[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"portal-settings:stajic:de":3,"public-menus:all":37,"post:rbac-vs-tenant-isolation-two-different-security-boundaries:de":204,"related:post:rbac-vs-tenant-isolation-two-different-security-boundaries:de:1":3031},{"statusCode":4,"data":5,"message":36},200,{"tenantId":6,"lang":7,"defaultLang":7,"siteUrl":8,"contactEmail":9,"brandName":10,"logoUrl":11,"siteName":10,"siteDescription":12,"ogImage":9,"robotsIndex":13,"socialLinks":9,"reservedSlugs":9,"seoPolicy":14},"stajic","de","https:\u002F\u002Fstajic.de",null,"Stajic Platform","\u002FLogo_Planet.svg","Stajic Portal",true,{"branding":15,"relatedContent":16,"crossDomainLinks":17},{"logoUrl":11},{"enabled":13},[18,21,24,27,30,33],{"url":19,"label":20,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Ffigure.rocks","figure.rocks",{"url":22,"label":23,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Floving.rocks","loving.rocks",{"url":25,"label":26,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Fbazify.com","bazify.com",{"url":28,"label":29,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Fbazify.de","bazify.de",{"url":31,"label":32,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Fbazify.at","bazify.at",{"url":34,"label":35,"isActive":13,"showInFooter":13,"includeInSameAs":13},"https:\u002F\u002Fbazify.ba","bazify.ba","Portal settings resolved",[38,44],{"id":39,"name":40,"location":41,"isActive":13,"isDefault":42,"items":43},1,"main-navigation","header",false,[],{"id":45,"name":46,"location":47,"isActive":13,"isDefault":13,"items":48},4,"main-menu","sidebar",[49,65,78,92,102,117,132],{"id":50,"title":51,"url":59,"target":60,"icon":61,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":63,"portfolioId":9,"children":64},"item-18",{"de":52,"en":53,"es":54,"fr":55,"it":53,"ru":56,"sr":57,"zh":58},"Startseite","Home","Inicio","Accueil","Главная","Почетна","首页","\u002Ffull-stack-web-developer-munich-performance-seo-and-maintainable-builds","_self","i-lucide-home","page",111,[],{"id":66,"title":67,"url":74,"target":60,"icon":75,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":76,"portfolioId":9,"children":77},"item-22",{"de":68,"en":68,"es":69,"fr":68,"it":70,"ru":71,"sr":72,"zh":73},"Vision","Visión","Visione","Видение","Визија","想象","\u002Fueber-uns-webdesign-muenchen-webaplikation","i-lucide-eye",113,[],{"id":79,"title":80,"url":88,"target":60,"icon":89,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":90,"portfolioId":9,"children":91},"item-19",{"de":81,"en":82,"es":83,"fr":82,"it":84,"ru":85,"sr":86,"zh":87},"Leistungen","Services","Servicios","Servizi","Услуги","Услуге","服务","\u002Fservices-dienstleistungen-muenchen","i-lucide-wrench",116,[],{"id":93,"title":94,"url":98,"target":60,"icon":99,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":100,"portfolioId":9,"children":101},"item-23",{"de":95,"en":95,"es":95,"fr":95,"it":95,"ru":96,"sr":96,"zh":97},"Blog","Блог","博客","\u002Fblog","i-lucide-book-open",112,[],{"id":103,"title":104,"url":113,"target":60,"icon":114,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":115,"portfolioId":9,"children":116},"item-32",{"de":105,"en":106,"es":107,"fr":108,"it":109,"ru":110,"sr":111,"zh":112},"Neue Technologien","New Technologies","Nuevas tecnologías","Nouvelles technologies","Nuove tecnologie","Новые технологии","Нове технологије","新技术！","\u002Fneue-webtechnologien","i-lucide-sparkles",122,[],{"id":118,"title":119,"url":128,"target":60,"icon":129,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":130,"portfolioId":9,"children":131},"item-20",{"de":120,"en":121,"es":122,"fr":123,"it":124,"ru":125,"sr":126,"zh":127},"Kontakt","Contact us!","Contacto","Contact","Contatto","Контакт","Контактирајте нас","联系我们！","\u002Fcontact","i-lucide-mail",115,[],{"id":133,"title":134,"url":143,"target":60,"icon":144,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":145,"portfolioId":9,"children":146},"item-21",{"de":135,"en":136,"es":137,"fr":138,"it":139,"ru":140,"sr":141,"zh":142},"Unsere Arbeit","Our Work","Nuestro trabajo","Nos réalisations","I nostri lavori","Наши работы","Наши радови","文件夹","\u002Fportfolio","i-lucide-briefcase",114,[147,160,174,180,192],{"id":148,"title":149,"url":143,"target":60,"icon":158,"isActive":13,"type":62,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":145,"portfolioId":9,"children":159},"item-24",{"de":150,"en":151,"es":152,"fr":153,"it":154,"ru":155,"sr":156,"zh":157},"Alle Projekte","All Projects","Todos los proyectos","Tous les projets","Tutti i progetti","Все проекты","Сви пројекти","所有项目","i-lucide-grid-3x3",[],{"id":161,"title":162,"url":170,"target":60,"icon":171,"isActive":13,"type":172,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":9,"portfolioId":9,"children":173},"item-29",{"de":163,"en":164,"es":165,"fr":166,"it":167,"ru":168,"sr":169,"zh":142},"Local Roots, Global Reach","Local Roots - Global Reach","Empresa local ","Entreprise locale","Azienda locale","Местная компания","Локално предузеће глобално тржиште","\u002Fportfolio\u002Flocal-roots-global-reach-communication-media-systems-for-modern-business","i-lucide-folder","custom",[],{"id":175,"title":176,"url":178,"target":60,"icon":171,"isActive":13,"type":172,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":9,"portfolioId":9,"children":179},"item-28",{"de":177,"en":177,"es":177,"fr":177,"it":177,"ru":177,"sr":177,"zh":177},"Solr Suggester","\u002Fportfolio\u002Fsolr-fuzzy-suggester-und-solr-infix-suggester-abfrage-ueber-ajax-und-filterung",[],{"id":181,"title":182,"url":190,"target":60,"icon":171,"isActive":13,"type":172,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":9,"portfolioId":9,"children":191},"item-27",{"de":183,"en":184,"es":185,"fr":186,"it":187,"ru":188,"sr":189,"zh":184},"Firmenwebseite SEO","Company Website SEO","Sitio web corporativo SEO","Site web d’entreprise SEO","Sito web aziendale SEO","Корпоративный сайт SEO","Пословна веб-страница SEO","\u002Fportfolio\u002Fseo-sem-branding-mobile-webseite-muenchen",[],{"id":193,"title":194,"url":202,"target":60,"icon":171,"isActive":13,"type":172,"productId":9,"categoryId":9,"shopCategoryId":9,"articleId":9,"pageId":9,"portfolioId":9,"children":203},"item-31",{"de":195,"en":196,"es":197,"fr":198,"it":199,"ru":200,"sr":201,"zh":196},"Digitalisierungsportal","Digitalization Portal","Portal de digitalización","Portail de numérisation","Portale di digitalizzazione","Портал цифровизации","Портал за дигитализацију","\u002Fportfolio\u002Fdigitalisierungsportal-archiv-museum-bibliothek-ead-lido-mets-mods",[],{"statusCode":4,"data":205,"message":3030},{"id":206,"title":207,"slug":208,"content":209,"contentJson":210,"excerpt":1410,"featuredImage":1411,"featuredImageAlt":1412,"featuredImageCaption":9,"featuredImageTitle":9,"featuredImageCopyright":9,"featuredImageAuthor":9,"featuredImageSourceUrl":9,"featuredImageLicense":9,"featuredImageIsAiGenerated":42,"status":1413,"publishedAt":1414,"createdAt":1415,"updatedAt":1416,"seoLocalePaths":1417,"categories":1426,"author":1439,"translations":1444},"490","RBAC vs. Mandantenisolierung: Zwei unterschiedliche Sicherheitsgrenzen","rbac-vs-tenant-isolation-two-different-security-boundaries","\u003Cp>RBAC und Mandantentrennung lösen zwei unterschiedliche Sicherheitsprobleme in Multi-Tenant-Systemen. Role-Based Access Control (RBAC) bestimmt, was ein authentifizierter Principal tun darf, z. B. Bestellungen lesen, Produkte bearbeiten oder Benutzer verwalten. Mandantentrennung bestimmt, auf die Daten, Ressourcen und den Ausführungskontext welches Mandanten dieser Principal zugreifen darf. Ein Benutzer kann korrekt authentifiziert und korrekt einer RBAC-Rolle zugewiesen sein und dennoch einen Sicherheitsfehler erleben, wenn die Anwendung dieser Rolle erlaubt, auf Ressourcen eines anderen Mandanten zuzugreifen.\u003C\u002Fp>\n\u003Caside class=\"editorjs-callout editorjs-callout--info my-6 rounded-xl border p-5 border-blue-300 bg-blue-50 dark:border-blue-900 dark:bg-blue-950\u002F20\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Direkte Antwort\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">\u003Cstrong>RBAC beantwortet „Was darf diese Identität tun?“ Mandantentrennung beantwortet „Innerhalb welcher Grenze darf sie es tun?“\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Eine sichere Multi-Tenant-Anwendung benötigt normalerweise beides. Ein Mandantenadministrator kann weitreichende Berechtigungen haben, aber diese Berechtigungen sollten auf den Mandanten des Administrators beschränkt bleiben, es sei denn, es existiert eine explizit separate Autorität auf Plattformebene.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Caside class=\"editorjs-callout editorjs-callout--warning my-6 rounded-xl border p-5 border-amber-300 bg-amber-50 dark:border-amber-900 dark:bg-amber-950\u002F20\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Eine Rolle ist keine Mandantengrenze\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Einem Benutzer die Rolle \u003Ccode>ADMIN\u003C\u002Fcode> zu geben, impliziert nicht automatisch „Administrator nur von Mandant A“. Die Rolle muss zusammen mit dem verifizierten Mandantenkontext und der Mandantenzugehörigkeit der Zielressource bewertet werden. Andernfalls kann eine gültige Rolle zu einem mandantenübergreifenden Privileg werden.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Caside class=\"editorjs-callout editorjs-callout--note my-6 rounded-xl border p-5 border-gray-300 bg-gray-50 dark:border-gray-700 dark:bg-gray-900\u002F40\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Hinweis zu aktuellen Quellen — 8. Oktober 2026\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Die zugrunde liegende Unterscheidung ist stabil. NIST definiert RBAC anhand von Benutzern, Rollen, Berechtigungen, Operationen und Objekten. Die aktuelle AWS-SaaS-Richtlinie stellt ausdrücklich fest, dass Authentifizierung und Autorisierung nicht gleichbedeutend mit Mandantentrennung sind und dass ein Benutzer authentifiziert und autorisiert sein kann, während er dennoch auf Ressourcen eines anderen Mandanten zugreift, wenn die Trennung nicht separat durchgesetzt wird. Die aktuelle Multi-Tenant-Security-Richtlinie von OWASP behandelt Mandantentrennung ebenfalls als eine Anforderung über alle Schichten hinweg, die APIs, Datenbanken, Caches, Speicher, Warteschlangen und andere gemeinsam genutzte Ressourcen abdeckt.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cnav class=\"editorjs-toc\" data-editorjs-toc=\"true\" aria-label=\"Inhalt\">\u003Cstrong class=\"editorjs-toc__title\">Inhalt\u003C\u002Fstrong>\u003Col class=\"editorjs-toc__list editorjs-toc__list--depth-0\">\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-6\" class=\"editorjs-toc__link\">Was RBAC wirklich steuert\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-10\" class=\"editorjs-toc__link\">Was Mandantentrennung wirklich steuert\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-14\" class=\"editorjs-toc__link\">Das einfachste Beispiel\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-19\" class=\"editorjs-toc__link\">Wo das einfache Beispiel an seine Grenzen stößt\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-23\" class=\"editorjs-toc__link\">RBAC vs. Mandantenisolation\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-25\" class=\"editorjs-toc__link\">Authentifizierung, Autorisierung und Isolation sind drei verschiedene Prüfungen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-28\" class=\"editorjs-toc__link\">Rollen brauchen einen Geltungsbereich\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-32\" class=\"editorjs-toc__link\">Der Mandantenkontext muss aus einem vertrauenswürdigen Pfad stammen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-36\" class=\"editorjs-toc__link\">Der Mandantenbereich gehört in die Ressourcensuche\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-40\" class=\"editorjs-toc__link\">Anwendungsprüfungen sind nützlich, aber die Isolation sollte nicht von perfektem Entwicklerverhalten abhängen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-44\" class=\"editorjs-toc__link\">Datenbank-Isolationsstrategien\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-47\" class=\"editorjs-toc__link\">PostgreSQL Row-Level Security kann Verteidigung in der Tiefe bieten\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-51\" class=\"editorjs-toc__link\">Mandantenisolierung muss Caches einschließen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-55\" class=\"editorjs-toc__link\">Dateien und Objektspeicher benötigen ihre eigene Mandantengrenze\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-59\" class=\"editorjs-toc__link\">Hintergrundjobs und Warteschlangen können die Isolierung durchbrechen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-63\" class=\"editorjs-toc__link\">Suche und RAG benötigen mandantenbewussten Abruf\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-68\" class=\"editorjs-toc__link\">Abgeleitete Daten erben die Mandantensensibilität\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-71\" class=\"editorjs-toc__link\">Nicht alles gehört zu einem Mandanten\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-75\" class=\"editorjs-toc__link\">Plattformadministratoren erfordern ein anderes Berechtigungsmodell\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-79\" class=\"editorjs-toc__link\">RBAC kann mit Attributen kombiniert werden\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-83\" class=\"editorjs-toc__link\">Autorisierungsentscheidungen sind mindestens zweidimensional\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-85\" class=\"editorjs-toc__link\">Ursprüngliche Implementierungsnachweise: Aaasaasa AI CMS\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-94\" class=\"editorjs-toc__link\">Warum diese Unterscheidung für KI-Agenten noch wichtiger ist\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-98\" class=\"editorjs-toc__link\">RBAC und Mandantentrennung getrennt testen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-101\" class=\"editorjs-toc__link\">Häufige Fehlermodi\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-103\" class=\"editorjs-toc__link\">Häufige Missverständnisse\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-105\" class=\"editorjs-toc__link\">Eine praktische Entwurfssequenz\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-107\" class=\"editorjs-toc__link\">RBAC + Mandantentrennungs-Checkliste\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-109\" class=\"editorjs-toc__link\">Edge Cases und Einschränkungen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-115\" class=\"editorjs-toc__link\">Was würde diese Antwort ändern?\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-119\" class=\"editorjs-toc__link\">Verwandtes kanonisches Wissen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-125\" class=\"editorjs-toc__link\">Häufig gestellte Fragen\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-127\" class=\"editorjs-toc__link\">Glossar\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-129\" class=\"editorjs-toc__link\">Fazit\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-133\" class=\"editorjs-toc__link\">Primärquellen und aktuelle Leitlinien\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Fol>\u003C\u002Fnav>\n\u003Ch2 id=\"section-6\">Was RBAC wirklich steuert\u003C\u002Fh2>\n\u003Cp>RBAC ist ein Autorisierungsmodell, bei dem Berechtigungen mit Rollen verknüpft und Benutzer diesen Rollen zugewiesen werden. Die Rolle fungiert als administrative Abstraktion zwischen Identitäten und Berechtigungen.\u003C\u002Fp>\n\u003Cp>Die klassische RBAC-Arbeit von NIST formalisiert dies anhand von Benutzern, Rollen, Berechtigungen, Operationen und Objekten. Der praktische Nutzen besteht darin, dass eine Organisation die Autorisierung über relativ stabile Job- oder Verantwortungsrollen verwalten kann, anstatt jede Berechtigung direkt an jeden Benutzer zu knüpfen.\u003C\u002Fp>\n\u003Cp>Eine Rolle wie EDITOR kann daher bedeuten: darf Inhalte lesen, Inhalte schreiben und Inhalte veröffentlichen. Eine Rolle wie ACCOUNTANT kann bedeuten: darf Abrechnungsdaten lesen, Rechnungen abstimmen und Abrechnungen genehmigen.\u003C\u002Fp>\n\u003Ch2 id=\"section-10\">Was Mandantentrennung wirklich steuert\u003C\u002Fh2>\n\u003Cp>Mandantentrennung ist die Gesamtheit der Mechanismen, die verhindern, dass ein Mandant die Ressourcen eines anderen Mandanten in einem gemeinsam genutzten System liest, verändert, beeinflusst oder versehentlich erhält.\u003C\u002Fp>\n\u003Cp>Die geschützte Grenze ist breiter als Datenbankzeilen. Mandantenspezifischer Zustand kann in relationalen Tabellen, Objektspeichern, Vektorindizes, Caches, Suchindizes, Warteschlangennachrichten, Dateien, temporären Artefakten, Hintergrundjobs, Analysen, Ratenbegrenzungen und Infrastrukturressourcen existieren.\u003C\u002Fp>\n\u003Cp>Die SaaS-Richtlinie von AWS macht die Unterscheidung explizit: Autorisierung gewährt Zugriff auf Ressourcen, während Mandantentrennung sicherstellt, dass diese Ressourcen die falsche Mandantengrenze nicht überschreiten können, selbst wenn die Infrastruktur gemeinsam genutzt wird.\u003C\u002Fp>\n\u003Ch2 id=\"section-14\">Das einfachste Beispiel\u003C\u002Fh2>\n\u003Cp>Angenommen, Alice ist Administratorin für Mandant A und Bob ist Administrator für Mandant B. Beide Benutzer haben legitimerweise dieselbe ADMIN-Rolle.\u003C\u002Fp>\n\u003Cp>RBAC kann korrekt zu dem Schluss kommen, dass beide Benutzer eine Operation wie users.read ausführen dürfen. Wenn Alice jedoch Benutzer-ID 847 anfordert, muss die Anwendung dennoch überprüfen, ob Benutzer 847 zu Mandant A gehört.\u003C\u002Fp>\n\u003Cp>Wenn die API nur prüft „Alice hat ADMIN“ und dann SELECT * FROM users WHERE id = 847 ausführt, war RBAC erfolgreich, während die Mandantentrennung fehlgeschlagen ist.\u003C\u002Fp>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Eine korrekte Multi-Tenant-Autorisierungsentscheidung\u003C\u002Fh3>\u003Cdiv class=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">1\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">1. Principal authentifizieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Feststellen, wer der Benutzer, Dienst oder Agent ist.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">2\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">2. Verifizierten Mandantenkontext auflösen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Bestimmen, welcher Mandantenkontext gilt, anhand vertrauenswürdiger serverseitiger Identitäts-\u002FMitgliedschaftsinformationen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">3\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">3. Berechtigung auflösen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Bewerten, ob die Rolle oder Richtlinie des Principals die angeforderte Operation erlaubt.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">4\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">4. Zielressource eingrenzen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Überprüfen, ob das Zielobjekt zum erlaubten Mandanten oder explizit gemeinsam genutzten Bereich gehört.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">5\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">5. An der Zugriffsgrenze durchsetzen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Die Datenbank-, Cache-, Speicher-, Warteschlangen- oder Dienstoperation mit angewendeten Mandanteneinschränkungen ausführen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">6\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">6. Beide Dimensionen prüfen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Principal, Mandant, Operation, Ziel und Ergebnis aufzeichnen, damit mandantenübergreifende Versuche sichtbar sind.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-19\">Wo das einfache Beispiel an seine Grenzen stößt\u003C\u002Fh2>\n\u003Cp>Reale Systeme enthalten oft mehrere Identitätsklassen: Mandantenbenutzer, Plattformadministratoren, Hintergrundprozesse, Integrationen, Agenten und mandantenübergreifende Betriebsdienste. Einige davon überschreiten legitim Mandantengrenzen.\u003C\u002Fp>\n\u003Cp>Das beseitigt nicht die Notwendigkeit der Isolation. Es bedeutet, dass mandantenübergreifende Berechtigungen explizit, eng begrenzt und separat prüfbar sein müssen, anstatt versehentlich aus einer globalen Rolle oder einer nicht eingegrenzten Datenbankverbindung zu entstehen.\u003C\u002Fp>\n\u003Cp>Die Mandantenisolation kann auch je nach Ebene variieren. Ein Produkt kann Anwendungsserver gemeinsam nutzen und gleichzeitig Datenbanken trennen oder eine gemeinsame Datenbank mit zeilenbasierten Richtlinien verwenden und Premium-Mandanten isolierten Speicher oder Rechenleistung bieten. Es gibt keine einzige universelle Isolations-Topologie.\u003C\u002Fp>\n\u003Ch2 id=\"section-23\">RBAC vs. Mandantenisolation\u003C\u002Fh2>\n\u003Csection class=\"editorjs-comparison my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Zwei verschiedene Sicherheitsdimensionen\u003C\u002Fh3>\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 bg-gray-50 px-4 py-3 text-left dark:border-gray-700 dark:bg-gray-900\">\u003C\u002Fth>\u003Cth class=\"border border-gray-300 bg-gray-50 px-4 py-3 text-left font-semibold dark:border-gray-700 dark:bg-gray-900\">RBAC\u003C\u002Fth>\u003Cth class=\"border border-gray-300 bg-gray-50 px-4 py-3 text-left font-semibold dark:border-gray-700 dark:bg-gray-900\">Mandantenisolation\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Hauptfrage\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Typische Einheit\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Beispiel\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Typisches Versagen\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Typische Implementierung\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-3 text-left font-semibold dark:border-gray-700\">Kann es allein existieren?\u003C\u002Fth>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-3 dark:border-gray-700\">\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-25\">Authentifizierung, Autorisierung und Isolation sind drei verschiedene Prüfungen\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Ebene\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Frage\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Beispiel für Versagen\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Authentifizierung\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Wer ist dieser Prinzipal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Angreifer gibt sich als Alice aus\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autorisierung \u002F RBAC\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Darf dieser Prinzipal diese Operation ausführen?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Betrachter kann Benutzer löschen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenisolation\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Darf diese Operation diese Mandanten-\u002FRessourcengrenze erreichen?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandant-A-Administrator liest Bestellung von Mandant B\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Diese Prüfungen sind miteinander verbunden, aber nicht gegenseitig ersetzbar. Die Authentifizierung kann perfekt sein, während die Autorisierung fehlschlägt. Die Autorisierung kann korrekt sein, während die Mandantenisolation fehlschlägt. Ein sicherer SaaS-Anfragepfad benötigt alle anwendbaren Grenzen.\u003C\u002Fp>\n\u003Ch2 id=\"section-28\">Rollen brauchen einen Geltungsbereich\u003C\u002Fh2>\n\u003Cp>Das Wort ADMIN ist ohne Geltungsbereich unvollständig. Es kann Plattformadministrator, Mandantenadministrator, Projektadministrator, Arbeitsbereichsadministrator oder Administrator eines Subsystems bedeuten.\u003C\u002Fp>\n\u003Cp>In Multi-Mandanten-Systemen sollte die Rollenzuweisung normalerweise mit der Mandantenmitgliedschaft oder einem anderen expliziten Ressourcenbereich verknüpft sein. Derselbe Benutzer kann legitim ADMIN in Mandant A und VIEWER in Mandant B sein.\u003C\u002Fp>\n\u003Cp>Ein globales Rollenmodell, das diese Unterscheidung ignoriert, kann zu Berechtigungslecks führen, selbst wenn die Berechtigungszuordnung selbst korrekt ist.\u003C\u002Fp>\n\u003Ch2 id=\"section-32\">Der Mandantenkontext muss aus einem vertrauenswürdigen Pfad stammen\u003C\u002Fh2>\n\u003Cp>Eine vom Client bereitgestellte Mandanten-ID ist als Selektor nützlich, aber sie ist kein Nachweis der Berechtigung. Der Server muss die Mandantenmitgliedschaft anhand der authentifizierten Identität und der aktuellen Autorisierungsdaten ableiten oder überprüfen.\u003C\u002Fp>\n\u003Cp>Die aktuelle Multi-Mandanten-Richtlinie von OWASP empfiehlt, den Mandantenkontext früh im Anfragelebenszyklus festzulegen, und warnt ausdrücklich davor, Client-Header oder Anfrageparameter als Autorisierungsnachweis zu behandeln.\u003C\u002Fp>\n\u003Cp>Das ist wichtig, weil eine triviale Änderung der Anfrage von tenant=A zu tenant=B nicht ausreichen darf, um die Isolationsgrenze zu überschreiten.\u003C\u002Fp>\n\u003Ch2 id=\"section-36\">Der Mandantenbereich gehört in die Ressourcensuche\u003C\u002Fh2>\n\u003Cp>Ein gängiges Isolationsmuster auf Anwendungsebene besteht darin, den Mandantenbereich in dieselbe Abfrage aufzunehmen, die die Ressource auflöst.\u003C\u002Fp>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Schwache Suche\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Stärkere mandantenbezogene Suche\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">findFirst({ where: { id } })\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">findFirst({ where: { id, tenantId } })\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">UPDATE orders SET ... WHERE id = ?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">UPDATE orders SET ... WHERE id = ? AND tenant_id = ?\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">cache.get('user:' + id)\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">cache.get('tenant:' + tenantId + ':user:' + id)\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Dieses Muster ist nicht der einzige mögliche Isolationsmechanismus, aber es hält die Mandantenzugehörigkeit nahe an der Datenzugriffsoperation und verhindert, dass eine Objekt-ID zu einer mandantenübergreifenden Fähigkeit wird.\u003C\u002Fp>\n\u003Ch2 id=\"section-40\">Anwendungsprüfungen sind nützlich, aber die Isolation sollte nicht von perfektem Entwicklerverhalten abhängen\u003C\u002Fh2>\n\u003Cp>Die Isolationsrichtlinie von AWS warnt ausdrücklich davor, die Durchsetzung der Isolation nur den Serviceentwicklern zu überlassen. In einer großen Codebasis kann irgendwann eine Abfrage, ein Cache-Schlüssel oder ein Worker-Pfad den Mandantenbereich auslassen.\u003C\u002Fp>\n\u003Cp>Verteidigung in der Tiefe kann die Isolation daher in gemeinsame Middleware, Repository-\u002FService-Schichten, Policy-Engines, Datenbank-Row-Level-Security, dedizierte Anmeldeinformationen, separate Schemas oder separate Datenbanken verlagern, je nach Risiko und Architektur.\u003C\u002Fp>\n\u003Caside class=\"editorjs-callout editorjs-callout--success my-6 rounded-xl border p-5 border-emerald-300 bg-emerald-50 dark:border-emerald-900 dark:bg-emerald-950\u002F20\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Isolation sollte schwer zu vergessen sein\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Die stärkste Grenze ist eine, die gewöhnlicher Anwendungscode nicht beiläufig umgehen kann, indem er eine \u003Ccode>tenantId\u003C\u002Fcode>-Bedingung auslässt.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-44\">Datenbank-Isolationsstrategien\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Strategie\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Grenze\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Stärke \u002F Kompromiss\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Gemeinsame Tabellen + Mandantenschlüssel\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Zeilen-\u002FAnwendungsrichtlinie\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Operativ effizient; erfordert umfassende Mandantenbereichsabdeckung und starke Tests\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Gemeinsame Tabellen + Datenbank-RLS\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Datenbankrichtliniengrenze\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verringert die Abhängigkeit von jeder Anwendungsabfrage; erfordert korrekte Rollen, Sitzungs-\u002FTransaktions-Mandantenkontext und Richtlinienabdeckung\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separate Schemas\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Namensraum-\u002FDB-Rollengrenze\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Stärkere logische Trennung; mehr operative Komplexität\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separate Datenbanken\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Datenbank-\u002FAnmeldeinformationsgrenze\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Starke Isolation und einfachere Blast-Radius-Geschichte; höhere Bereitstellungs- und Betriebskosten\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separate Infrastruktur\u002FKonto\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Infrastrukturgrenze\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Stärkste grobkörnige Trennung; höchste Kosten und operativer Aufwand\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Hybrid\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Pro Workload\u002FDatenklasse\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ermöglicht stärkere Isolation nur dort, wo Risiko\u002FCompliance es rechtfertigt\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Das aktuelle Multi-Tenant Security Cheat Sheet von OWASP listet separate Datenbanken, separate Schemas, gemeinsame Tabellen mit Zeilensteuerung und Hybridmodelle auf. Das richtige Modell hängt von Bedrohungsniveau, Compliance, Leistung und Betriebskosten ab.\u003C\u002Fp>\n\u003Ch2 id=\"section-47\">PostgreSQL Row-Level Security kann Verteidigung in der Tiefe bieten\u003C\u002Fh2>\n\u003Cp>Bei gemeinsamen Tabellen kann PostgreSQL Row-Level Security ein Mandantenprädikat auf der Datenbankebene durchsetzen, sodass gewöhnliche Abfragen keine Zeilen außerhalb der aktiven Mandantenrichtlinie sehen können.\u003C\u002Fp>\n\u003Cp>RLS ist jedoch keine Magie. PostgreSQL-Superuser und Rollen mit BYPASSRLS können Zeilenrichtlinien umgehen. OWASP empfiehlt daher, eine Rolle mit minimalen Berechtigungen für den Anforderungspfad zu verwenden und denselben Verbindungs-\u002FPooling-Modus zu testen, der in der Produktion verwendet wird.\u003C\u002Fp>\n\u003Cp>Die Wiederverwendung von Verbindungen ist ein weiterer wichtiger Randfall: Der Mandantenkontext muss für jede Transaktion\u002FAnforderung sicher gesetzt und zurückgesetzt werden, damit eine gepoolte Verbindung keinen vorherigen Mandantenzustand preisgeben kann.\u003C\u002Fp>\n\u003Ch2 id=\"section-51\">Mandantenisolierung muss Caches einschließen\u003C\u002Fh2>\n\u003Cp>Eine Datenbankabfrage kann perfekt abgegrenzt sein und dennoch Daten über einen gemeinsamen Cache-Schlüssel preisgeben.\u003C\u002Fp>\n\u003Cp>Wenn user:42 sowohl in Mandant A als auch in Mandant B existiert, kann ein globaler Cache-Schlüssel den Wert des falschen Mandanten zurückgeben. Mandantensensible Cache-Schlüssel sollten jedes Attribut enthalten, das die Sichtbarkeit oder Ergebnis-Semantik ändert, üblicherweise Mandant, Benutzer, Locale, Feature-Set oder Berechtigungsversion.\u003C\u002Fp>\n\u003Cp>Cache-Partitionierung ist Verteidigung in der Tiefe, kein Ersatz für Autorisierung. Die Anforderung muss weiterhin autorisiert werden, bevor geschützte zwischengespeicherte Inhalte zurückgegeben werden.\u003C\u002Fp>\n\u003Ch2 id=\"section-55\">Dateien und Objektspeicher benötigen ihre eigene Mandantengrenze\u003C\u002Fh2>\n\u003Cp>Objektspeicher sollte globale, mandantenbezogene und benutzerbezogene Objekte unterscheiden. Ein Ordnerpräfix allein ist nur eine Namenskonvention, es sei denn, die Zugriffsrichtlinie schränkt Lese- und Schreibvorgänge tatsächlich ein.\u003C\u002Fp>\n\u003Cp>Robustere Designs können mandantenbewusste Objektschlüssel, Bucket-Richtlinien, separate Buckets\u002FKonten oder mandantenspezifische Verschlüsselungsschlüssel verwenden, wenn Risiko oder Compliance eine stärkere Isolierung erfordern.\u003C\u002Fp>\n\u003Cp>Signierte URLs müssen vor der Ausstellung autorisiert und auf das genaue Objekt und die genaue Operation beschränkt werden. Der Besitz einer Objektkennung sollte für sich genommen keinen mandantenübergreifenden Zugriff gewähren.\u003C\u002Fp>\n\u003Ch2 id=\"section-59\">Hintergrundjobs und Warteschlangen können die Isolierung durchbrechen\u003C\u002Fh2>\n\u003Cp>Asynchrone Jobs verlassen oft den ursprünglichen HTTP-Anfragekontext, was die Weitergabe des Mandanten leicht fehleranfällig macht. Eine Warteschlangennachricht, die tenantId enthält, ist kein ausreichender Beweis dafür, dass der Produzent autorisiert war.\u003C\u002Fp>\n\u003Cp>Der Worker sollte eine verifizierte Dienst-\u002FBenutzeridentität oder einen vertrauenswürdigen Job-Umschlag mitführen, den Mandantenkontext wiederherstellen und folgenreiche Operationen an der Konsumentengrenze erneut autorisieren.\u003C\u002Fp>\n\u003Cp>Mandantenisolierung umfasst auch Verfügbarkeit. Ein Mandant sollte nicht in der Lage sein, gemeinsame Worker, Warteschlangen, Verbindungspools oder Rechenleistung so zu monopolisieren, dass andere Mandanten wesentlich beeinträchtigt werden.\u003C\u002Fp>\n\u003Ch2 id=\"section-63\">Suche und RAG benötigen mandantenbewussten Abruf\u003C\u002Fh2>\n\u003Cp>Multi-Mandanten-KI führt eine weitere Kopie des Isolierungsproblems ein. Dokumente können nach der Aufnahme in Chunks aufgeteilt, eingebettet und in einem Vektorindex gespeichert werden.\u003C\u002Fp>\n\u003Cp>Die aktuelle RAG-Sicherheitsrichtlinie von OWASP besagt, dass Zugriffskontrolle zum Zeitpunkt des Abrufs durchgesetzt werden muss und dass Chunks von Mandant A nicht durch Abfragen von Mandant B abgerufen werden dürfen. Es kann nicht einfach davon ausgegangen werden, dass Berechtigungen auf Dokumentebene das Chunking automatisch überleben.\u003C\u002Fp>\n\u003Cp>Der Vektorindex benötigt daher Mandanten-\u002FZugriffsmetadaten oder physisch\u002Flogisch getrennte Sammlungen gemäß dem Isolierungsdesign. Abruffilter sollten angewendet werden, bevor nicht autorisierte Inhalte in den Modellkontext gelangen können.\u003C\u002Fp>\n\u003Caside class=\"editorjs-callout editorjs-callout--warning my-6 rounded-xl border p-5 border-amber-300 bg-amber-50 dark:border-amber-900 dark:bg-amber-950\u002F20\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Das Modell darf niemals der Mandantenfiler sein\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Rufen Sie keine mandantenübergreifenden Chunks ab und weisen Sie dann das Sprachmodell an, sie zu ignorieren. Sobald geschützte Daten in den Modellkontext gelangen, ist die Isolierungsgrenze bereits durchbrochen.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-68\">Abgeleitete Daten erben die Mandantensensibilität\u003C\u002Fh2>\n\u003Cp>Einbettungen, Suchindizes, Miniaturansichten, generierte Zusammenfassungen, Caches, Analysezeilen und KI-Antworten werden aus Quelldaten abgeleitet. Ihr Mandantenbereich sollte der Quelle folgen, es sei denn, eine explizite Transformation erzeugt ein legitimes gemeinsames\u002Fglobales Artefakt.\u003C\u002Fp>\n\u003Cp>Löschung und Offboarding müssen sich daher über die kanonische Zeile hinaus ausbreiten. Das Entfernen eines Mandantendokuments, während durchsuchbare Chunks oder zwischengespeicherte Zusammenfassungen verbleiben, kann eine mandantenübergreifende oder über die Aufbewahrungsfrist hinausgehende Exposition aufrechterhalten.\u003C\u002Fp>\n\u003Ch2 id=\"section-71\">Nicht alles gehört zu einem Mandanten\u003C\u002Fh2>\n\u003Cp>Multi-Mandanten-Plattformen haben oft absichtlich globale Ressourcen: Produkttaxonomien, öffentliche Vorlagen, Systemberechtigungen, Funktionsdefinitionen oder öffentliche Inhalte.\u003C\u002Fp>\n\u003Cp>Das sicherste Modell ist die explizite Klassifizierung: global, mandantenbezogen, benutzerbezogen oder explizit mandantenübergreifend. Mehrdeutige Ressourcen sind der Ausgangspunkt für versehentliche Datenlecks.\u003C\u002Fp>\n\u003Cp>Ein absichtlich gemeinsam genutztes Objekt sollte einen dokumentierten Grund dafür haben, global zu sein, und nicht einfach keine Mandantenzuordnung besitzen.\u003C\u002Fp>\n\u003Ch2 id=\"section-75\">Plattformadministratoren erfordern ein anderes Berechtigungsmodell\u003C\u002Fh2>\n\u003Cp>Ein Plattformbetreiber muss möglicherweise mehrere Mandanten für Support, Compliance oder Infrastrukturbetrieb inspizieren. Dies als gewöhnlichen Mandanten-ADMIN mit versehentlichem globalem Datenbankzugriff zu modellieren, schwächt sowohl Sicherheit als auch Auditierbarkeit.\u003C\u002Fp>\n\u003Cp>Ein besseres Design verwendet eine eigenständige Plattformidentität oder eine explizite mandantenübergreifende Berechtigung, stärkere Authentifizierung, Zweckbindung, detaillierte Auditierung und, wo angemessen, Genehmigungs- oder Break-Glass-Kontrollen.\u003C\u002Fp>\n\u003Cp>Mandantenübergreifender Zugriff sollte daher eine benannte Fähigkeit sein, nicht das Fehlen eines Mandantenfilters.\u003C\u002Fp>\n\u003Ch2 id=\"section-79\">RBAC kann mit Attributen kombiniert werden\u003C\u002Fh2>\n\u003Cp>Einige Entscheidungen hängen von mehr als der Rolle ab. Mandantenzugehörigkeit, Region, Ressourceneigentümer, Abonnementstufe, Zeit, Projektzugehörigkeit oder Datenklassifizierung können alle den Zugriff beeinflussen.\u003C\u002Fp>\n\u003Cp>RBAC und ABAC schließen sich nicht gegenseitig aus. Die aktuelle Multi-Tenant-Autorisierungsrichtlinie von AWS behandelt RBAC, ABAC und Hybridmodelle. Eine Rolle kann eine breite Verantwortung definieren, während Attribute einschränken, auf welche konkrete Ressourceninstanz zugegriffen werden kann.\u003C\u002Fp>\n\u003Cp>Die zentrale Architekturregel bleibt: Kodieren Sie die Mandantenisolierung nicht nur als beiläufigen Rollennamen, wenn die Mandantenidentität eine erstklassige Ressourcengrenze ist.\u003C\u002Fp>\n\u003Ch2 id=\"section-83\">Autorisierungsentscheidungen sind mindestens zweidimensional\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Prinzipal\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Rollenberechtigung\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Mandantenbeziehung\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Entscheidung\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.read\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bestellung gehört zum Mandanten von Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Erlauben\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.read\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bestellung gehört zu einem anderen Mandanten\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verweigern\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.write\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bestellung gehört zum Mandanten von Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Erlauben, wenn die Rolle Schreibzugriff umfasst\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.write\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bestellung gehört zu einem anderen Mandanten\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verweigern\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Plattform-Support\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">support.cross_tenant.read\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Expliziter Support-Umfang + auditierter Zielmandant\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Potenziell erlauben gemäß Plattformrichtlinie\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Hintergrund-Worker\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.process\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Vertrauenswürdiger Dienstumfang für den Auftragsmandanten\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Nur für verifizierten Auftragsmandanten erlauben\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-85\">Ursprüngliche Implementierungsnachweise: Aaasaasa AI CMS\u003C\u002Fh2>\n\u003Caside class=\"editorjs-callout editorjs-callout--note my-6 rounded-xl border p-5 border-gray-300 bg-gray-50 dark:border-gray-700 dark:bg-gray-900\u002F40\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Ursprüngliche Implementierungsnachweise\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Aaasaasa AI CMS enthält eine konkrete mandantenbezogene RBAC-Implementierung. Sie ist ein nützlicher Nachweis dafür, wie Rollenautorisierung und Mandantenumfang kombiniert werden können, sollte aber nicht als Beweis dafür präsentiert werden, dass jede Speicher-, Cache- oder Infrastrukturschicht eine vollständige Mandantenisolierung aufweist.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cp>Der RBAC-Dienst definiert typisierte Berechtigungscodes wie cms.content.read, shop.orders.write, billing.reconcile und users.roles. Systemrollen ordnen diese Berechtigungen benannten Verantwortungssätzen zu.\u003C\u002Fp>\n\u003Cp>Rollendatensätze werden mit einer tenantId erstellt und aufgelöst. Systemrollen werden mithilfe einer zusammengesetzten Mandanten-\u002FCode-Identität aktualisiert oder eingefügt, und die Rollenauflistung wird nach Mandant gefiltert.\u003C\u002Fp>\n\u003Cp>Bei der Rollenaktualisierung und -löschung wird die Rolle zuerst anhand von Rollen-ID und Mandanten-ID aufgelöst. Benutzer-Rollen-Zuweisungen werden ebenfalls im aktuellen Mandantenkontext gespeichert und ersetzt.\u003C\u002Fp>\n\u003Cp>Die Berechtigungsauflösung liest explizite Benutzer-Rollen-Zuweisungen, die sowohl nach tenantId als auch nach userId eingeschränkt sind. Dies verhindert, dass die Rollenzuweisung eines Mandanten automatisch zur Rollenzuweisung eines anderen Mandanten wird.\u003C\u002Fp>\n\u003Cp>Auf API-Ebene lösen administrative RBAC-Routen einen Mandantenkontext auf, bevor Rollen erstellt oder geändert werden. Dies ist die richtige Richtung: Die Berechtigungsverwaltung selbst muss die Mandantenfähigkeit respektieren.\u003C\u002Fp>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Beobachtetes Implementierungsmuster\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Sicherheitsbedeutung\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Typisierte Berechtigungscodes\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Das Vokabular für RBAC-Operationen ist explizit\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Systemrolle → Berechtigungszuordnungen\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rollen aggregieren Berechtigungen, anstatt Benutzer fest zu codieren\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">tenantId_code Rollenidentität\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dieselbe logische Rolle kann pro Mandant separat existieren\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rollen-Lookup verwendet id + tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rollenänderung ist mandantenbezogen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Benutzer-Rollen-Beziehung speichert tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mitgliedschaft wird nicht allein aus der Rolle global abgeleitet\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Berechtigungsauflösung verwendet tenantId + userId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autorisierung wird innerhalb des Mandantenkontexts bewertet\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Caside class=\"editorjs-callout editorjs-callout--warning my-6 rounded-xl border p-5 border-amber-300 bg-amber-50 dark:border-amber-900 dark:bg-amber-950\u002F20\" role=\"note\">\u003Cstrong class=\"block mb-2 text-gray-900 dark:text-gray-100\">Was dieser Nachweis nicht beweist\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Mandantenbezogenes RBAC ist eine Ebene. Vollständige Mandantentrennung muss auch alle mandanteneigenen Ressourcen-Lookups, Datenbanken, Caches, Dateien, Such-\u002FVektorindizes, Hintergrundjobs, Integrationen und Betriebspfade abdecken. Die hier vorliegenden Repository-Nachweise stützen das RBAC-\u002FMandantenbereich-Entwurfsmuster, nicht die Behauptung einer unabhängig geprüften SaaS-Isolation.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-94\">Warum diese Unterscheidung für KI-Agenten noch wichtiger ist\u003C\u002Fh2>\n\u003Cp>KI-Agenten können einen Berechtigungsfehler in eine Abfolge von Aktionen verwandeln. Wenn ein Agent ein breites orders.read-Tool ohne mandantenbezogene Durchsetzung erhält, kann ein Fehler beim Schlussfolgern oder eine Prompt-Injection zu mandantenübergreifenden Lesezugriffen mit Maschinengeschwindigkeit führen.\u003C\u002Fp>\n\u003Cp>Agenten-Tool-Beschreibungen können Mandantenbeschränkungen erwähnen, aber die Durchsetzung muss weiterhin in der vertrauenswürdigen Laufzeit-\u002FService-\u002FDatenschicht erfolgen. Natürlichsprachliche Anweisungen sind keine Autorisierungsgrenze.\u003C\u002Fp>\n\u003Cp>Dasselbe gilt für RAG: Ein Agent kann die Berechtigung haben, das Suchtool zu verwenden, während das Such-Backend weiterhin verhindern muss, dass die Abfrage von Mandant A Chunks von Mandant B zurückgibt.\u003C\u002Fp>\n\u003Ch2 id=\"section-98\">RBAC und Mandantentrennung getrennt testen\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Testfamilie\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Was sie beweisen sollte\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rollen-Herabstufungstest\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ein Benutzer ohne Berechtigung kann die Operation nicht ausführen, selbst innerhalb seines eigenen Mandanten\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenübergreifender Objekttest\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ein Benutzer mit der richtigen Rolle kann weiterhin nicht auf denselben Ressourcentyp in einem anderen Mandanten zugreifen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Identifikator-Manipulation\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Das Ändern von Objekt-\u002FMandanten-IDs überschreitet nicht den Bereich\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Listen-\u002FMassenendpunkt-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Breite Abfragen geben nur autorisierte Mandantendaten zurück\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Cache-Wiederverwendungstest\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Zwei Mandanten, die wiederverwendete Prozesse\u002FVerbindungen nutzen, erhalten niemals den zwischengespeicherten Zustand des jeweils anderen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RLS-Anfrage-Rollen-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Die Produktionsanfrage-Rolle kann Zeilenrichtlinien nicht umgehen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Asynchroner Worker-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Der Mandantenkontext überlebt die Warteschlange und wird bei der Verarbeitung erneut validiert\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Vektorabruf-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Die Abfrage von Mandant A ruft niemals Chunks von Mandant B ab\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Plattform-Admin-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenübergreifende Fähigkeiten sind explizit, eng begrenzt und auditierbar\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Offboarding-Test\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantendaten und abgeleitete Indizes\u002FCaches werden gemäß Richtlinie entfernt\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Die Autorisierungs-Regressionsrichtlinie von OWASP hebt speziell mandantenübergreifende Grenztests hervor, weil Codeänderungen an Caching, Abfragen oder gemeinsamen Diensten die Isolation stillschweigend brechen können, selbst wenn Rollentests weiterhin bestehen.\u003C\u002Fp>\n\u003Ch2 id=\"section-101\">Häufige Fehlermodi\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Fehlermodus\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Warum er fehlschlägt\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rolle prüfen, aber nicht Mandant\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Eine gültige Rolle wird zu mandantenübergreifender Autorität\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandanten-ID aus der Anfrage vertrauen\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Der Client kontrolliert den Isolationsselektor\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">UI einschränken, aber nicht API\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Versteckte Schaltflächen schützen keine Backend-Ressourcen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenbewusster Detailendpunkt, nicht bereichsbezogener Listenendpunkt\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Massenlesevorgänge leaken andere Mandanten\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenfilter in den meisten Abfragen\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ein vergessener Pfad bricht die Grenze\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Globale Cache-Schlüssel\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Korrekte Datenbankisolation wird durch zwischengespeicherte Daten umgangen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Gemeinsamer Vektorindex ohne erzwungene Metadatenfilter\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RAG ruft Chunks eines anderen Mandanten ab\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandanten-ID in Warteschlangennachricht als Autorisierung behandelt\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ein gefälschter oder falsch erzeugter Job kann die Mandantengrenze überschreiten\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Plattform-Admin als gewöhnlicher ADMIN modelliert\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenübergreifende Macht wird implizit und schwer auditierbar\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rolle global über Mandantenmitgliedschaften kopiert\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Benutzer erhält Berechtigungen in Mandanten, in denen er nie zugewiesen wurde\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separate Datenbanken, aber gemeinsam genutzte privilegierte Anmeldeinformationen\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Die Anwendung kann weiterhin Datenbanken überschreiten, wenn ihre Anmeldeinformationen zu weit gefasst sind\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RLS mit BYPASSRLS-Anfrage-Rolle\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Die Datenbankrichtlinie existiert, schützt aber nicht den tatsächlichen Anfragepfad\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Zufällige UUIDs als Isolation behandelt\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Schwer zu erratende Identifikatoren reduzieren Enumeration, autorisieren aber keinen Zugriff\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-103\">Häufige Missverständnisse\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Missverständnis\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Korrektur\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„RBAC bietet Mandantentrennung.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RBAC steuert Berechtigungen; Isolation erfordert auch Mandanten-\u002FRessourcenbereich.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Wenn der Benutzer ein Admin ist, sind Mandantenprüfungen unnötig.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Admin-Autorität muss weiterhin einen expliziten Bereich haben.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Mandanten-ID im JWT reicht aus.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sie kann nur dann eine vertrauenswürdige Eingabe sein, wenn sie validiert und konsistent auf jeden geschützten Ressourcenpfad angewendet wird.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Separate Datenbanken entfernen Autorisierungsanforderungen.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Benutzer benötigen weiterhin Berechtigungen auf Operationsebene innerhalb ihres Mandanten.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Eine tenant_id-Spalte bedeutet, dass das System isoliert ist.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Das Feld hilft nur, wenn Zugriffspfade es durchsetzen.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„UUIDs verhindern mandantenübergreifenden Zugriff.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Unvorhersehbare Identifikatoren sind Defense in Depth, keine Autorisierung.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„RLS bedeutet, dass Anwendungscode keine Sicherheitsprüfungen benötigt.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Anwendungsautorisierung, korrekte DB-Rollen und Richtlinienabdeckung sind weiterhin wichtig.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Eine gemeinsame Vektor-DB ist unsicher.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sie kann sicher sein, wenn Isolation durchsetzbar und verifiziert ist; physische Trennung ist eine Option, nicht die einzige.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Plattform-Support benötigt globales ADMIN.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenübergreifender Support sollte eine eigenständige, eingeschränkte und auditierbare Autorität sein.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Interne Dienste können Mandantenprüfungen überspringen.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Interne Pfade können weiterhin kompromittiert oder falsch konfiguriert sein und müssen den Mandantenkontext bewahren.\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-105\">Eine praktische Entwurfssequenz\u003C\u002Fh2>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Berechtigungen und Isolation als separate Dimensionen entwerfen\u003C\u002Fh3>\u003Cdiv class=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4\">\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">1\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">1. Mandanteneigentum definieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Klassifizieren Sie, welche Entitäten und Ressourcen global, mandantenbezogen, benutzerbezogen oder absichtlich mandantenübergreifend sind.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">2\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">2. Operationen definieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Erstellen Sie explizite Berechtigungen für Lesevorgänge, Schreibvorgänge, Veröffentlichung, Genehmigungen, Administration und andere Geschäftsaktionen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">3\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">3. Rollen definieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Gruppieren Sie Berechtigungen nach Verantwortlichkeiten, ohne versehentlich globalen Bereich einzubetten.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">4\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">4. Mitgliedschaftsbereich definieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Binden Sie Rollenzuweisungen an den Mandanten-\u002FWorkspace-\u002FProjektkontext, in dem sie gelten.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">5\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">5. Vertrauenswürdigen Mandantenkontext auflösen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Leiten Sie die Mandantenidentität aus authentifizierter, serverseitig verifizierter Mitgliedschaft oder Dienstautorisierung ab.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">6\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">6. Ressourceneigentum durchsetzen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Wenden Sie den Mandantenbereich an jeder mandanteneigenen Daten-\u002FDienstgrenze an.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">7\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">7. Defense in Depth hinzufügen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Verwenden Sie RLS, separate Anmeldeinformationen, Schemas\u002FDatenbanken, Speicherrichtlinien oder Richtlinien-Engines, wo das Risiko sie rechtfertigt.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">8\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">8. Bereich durch abgeleitete Systeme tragen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Bewahren Sie Mandantenmetadaten in Cache, Suche, Vektorindizes, Warteschlangen, Dateien und Analysen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">9\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">9. Mandantenübergreifende Operationen explizit modellieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Trennen Sie Plattformadministration und Dienstidentitäten von gewöhnlichen Mandantenrollen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">10\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">10. Beide Achsen testen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Führen Sie Negativtests für fehlende Berechtigung und für falschen Mandanten unabhängig voneinander durch.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">11\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">11. Mandant + Berechtigung zusammen auditieren\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Protokollieren Sie, wer gehandelt hat, in welchem Mandanten, auf welches Ziel und unter welcher Autorität.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv class=\"editorjs-process__step min-w-0  rounded-xl border border-gray-200 dark:border-gray-700 p-4\">\u003Cdiv class=\"text-xs font-semibold text-gray-500 dark:text-gray-400\">12\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 font-semibold text-gray-900 dark:text-gray-100\">12. Nach Schema-\u002FLaufzeitänderungen erneut testen\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Isolation kann brechen, wenn neue Tabellen, Caches, Warteschlangen oder Abrufpfade eingeführt werden.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-107\">RBAC + Mandantentrennungs-Checkliste\u003C\u002Fh2>\n\u003Cdiv class=\"overflow-x-auto\">\u003Ctable class=\"w-full border-collapse\">\u003Cthead>\u003Ctr>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Frage\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Erwartete Antwort\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Wer ist der Prinzipal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Authentifizierte Benutzer-\u002FDienst-\u002FAgentenidentität\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Welcher Mandantenkontext gilt?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Serverseitig verifizierte Mitgliedschaft oder Dienstbereich\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Welche Operation wird angefordert?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Typisierte Berechtigung oder Richtlinienaktion\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Hat der Prinzipal diese Berechtigung?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rollen-\u002FRichtlinienentscheidung\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Wem gehört die Zielressource?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Explizite Mandanten-\u002FGlobal-\u002FBenutzerklassifizierung\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Entspricht der Ressourcenbereich der Autorität?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mandantenbewusster Lookup\u002FRichtlinie\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Kann der Speicher Anwendungsprüfungen umgehen?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Defense-in-Depth-Entscheidung dokumentiert\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sind Caches mandantensicher?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Schlüssel\u002FNamespaces und Autorisierung bewahren den Mandantenbereich\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sind Dateien\u002FBlobs mandantensicher?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Objektrichtlinie und Ausstellung signierter URLs erzwingen den Bereich\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sind asynchrone Jobs mandantensicher?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verifizierter Kontext wird weitergegeben und erneut validiert\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ist RAG\u002FSuche mandantensicher?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Metadaten-\u002FSammlungsisolation wird vor dem Modellkontext erzwungen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sind mandantenübergreifende Admins explizit?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separate Autorität, Kontrollen und Audit\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Können gewöhnliche Anmeldeinformationen die Isolation umgehen?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Nein, oder eng dokumentierter Ausnahmepfad\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sind negative mandantenübergreifende Tests automatisiert?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ja für jede relevante Zugriffsebene\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-109\">Edge Cases und Einschränkungen\u003C\u002Fh2>\n\u003Cp>Ein Benutzer kann mehreren Mandanten angehören. Der aktuelle Mandant sollte daher ein expliziter Ausführungskontext sein und nicht dauerhaft aus dem Benutzerkonto abgeleitet werden.\u003C\u002Fp>\n\u003Cp>Einige Ressourcen werden absichtlich zwischen ausgewählten Mandanten geteilt, wie z. B. Kollaborationsräume oder Konsortialdaten. Dies erfordert ein explizites Freigabemodell; vorzugeben, die Ressource gehöre zu einem Mandanten, und später Ausnahmen hinzuzufügen, führt in der Regel zu mehrdeutiger Autorisierung.\u003C\u002Fp>\n\u003Cp>Noisy-Neighbor-Isolation ist verwandt, aber anders als Vertraulichkeitsisolation. Ein Mandant darf niemals die Daten eines anderen Mandanten sehen und kann dennoch gemeinsame CPU, Warteschlangenkapazität oder Datenbankverbindungen erschöpfen. Rate Limits und Ressourcenkontingente können daher als Verfügbarkeitsgrenze mandantenbewusst sein.\u003C\u002Fp>\n\u003Cp>Physische Isolation ist nicht automatisch sicher, wenn Control-Plane-Anmeldeinformationen oder administrative Pfade Grenzen überschreiten können. Logische Isolation ist nicht automatisch schwach, wenn Richtlinien zentral durchgesetzt, mit minimalen Rechten versehen und gründlich getestet werden.\u003C\u002Fp>\n\u003Cp>Die Anforderungen an die Mandantenisolation können je nach Datenklasse unterschiedlich sein. Öffentliche Katalogdaten, Abrechnungsdatensätze und private KI-Dokumente können unterschiedliche Speicher- und Verschlüsselungsgrenzen innerhalb desselben SaaS-Produkts rechtfertigen.\u003C\u002Fp>\n\u003Ch2 id=\"section-115\">Was würde diese Antwort ändern?\u003C\u002Fh2>\n\u003Cp>Die genaue Implementierung ändert sich mit der Architektur: Serverless-APIs, Kubernetes, PostgreSQL, Objektspeicher, Vektordatenbanken und Policy Engines bieten unterschiedliche Isolationsprimitive.\u003C\u002Fp>\n\u003Cp>Die erforderliche Stärke ändert sich auch mit Regulierung, Kundenverträgen, Datensensibilität, Bedrohungsmodell und operativer Skalierung. Einige Mandanten können isolierte Datenbanken oder Infrastruktur rechtfertigen, während andere gemeinsam genutzte Ressourcen teilen.\u003C\u002Fp>\n\u003Cp>Die konzeptionelle Unterscheidung ändert sich nicht: Die Berechtigung zur Durchführung einer Operation ist nicht dasselbe wie die Berechtigung, eine Mandantengrenze zu überschreiten.\u003C\u002Fp>\n\u003Ch2 id=\"section-119\">Verwandtes kanonisches Wissen\u003C\u002Fh2>\n\u003Cp>S01 ist eine Voraussetzung für Sicherheitsgrenzen in Enterprise AI Architecture und AI Governance. Sobald KI-Tools, RAG oder Agenten über mandantenfähige Daten arbeiten, muss die Mandantenidentität durch Retrieval, Tool-Ausführung, Speicher, Caches und Audit-Traces wandern.\u003C\u002Fp>\n\u003Cp>Es verbindet sich auch direkt mit Agentic AI: Tool-Fähigkeiten und Rollenberechtigungen müssen weiterhin durch den Mandantenbesitz eingeschränkt werden, bevor ein Agent Geschäftsressourcen lesen oder verändern kann.\u003C\u002Fp>\n\u003Caside class=\"editorjs-referral my-6\">\u003Ca href=\"https:\u002F\u002Fstajic.de\u002Fde\u002Fblog\u002Fmcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained\" class=\"flex flex-col sm:flex-row gap-4 rounded-xl border border-gray-200 dark:border-gray-700 p-4 transition hover:border-primary-500\">\u003Cdiv class=\"min-w-0 flex-1\">\u003Cstrong class=\"block text-lg text-gray-900 dark:text-gray-100\">MCP vs A2A vs UCP vs AP2 vs A2UI: Der Agent Protocol Stack erklärt\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">Protokollinteroperabilität ersetzt nicht Autorisierung oder Mandantenisolation. Fähigkeitserkennung und Geschäftsautorität bleiben getrennte Architekturanliegen.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Lesen Sie den Artikel zum Protokollstapel →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Cp>Für RAG muss die Mandantenisolation durchgesetzt werden, bevor geschützte Chunks den Modellkontext erreichen.\u003C\u002Fp>\n\u003Caside class=\"editorjs-referral my-6\">\u003Ca href=\"https:\u002F\u002Fstajic.de\u002Fde\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works\" class=\"flex flex-col sm:flex-row gap-4 rounded-xl border border-gray-200 dark:border-gray-700 p-4 transition hover:border-primary-500\">\u003Cdiv class=\"min-w-0 flex-1\">\u003Cstrong class=\"block text-lg text-gray-900 dark:text-gray-100\">Was ist RAG? Die einfachste Erklärung, wie es funktioniert\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">Die Retrieval-Grundlage zum Verständnis, wo mandantenbewusste Quellenfilterung und Vektorspeicherisolation durchgesetzt werden müssen.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Lesen Sie die RAG-Grundlagen →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Ch2 id=\"section-125\">Häufig gestellte Fragen\u003C\u002Fh2>\n\u003Csection class=\"editorjs-faq my-6 rounded-xl border border-gray-200 p-5 dark:border-gray-700\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">RBAC vs Mandantenisolation FAQ\u003C\u002Fh3>\u003Cdiv id=\"faq1\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Was ist der Unterschied zwischen RBAC und Mandantenisolation?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RBAC bestimmt, welche Operationen ein Prinzipal ausführen darf. Mandantenisolation bestimmt, auf welche Ressourcen welches Mandanten diese Operationen zugreifen dürfen. Sichere mandantenfähige Anwendungen benötigen normalerweise beides.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq2\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Erlaubt eine ADMIN-Rolle automatisch den Zugriff auf alle Mandanten?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Nein. ADMIN sollte einen expliziten Geltungsbereich haben. Ein Mandantenadministrator hat normalerweise nur innerhalb dieses Mandanten umfassende Berechtigungen, während mandantenübergreifende Plattformadministration separat modelliert werden sollte.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq3\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Reicht Authentifizierung für die Mandantenisolation aus?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Nein. Authentifizierung beweist Identität. Autorisierung kontrolliert erlaubte Aktionen. Mandantenisolation verhindert zusätzlich, dass diese Aktionen die Ressourcen des falschen Mandanten erreichen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq4\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Sollte tenantId im JWT gespeichert werden?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Es kann eine Eingabe für den Mandantenkontext sein, aber der Server muss die aktuelle Mitgliedschaft\u002FBerechtigung überprüfen und den Geltungsbereich an geschützten Ressourcengrenzen durchsetzen. Ein Anspruch allein ersetzt keine Isolationskontrollen.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq5\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Brauche ich eine separate Datenbank pro Mandant?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Nicht unbedingt. Gemeinsame Tabellen, RLS, Schema-, Datenbank-, Infrastruktur- und hybride Isolationsmodelle können je nach Risiko und betrieblichen Anforderungen alle gültig sein.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq6\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Kann PostgreSQL RLS Mandantenfilters im Anwendungscode ersetzen?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RLS kann eine starke Verteidigung in der Tiefe bieten, aber korrekte Datenbankrollen, Anforderungskontext, Richtlinienabdeckung und Autorisierung auf Anwendungsebene sind weiterhin wichtig.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq7\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Wie sollte RAG die Mandantenisolation durchsetzen?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Der Mandanten-\u002FZugriffsbereich sollte während des Retrievals durchgesetzt werden, damit nicht autorisierte Chunks niemals in den Modellkontext gelangen. Bewahren Sie Zugriffsmetadaten durch Chunking und Indexierung.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq8\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Kann ein Benutzer in verschiedenen Mandanten unterschiedliche Rollen haben?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Ja. Dies ist in B2B-SaaS üblich und ein starker Grund, Rollenzuweisungen nach Mandantenzugehörigkeit zu skalieren, anstatt Rollen als global an den Benutzer gebunden zu behandeln.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cdiv id=\"faq9\" class=\"border-t border-gray-200 py-4 first:border-t-0 dark:border-gray-700\">\u003Ch4 class=\"font-semibold text-gray-900 dark:text-gray-100\">Was ist der beste Test für Mandantenisolation?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Verwenden Sie negative mandantenübergreifende Tests: Erstellen Sie mindestens zwei Mandanten, geben Sie einem Benutzer gültige Berechtigungen in einem Mandanten und beweisen Sie dann, dass jeder geschützte Pfad den Zugriff auf die Ressourcen des anderen Mandanten verweigert.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-127\">Glossar\u003C\u002Fh2>\n\u003Csection class=\"editorjs-glossary my-6 rounded-xl border border-gray-200 dark:border-gray-700 p-5\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Wichtige Begriffe der mandantenfähigen Sicherheit\u003C\u002Fh3>\u003Cdl>\u003Cdiv id=\"rbac\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">RBAC\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Role-Based Access Control: ein Autorisierungsmodell, das Berechtigungen mit Rollen verknüpft und Benutzer oder Prinzipale diesen Rollen zuweist.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"tenant\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Mandant\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Ein Kunde, eine Organisation, ein Arbeitsbereich oder ein anderer isolierter logischer Konsument eines gemeinsam genutzten mandantenfähigen Systems.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"tenant-isolation\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Mandantenisolierung\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Mechanismen, die verhindern, dass ein Mandant auf die Ressourcen eines anderen Mandanten in einem gemeinsam genutzten System zugreift, sie ändert oder erhält.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"authentication\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Authentifizierung\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Überprüfung der Identität eines Benutzers, Dienstes oder eines anderen Prinzipals.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"authorization\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Autorisierung\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Entscheidungsprozess, der festlegt, ob ein Prinzipal eine angeforderte Operation an einer Ressource ausführen darf.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"permission\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Berechtigung\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Eine definierte erlaubte Operation oder Fähigkeit wie orders.read oder users.write.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"role\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Rolle\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Eine benannte Gruppierung von Berechtigungen, die einer Verantwortlichkeit oder Funktion zugeordnet ist.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"abac\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">ABAC\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Attribute-Based Access Control: Autorisierung basierend auf Attributen des Prinzipals, der Ressource, der Aktion oder der Umgebung.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"row-level-security\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Row-Level Security\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Datenbankrichtlinienmechanismus, der einschränkt, welche Zeilen eine Datenbankrolle oder Sitzung lesen oder ändern darf.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"cross-tenant-access\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Mandantenübergreifender Zugriff\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Jeder Zugriffspfad, bei dem ein Prinzipal, der unter einem Mandantenkontext arbeitet, Ressourcen erreicht, die einem anderen Mandanten gehören.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"platform-administrator\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Plattformadministrator\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Eine privilegierte operative Identität mit explizit modellierter Autorität, die mehrere Mandanten umfassen kann.\u003C\u002Fdd>\u003C\u002Fdiv>\u003Cdiv id=\"tenant-context\" class=\"border-t border-gray-200 dark:border-gray-700 py-3 first:border-t-0\">\u003Cdt class=\"font-semibold text-gray-900 dark:text-gray-100\">Mandantenkontext\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Der verifizierte Mandantenbereich, unter dem die aktuelle Anfrage, der Job oder die Agentenoperation ausgeführt wird.\u003C\u002Fdd>\u003C\u002Fdiv>\u003C\u002Fdl>\u003C\u002Fsection>\n\u003Ch2 id=\"section-129\">Fazit\u003C\u002Fh2>\n\u003Cp>RBAC und Mandantenisolierung sind komplementäre, nicht konkurrierende Sicherheitsmechanismen. RBAC strukturiert operative Berechtigungen; Mandantenisolierung beschränkt die Ressourcengrenze, innerhalb derer diese Berechtigung gelten kann.\u003C\u002Fp>\n\u003Cp>Eine robuste mandantenfähige Anfrage benötigt daher mehr als „Benutzer hat Rolle ADMIN“. Sie benötigt einen verifizierten Prinzipal, einen verifizierten Mandantenkontext, eine erlaubte Operation, ein mandantenbezogenes Ziel und Durchsetzung auf jeder Ressourcenschicht, die mandanteneigene Daten tragen kann.\u003C\u002Fp>\n\u003Cp>Die kürzeste zuverlässige Regel lautet: Autorisieren Sie die Aktion, dann isolieren Sie den Bereich — und nehmen Sie niemals an, dass eines das andere beweist.\u003C\u002Fp>\n\u003Ch2 id=\"section-133\">Primärquellen und aktuelle Leitlinien\u003C\u002Fh2>\n\u003Cp>Die folgenden Quellen stützen die RBAC-Definition und die aktuellen Leitlinien zur Mandantenisolierung. Der Abschnitt zum Aaasaasa AI CMS ist ursprüngliche Implementierungsnachweis und ist absichtlich auf die verifizierten Codemuster beschränkt.\u003C\u002Fp>\n\u003Ca href=\"https:\u002F\u002Fcsrc.nist.gov\u002Fprojects\u002Frole-based-access-control\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">NIST — Role Based Access Control\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">NIST-Überblick über RBAC-Modelle und den INCITS-RBAC-Standard, einschließlich Benutzer, Rollen, Berechtigungen, Operationen und Objekte.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcsrc.nist.gov\u002Fglossary\u002Fterm\u002Frole_based_access_control\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">NIST CSRC — RBAC-Glossar\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle NIST-Glossardefinitionen von rollenbasierter Zugriffskontrolle als Berechtigungszuweisung durch Rollen.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fwhitepapers\u002Flatest\u002Fsaas-tenant-isolation-strategies\u002Fthe-isolation-mindset.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">AWS — Die Isolationsmentalität\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">AWS-SaaS-Leitlinien, die ausdrücklich Authentifizierung\u002FAutorisierung von Mandantenisolierung unterscheiden und gemeinsame Isolationsmechanismen empfehlen.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Ffaq.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">AWS — FAQ zur mandantenfähigen Autorisierung\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle Leitlinien, die den Unterschied zwischen Autorisierung und Mandantenisolierung in SaaS-Anwendungen erklären.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Favp-design-considerations.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">AWS — Überlegungen zum mandantenfähigen Design\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle SaaS-Leitlinien, die Mandantenisolierung von Autorisierung unterscheiden und pooled\u002Fsiloed Autorisierungsrichtlinienmodelle diskutieren.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FMulti_Tenant_Security_Cheat_Sheet.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">OWASP — Multi-Tenant Application Security Cheat Sheet\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle praktische Leitlinien für Mandantenkontext, Datenbankisolierung, Caches, Speicher, Warteschlangen, Tests und Verhinderung mandantenübergreifenden Zugriffs.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FRAG_Security_Cheat_Sheet.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">OWASP — RAG Security Cheat Sheet\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle Leitlinien, die Zugriffskontrolle zum Abrufzeitpunkt und Mandantenisolierung für mandantenfähige Vektorspeicher erfordern.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FAuthorization_Regression_Testing_Cheat_Sheet.html\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">OWASP — Autorisierungs-Regressionstests\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelle Testleitlinien einschließlich Rollenherabsetzung und mandantenübergreifenden Grenztests.\u003C\u002Fp>\u003C\u002Fa>",{"time":211,"blocks":212,"version":1409},1791485177846,[213,219,227,234,241,249,254,259,264,269,274,279,284,289,294,299,304,309,335,340,345,350,355,360,400,405,425,430,435,440,445,450,455,460,465,470,475,480,497,502,507,512,517,524,529,562,567,572,577,582,587,592,597,602,607,612,617,622,627,632,637,642,647,652,657,662,667,673,678,683,688,693,698,703,708,713,718,723,728,733,738,743,748,753,785,790,796,801,806,811,816,821,847,853,858,863,868,873,878,916,921,926,973,978,1016,1021,1063,1068,1117,1122,1127,1132,1137,1142,1147,1152,1157,1162,1167,1172,1177,1182,1191,1196,1204,1209,1251,1256,1306,1311,1316,1321,1326,1331,1336,1346,1355,1364,1373,1382,1391,1400],{"id":214,"data":215,"type":217,"tunes":218},"intro",{"text":216},"RBAC und Mandantentrennung lösen zwei unterschiedliche Sicherheitsprobleme in Multi-Tenant-Systemen. Role-Based Access Control (RBAC) bestimmt, was ein authentifizierter Principal tun darf, z. B. Bestellungen lesen, Produkte bearbeiten oder Benutzer verwalten. Mandantentrennung bestimmt, auf die Daten, Ressourcen und den Ausführungskontext welches Mandanten dieser Principal zugreifen darf. Ein Benutzer kann korrekt authentifiziert und korrekt einer RBAC-Rolle zugewiesen sein und dennoch einen Sicherheitsfehler erleben, wenn die Anwendung dieser Rolle erlaubt, auf Ressourcen eines anderen Mandanten zuzugreifen.","paragraph",{},{"id":220,"data":221,"type":225,"tunes":226},"direct",{"body":222,"title":223,"variant":224},"\u003Cstrong>RBAC beantwortet „Was darf diese Identität tun?“ Mandantentrennung beantwortet „Innerhalb welcher Grenze darf sie es tun?“\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Eine sichere Multi-Tenant-Anwendung benötigt normalerweise beides. Ein Mandantenadministrator kann weitreichende Berechtigungen haben, aber diese Berechtigungen sollten auf den Mandanten des Administrators beschränkt bleiben, es sei denn, es existiert eine explizit separate Autorität auf Plattformebene.","Direkte Antwort","info","callout",{},{"id":228,"data":229,"type":225,"tunes":233},"boundary",{"body":230,"title":231,"variant":232},"Einem Benutzer die Rolle \u003Ccode>ADMIN\u003C\u002Fcode> zu geben, impliziert nicht automatisch „Administrator nur von Mandant A“. Die Rolle muss zusammen mit dem verifizierten Mandantenkontext und der Mandantenzugehörigkeit der Zielressource bewertet werden. Andernfalls kann eine gültige Rolle zu einem mandantenübergreifenden Privileg werden.","Eine Rolle ist keine Mandantengrenze","warning",{},{"id":235,"data":236,"type":225,"tunes":240},"current",{"body":237,"title":238,"variant":239},"Die zugrunde liegende Unterscheidung ist stabil. NIST definiert RBAC anhand von Benutzern, Rollen, Berechtigungen, Operationen und Objekten. Die aktuelle AWS-SaaS-Richtlinie stellt ausdrücklich fest, dass Authentifizierung und Autorisierung nicht gleichbedeutend mit Mandantentrennung sind und dass ein Benutzer authentifiziert und autorisiert sein kann, während er dennoch auf Ressourcen eines anderen Mandanten zugreift, wenn die Trennung nicht separat durchgesetzt wird. Die aktuelle Multi-Tenant-Security-Richtlinie von OWASP behandelt Mandantentrennung ebenfalls als eine Anforderung über alle Schichten hinweg, die APIs, Datenbanken, Caches, Speicher, Warteschlangen und andere gemeinsam genutzte Ressourcen abdeckt.","Hinweis zu aktuellen Quellen — 8. Oktober 2026","note",{},{"id":242,"data":243,"type":247,"tunes":248},"toc",{"title":244,"maxLevel":245,"minLevel":246},"Inhalt",3,2,"tableOfContents",{},{"id":250,"data":251,"type":41,"tunes":253},"h-meaning",{"text":252,"level":246},"Was RBAC wirklich steuert",{},{"id":255,"data":256,"type":217,"tunes":258},"p-rbac-1",{"text":257},"RBAC ist ein Autorisierungsmodell, bei dem Berechtigungen mit Rollen verknüpft und Benutzer diesen Rollen zugewiesen werden. Die Rolle fungiert als administrative Abstraktion zwischen Identitäten und Berechtigungen.",{},{"id":260,"data":261,"type":217,"tunes":263},"p-rbac-2",{"text":262},"Die klassische RBAC-Arbeit von NIST formalisiert dies anhand von Benutzern, Rollen, Berechtigungen, Operationen und Objekten. Der praktische Nutzen besteht darin, dass eine Organisation die Autorisierung über relativ stabile Job- oder Verantwortungsrollen verwalten kann, anstatt jede Berechtigung direkt an jeden Benutzer zu knüpfen.",{},{"id":265,"data":266,"type":217,"tunes":268},"p-rbac-3",{"text":267},"Eine Rolle wie EDITOR kann daher bedeuten: darf Inhalte lesen, Inhalte schreiben und Inhalte veröffentlichen. Eine Rolle wie ACCOUNTANT kann bedeuten: darf Abrechnungsdaten lesen, Rechnungen abstimmen und Abrechnungen genehmigen.",{},{"id":270,"data":271,"type":41,"tunes":273},"h-tenant",{"text":272,"level":246},"Was Mandantentrennung wirklich steuert",{},{"id":275,"data":276,"type":217,"tunes":278},"p-tenant-1",{"text":277},"Mandantentrennung ist die Gesamtheit der Mechanismen, die verhindern, dass ein Mandant die Ressourcen eines anderen Mandanten in einem gemeinsam genutzten System liest, verändert, beeinflusst oder versehentlich erhält.",{},{"id":280,"data":281,"type":217,"tunes":283},"p-tenant-2",{"text":282},"Die geschützte Grenze ist breiter als Datenbankzeilen. Mandantenspezifischer Zustand kann in relationalen Tabellen, Objektspeichern, Vektorindizes, Caches, Suchindizes, Warteschlangennachrichten, Dateien, temporären Artefakten, Hintergrundjobs, Analysen, Ratenbegrenzungen und Infrastrukturressourcen existieren.",{},{"id":285,"data":286,"type":217,"tunes":288},"p-tenant-3",{"text":287},"Die SaaS-Richtlinie von AWS macht die Unterscheidung explizit: Autorisierung gewährt Zugriff auf Ressourcen, während Mandantentrennung sicherstellt, dass diese Ressourcen die falsche Mandantengrenze nicht überschreiten können, selbst wenn die Infrastruktur gemeinsam genutzt wird.",{},{"id":290,"data":291,"type":41,"tunes":293},"h-simple",{"text":292,"level":246},"Das einfachste Beispiel",{},{"id":295,"data":296,"type":217,"tunes":298},"p-simple-1",{"text":297},"Angenommen, Alice ist Administratorin für Mandant A und Bob ist Administrator für Mandant B. Beide Benutzer haben legitimerweise dieselbe ADMIN-Rolle.",{},{"id":300,"data":301,"type":217,"tunes":303},"p-simple-2",{"text":302},"RBAC kann korrekt zu dem Schluss kommen, dass beide Benutzer eine Operation wie users.read ausführen dürfen. Wenn Alice jedoch Benutzer-ID 847 anfordert, muss die Anwendung dennoch überprüfen, ob Benutzer 847 zu Mandant A gehört.",{},{"id":305,"data":306,"type":217,"tunes":308},"p-simple-3",{"text":307},"Wenn die API nur prüft „Alice hat ADMIN“ und dann SELECT * FROM users WHERE id = 847 ausführt, war RBAC erfolgreich, während die Mandantentrennung fehlgeschlagen ist.",{},{"id":310,"data":311,"type":333,"tunes":334},"simple-flow",{"steps":312,"title":331,"orientation":332},[313,316,319,322,325,328],{"label":314,"description":315},"1. Principal authentifizieren","Feststellen, wer der Benutzer, Dienst oder Agent ist.",{"label":317,"description":318},"2. Verifizierten Mandantenkontext auflösen","Bestimmen, welcher Mandantenkontext gilt, anhand vertrauenswürdiger serverseitiger Identitäts-\u002FMitgliedschaftsinformationen.",{"label":320,"description":321},"3. Berechtigung auflösen","Bewerten, ob die Rolle oder Richtlinie des Principals die angeforderte Operation erlaubt.",{"label":323,"description":324},"4. Zielressource eingrenzen","Überprüfen, ob das Zielobjekt zum erlaubten Mandanten oder explizit gemeinsam genutzten Bereich gehört.",{"label":326,"description":327},"5. An der Zugriffsgrenze durchsetzen","Die Datenbank-, Cache-, Speicher-, Warteschlangen- oder Dienstoperation mit angewendeten Mandanteneinschränkungen ausführen.",{"label":329,"description":330},"6. Beide Dimensionen prüfen","Principal, Mandant, Operation, Ziel und Ergebnis aufzeichnen, damit mandantenübergreifende Versuche sichtbar sind.","Eine korrekte Multi-Tenant-Autorisierungsentscheidung","auto","processFlow",{},{"id":336,"data":337,"type":41,"tunes":339},"h-stops",{"text":338,"level":246},"Wo das einfache Beispiel an seine Grenzen stößt",{},{"id":341,"data":342,"type":217,"tunes":344},"p-stops-1",{"text":343},"Reale Systeme enthalten oft mehrere Identitätsklassen: Mandantenbenutzer, Plattformadministratoren, Hintergrundprozesse, Integrationen, Agenten und mandantenübergreifende Betriebsdienste. Einige davon überschreiten legitim Mandantengrenzen.",{},{"id":346,"data":347,"type":217,"tunes":349},"p-stops-2",{"text":348},"Das beseitigt nicht die Notwendigkeit der Isolation. Es bedeutet, dass mandantenübergreifende Berechtigungen explizit, eng begrenzt und separat prüfbar sein müssen, anstatt versehentlich aus einer globalen Rolle oder einer nicht eingegrenzten Datenbankverbindung zu entstehen.",{},{"id":351,"data":352,"type":217,"tunes":354},"p-stops-3",{"text":353},"Die Mandantenisolation kann auch je nach Ebene variieren. Ein Produkt kann Anwendungsserver gemeinsam nutzen und gleichzeitig Datenbanken trennen oder eine gemeinsame Datenbank mit zeilenbasierten Richtlinien verwenden und Premium-Mandanten isolierten Speicher oder Rechenleistung bieten. Es gibt keine einzige universelle Isolations-Topologie.",{},{"id":356,"data":357,"type":41,"tunes":359},"h-compare",{"text":358,"level":246},"RBAC vs. Mandantenisolation",{},{"id":361,"data":362,"type":398,"tunes":399},"core-comparison",{"rows":363,"title":389,"layout":390,"columns":391},[364,369,373,377,381,385],{"id":365,"label":366,"values":367},"question","Hauptfrage",[368,368],"",{"id":370,"label":371,"values":372},"unit","Typische Einheit",[368,368],{"id":374,"label":375,"values":376},"example","Beispiel",[368,368],{"id":378,"label":379,"values":380},"failure","Typisches Versagen",[368,368],{"id":382,"label":383,"values":384},"implementation","Typische Implementierung",[368,368],{"id":386,"label":387,"values":388},"scope","Kann es allein existieren?",[368,368],"Zwei verschiedene Sicherheitsdimensionen","table",[392,395],{"id":393,"label":394},"rbac","RBAC",{"id":396,"label":397},"tenant","Mandantenisolation","comparison",{},{"id":401,"data":402,"type":41,"tunes":404},"h-authn",{"text":403,"level":246},"Authentifizierung, Autorisierung und Isolation sind drei verschiedene Prüfungen",{},{"id":406,"data":407,"type":390,"tunes":424},"three-checks",{"content":408,"stretched":42,"withHeadings":13},[409,413,417,421],[410,411,412],"Ebene","Frage","Beispiel für Versagen",[414,415,416],"Authentifizierung","Wer ist dieser Prinzipal?","Angreifer gibt sich als Alice aus",[418,419,420],"Autorisierung \u002F RBAC","Darf dieser Prinzipal diese Operation ausführen?","Betrachter kann Benutzer löschen",[397,422,423],"Darf diese Operation diese Mandanten-\u002FRessourcengrenze erreichen?","Mandant-A-Administrator liest Bestellung von Mandant B",{},{"id":426,"data":427,"type":217,"tunes":429},"p-authn-1",{"text":428},"Diese Prüfungen sind miteinander verbunden, aber nicht gegenseitig ersetzbar. Die Authentifizierung kann perfekt sein, während die Autorisierung fehlschlägt. Die Autorisierung kann korrekt sein, während die Mandantenisolation fehlschlägt. Ein sicherer SaaS-Anfragepfad benötigt alle anwendbaren Grenzen.",{},{"id":431,"data":432,"type":41,"tunes":434},"h-role-scope",{"text":433,"level":246},"Rollen brauchen einen Geltungsbereich",{},{"id":436,"data":437,"type":217,"tunes":439},"p-role-scope-1",{"text":438},"Das Wort ADMIN ist ohne Geltungsbereich unvollständig. Es kann Plattformadministrator, Mandantenadministrator, Projektadministrator, Arbeitsbereichsadministrator oder Administrator eines Subsystems bedeuten.",{},{"id":441,"data":442,"type":217,"tunes":444},"p-role-scope-2",{"text":443},"In Multi-Mandanten-Systemen sollte die Rollenzuweisung normalerweise mit der Mandantenmitgliedschaft oder einem anderen expliziten Ressourcenbereich verknüpft sein. Derselbe Benutzer kann legitim ADMIN in Mandant A und VIEWER in Mandant B sein.",{},{"id":446,"data":447,"type":217,"tunes":449},"p-role-scope-3",{"text":448},"Ein globales Rollenmodell, das diese Unterscheidung ignoriert, kann zu Berechtigungslecks führen, selbst wenn die Berechtigungszuordnung selbst korrekt ist.",{},{"id":451,"data":452,"type":41,"tunes":454},"h-context",{"text":453,"level":246},"Der Mandantenkontext muss aus einem vertrauenswürdigen Pfad stammen",{},{"id":456,"data":457,"type":217,"tunes":459},"p-context-1",{"text":458},"Eine vom Client bereitgestellte Mandanten-ID ist als Selektor nützlich, aber sie ist kein Nachweis der Berechtigung. Der Server muss die Mandantenmitgliedschaft anhand der authentifizierten Identität und der aktuellen Autorisierungsdaten ableiten oder überprüfen.",{},{"id":461,"data":462,"type":217,"tunes":464},"p-context-2",{"text":463},"Die aktuelle Multi-Mandanten-Richtlinie von OWASP empfiehlt, den Mandantenkontext früh im Anfragelebenszyklus festzulegen, und warnt ausdrücklich davor, Client-Header oder Anfrageparameter als Autorisierungsnachweis zu behandeln.",{},{"id":466,"data":467,"type":217,"tunes":469},"p-context-3",{"text":468},"Das ist wichtig, weil eine triviale Änderung der Anfrage von tenant=A zu tenant=B nicht ausreichen darf, um die Isolationsgrenze zu überschreiten.",{},{"id":471,"data":472,"type":41,"tunes":474},"h-query",{"text":473,"level":246},"Der Mandantenbereich gehört in die Ressourcensuche",{},{"id":476,"data":477,"type":217,"tunes":479},"p-query-1",{"text":478},"Ein gängiges Isolationsmuster auf Anwendungsebene besteht darin, den Mandantenbereich in dieselbe Abfrage aufzunehmen, die die Ressource auflöst.",{},{"id":481,"data":482,"type":390,"tunes":496},"query-table",{"content":483,"stretched":42,"withHeadings":13},[484,487,490,493],[485,486],"Schwache Suche","Stärkere mandantenbezogene Suche",[488,489],"findFirst({ where: { id } })","findFirst({ where: { id, tenantId } })",[491,492],"UPDATE orders SET ... WHERE id = ?","UPDATE orders SET ... WHERE id = ? AND tenant_id = ?",[494,495],"cache.get('user:' + id)","cache.get('tenant:' + tenantId + ':user:' + id)",{},{"id":498,"data":499,"type":217,"tunes":501},"p-query-2",{"text":500},"Dieses Muster ist nicht der einzige mögliche Isolationsmechanismus, aber es hält die Mandantenzugehörigkeit nahe an der Datenzugriffsoperation und verhindert, dass eine Objekt-ID zu einer mandantenübergreifenden Fähigkeit wird.",{},{"id":503,"data":504,"type":41,"tunes":506},"h-defense",{"text":505,"level":246},"Anwendungsprüfungen sind nützlich, aber die Isolation sollte nicht von perfektem Entwicklerverhalten abhängen",{},{"id":508,"data":509,"type":217,"tunes":511},"p-defense-1",{"text":510},"Die Isolationsrichtlinie von AWS warnt ausdrücklich davor, die Durchsetzung der Isolation nur den Serviceentwicklern zu überlassen. In einer großen Codebasis kann irgendwann eine Abfrage, ein Cache-Schlüssel oder ein Worker-Pfad den Mandantenbereich auslassen.",{},{"id":513,"data":514,"type":217,"tunes":516},"p-defense-2",{"text":515},"Verteidigung in der Tiefe kann die Isolation daher in gemeinsame Middleware, Repository-\u002FService-Schichten, Policy-Engines, Datenbank-Row-Level-Security, dedizierte Anmeldeinformationen, separate Schemas oder separate Datenbanken verlagern, je nach Risiko und Architektur.",{},{"id":518,"data":519,"type":225,"tunes":523},"defense-rule",{"body":520,"title":521,"variant":522},"Die stärkste Grenze ist eine, die gewöhnlicher Anwendungscode nicht beiläufig umgehen kann, indem er eine \u003Ccode>tenantId\u003C\u002Fcode>-Bedingung auslässt.","Isolation sollte schwer zu vergessen sein","success",{},{"id":525,"data":526,"type":41,"tunes":528},"h-db",{"text":527,"level":246},"Datenbank-Isolationsstrategien",{},{"id":530,"data":531,"type":390,"tunes":561},"db-table",{"content":532,"stretched":42,"withHeadings":13},[533,537,541,545,549,553,557],[534,535,536],"Strategie","Grenze","Stärke \u002F Kompromiss",[538,539,540],"Gemeinsame Tabellen + Mandantenschlüssel","Zeilen-\u002FAnwendungsrichtlinie","Operativ effizient; erfordert umfassende Mandantenbereichsabdeckung und starke Tests",[542,543,544],"Gemeinsame Tabellen + Datenbank-RLS","Datenbankrichtliniengrenze","Verringert die Abhängigkeit von jeder Anwendungsabfrage; erfordert korrekte Rollen, Sitzungs-\u002FTransaktions-Mandantenkontext und Richtlinienabdeckung",[546,547,548],"Separate Schemas","Namensraum-\u002FDB-Rollengrenze","Stärkere logische Trennung; mehr operative Komplexität",[550,551,552],"Separate Datenbanken","Datenbank-\u002FAnmeldeinformationsgrenze","Starke Isolation und einfachere Blast-Radius-Geschichte; höhere Bereitstellungs- und Betriebskosten",[554,555,556],"Separate Infrastruktur\u002FKonto","Infrastrukturgrenze","Stärkste grobkörnige Trennung; höchste Kosten und operativer Aufwand",[558,559,560],"Hybrid","Pro Workload\u002FDatenklasse","Ermöglicht stärkere Isolation nur dort, wo Risiko\u002FCompliance es rechtfertigt",{},{"id":563,"data":564,"type":217,"tunes":566},"p-db-1",{"text":565},"Das aktuelle Multi-Tenant Security Cheat Sheet von OWASP listet separate Datenbanken, separate Schemas, gemeinsame Tabellen mit Zeilensteuerung und Hybridmodelle auf. Das richtige Modell hängt von Bedrohungsniveau, Compliance, Leistung und Betriebskosten ab.",{},{"id":568,"data":569,"type":41,"tunes":571},"h-rls",{"text":570,"level":246},"PostgreSQL Row-Level Security kann Verteidigung in der Tiefe bieten",{},{"id":573,"data":574,"type":217,"tunes":576},"p-rls-1",{"text":575},"Bei gemeinsamen Tabellen kann PostgreSQL Row-Level Security ein Mandantenprädikat auf der Datenbankebene durchsetzen, sodass gewöhnliche Abfragen keine Zeilen außerhalb der aktiven Mandantenrichtlinie sehen können.",{},{"id":578,"data":579,"type":217,"tunes":581},"p-rls-2",{"text":580},"RLS ist jedoch keine Magie. PostgreSQL-Superuser und Rollen mit BYPASSRLS können Zeilenrichtlinien umgehen. OWASP empfiehlt daher, eine Rolle mit minimalen Berechtigungen für den Anforderungspfad zu verwenden und denselben Verbindungs-\u002FPooling-Modus zu testen, der in der Produktion verwendet wird.",{},{"id":583,"data":584,"type":217,"tunes":586},"p-rls-3",{"text":585},"Die Wiederverwendung von Verbindungen ist ein weiterer wichtiger Randfall: Der Mandantenkontext muss für jede Transaktion\u002FAnforderung sicher gesetzt und zurückgesetzt werden, damit eine gepoolte Verbindung keinen vorherigen Mandantenzustand preisgeben kann.",{},{"id":588,"data":589,"type":41,"tunes":591},"h-cache",{"text":590,"level":246},"Mandantenisolierung muss Caches einschließen",{},{"id":593,"data":594,"type":217,"tunes":596},"p-cache-1",{"text":595},"Eine Datenbankabfrage kann perfekt abgegrenzt sein und dennoch Daten über einen gemeinsamen Cache-Schlüssel preisgeben.",{},{"id":598,"data":599,"type":217,"tunes":601},"p-cache-2",{"text":600},"Wenn user:42 sowohl in Mandant A als auch in Mandant B existiert, kann ein globaler Cache-Schlüssel den Wert des falschen Mandanten zurückgeben. Mandantensensible Cache-Schlüssel sollten jedes Attribut enthalten, das die Sichtbarkeit oder Ergebnis-Semantik ändert, üblicherweise Mandant, Benutzer, Locale, Feature-Set oder Berechtigungsversion.",{},{"id":603,"data":604,"type":217,"tunes":606},"p-cache-3",{"text":605},"Cache-Partitionierung ist Verteidigung in der Tiefe, kein Ersatz für Autorisierung. Die Anforderung muss weiterhin autorisiert werden, bevor geschützte zwischengespeicherte Inhalte zurückgegeben werden.",{},{"id":608,"data":609,"type":41,"tunes":611},"h-storage",{"text":610,"level":246},"Dateien und Objektspeicher benötigen ihre eigene Mandantengrenze",{},{"id":613,"data":614,"type":217,"tunes":616},"p-storage-1",{"text":615},"Objektspeicher sollte globale, mandantenbezogene und benutzerbezogene Objekte unterscheiden. Ein Ordnerpräfix allein ist nur eine Namenskonvention, es sei denn, die Zugriffsrichtlinie schränkt Lese- und Schreibvorgänge tatsächlich ein.",{},{"id":618,"data":619,"type":217,"tunes":621},"p-storage-2",{"text":620},"Robustere Designs können mandantenbewusste Objektschlüssel, Bucket-Richtlinien, separate Buckets\u002FKonten oder mandantenspezifische Verschlüsselungsschlüssel verwenden, wenn Risiko oder Compliance eine stärkere Isolierung erfordern.",{},{"id":623,"data":624,"type":217,"tunes":626},"p-storage-3",{"text":625},"Signierte URLs müssen vor der Ausstellung autorisiert und auf das genaue Objekt und die genaue Operation beschränkt werden. Der Besitz einer Objektkennung sollte für sich genommen keinen mandantenübergreifenden Zugriff gewähren.",{},{"id":628,"data":629,"type":41,"tunes":631},"h-queues",{"text":630,"level":246},"Hintergrundjobs und Warteschlangen können die Isolierung durchbrechen",{},{"id":633,"data":634,"type":217,"tunes":636},"p-queue-1",{"text":635},"Asynchrone Jobs verlassen oft den ursprünglichen HTTP-Anfragekontext, was die Weitergabe des Mandanten leicht fehleranfällig macht. Eine Warteschlangennachricht, die tenantId enthält, ist kein ausreichender Beweis dafür, dass der Produzent autorisiert war.",{},{"id":638,"data":639,"type":217,"tunes":641},"p-queue-2",{"text":640},"Der Worker sollte eine verifizierte Dienst-\u002FBenutzeridentität oder einen vertrauenswürdigen Job-Umschlag mitführen, den Mandantenkontext wiederherstellen und folgenreiche Operationen an der Konsumentengrenze erneut autorisieren.",{},{"id":643,"data":644,"type":217,"tunes":646},"p-queue-3",{"text":645},"Mandantenisolierung umfasst auch Verfügbarkeit. Ein Mandant sollte nicht in der Lage sein, gemeinsame Worker, Warteschlangen, Verbindungspools oder Rechenleistung so zu monopolisieren, dass andere Mandanten wesentlich beeinträchtigt werden.",{},{"id":648,"data":649,"type":41,"tunes":651},"h-search",{"text":650,"level":246},"Suche und RAG benötigen mandantenbewussten Abruf",{},{"id":653,"data":654,"type":217,"tunes":656},"p-search-1",{"text":655},"Multi-Mandanten-KI führt eine weitere Kopie des Isolierungsproblems ein. Dokumente können nach der Aufnahme in Chunks aufgeteilt, eingebettet und in einem Vektorindex gespeichert werden.",{},{"id":658,"data":659,"type":217,"tunes":661},"p-search-2",{"text":660},"Die aktuelle RAG-Sicherheitsrichtlinie von OWASP besagt, dass Zugriffskontrolle zum Zeitpunkt des Abrufs durchgesetzt werden muss und dass Chunks von Mandant A nicht durch Abfragen von Mandant B abgerufen werden dürfen. Es kann nicht einfach davon ausgegangen werden, dass Berechtigungen auf Dokumentebene das Chunking automatisch überleben.",{},{"id":663,"data":664,"type":217,"tunes":666},"p-search-3",{"text":665},"Der Vektorindex benötigt daher Mandanten-\u002FZugriffsmetadaten oder physisch\u002Flogisch getrennte Sammlungen gemäß dem Isolierungsdesign. Abruffilter sollten angewendet werden, bevor nicht autorisierte Inhalte in den Modellkontext gelangen können.",{},{"id":668,"data":669,"type":225,"tunes":672},"rag-rule",{"body":670,"title":671,"variant":232},"Rufen Sie keine mandantenübergreifenden Chunks ab und weisen Sie dann das Sprachmodell an, sie zu ignorieren. Sobald geschützte Daten in den Modellkontext gelangen, ist die Isolierungsgrenze bereits durchbrochen.","Das Modell darf niemals der Mandantenfiler sein",{},{"id":674,"data":675,"type":41,"tunes":677},"h-derived",{"text":676,"level":246},"Abgeleitete Daten erben die Mandantensensibilität",{},{"id":679,"data":680,"type":217,"tunes":682},"p-derived-1",{"text":681},"Einbettungen, Suchindizes, Miniaturansichten, generierte Zusammenfassungen, Caches, Analysezeilen und KI-Antworten werden aus Quelldaten abgeleitet. Ihr Mandantenbereich sollte der Quelle folgen, es sei denn, eine explizite Transformation erzeugt ein legitimes gemeinsames\u002Fglobales Artefakt.",{},{"id":684,"data":685,"type":217,"tunes":687},"p-derived-2",{"text":686},"Löschung und Offboarding müssen sich daher über die kanonische Zeile hinaus ausbreiten. Das Entfernen eines Mandantendokuments, während durchsuchbare Chunks oder zwischengespeicherte Zusammenfassungen verbleiben, kann eine mandantenübergreifende oder über die Aufbewahrungsfrist hinausgehende Exposition aufrechterhalten.",{},{"id":689,"data":690,"type":41,"tunes":692},"h-shared",{"text":691,"level":246},"Nicht alles gehört zu einem Mandanten",{},{"id":694,"data":695,"type":217,"tunes":697},"p-shared-1",{"text":696},"Multi-Mandanten-Plattformen haben oft absichtlich globale Ressourcen: Produkttaxonomien, öffentliche Vorlagen, Systemberechtigungen, Funktionsdefinitionen oder öffentliche Inhalte.",{},{"id":699,"data":700,"type":217,"tunes":702},"p-shared-2",{"text":701},"Das sicherste Modell ist die explizite Klassifizierung: global, mandantenbezogen, benutzerbezogen oder explizit mandantenübergreifend. Mehrdeutige Ressourcen sind der Ausgangspunkt für versehentliche Datenlecks.",{},{"id":704,"data":705,"type":217,"tunes":707},"p-shared-3",{"text":706},"Ein absichtlich gemeinsam genutztes Objekt sollte einen dokumentierten Grund dafür haben, global zu sein, und nicht einfach keine Mandantenzuordnung besitzen.",{},{"id":709,"data":710,"type":41,"tunes":712},"h-platform-admin",{"text":711,"level":246},"Plattformadministratoren erfordern ein anderes Berechtigungsmodell",{},{"id":714,"data":715,"type":217,"tunes":717},"p-platform-1",{"text":716},"Ein Plattformbetreiber muss möglicherweise mehrere Mandanten für Support, Compliance oder Infrastrukturbetrieb inspizieren. Dies als gewöhnlichen Mandanten-ADMIN mit versehentlichem globalem Datenbankzugriff zu modellieren, schwächt sowohl Sicherheit als auch Auditierbarkeit.",{},{"id":719,"data":720,"type":217,"tunes":722},"p-platform-2",{"text":721},"Ein besseres Design verwendet eine eigenständige Plattformidentität oder eine explizite mandantenübergreifende Berechtigung, stärkere Authentifizierung, Zweckbindung, detaillierte Auditierung und, wo angemessen, Genehmigungs- oder Break-Glass-Kontrollen.",{},{"id":724,"data":725,"type":217,"tunes":727},"p-platform-3",{"text":726},"Mandantenübergreifender Zugriff sollte daher eine benannte Fähigkeit sein, nicht das Fehlen eines Mandantenfilters.",{},{"id":729,"data":730,"type":41,"tunes":732},"h-abac",{"text":731,"level":246},"RBAC kann mit Attributen kombiniert werden",{},{"id":734,"data":735,"type":217,"tunes":737},"p-abac-1",{"text":736},"Einige Entscheidungen hängen von mehr als der Rolle ab. Mandantenzugehörigkeit, Region, Ressourceneigentümer, Abonnementstufe, Zeit, Projektzugehörigkeit oder Datenklassifizierung können alle den Zugriff beeinflussen.",{},{"id":739,"data":740,"type":217,"tunes":742},"p-abac-2",{"text":741},"RBAC und ABAC schließen sich nicht gegenseitig aus. Die aktuelle Multi-Tenant-Autorisierungsrichtlinie von AWS behandelt RBAC, ABAC und Hybridmodelle. Eine Rolle kann eine breite Verantwortung definieren, während Attribute einschränken, auf welche konkrete Ressourceninstanz zugegriffen werden kann.",{},{"id":744,"data":745,"type":217,"tunes":747},"p-abac-3",{"text":746},"Die zentrale Architekturregel bleibt: Kodieren Sie die Mandantenisolierung nicht nur als beiläufigen Rollennamen, wenn die Mandantenidentität eine erstklassige Ressourcengrenze ist.",{},{"id":749,"data":750,"type":41,"tunes":752},"h-matrix",{"text":751,"level":246},"Autorisierungsentscheidungen sind mindestens zweidimensional",{},{"id":754,"data":755,"type":390,"tunes":784},"matrix-table",{"content":756,"stretched":42,"withHeadings":13},[757,762,767,770,773,774,779],[758,759,760,761],"Prinzipal","Rollenberechtigung","Mandantenbeziehung","Entscheidung",[763,764,765,766],"Alice","orders.read","Bestellung gehört zum Mandanten von Alice","Erlauben",[763,764,768,769],"Bestellung gehört zu einem anderen Mandanten","Verweigern",[763,771,765,772],"orders.write","Erlauben, wenn die Rolle Schreibzugriff umfasst",[763,771,768,769],[775,776,777,778],"Plattform-Support","support.cross_tenant.read","Expliziter Support-Umfang + auditierter Zielmandant","Potenziell erlauben gemäß Plattformrichtlinie",[780,781,782,783],"Hintergrund-Worker","orders.process","Vertrauenswürdiger Dienstumfang für den Auftragsmandanten","Nur für verifizierten Auftragsmandanten erlauben",{},{"id":786,"data":787,"type":41,"tunes":789},"h-implementation",{"text":788,"level":246},"Ursprüngliche Implementierungsnachweise: Aaasaasa AI CMS",{},{"id":791,"data":792,"type":225,"tunes":795},"impl-note",{"body":793,"title":794,"variant":239},"Aaasaasa AI CMS enthält eine konkrete mandantenbezogene RBAC-Implementierung. Sie ist ein nützlicher Nachweis dafür, wie Rollenautorisierung und Mandantenumfang kombiniert werden können, sollte aber nicht als Beweis dafür präsentiert werden, dass jede Speicher-, Cache- oder Infrastrukturschicht eine vollständige Mandantenisolierung aufweist.","Ursprüngliche Implementierungsnachweise",{},{"id":797,"data":798,"type":217,"tunes":800},"p-impl-1",{"text":799},"Der RBAC-Dienst definiert typisierte Berechtigungscodes wie cms.content.read, shop.orders.write, billing.reconcile und users.roles. Systemrollen ordnen diese Berechtigungen benannten Verantwortungssätzen zu.",{},{"id":802,"data":803,"type":217,"tunes":805},"p-impl-2",{"text":804},"Rollendatensätze werden mit einer tenantId erstellt und aufgelöst. Systemrollen werden mithilfe einer zusammengesetzten Mandanten-\u002FCode-Identität aktualisiert oder eingefügt, und die Rollenauflistung wird nach Mandant gefiltert.",{},{"id":807,"data":808,"type":217,"tunes":810},"p-impl-3",{"text":809},"Bei der Rollenaktualisierung und -löschung wird die Rolle zuerst anhand von Rollen-ID und Mandanten-ID aufgelöst. Benutzer-Rollen-Zuweisungen werden ebenfalls im aktuellen Mandantenkontext gespeichert und ersetzt.",{},{"id":812,"data":813,"type":217,"tunes":815},"p-impl-4",{"text":814},"Die Berechtigungsauflösung liest explizite Benutzer-Rollen-Zuweisungen, die sowohl nach tenantId als auch nach userId eingeschränkt sind. Dies verhindert, dass die Rollenzuweisung eines Mandanten automatisch zur Rollenzuweisung eines anderen Mandanten wird.",{},{"id":817,"data":818,"type":217,"tunes":820},"p-impl-5",{"text":819},"Auf API-Ebene lösen administrative RBAC-Routen einen Mandantenkontext auf, bevor Rollen erstellt oder geändert werden. Dies ist die richtige Richtung: Die Berechtigungsverwaltung selbst muss die Mandantenfähigkeit respektieren.",{},{"id":822,"data":823,"type":390,"tunes":846},"impl-table",{"content":824,"stretched":42,"withHeadings":13},[825,828,831,834,837,840,843],[826,827],"Beobachtetes Implementierungsmuster","Sicherheitsbedeutung",[829,830],"Typisierte Berechtigungscodes","Das Vokabular für RBAC-Operationen ist explizit",[832,833],"Systemrolle → Berechtigungszuordnungen","Rollen aggregieren Berechtigungen, anstatt Benutzer fest zu codieren",[835,836],"tenantId_code Rollenidentität","Dieselbe logische Rolle kann pro Mandant separat existieren",[838,839],"Rollen-Lookup verwendet id + tenantId","Rollenänderung ist mandantenbezogen",[841,842],"Benutzer-Rollen-Beziehung speichert tenantId","Mitgliedschaft wird nicht allein aus der Rolle global abgeleitet",[844,845],"Berechtigungsauflösung verwendet tenantId + userId","Autorisierung wird innerhalb des Mandantenkontexts bewertet",{},{"id":848,"data":849,"type":225,"tunes":852},"impl-boundary",{"body":850,"title":851,"variant":232},"Mandantenbezogenes RBAC ist eine Ebene. Vollständige Mandantentrennung muss auch alle mandanteneigenen Ressourcen-Lookups, Datenbanken, Caches, Dateien, Such-\u002FVektorindizes, Hintergrundjobs, Integrationen und Betriebspfade abdecken. Die hier vorliegenden Repository-Nachweise stützen das RBAC-\u002FMandantenbereich-Entwurfsmuster, nicht die Behauptung einer unabhängig geprüften SaaS-Isolation.","Was dieser Nachweis nicht beweist",{},{"id":854,"data":855,"type":41,"tunes":857},"h-ai",{"text":856,"level":246},"Warum diese Unterscheidung für KI-Agenten noch wichtiger ist",{},{"id":859,"data":860,"type":217,"tunes":862},"p-ai-1",{"text":861},"KI-Agenten können einen Berechtigungsfehler in eine Abfolge von Aktionen verwandeln. Wenn ein Agent ein breites orders.read-Tool ohne mandantenbezogene Durchsetzung erhält, kann ein Fehler beim Schlussfolgern oder eine Prompt-Injection zu mandantenübergreifenden Lesezugriffen mit Maschinengeschwindigkeit führen.",{},{"id":864,"data":865,"type":217,"tunes":867},"p-ai-2",{"text":866},"Agenten-Tool-Beschreibungen können Mandantenbeschränkungen erwähnen, aber die Durchsetzung muss weiterhin in der vertrauenswürdigen Laufzeit-\u002FService-\u002FDatenschicht erfolgen. Natürlichsprachliche Anweisungen sind keine Autorisierungsgrenze.",{},{"id":869,"data":870,"type":217,"tunes":872},"p-ai-3",{"text":871},"Dasselbe gilt für RAG: Ein Agent kann die Berechtigung haben, das Suchtool zu verwenden, während das Such-Backend weiterhin verhindern muss, dass die Abfrage von Mandant A Chunks von Mandant B zurückgibt.",{},{"id":874,"data":875,"type":41,"tunes":877},"h-tests",{"text":876,"level":246},"RBAC und Mandantentrennung getrennt testen",{},{"id":879,"data":880,"type":390,"tunes":915},"tests-table",{"content":881,"stretched":42,"withHeadings":13},[882,885,888,891,894,897,900,903,906,909,912],[883,884],"Testfamilie","Was sie beweisen sollte",[886,887],"Rollen-Herabstufungstest","Ein Benutzer ohne Berechtigung kann die Operation nicht ausführen, selbst innerhalb seines eigenen Mandanten",[889,890],"Mandantenübergreifender Objekttest","Ein Benutzer mit der richtigen Rolle kann weiterhin nicht auf denselben Ressourcentyp in einem anderen Mandanten zugreifen",[892,893],"Identifikator-Manipulation","Das Ändern von Objekt-\u002FMandanten-IDs überschreitet nicht den Bereich",[895,896],"Listen-\u002FMassenendpunkt-Test","Breite Abfragen geben nur autorisierte Mandantendaten zurück",[898,899],"Cache-Wiederverwendungstest","Zwei Mandanten, die wiederverwendete Prozesse\u002FVerbindungen nutzen, erhalten niemals den zwischengespeicherten Zustand des jeweils anderen",[901,902],"RLS-Anfrage-Rollen-Test","Die Produktionsanfrage-Rolle kann Zeilenrichtlinien nicht umgehen",[904,905],"Asynchroner Worker-Test","Der Mandantenkontext überlebt die Warteschlange und wird bei der Verarbeitung erneut validiert",[907,908],"Vektorabruf-Test","Die Abfrage von Mandant A ruft niemals Chunks von Mandant B ab",[910,911],"Plattform-Admin-Test","Mandantenübergreifende Fähigkeiten sind explizit, eng begrenzt und auditierbar",[913,914],"Offboarding-Test","Mandantendaten und abgeleitete Indizes\u002FCaches werden gemäß Richtlinie entfernt",{},{"id":917,"data":918,"type":217,"tunes":920},"p-tests-1",{"text":919},"Die Autorisierungs-Regressionsrichtlinie von OWASP hebt speziell mandantenübergreifende Grenztests hervor, weil Codeänderungen an Caching, Abfragen oder gemeinsamen Diensten die Isolation stillschweigend brechen können, selbst wenn Rollentests weiterhin bestehen.",{},{"id":922,"data":923,"type":41,"tunes":925},"h-failures",{"text":924,"level":246},"Häufige Fehlermodi",{},{"id":927,"data":928,"type":390,"tunes":972},"failures-table",{"content":929,"stretched":42,"withHeadings":13},[930,933,936,939,942,945,948,951,954,957,960,963,966,969],[931,932],"Fehlermodus","Warum er fehlschlägt",[934,935],"Rolle prüfen, aber nicht Mandant","Eine gültige Rolle wird zu mandantenübergreifender Autorität",[937,938],"Mandanten-ID aus der Anfrage vertrauen","Der Client kontrolliert den Isolationsselektor",[940,941],"UI einschränken, aber nicht API","Versteckte Schaltflächen schützen keine Backend-Ressourcen",[943,944],"Mandantenbewusster Detailendpunkt, nicht bereichsbezogener Listenendpunkt","Massenlesevorgänge leaken andere Mandanten",[946,947],"Mandantenfilter in den meisten Abfragen","Ein vergessener Pfad bricht die Grenze",[949,950],"Globale Cache-Schlüssel","Korrekte Datenbankisolation wird durch zwischengespeicherte Daten umgangen",[952,953],"Gemeinsamer Vektorindex ohne erzwungene Metadatenfilter","RAG ruft Chunks eines anderen Mandanten ab",[955,956],"Mandanten-ID in Warteschlangennachricht als Autorisierung behandelt","Ein gefälschter oder falsch erzeugter Job kann die Mandantengrenze überschreiten",[958,959],"Plattform-Admin als gewöhnlicher ADMIN modelliert","Mandantenübergreifende Macht wird implizit und schwer auditierbar",[961,962],"Rolle global über Mandantenmitgliedschaften kopiert","Benutzer erhält Berechtigungen in Mandanten, in denen er nie zugewiesen wurde",[964,965],"Separate Datenbanken, aber gemeinsam genutzte privilegierte Anmeldeinformationen","Die Anwendung kann weiterhin Datenbanken überschreiten, wenn ihre Anmeldeinformationen zu weit gefasst sind",[967,968],"RLS mit BYPASSRLS-Anfrage-Rolle","Die Datenbankrichtlinie existiert, schützt aber nicht den tatsächlichen Anfragepfad",[970,971],"Zufällige UUIDs als Isolation behandelt","Schwer zu erratende Identifikatoren reduzieren Enumeration, autorisieren aber keinen Zugriff",{},{"id":974,"data":975,"type":41,"tunes":977},"h-misconceptions",{"text":976,"level":246},"Häufige Missverständnisse",{},{"id":979,"data":980,"type":390,"tunes":1015},"misconceptions-table",{"content":981,"stretched":42,"withHeadings":13},[982,985,988,991,994,997,1000,1003,1006,1009,1012],[983,984],"Missverständnis","Korrektur",[986,987],"„RBAC bietet Mandantentrennung.“","RBAC steuert Berechtigungen; Isolation erfordert auch Mandanten-\u002FRessourcenbereich.",[989,990],"„Wenn der Benutzer ein Admin ist, sind Mandantenprüfungen unnötig.“","Admin-Autorität muss weiterhin einen expliziten Bereich haben.",[992,993],"„Mandanten-ID im JWT reicht aus.“","Sie kann nur dann eine vertrauenswürdige Eingabe sein, wenn sie validiert und konsistent auf jeden geschützten Ressourcenpfad angewendet wird.",[995,996],"„Separate Datenbanken entfernen Autorisierungsanforderungen.“","Benutzer benötigen weiterhin Berechtigungen auf Operationsebene innerhalb ihres Mandanten.",[998,999],"„Eine tenant_id-Spalte bedeutet, dass das System isoliert ist.“","Das Feld hilft nur, wenn Zugriffspfade es durchsetzen.",[1001,1002],"„UUIDs verhindern mandantenübergreifenden Zugriff.“","Unvorhersehbare Identifikatoren sind Defense in Depth, keine Autorisierung.",[1004,1005],"„RLS bedeutet, dass Anwendungscode keine Sicherheitsprüfungen benötigt.“","Anwendungsautorisierung, korrekte DB-Rollen und Richtlinienabdeckung sind weiterhin wichtig.",[1007,1008],"„Eine gemeinsame Vektor-DB ist unsicher.“","Sie kann sicher sein, wenn Isolation durchsetzbar und verifiziert ist; physische Trennung ist eine Option, nicht die einzige.",[1010,1011],"„Plattform-Support benötigt globales ADMIN.“","Mandantenübergreifender Support sollte eine eigenständige, eingeschränkte und auditierbare Autorität sein.",[1013,1014],"„Interne Dienste können Mandantenprüfungen überspringen.“","Interne Pfade können weiterhin kompromittiert oder falsch konfiguriert sein und müssen den Mandantenkontext bewahren.",{},{"id":1017,"data":1018,"type":41,"tunes":1020},"h-design",{"text":1019,"level":246},"Eine praktische Entwurfssequenz",{},{"id":1022,"data":1023,"type":333,"tunes":1062},"design-flow",{"steps":1024,"title":1061,"orientation":332},[1025,1028,1031,1034,1037,1040,1043,1046,1049,1052,1055,1058],{"label":1026,"description":1027},"1. Mandanteneigentum definieren","Klassifizieren Sie, welche Entitäten und Ressourcen global, mandantenbezogen, benutzerbezogen oder absichtlich mandantenübergreifend sind.",{"label":1029,"description":1030},"2. Operationen definieren","Erstellen Sie explizite Berechtigungen für Lesevorgänge, Schreibvorgänge, Veröffentlichung, Genehmigungen, Administration und andere Geschäftsaktionen.",{"label":1032,"description":1033},"3. Rollen definieren","Gruppieren Sie Berechtigungen nach Verantwortlichkeiten, ohne versehentlich globalen Bereich einzubetten.",{"label":1035,"description":1036},"4. Mitgliedschaftsbereich definieren","Binden Sie Rollenzuweisungen an den Mandanten-\u002FWorkspace-\u002FProjektkontext, in dem sie gelten.",{"label":1038,"description":1039},"5. Vertrauenswürdigen Mandantenkontext auflösen","Leiten Sie die Mandantenidentität aus authentifizierter, serverseitig verifizierter Mitgliedschaft oder Dienstautorisierung ab.",{"label":1041,"description":1042},"6. Ressourceneigentum durchsetzen","Wenden Sie den Mandantenbereich an jeder mandanteneigenen Daten-\u002FDienstgrenze an.",{"label":1044,"description":1045},"7. Defense in Depth hinzufügen","Verwenden Sie RLS, separate Anmeldeinformationen, Schemas\u002FDatenbanken, Speicherrichtlinien oder Richtlinien-Engines, wo das Risiko sie rechtfertigt.",{"label":1047,"description":1048},"8. Bereich durch abgeleitete Systeme tragen","Bewahren Sie Mandantenmetadaten in Cache, Suche, Vektorindizes, Warteschlangen, Dateien und Analysen.",{"label":1050,"description":1051},"9. Mandantenübergreifende Operationen explizit modellieren","Trennen Sie Plattformadministration und Dienstidentitäten von gewöhnlichen Mandantenrollen.",{"label":1053,"description":1054},"10. Beide Achsen testen","Führen Sie Negativtests für fehlende Berechtigung und für falschen Mandanten unabhängig voneinander durch.",{"label":1056,"description":1057},"11. Mandant + Berechtigung zusammen auditieren","Protokollieren Sie, wer gehandelt hat, in welchem Mandanten, auf welches Ziel und unter welcher Autorität.",{"label":1059,"description":1060},"12. Nach Schema-\u002FLaufzeitänderungen erneut testen","Isolation kann brechen, wenn neue Tabellen, Caches, Warteschlangen oder Abrufpfade eingeführt werden.","Berechtigungen und Isolation als separate Dimensionen entwerfen",{},{"id":1064,"data":1065,"type":41,"tunes":1067},"h-checklist",{"text":1066,"level":246},"RBAC + Mandantentrennungs-Checkliste",{},{"id":1069,"data":1070,"type":390,"tunes":1116},"checklist-table",{"content":1071,"stretched":42,"withHeadings":13},[1072,1074,1077,1080,1083,1086,1089,1092,1095,1098,1101,1104,1107,1110,1113],[411,1073],"Erwartete Antwort",[1075,1076],"Wer ist der Prinzipal?","Authentifizierte Benutzer-\u002FDienst-\u002FAgentenidentität",[1078,1079],"Welcher Mandantenkontext gilt?","Serverseitig verifizierte Mitgliedschaft oder Dienstbereich",[1081,1082],"Welche Operation wird angefordert?","Typisierte Berechtigung oder Richtlinienaktion",[1084,1085],"Hat der Prinzipal diese Berechtigung?","Rollen-\u002FRichtlinienentscheidung",[1087,1088],"Wem gehört die Zielressource?","Explizite Mandanten-\u002FGlobal-\u002FBenutzerklassifizierung",[1090,1091],"Entspricht der Ressourcenbereich der Autorität?","Mandantenbewusster Lookup\u002FRichtlinie",[1093,1094],"Kann der Speicher Anwendungsprüfungen umgehen?","Defense-in-Depth-Entscheidung dokumentiert",[1096,1097],"Sind Caches mandantensicher?","Schlüssel\u002FNamespaces und Autorisierung bewahren den Mandantenbereich",[1099,1100],"Sind Dateien\u002FBlobs mandantensicher?","Objektrichtlinie und Ausstellung signierter URLs erzwingen den Bereich",[1102,1103],"Sind asynchrone Jobs mandantensicher?","Verifizierter Kontext wird weitergegeben und erneut validiert",[1105,1106],"Ist RAG\u002FSuche mandantensicher?","Metadaten-\u002FSammlungsisolation wird vor dem Modellkontext erzwungen",[1108,1109],"Sind mandantenübergreifende Admins explizit?","Separate Autorität, Kontrollen und Audit",[1111,1112],"Können gewöhnliche Anmeldeinformationen die Isolation umgehen?","Nein, oder eng dokumentierter Ausnahmepfad",[1114,1115],"Sind negative mandantenübergreifende Tests automatisiert?","Ja für jede relevante Zugriffsebene",{},{"id":1118,"data":1119,"type":41,"tunes":1121},"h-edge",{"text":1120,"level":246},"Edge Cases und Einschränkungen",{},{"id":1123,"data":1124,"type":217,"tunes":1126},"p-edge-1",{"text":1125},"Ein Benutzer kann mehreren Mandanten angehören. Der aktuelle Mandant sollte daher ein expliziter Ausführungskontext sein und nicht dauerhaft aus dem Benutzerkonto abgeleitet werden.",{},{"id":1128,"data":1129,"type":217,"tunes":1131},"p-edge-2",{"text":1130},"Einige Ressourcen werden absichtlich zwischen ausgewählten Mandanten geteilt, wie z. B. Kollaborationsräume oder Konsortialdaten. Dies erfordert ein explizites Freigabemodell; vorzugeben, die Ressource gehöre zu einem Mandanten, und später Ausnahmen hinzuzufügen, führt in der Regel zu mehrdeutiger Autorisierung.",{},{"id":1133,"data":1134,"type":217,"tunes":1136},"p-edge-3",{"text":1135},"Noisy-Neighbor-Isolation ist verwandt, aber anders als Vertraulichkeitsisolation. Ein Mandant darf niemals die Daten eines anderen Mandanten sehen und kann dennoch gemeinsame CPU, Warteschlangenkapazität oder Datenbankverbindungen erschöpfen. Rate Limits und Ressourcenkontingente können daher als Verfügbarkeitsgrenze mandantenbewusst sein.",{},{"id":1138,"data":1139,"type":217,"tunes":1141},"p-edge-4",{"text":1140},"Physische Isolation ist nicht automatisch sicher, wenn Control-Plane-Anmeldeinformationen oder administrative Pfade Grenzen überschreiten können. Logische Isolation ist nicht automatisch schwach, wenn Richtlinien zentral durchgesetzt, mit minimalen Rechten versehen und gründlich getestet werden.",{},{"id":1143,"data":1144,"type":217,"tunes":1146},"p-edge-5",{"text":1145},"Die Anforderungen an die Mandantenisolation können je nach Datenklasse unterschiedlich sein. Öffentliche Katalogdaten, Abrechnungsdatensätze und private KI-Dokumente können unterschiedliche Speicher- und Verschlüsselungsgrenzen innerhalb desselben SaaS-Produkts rechtfertigen.",{},{"id":1148,"data":1149,"type":41,"tunes":1151},"h-change",{"text":1150,"level":246},"Was würde diese Antwort ändern?",{},{"id":1153,"data":1154,"type":217,"tunes":1156},"p-change-1",{"text":1155},"Die genaue Implementierung ändert sich mit der Architektur: Serverless-APIs, Kubernetes, PostgreSQL, Objektspeicher, Vektordatenbanken und Policy Engines bieten unterschiedliche Isolationsprimitive.",{},{"id":1158,"data":1159,"type":217,"tunes":1161},"p-change-2",{"text":1160},"Die erforderliche Stärke ändert sich auch mit Regulierung, Kundenverträgen, Datensensibilität, Bedrohungsmodell und operativer Skalierung. Einige Mandanten können isolierte Datenbanken oder Infrastruktur rechtfertigen, während andere gemeinsam genutzte Ressourcen teilen.",{},{"id":1163,"data":1164,"type":217,"tunes":1166},"p-change-3",{"text":1165},"Die konzeptionelle Unterscheidung ändert sich nicht: Die Berechtigung zur Durchführung einer Operation ist nicht dasselbe wie die Berechtigung, eine Mandantengrenze zu überschreiten.",{},{"id":1168,"data":1169,"type":41,"tunes":1171},"h-related",{"text":1170,"level":246},"Verwandtes kanonisches Wissen",{},{"id":1173,"data":1174,"type":217,"tunes":1176},"p-related-1",{"text":1175},"S01 ist eine Voraussetzung für Sicherheitsgrenzen in Enterprise AI Architecture und AI Governance. Sobald KI-Tools, RAG oder Agenten über mandantenfähige Daten arbeiten, muss die Mandantenidentität durch Retrieval, Tool-Ausführung, Speicher, Caches und Audit-Traces wandern.",{},{"id":1178,"data":1179,"type":217,"tunes":1181},"p-related-2",{"text":1180},"Es verbindet sich auch direkt mit Agentic AI: Tool-Fähigkeiten und Rollenberechtigungen müssen weiterhin durch den Mandantenbesitz eingeschränkt werden, bevor ein Agent Geschäftsressourcen lesen oder verändern kann.",{},{"id":1183,"data":1184,"type":1189,"tunes":1190},"ref-agentic",{"url":1185,"title":1186,"excerpt":1187,"ctaLabel":1188},"https:\u002F\u002Fstajic.de\u002Fde\u002Fblog\u002Fmcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained","MCP vs A2A vs UCP vs AP2 vs A2UI: Der Agent Protocol Stack erklärt","Protokollinteroperabilität ersetzt nicht Autorisierung oder Mandantenisolation. Fähigkeitserkennung und Geschäftsautorität bleiben getrennte Architekturanliegen.","Lesen Sie den Artikel zum Protokollstapel","referralArticle",{},{"id":1192,"data":1193,"type":217,"tunes":1195},"p-related-3",{"text":1194},"Für RAG muss die Mandantenisolation durchgesetzt werden, bevor geschützte Chunks den Modellkontext erreichen.",{},{"id":1197,"data":1198,"type":1189,"tunes":1203},"ref-rag",{"url":1199,"title":1200,"excerpt":1201,"ctaLabel":1202},"https:\u002F\u002Fstajic.de\u002Fde\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works","Was ist RAG? Die einfachste Erklärung, wie es funktioniert","Die Retrieval-Grundlage zum Verständnis, wo mandantenbewusste Quellenfilterung und Vektorspeicherisolation durchgesetzt werden müssen.","Lesen Sie die RAG-Grundlagen",{},{"id":1205,"data":1206,"type":41,"tunes":1208},"h-faq",{"text":1207,"level":246},"Häufig gestellte Fragen",{},{"id":1210,"data":1211,"type":1210,"tunes":1250},"faq",{"items":1212,"title":1249},[1213,1217,1221,1225,1229,1233,1237,1241,1245],{"id":1214,"answer":1215,"question":1216},"faq1","RBAC bestimmt, welche Operationen ein Prinzipal ausführen darf. Mandantenisolation bestimmt, auf welche Ressourcen welches Mandanten diese Operationen zugreifen dürfen. Sichere mandantenfähige Anwendungen benötigen normalerweise beides.","Was ist der Unterschied zwischen RBAC und Mandantenisolation?",{"id":1218,"answer":1219,"question":1220},"faq2","Nein. ADMIN sollte einen expliziten Geltungsbereich haben. Ein Mandantenadministrator hat normalerweise nur innerhalb dieses Mandanten umfassende Berechtigungen, während mandantenübergreifende Plattformadministration separat modelliert werden sollte.","Erlaubt eine ADMIN-Rolle automatisch den Zugriff auf alle Mandanten?",{"id":1222,"answer":1223,"question":1224},"faq3","Nein. Authentifizierung beweist Identität. Autorisierung kontrolliert erlaubte Aktionen. Mandantenisolation verhindert zusätzlich, dass diese Aktionen die Ressourcen des falschen Mandanten erreichen.","Reicht Authentifizierung für die Mandantenisolation aus?",{"id":1226,"answer":1227,"question":1228},"faq4","Es kann eine Eingabe für den Mandantenkontext sein, aber der Server muss die aktuelle Mitgliedschaft\u002FBerechtigung überprüfen und den Geltungsbereich an geschützten Ressourcengrenzen durchsetzen. Ein Anspruch allein ersetzt keine Isolationskontrollen.","Sollte tenantId im JWT gespeichert werden?",{"id":1230,"answer":1231,"question":1232},"faq5","Nicht unbedingt. Gemeinsame Tabellen, RLS, Schema-, Datenbank-, Infrastruktur- und hybride Isolationsmodelle können je nach Risiko und betrieblichen Anforderungen alle gültig sein.","Brauche ich eine separate Datenbank pro Mandant?",{"id":1234,"answer":1235,"question":1236},"faq6","RLS kann eine starke Verteidigung in der Tiefe bieten, aber korrekte Datenbankrollen, Anforderungskontext, Richtlinienabdeckung und Autorisierung auf Anwendungsebene sind weiterhin wichtig.","Kann PostgreSQL RLS Mandantenfilters im Anwendungscode ersetzen?",{"id":1238,"answer":1239,"question":1240},"faq7","Der Mandanten-\u002FZugriffsbereich sollte während des Retrievals durchgesetzt werden, damit nicht autorisierte Chunks niemals in den Modellkontext gelangen. Bewahren Sie Zugriffsmetadaten durch Chunking und Indexierung.","Wie sollte RAG die Mandantenisolation durchsetzen?",{"id":1242,"answer":1243,"question":1244},"faq8","Ja. Dies ist in B2B-SaaS üblich und ein starker Grund, Rollenzuweisungen nach Mandantenzugehörigkeit zu skalieren, anstatt Rollen als global an den Benutzer gebunden zu behandeln.","Kann ein Benutzer in verschiedenen Mandanten unterschiedliche Rollen haben?",{"id":1246,"answer":1247,"question":1248},"faq9","Verwenden Sie negative mandantenübergreifende Tests: Erstellen Sie mindestens zwei Mandanten, geben Sie einem Benutzer gültige Berechtigungen in einem Mandanten und beweisen Sie dann, dass jeder geschützte Pfad den Zugriff auf die Ressourcen des anderen Mandanten verweigert.","Was ist der beste Test für Mandantenisolation?","RBAC vs Mandantenisolation FAQ",{},{"id":1252,"data":1253,"type":41,"tunes":1255},"h-glossary",{"text":1254,"level":246},"Glossar",{},{"id":1257,"data":1258,"type":1257,"tunes":1305},"glossary",{"title":1259,"entries":1260},"Wichtige Begriffe der mandantenfähigen Sicherheit",[1261,1263,1266,1270,1273,1277,1281,1285,1289,1293,1297,1301],{"term":394,"anchor":393,"definition":1262},"Role-Based Access Control: ein Autorisierungsmodell, das Berechtigungen mit Rollen verknüpft und Benutzer oder Prinzipale diesen Rollen zuweist.",{"term":1264,"anchor":396,"definition":1265},"Mandant","Ein Kunde, eine Organisation, ein Arbeitsbereich oder ein anderer isolierter logischer Konsument eines gemeinsam genutzten mandantenfähigen Systems.",{"term":1267,"anchor":1268,"definition":1269},"Mandantenisolierung","tenant-isolation","Mechanismen, die verhindern, dass ein Mandant auf die Ressourcen eines anderen Mandanten in einem gemeinsam genutzten System zugreift, sie ändert oder erhält.",{"term":414,"anchor":1271,"definition":1272},"authentication","Überprüfung der Identität eines Benutzers, Dienstes oder eines anderen Prinzipals.",{"term":1274,"anchor":1275,"definition":1276},"Autorisierung","authorization","Entscheidungsprozess, der festlegt, ob ein Prinzipal eine angeforderte Operation an einer Ressource ausführen darf.",{"term":1278,"anchor":1279,"definition":1280},"Berechtigung","permission","Eine definierte erlaubte Operation oder Fähigkeit wie orders.read oder users.write.",{"term":1282,"anchor":1283,"definition":1284},"Rolle","role","Eine benannte Gruppierung von Berechtigungen, die einer Verantwortlichkeit oder Funktion zugeordnet ist.",{"term":1286,"anchor":1287,"definition":1288},"ABAC","abac","Attribute-Based Access Control: Autorisierung basierend auf Attributen des Prinzipals, der Ressource, der Aktion oder der Umgebung.",{"term":1290,"anchor":1291,"definition":1292},"Row-Level Security","row-level-security","Datenbankrichtlinienmechanismus, der einschränkt, welche Zeilen eine Datenbankrolle oder Sitzung lesen oder ändern darf.",{"term":1294,"anchor":1295,"definition":1296},"Mandantenübergreifender Zugriff","cross-tenant-access","Jeder Zugriffspfad, bei dem ein Prinzipal, der unter einem Mandantenkontext arbeitet, Ressourcen erreicht, die einem anderen Mandanten gehören.",{"term":1298,"anchor":1299,"definition":1300},"Plattformadministrator","platform-administrator","Eine privilegierte operative Identität mit explizit modellierter Autorität, die mehrere Mandanten umfassen kann.",{"term":1302,"anchor":1303,"definition":1304},"Mandantenkontext","tenant-context","Der verifizierte Mandantenbereich, unter dem die aktuelle Anfrage, der Job oder die Agentenoperation ausgeführt wird.",{},{"id":1307,"data":1308,"type":41,"tunes":1310},"h-conclusion",{"text":1309,"level":246},"Fazit",{},{"id":1312,"data":1313,"type":217,"tunes":1315},"p-conclusion-1",{"text":1314},"RBAC und Mandantenisolierung sind komplementäre, nicht konkurrierende Sicherheitsmechanismen. RBAC strukturiert operative Berechtigungen; Mandantenisolierung beschränkt die Ressourcengrenze, innerhalb derer diese Berechtigung gelten kann.",{},{"id":1317,"data":1318,"type":217,"tunes":1320},"p-conclusion-2",{"text":1319},"Eine robuste mandantenfähige Anfrage benötigt daher mehr als „Benutzer hat Rolle ADMIN“. Sie benötigt einen verifizierten Prinzipal, einen verifizierten Mandantenkontext, eine erlaubte Operation, ein mandantenbezogenes Ziel und Durchsetzung auf jeder Ressourcenschicht, die mandanteneigene Daten tragen kann.",{},{"id":1322,"data":1323,"type":217,"tunes":1325},"p-conclusion-3",{"text":1324},"Die kürzeste zuverlässige Regel lautet: Autorisieren Sie die Aktion, dann isolieren Sie den Bereich — und nehmen Sie niemals an, dass eines das andere beweist.",{},{"id":1327,"data":1328,"type":41,"tunes":1330},"h-sources",{"text":1329,"level":246},"Primärquellen und aktuelle Leitlinien",{},{"id":1332,"data":1333,"type":217,"tunes":1335},"p-sources-note",{"text":1334},"Die folgenden Quellen stützen die RBAC-Definition und die aktuellen Leitlinien zur Mandantenisolierung. Der Abschnitt zum Aaasaasa AI CMS ist ursprüngliche Implementierungsnachweis und ist absichtlich auf die verifizierten Codemuster beschränkt.",{},{"id":1337,"data":1338,"type":1344,"tunes":1345},"src-nist-rbac",{"link":1339,"meta":1340},"https:\u002F\u002Fcsrc.nist.gov\u002Fprojects\u002Frole-based-access-control",{"image":1341,"title":1342,"description":1343},{"url":368},"NIST — Role Based Access Control","NIST-Überblick über RBAC-Modelle und den INCITS-RBAC-Standard, einschließlich Benutzer, Rollen, Berechtigungen, Operationen und Objekte.","linkTool",{},{"id":1347,"data":1348,"type":1344,"tunes":1354},"src-nist-glossary",{"link":1349,"meta":1350},"https:\u002F\u002Fcsrc.nist.gov\u002Fglossary\u002Fterm\u002Frole_based_access_control",{"image":1351,"title":1352,"description":1353},{"url":368},"NIST CSRC — RBAC-Glossar","Aktuelle NIST-Glossardefinitionen von rollenbasierter Zugriffskontrolle als Berechtigungszuweisung durch Rollen.",{},{"id":1356,"data":1357,"type":1344,"tunes":1363},"src-aws-isolation",{"link":1358,"meta":1359},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fwhitepapers\u002Flatest\u002Fsaas-tenant-isolation-strategies\u002Fthe-isolation-mindset.html",{"image":1360,"title":1361,"description":1362},{"url":368},"AWS — Die Isolationsmentalität","AWS-SaaS-Leitlinien, die ausdrücklich Authentifizierung\u002FAutorisierung von Mandantenisolierung unterscheiden und gemeinsame Isolationsmechanismen empfehlen.",{},{"id":1365,"data":1366,"type":1344,"tunes":1372},"src-aws-faq",{"link":1367,"meta":1368},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Ffaq.html",{"image":1369,"title":1370,"description":1371},{"url":368},"AWS — FAQ zur mandantenfähigen Autorisierung","Aktuelle Leitlinien, die den Unterschied zwischen Autorisierung und Mandantenisolierung in SaaS-Anwendungen erklären.",{},{"id":1374,"data":1375,"type":1344,"tunes":1381},"src-aws-avp",{"link":1376,"meta":1377},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Favp-design-considerations.html",{"image":1378,"title":1379,"description":1380},{"url":368},"AWS — Überlegungen zum mandantenfähigen Design","Aktuelle SaaS-Leitlinien, die Mandantenisolierung von Autorisierung unterscheiden und pooled\u002Fsiloed Autorisierungsrichtlinienmodelle diskutieren.",{},{"id":1383,"data":1384,"type":1344,"tunes":1390},"src-owasp-multi",{"link":1385,"meta":1386},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FMulti_Tenant_Security_Cheat_Sheet.html",{"image":1387,"title":1388,"description":1389},{"url":368},"OWASP — Multi-Tenant Application Security Cheat Sheet","Aktuelle praktische Leitlinien für Mandantenkontext, Datenbankisolierung, Caches, Speicher, Warteschlangen, Tests und Verhinderung mandantenübergreifenden Zugriffs.",{},{"id":1392,"data":1393,"type":1344,"tunes":1399},"src-owasp-rag",{"link":1394,"meta":1395},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FRAG_Security_Cheat_Sheet.html",{"image":1396,"title":1397,"description":1398},{"url":368},"OWASP — RAG Security Cheat Sheet","Aktuelle Leitlinien, die Zugriffskontrolle zum Abrufzeitpunkt und Mandantenisolierung für mandantenfähige Vektorspeicher erfordern.",{},{"id":1401,"data":1402,"type":1344,"tunes":1408},"src-owasp-auth-test",{"link":1403,"meta":1404},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FAuthorization_Regression_Testing_Cheat_Sheet.html",{"image":1405,"title":1406,"description":1407},{"url":368},"OWASP — Autorisierungs-Regressionstests","Aktuelle Testleitlinien einschließlich Rollenherabsetzung und mandantenübergreifenden Grenztests.",{},"2.31","RBAC steuert, was ein Benutzer tun darf; Mandantenisolierung steuert, auf welche Ressourcen eines Mandanten diese Aktion zugreifen darf. Erfahren Sie, warum die Sicherheit von Multi-Tenant-SaaS beide Grenzen erfordert.","\u002Fuploads\u002F2026\u002F10\u002Frbac-vs-tenant-isolation-two-different-security-boundaries-1791485111528-qqtzby.webp","rbac-vs-tenant-isolation-two-different-security-boundaries-1791485111528-qqtzby","PUBLISHED","2026-10-08T14:43:00.000Z","2026-10-08T18:43:57.878Z","2026-10-08T18:56:28.335Z",{"en":1418,"de":1419,"sr":1420,"es":1421,"fr":1422,"it":1423,"ru":1424,"zh":1425},"\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fde\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fsr\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fes\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Ffr\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fit\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fru\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries","\u002Fzh\u002Fblog\u002Frbac-vs-tenant-isolation-two-different-security-boundaries",[1427,1431,1435],{"id":1428,"name":1429,"slug":1430},84,"Policy & Datengrenzen","policy-and-data",{"id":1432,"name":1433,"slug":1434},57,"Daten-Grenzen","data-boundaries",{"id":1436,"name":1437,"slug":1438},64,"Informationsarchitektur","information-architecture",{"id":1440,"login":1441,"email":1442,"displayName":1443},"20","rooth8233","aleksandar@stajic.de","Aleksandar Stajić",[1445,2038],{"lang":7,"title":207,"content":209,"contentJson":1446,"excerpt":1410},{"time":211,"blocks":1447,"version":1409},[1448,1451,1454,1457,1460,1463,1466,1469,1472,1475,1478,1481,1484,1487,1490,1493,1496,1499,1509,1512,1515,1518,1521,1524,1543,1546,1554,1557,1560,1563,1566,1569,1572,1575,1578,1581,1584,1587,1595,1598,1601,1604,1607,1610,1613,1624,1627,1630,1633,1636,1639,1642,1645,1648,1651,1654,1657,1660,1663,1666,1669,1672,1675,1678,1681,1684,1687,1690,1693,1696,1699,1702,1705,1708,1711,1714,1717,1720,1723,1726,1729,1732,1735,1738,1749,1752,1755,1758,1761,1764,1767,1770,1781,1784,1787,1790,1793,1796,1799,1814,1817,1820,1838,1841,1856,1859,1875,1878,1897,1900,1903,1906,1909,1912,1915,1918,1921,1924,1927,1930,1933,1936,1939,1942,1945,1948,1961,1964,1980,1983,1986,1989,1992,1995,1998,2003,2008,2013,2018,2023,2028,2033],{"id":214,"data":1449,"type":217,"tunes":1450},{"text":216},{},{"id":220,"data":1452,"type":225,"tunes":1453},{"body":222,"title":223,"variant":224},{},{"id":228,"data":1455,"type":225,"tunes":1456},{"body":230,"title":231,"variant":232},{},{"id":235,"data":1458,"type":225,"tunes":1459},{"body":237,"title":238,"variant":239},{},{"id":242,"data":1461,"type":247,"tunes":1462},{"title":244,"maxLevel":245,"minLevel":246},{},{"id":250,"data":1464,"type":41,"tunes":1465},{"text":252,"level":246},{},{"id":255,"data":1467,"type":217,"tunes":1468},{"text":257},{},{"id":260,"data":1470,"type":217,"tunes":1471},{"text":262},{},{"id":265,"data":1473,"type":217,"tunes":1474},{"text":267},{},{"id":270,"data":1476,"type":41,"tunes":1477},{"text":272,"level":246},{},{"id":275,"data":1479,"type":217,"tunes":1480},{"text":277},{},{"id":280,"data":1482,"type":217,"tunes":1483},{"text":282},{},{"id":285,"data":1485,"type":217,"tunes":1486},{"text":287},{},{"id":290,"data":1488,"type":41,"tunes":1489},{"text":292,"level":246},{},{"id":295,"data":1491,"type":217,"tunes":1492},{"text":297},{},{"id":300,"data":1494,"type":217,"tunes":1495},{"text":302},{},{"id":305,"data":1497,"type":217,"tunes":1498},{"text":307},{},{"id":310,"data":1500,"type":333,"tunes":1508},{"steps":1501,"title":331,"orientation":332},[1502,1503,1504,1505,1506,1507],{"label":314,"description":315},{"label":317,"description":318},{"label":320,"description":321},{"label":323,"description":324},{"label":326,"description":327},{"label":329,"description":330},{},{"id":336,"data":1510,"type":41,"tunes":1511},{"text":338,"level":246},{},{"id":341,"data":1513,"type":217,"tunes":1514},{"text":343},{},{"id":346,"data":1516,"type":217,"tunes":1517},{"text":348},{},{"id":351,"data":1519,"type":217,"tunes":1520},{"text":353},{},{"id":356,"data":1522,"type":41,"tunes":1523},{"text":358,"level":246},{},{"id":361,"data":1525,"type":398,"tunes":1542},{"rows":1526,"title":389,"layout":390,"columns":1539},[1527,1529,1531,1533,1535,1537],{"id":365,"label":366,"values":1528},[368,368],{"id":370,"label":371,"values":1530},[368,368],{"id":374,"label":375,"values":1532},[368,368],{"id":378,"label":379,"values":1534},[368,368],{"id":382,"label":383,"values":1536},[368,368],{"id":386,"label":387,"values":1538},[368,368],[1540,1541],{"id":393,"label":394},{"id":396,"label":397},{},{"id":401,"data":1544,"type":41,"tunes":1545},{"text":403,"level":246},{},{"id":406,"data":1547,"type":390,"tunes":1553},{"content":1548,"stretched":42,"withHeadings":13},[1549,1550,1551,1552],[410,411,412],[414,415,416],[418,419,420],[397,422,423],{},{"id":426,"data":1555,"type":217,"tunes":1556},{"text":428},{},{"id":431,"data":1558,"type":41,"tunes":1559},{"text":433,"level":246},{},{"id":436,"data":1561,"type":217,"tunes":1562},{"text":438},{},{"id":441,"data":1564,"type":217,"tunes":1565},{"text":443},{},{"id":446,"data":1567,"type":217,"tunes":1568},{"text":448},{},{"id":451,"data":1570,"type":41,"tunes":1571},{"text":453,"level":246},{},{"id":456,"data":1573,"type":217,"tunes":1574},{"text":458},{},{"id":461,"data":1576,"type":217,"tunes":1577},{"text":463},{},{"id":466,"data":1579,"type":217,"tunes":1580},{"text":468},{},{"id":471,"data":1582,"type":41,"tunes":1583},{"text":473,"level":246},{},{"id":476,"data":1585,"type":217,"tunes":1586},{"text":478},{},{"id":481,"data":1588,"type":390,"tunes":1594},{"content":1589,"stretched":42,"withHeadings":13},[1590,1591,1592,1593],[485,486],[488,489],[491,492],[494,495],{},{"id":498,"data":1596,"type":217,"tunes":1597},{"text":500},{},{"id":503,"data":1599,"type":41,"tunes":1600},{"text":505,"level":246},{},{"id":508,"data":1602,"type":217,"tunes":1603},{"text":510},{},{"id":513,"data":1605,"type":217,"tunes":1606},{"text":515},{},{"id":518,"data":1608,"type":225,"tunes":1609},{"body":520,"title":521,"variant":522},{},{"id":525,"data":1611,"type":41,"tunes":1612},{"text":527,"level":246},{},{"id":530,"data":1614,"type":390,"tunes":1623},{"content":1615,"stretched":42,"withHeadings":13},[1616,1617,1618,1619,1620,1621,1622],[534,535,536],[538,539,540],[542,543,544],[546,547,548],[550,551,552],[554,555,556],[558,559,560],{},{"id":563,"data":1625,"type":217,"tunes":1626},{"text":565},{},{"id":568,"data":1628,"type":41,"tunes":1629},{"text":570,"level":246},{},{"id":573,"data":1631,"type":217,"tunes":1632},{"text":575},{},{"id":578,"data":1634,"type":217,"tunes":1635},{"text":580},{},{"id":583,"data":1637,"type":217,"tunes":1638},{"text":585},{},{"id":588,"data":1640,"type":41,"tunes":1641},{"text":590,"level":246},{},{"id":593,"data":1643,"type":217,"tunes":1644},{"text":595},{},{"id":598,"data":1646,"type":217,"tunes":1647},{"text":600},{},{"id":603,"data":1649,"type":217,"tunes":1650},{"text":605},{},{"id":608,"data":1652,"type":41,"tunes":1653},{"text":610,"level":246},{},{"id":613,"data":1655,"type":217,"tunes":1656},{"text":615},{},{"id":618,"data":1658,"type":217,"tunes":1659},{"text":620},{},{"id":623,"data":1661,"type":217,"tunes":1662},{"text":625},{},{"id":628,"data":1664,"type":41,"tunes":1665},{"text":630,"level":246},{},{"id":633,"data":1667,"type":217,"tunes":1668},{"text":635},{},{"id":638,"data":1670,"type":217,"tunes":1671},{"text":640},{},{"id":643,"data":1673,"type":217,"tunes":1674},{"text":645},{},{"id":648,"data":1676,"type":41,"tunes":1677},{"text":650,"level":246},{},{"id":653,"data":1679,"type":217,"tunes":1680},{"text":655},{},{"id":658,"data":1682,"type":217,"tunes":1683},{"text":660},{},{"id":663,"data":1685,"type":217,"tunes":1686},{"text":665},{},{"id":668,"data":1688,"type":225,"tunes":1689},{"body":670,"title":671,"variant":232},{},{"id":674,"data":1691,"type":41,"tunes":1692},{"text":676,"level":246},{},{"id":679,"data":1694,"type":217,"tunes":1695},{"text":681},{},{"id":684,"data":1697,"type":217,"tunes":1698},{"text":686},{},{"id":689,"data":1700,"type":41,"tunes":1701},{"text":691,"level":246},{},{"id":694,"data":1703,"type":217,"tunes":1704},{"text":696},{},{"id":699,"data":1706,"type":217,"tunes":1707},{"text":701},{},{"id":704,"data":1709,"type":217,"tunes":1710},{"text":706},{},{"id":709,"data":1712,"type":41,"tunes":1713},{"text":711,"level":246},{},{"id":714,"data":1715,"type":217,"tunes":1716},{"text":716},{},{"id":719,"data":1718,"type":217,"tunes":1719},{"text":721},{},{"id":724,"data":1721,"type":217,"tunes":1722},{"text":726},{},{"id":729,"data":1724,"type":41,"tunes":1725},{"text":731,"level":246},{},{"id":734,"data":1727,"type":217,"tunes":1728},{"text":736},{},{"id":739,"data":1730,"type":217,"tunes":1731},{"text":741},{},{"id":744,"data":1733,"type":217,"tunes":1734},{"text":746},{},{"id":749,"data":1736,"type":41,"tunes":1737},{"text":751,"level":246},{},{"id":754,"data":1739,"type":390,"tunes":1748},{"content":1740,"stretched":42,"withHeadings":13},[1741,1742,1743,1744,1745,1746,1747],[758,759,760,761],[763,764,765,766],[763,764,768,769],[763,771,765,772],[763,771,768,769],[775,776,777,778],[780,781,782,783],{},{"id":786,"data":1750,"type":41,"tunes":1751},{"text":788,"level":246},{},{"id":791,"data":1753,"type":225,"tunes":1754},{"body":793,"title":794,"variant":239},{},{"id":797,"data":1756,"type":217,"tunes":1757},{"text":799},{},{"id":802,"data":1759,"type":217,"tunes":1760},{"text":804},{},{"id":807,"data":1762,"type":217,"tunes":1763},{"text":809},{},{"id":812,"data":1765,"type":217,"tunes":1766},{"text":814},{},{"id":817,"data":1768,"type":217,"tunes":1769},{"text":819},{},{"id":822,"data":1771,"type":390,"tunes":1780},{"content":1772,"stretched":42,"withHeadings":13},[1773,1774,1775,1776,1777,1778,1779],[826,827],[829,830],[832,833],[835,836],[838,839],[841,842],[844,845],{},{"id":848,"data":1782,"type":225,"tunes":1783},{"body":850,"title":851,"variant":232},{},{"id":854,"data":1785,"type":41,"tunes":1786},{"text":856,"level":246},{},{"id":859,"data":1788,"type":217,"tunes":1789},{"text":861},{},{"id":864,"data":1791,"type":217,"tunes":1792},{"text":866},{},{"id":869,"data":1794,"type":217,"tunes":1795},{"text":871},{},{"id":874,"data":1797,"type":41,"tunes":1798},{"text":876,"level":246},{},{"id":879,"data":1800,"type":390,"tunes":1813},{"content":1801,"stretched":42,"withHeadings":13},[1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812],[883,884],[886,887],[889,890],[892,893],[895,896],[898,899],[901,902],[904,905],[907,908],[910,911],[913,914],{},{"id":917,"data":1815,"type":217,"tunes":1816},{"text":919},{},{"id":922,"data":1818,"type":41,"tunes":1819},{"text":924,"level":246},{},{"id":927,"data":1821,"type":390,"tunes":1837},{"content":1822,"stretched":42,"withHeadings":13},[1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836],[931,932],[934,935],[937,938],[940,941],[943,944],[946,947],[949,950],[952,953],[955,956],[958,959],[961,962],[964,965],[967,968],[970,971],{},{"id":974,"data":1839,"type":41,"tunes":1840},{"text":976,"level":246},{},{"id":979,"data":1842,"type":390,"tunes":1855},{"content":1843,"stretched":42,"withHeadings":13},[1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854],[983,984],[986,987],[989,990],[992,993],[995,996],[998,999],[1001,1002],[1004,1005],[1007,1008],[1010,1011],[1013,1014],{},{"id":1017,"data":1857,"type":41,"tunes":1858},{"text":1019,"level":246},{},{"id":1022,"data":1860,"type":333,"tunes":1874},{"steps":1861,"title":1061,"orientation":332},[1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873],{"label":1026,"description":1027},{"label":1029,"description":1030},{"label":1032,"description":1033},{"label":1035,"description":1036},{"label":1038,"description":1039},{"label":1041,"description":1042},{"label":1044,"description":1045},{"label":1047,"description":1048},{"label":1050,"description":1051},{"label":1053,"description":1054},{"label":1056,"description":1057},{"label":1059,"description":1060},{},{"id":1064,"data":1876,"type":41,"tunes":1877},{"text":1066,"level":246},{},{"id":1069,"data":1879,"type":390,"tunes":1896},{"content":1880,"stretched":42,"withHeadings":13},[1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895],[411,1073],[1075,1076],[1078,1079],[1081,1082],[1084,1085],[1087,1088],[1090,1091],[1093,1094],[1096,1097],[1099,1100],[1102,1103],[1105,1106],[1108,1109],[1111,1112],[1114,1115],{},{"id":1118,"data":1898,"type":41,"tunes":1899},{"text":1120,"level":246},{},{"id":1123,"data":1901,"type":217,"tunes":1902},{"text":1125},{},{"id":1128,"data":1904,"type":217,"tunes":1905},{"text":1130},{},{"id":1133,"data":1907,"type":217,"tunes":1908},{"text":1135},{},{"id":1138,"data":1910,"type":217,"tunes":1911},{"text":1140},{},{"id":1143,"data":1913,"type":217,"tunes":1914},{"text":1145},{},{"id":1148,"data":1916,"type":41,"tunes":1917},{"text":1150,"level":246},{},{"id":1153,"data":1919,"type":217,"tunes":1920},{"text":1155},{},{"id":1158,"data":1922,"type":217,"tunes":1923},{"text":1160},{},{"id":1163,"data":1925,"type":217,"tunes":1926},{"text":1165},{},{"id":1168,"data":1928,"type":41,"tunes":1929},{"text":1170,"level":246},{},{"id":1173,"data":1931,"type":217,"tunes":1932},{"text":1175},{},{"id":1178,"data":1934,"type":217,"tunes":1935},{"text":1180},{},{"id":1183,"data":1937,"type":1189,"tunes":1938},{"url":1185,"title":1186,"excerpt":1187,"ctaLabel":1188},{},{"id":1192,"data":1940,"type":217,"tunes":1941},{"text":1194},{},{"id":1197,"data":1943,"type":1189,"tunes":1944},{"url":1199,"title":1200,"excerpt":1201,"ctaLabel":1202},{},{"id":1205,"data":1946,"type":41,"tunes":1947},{"text":1207,"level":246},{},{"id":1210,"data":1949,"type":1210,"tunes":1960},{"items":1950,"title":1249},[1951,1952,1953,1954,1955,1956,1957,1958,1959],{"id":1214,"answer":1215,"question":1216},{"id":1218,"answer":1219,"question":1220},{"id":1222,"answer":1223,"question":1224},{"id":1226,"answer":1227,"question":1228},{"id":1230,"answer":1231,"question":1232},{"id":1234,"answer":1235,"question":1236},{"id":1238,"answer":1239,"question":1240},{"id":1242,"answer":1243,"question":1244},{"id":1246,"answer":1247,"question":1248},{},{"id":1252,"data":1962,"type":41,"tunes":1963},{"text":1254,"level":246},{},{"id":1257,"data":1965,"type":1257,"tunes":1979},{"title":1259,"entries":1966},[1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978],{"term":394,"anchor":393,"definition":1262},{"term":1264,"anchor":396,"definition":1265},{"term":1267,"anchor":1268,"definition":1269},{"term":414,"anchor":1271,"definition":1272},{"term":1274,"anchor":1275,"definition":1276},{"term":1278,"anchor":1279,"definition":1280},{"term":1282,"anchor":1283,"definition":1284},{"term":1286,"anchor":1287,"definition":1288},{"term":1290,"anchor":1291,"definition":1292},{"term":1294,"anchor":1295,"definition":1296},{"term":1298,"anchor":1299,"definition":1300},{"term":1302,"anchor":1303,"definition":1304},{},{"id":1307,"data":1981,"type":41,"tunes":1982},{"text":1309,"level":246},{},{"id":1312,"data":1984,"type":217,"tunes":1985},{"text":1314},{},{"id":1317,"data":1987,"type":217,"tunes":1988},{"text":1319},{},{"id":1322,"data":1990,"type":217,"tunes":1991},{"text":1324},{},{"id":1327,"data":1993,"type":41,"tunes":1994},{"text":1329,"level":246},{},{"id":1332,"data":1996,"type":217,"tunes":1997},{"text":1334},{},{"id":1337,"data":1999,"type":1344,"tunes":2002},{"link":1339,"meta":2000},{"image":2001,"title":1342,"description":1343},{"url":368},{},{"id":1347,"data":2004,"type":1344,"tunes":2007},{"link":1349,"meta":2005},{"image":2006,"title":1352,"description":1353},{"url":368},{},{"id":1356,"data":2009,"type":1344,"tunes":2012},{"link":1358,"meta":2010},{"image":2011,"title":1361,"description":1362},{"url":368},{},{"id":1365,"data":2014,"type":1344,"tunes":2017},{"link":1367,"meta":2015},{"image":2016,"title":1370,"description":1371},{"url":368},{},{"id":1374,"data":2019,"type":1344,"tunes":2022},{"link":1376,"meta":2020},{"image":2021,"title":1379,"description":1380},{"url":368},{},{"id":1383,"data":2024,"type":1344,"tunes":2027},{"link":1385,"meta":2025},{"image":2026,"title":1388,"description":1389},{"url":368},{},{"id":1392,"data":2029,"type":1344,"tunes":2032},{"link":1394,"meta":2030},{"image":2031,"title":1397,"description":1398},{"url":368},{},{"id":1401,"data":2034,"type":1344,"tunes":2037},{"link":1403,"meta":2035},{"image":2036,"title":1406,"description":1407},{"url":368},{},{"lang":2039,"title":2040,"content":2041,"contentJson":2042,"excerpt":3029},"en","RBAC vs Tenant Isolation: Two Different Security Boundaries","{\"time\":1791485112883,\"blocks\":[{\"id\":\"intro\",\"type\":\"paragraph\",\"data\":{\"text\":\"RBAC and tenant isolation solve two different security problems in multi-tenant systems. Role-Based Access Control (RBAC) determines what an authenticated principal is allowed to do, such as read orders, edit products or manage users. Tenant isolation determines which tenant's data, resources and execution context that principal is allowed to access. A user can be correctly authenticated and correctly assigned an RBAC role yet still experience a security failure if the application lets that role operate on another tenant's resources.\"},\"tunes\":{}},{\"id\":\"direct\",\"type\":\"callout\",\"data\":{\"variant\":\"info\",\"title\":\"Direct answer\",\"body\":\"\u003Cstrong>RBAC answers “what may this identity do?” Tenant isolation answers “inside whose boundary may it do it?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>A secure multi-tenant application normally needs both. A tenant administrator may have broad permissions, but those permissions should remain constrained to the administrator's tenant unless an explicitly separate platform-level authority exists.\"},\"tunes\":{}},{\"id\":\"boundary\",\"type\":\"callout\",\"data\":{\"variant\":\"warning\",\"title\":\"A role is not a tenant boundary\",\"body\":\"Giving a user the role \u003Ccode>ADMIN\u003C\u002Fcode> does not automatically imply “administrator of tenant A only.” The role must be evaluated together with verified tenant context and the target resource's tenant ownership. Otherwise a valid role can become a cross-tenant privilege.\"},\"tunes\":{}},{\"id\":\"current\",\"type\":\"callout\",\"data\":{\"variant\":\"note\",\"title\":\"Current-source note — 8 October 2026\",\"body\":\"The underlying distinction is stable. NIST defines RBAC around users, roles, permissions, operations and objects. Current AWS SaaS guidance explicitly states that authentication and authorization are not equal to tenant isolation, and that a user can be authenticated and authorized while still accessing another tenant's resources if isolation is not separately enforced. OWASP's current Multi-Tenant Security guidance likewise treats tenant isolation as a cross-layer requirement covering APIs, databases, caches, storage, queues and other shared resources.\"},\"tunes\":{}},{\"id\":\"toc\",\"type\":\"tableOfContents\",\"data\":{\"title\":\"Contents\",\"minLevel\":2,\"maxLevel\":3},\"tunes\":{}},{\"id\":\"h-meaning\",\"type\":\"header\",\"data\":{\"text\":\"What RBAC really controls\",\"level\":2},\"tunes\":{}},{\"id\":\"p-rbac-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"RBAC is an authorization model in which permissions are associated with roles and users are assigned to those roles. The role acts as an administrative abstraction between identities and permissions.\"},\"tunes\":{}},{\"id\":\"p-rbac-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"NIST's classic RBAC work formalizes this around users, roles, permissions, operations and objects. The practical benefit is that an organization can manage authorization through relatively stable job or responsibility roles rather than attaching every permission directly to every user.\"},\"tunes\":{}},{\"id\":\"p-rbac-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"A role such as EDITOR can therefore mean: may read content, write content and publish content. A role such as ACCOUNTANT may mean: may read billing data, reconcile invoices and approve settlements.\"},\"tunes\":{}},{\"id\":\"h-tenant\",\"type\":\"header\",\"data\":{\"text\":\"What tenant isolation really controls\",\"level\":2},\"tunes\":{}},{\"id\":\"p-tenant-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Tenant isolation is the set of mechanisms that prevents one tenant from reading, modifying, influencing or accidentally receiving another tenant's resources in a shared system.\"},\"tunes\":{}},{\"id\":\"p-tenant-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"The protected boundary is broader than database rows. Tenant-specific state can exist in relational tables, object storage, vector indexes, caches, search indexes, queue messages, files, temporary artifacts, background jobs, analytics, rate limits and infrastructure resources.\"},\"tunes\":{}},{\"id\":\"p-tenant-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"AWS's SaaS guidance makes the distinction explicit: authorization grants access to resources, while tenant isolation ensures those resources cannot cross the wrong tenant boundary even when infrastructure is shared.\"},\"tunes\":{}},{\"id\":\"h-simple\",\"type\":\"header\",\"data\":{\"text\":\"The simplest example\",\"level\":2},\"tunes\":{}},{\"id\":\"p-simple-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Suppose Alice is an administrator for Tenant A and Bob is an administrator for Tenant B. Both users legitimately hold the same ADMIN role.\"},\"tunes\":{}},{\"id\":\"p-simple-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"RBAC can correctly conclude that both users may execute an operation such as users.read. But when Alice requests user ID 847, the application must still verify that user 847 belongs to Tenant A.\"},\"tunes\":{}},{\"id\":\"p-simple-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"If the API checks only “Alice has ADMIN” and then executes SELECT * FROM users WHERE id = 847, RBAC succeeded while tenant isolation failed.\"},\"tunes\":{}},{\"id\":\"simple-flow\",\"type\":\"processFlow\",\"data\":{\"title\":\"A correct multi-tenant authorization decision\",\"orientation\":\"auto\",\"steps\":[{\"label\":\"1. Authenticate principal\",\"description\":\"Establish who the user, service or agent is.\"},{\"label\":\"2. Resolve verified tenant context\",\"description\":\"Determine which tenant context applies from trusted server-side identity\u002Fmembership information.\"},{\"label\":\"3. Resolve permission\",\"description\":\"Evaluate whether the principal's role or policy permits the requested operation.\"},{\"label\":\"4. Scope the target resource\",\"description\":\"Verify that the target object belongs to the permitted tenant or explicitly shared scope.\"},{\"label\":\"5. Enforce at the access boundary\",\"description\":\"Perform the database, cache, storage, queue or service operation with tenant constraints applied.\"},{\"label\":\"6. Audit both dimensions\",\"description\":\"Record principal, tenant, operation, target and result so cross-tenant attempts are visible.\"}]},\"tunes\":{}},{\"id\":\"h-stops\",\"type\":\"header\",\"data\":{\"text\":\"Where the simple example stops\",\"level\":2},\"tunes\":{}},{\"id\":\"p-stops-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Real systems often contain several classes of identity: tenant users, platform administrators, background workers, integrations, agents and cross-tenant operational services. Some of these legitimately cross tenant boundaries.\"},\"tunes\":{}},{\"id\":\"p-stops-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"That does not remove the need for isolation. It means cross-tenant authority must be explicit, narrow and separately auditable rather than emerging accidentally from a global role or unscoped database connection.\"},\"tunes\":{}},{\"id\":\"p-stops-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Tenant isolation can also vary by layer. A product may share application servers while separating databases, or use a shared database with row-level policies while giving premium tenants isolated storage or compute. There is no single universal isolation topology.\"},\"tunes\":{}},{\"id\":\"h-compare\",\"type\":\"header\",\"data\":{\"text\":\"RBAC vs tenant isolation\",\"level\":2},\"tunes\":{}},{\"id\":\"core-comparison\",\"type\":\"comparison\",\"data\":{\"title\":\"Two different security dimensions\",\"layout\":\"table\",\"columns\":[{\"id\":\"rbac\",\"label\":\"RBAC\"},{\"id\":\"tenant\",\"label\":\"Tenant isolation\"}],\"rows\":[{\"id\":\"question\",\"label\":\"Primary question\",\"values\":[\"\",\"\"]},{\"id\":\"unit\",\"label\":\"Typical unit\",\"values\":[\"\",\"\"]},{\"id\":\"example\",\"label\":\"Example\",\"values\":[\"\",\"\"]},{\"id\":\"failure\",\"label\":\"Typical failure\",\"values\":[\"\",\"\"]},{\"id\":\"implementation\",\"label\":\"Typical implementation\",\"values\":[\"\",\"\"]},{\"id\":\"scope\",\"label\":\"Can it exist alone?\",\"values\":[\"\",\"\"]}]},\"tunes\":{}},{\"id\":\"h-authn\",\"type\":\"header\",\"data\":{\"text\":\"Authentication, authorization and isolation are three different checks\",\"level\":2},\"tunes\":{}},{\"id\":\"three-checks\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Layer\",\"Question\",\"Example failure\"],[\"Authentication\",\"Who is this principal?\",\"Attacker impersonates Alice\"],[\"Authorization \u002F RBAC\",\"May this principal perform this operation?\",\"Viewer can delete users\"],[\"Tenant isolation\",\"May this operation reach this tenant\u002Fresource boundary?\",\"Tenant A admin reads Tenant B order\"]]},\"tunes\":{}},{\"id\":\"p-authn-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"These checks are related but non-substitutable. Authentication can be perfect while authorization fails. Authorization can be correct while tenant isolation fails. A secure SaaS request path needs all applicable boundaries.\"},\"tunes\":{}},{\"id\":\"h-role-scope\",\"type\":\"header\",\"data\":{\"text\":\"Roles need a scope\",\"level\":2},\"tunes\":{}},{\"id\":\"p-role-scope-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"The word ADMIN is incomplete without scope. It can mean platform administrator, tenant administrator, project administrator, workspace administrator or administrator of one subsystem.\"},\"tunes\":{}},{\"id\":\"p-role-scope-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"In multi-tenant systems, role assignment should normally be associated with tenant membership or another explicit resource scope. The same user may legitimately be ADMIN in Tenant A and VIEWER in Tenant B.\"},\"tunes\":{}},{\"id\":\"p-role-scope-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"A global role model that ignores this distinction can create privilege leakage even when the permission map itself is correct.\"},\"tunes\":{}},{\"id\":\"h-context\",\"type\":\"header\",\"data\":{\"text\":\"Tenant context must come from a trusted path\",\"level\":2},\"tunes\":{}},{\"id\":\"p-context-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"A tenant ID supplied by the client is useful as a selector, but it is not proof of authority. The server must derive or verify tenant membership against authenticated identity and current authorization data.\"},\"tunes\":{}},{\"id\":\"p-context-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"OWASP's current multi-tenant guidance recommends establishing tenant context early in the request lifecycle and explicitly warns against treating client headers or request parameters as authorization proof.\"},\"tunes\":{}},{\"id\":\"p-context-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"This matters because a trivial request modification from tenant=A to tenant=B must not be sufficient to cross the isolation boundary.\"},\"tunes\":{}},{\"id\":\"h-query\",\"type\":\"header\",\"data\":{\"text\":\"Tenant scope belongs in the resource lookup\",\"level\":2},\"tunes\":{}},{\"id\":\"p-query-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"A common application-level isolation pattern is to include tenant scope in the same query that resolves the resource.\"},\"tunes\":{}},{\"id\":\"query-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Weak lookup\",\"Stronger tenant-scoped lookup\"],[\"findFirst({ where: { id } })\",\"findFirst({ where: { id, tenantId } })\"],[\"UPDATE orders SET ... WHERE id = ?\",\"UPDATE orders SET ... WHERE id = ? AND tenant_id = ?\"],[\"cache.get('user:' + id)\",\"cache.get('tenant:' + tenantId + ':user:' + id)\"]]},\"tunes\":{}},{\"id\":\"p-query-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"This pattern is not the only possible isolation mechanism, but it keeps tenant ownership close to the data access operation and prevents an object ID from becoming a cross-tenant capability.\"},\"tunes\":{}},{\"id\":\"h-defense\",\"type\":\"header\",\"data\":{\"text\":\"Application checks are useful, but isolation should not depend on perfect developer behavior\",\"level\":2},\"tunes\":{}},{\"id\":\"p-defense-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"AWS's isolation guidance explicitly warns against leaving isolation enforcement only to service developers. In a large codebase, eventually one query, cache key or worker path may omit tenant scope.\"},\"tunes\":{}},{\"id\":\"p-defense-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Defense in depth can therefore move isolation into shared middleware, repository\u002Fservice layers, policy engines, database Row-Level Security, dedicated credentials, separate schemas or separate databases depending on risk and architecture.\"},\"tunes\":{}},{\"id\":\"defense-rule\",\"type\":\"callout\",\"data\":{\"variant\":\"success\",\"title\":\"Isolation should be hard to forget\",\"body\":\"The strongest boundary is one that ordinary application code cannot casually bypass by omitting one \u003Ccode>tenantId\u003C\u002Fcode> condition.\"},\"tunes\":{}},{\"id\":\"h-db\",\"type\":\"header\",\"data\":{\"text\":\"Database isolation strategies\",\"level\":2},\"tunes\":{}},{\"id\":\"db-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Strategy\",\"Boundary\",\"Strength \u002F trade-off\"],[\"Shared tables + tenant key\",\"Row\u002Fapplication policy\",\"Operationally efficient; requires exhaustive tenant scoping and strong tests\"],[\"Shared tables + database RLS\",\"Database policy boundary\",\"Reduces dependence on every application query; requires correct roles, session\u002Ftransaction tenant context and policy coverage\"],[\"Separate schemas\",\"Namespace \u002F DB-role boundary\",\"Stronger logical separation; more operational complexity\"],[\"Separate databases\",\"Database \u002F credential boundary\",\"Strong isolation and simpler blast-radius story; higher provisioning and operations cost\"],[\"Separate infrastructure\u002Faccount\",\"Infrastructure boundary\",\"Strongest coarse-grained separation; highest cost and operational overhead\"],[\"Hybrid\",\"Per workload\u002Fdata class\",\"Allows stronger isolation only where risk\u002Fcompliance justifies it\"]]},\"tunes\":{}},{\"id\":\"p-db-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"OWASP's current Multi-Tenant Security Cheat Sheet lists separate databases, separate schemas, shared tables with row-level controls and hybrid models. The correct model depends on threat level, compliance, performance and operational cost.\"},\"tunes\":{}},{\"id\":\"h-rls\",\"type\":\"header\",\"data\":{\"text\":\"PostgreSQL Row-Level Security can provide defense in depth\",\"level\":2},\"tunes\":{}},{\"id\":\"p-rls-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"With shared tables, PostgreSQL Row-Level Security can enforce a tenant predicate at the database layer so ordinary queries cannot see rows outside the active tenant policy.\"},\"tunes\":{}},{\"id\":\"p-rls-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"However, RLS is not magic. PostgreSQL superusers and roles with BYPASSRLS can bypass row policies. OWASP therefore recommends using a least-privileged request-path role and testing the same connection\u002Fpooling mode used in production.\"},\"tunes\":{}},{\"id\":\"p-rls-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Connection reuse is another important edge: tenant context must be set and reset safely for every transaction\u002Frequest so one pooled connection cannot leak prior tenant state.\"},\"tunes\":{}},{\"id\":\"h-cache\",\"type\":\"header\",\"data\":{\"text\":\"Tenant isolation must include caches\",\"level\":2},\"tunes\":{}},{\"id\":\"p-cache-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"A database query can be perfectly scoped and still leak data through a shared cache key.\"},\"tunes\":{}},{\"id\":\"p-cache-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"If user:42 exists in both Tenant A and Tenant B, a global cache key can return the wrong tenant's value. Tenant-sensitive cache keys should include every attribute that changes visibility or result semantics, commonly tenant, user, locale, feature set or permission version.\"},\"tunes\":{}},{\"id\":\"p-cache-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Cache partitioning is defense in depth, not a replacement for authorization. The request still needs to be authorized before protected cached content is returned.\"},\"tunes\":{}},{\"id\":\"h-storage\",\"type\":\"header\",\"data\":{\"text\":\"Files and object storage need their own tenant boundary\",\"level\":2},\"tunes\":{}},{\"id\":\"p-storage-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Object storage should distinguish global, tenant-scoped and user-scoped objects. A folder prefix alone is only a naming convention unless access policy actually constrains reads and writes.\"},\"tunes\":{}},{\"id\":\"p-storage-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Stronger designs may use tenant-aware object keys, bucket policies, separate buckets\u002Faccounts or tenant-specific encryption keys where risk or compliance requires stronger isolation.\"},\"tunes\":{}},{\"id\":\"p-storage-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Signed URLs must be authorized before issuance and scoped to the exact object and operation. Possession of an object identifier should not itself grant cross-tenant access.\"},\"tunes\":{}},{\"id\":\"h-queues\",\"type\":\"header\",\"data\":{\"text\":\"Background jobs and queues can break isolation\",\"level\":2},\"tunes\":{}},{\"id\":\"p-queue-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Async jobs often leave the original HTTP request context, which makes tenant propagation easy to mishandle. A queue message containing tenantId is not sufficient proof that the producer was authorized.\"},\"tunes\":{}},{\"id\":\"p-queue-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"The worker should carry a verified service\u002Fuser identity or trusted job envelope, re-establish tenant context and re-authorize consequential operations at the consumer boundary.\"},\"tunes\":{}},{\"id\":\"p-queue-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Tenant isolation also includes availability. One tenant should not be able to monopolize shared workers, queues, connection pools or compute in ways that materially degrade other tenants.\"},\"tunes\":{}},{\"id\":\"h-search\",\"type\":\"header\",\"data\":{\"text\":\"Search and RAG need tenant-aware retrieval\",\"level\":2},\"tunes\":{}},{\"id\":\"p-search-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Multi-tenant AI introduces another copy of the isolation problem. Documents may be chunked, embedded and stored in a vector index after ingestion.\"},\"tunes\":{}},{\"id\":\"p-search-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"OWASP's current RAG security guidance states that access control must be enforced at retrieval time and that chunks from Tenant A must not be retrieved by queries from Tenant B. Document-level permissions cannot simply be assumed to survive chunking automatically.\"},\"tunes\":{}},{\"id\":\"p-search-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"The vector index therefore needs tenant\u002Faccess metadata or physically\u002Flogically separate collections according to the isolation design. Retrieval filters should be applied before unauthorized content can enter model context.\"},\"tunes\":{}},{\"id\":\"rag-rule\",\"type\":\"callout\",\"data\":{\"variant\":\"warning\",\"title\":\"The model must never be the tenant filter\",\"body\":\"Do not retrieve cross-tenant chunks and then instruct the language model to ignore them. Once protected data enters model context, the isolation boundary has already failed.\"},\"tunes\":{}},{\"id\":\"h-derived\",\"type\":\"header\",\"data\":{\"text\":\"Derived data inherits tenant sensitivity\",\"level\":2},\"tunes\":{}},{\"id\":\"p-derived-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Embeddings, search indexes, thumbnails, generated summaries, caches, analytics rows and AI responses are derived from source data. Their tenant scope should follow the source unless an explicit transformation creates a legitimate shared\u002Fglobal artifact.\"},\"tunes\":{}},{\"id\":\"p-derived-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Deletion and offboarding must therefore propagate beyond the canonical row. Removing a tenant document while leaving searchable chunks or cached summaries can retain cross-tenant or post-retention exposure.\"},\"tunes\":{}},{\"id\":\"h-shared\",\"type\":\"header\",\"data\":{\"text\":\"Not everything belongs to a tenant\",\"level\":2},\"tunes\":{}},{\"id\":\"p-shared-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Multi-tenant platforms often have intentionally global resources: product taxonomies, public templates, system permissions, feature definitions or public content.\"},\"tunes\":{}},{\"id\":\"p-shared-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"The safest model is explicit classification: global, tenant-scoped, user-scoped or explicitly cross-tenant. Ambiguous resources are where accidental leakage begins.\"},\"tunes\":{}},{\"id\":\"p-shared-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"An intentionally shared object should have a documented reason for being global rather than simply lacking a tenant association.\"},\"tunes\":{}},{\"id\":\"h-platform-admin\",\"type\":\"header\",\"data\":{\"text\":\"Platform administrators require a different authority model\",\"level\":2},\"tunes\":{}},{\"id\":\"p-platform-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"A platform operator may need to inspect multiple tenants for support, compliance or infrastructure operations. Modeling this as an ordinary tenant ADMIN with accidental global database access weakens both security and auditability.\"},\"tunes\":{}},{\"id\":\"p-platform-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"A better design uses a distinct platform identity or explicit cross-tenant permission, stronger authentication, purpose limitation, detailed audit and, where appropriate, approval or break-glass controls.\"},\"tunes\":{}},{\"id\":\"p-platform-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Cross-tenant access should therefore be a named capability, not the absence of a tenant filter.\"},\"tunes\":{}},{\"id\":\"h-abac\",\"type\":\"header\",\"data\":{\"text\":\"RBAC can be combined with attributes\",\"level\":2},\"tunes\":{}},{\"id\":\"p-abac-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"Some decisions depend on more than role. Tenant membership, region, resource owner, subscription tier, time, project membership or data classification can all affect access.\"},\"tunes\":{}},{\"id\":\"p-abac-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"RBAC and ABAC are not mutually exclusive. AWS's current multi-tenant authorization guidance discusses RBAC, ABAC and hybrid models. A role can define broad responsibility while attributes constrain which concrete resource instance can be accessed.\"},\"tunes\":{}},{\"id\":\"p-abac-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"The key architecture rule remains: do not encode tenant isolation only as an incidental role name if tenant identity is a first-class resource boundary.\"},\"tunes\":{}},{\"id\":\"h-matrix\",\"type\":\"header\",\"data\":{\"text\":\"Authorization decisions are at least two-dimensional\",\"level\":2},\"tunes\":{}},{\"id\":\"matrix-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Principal\",\"Role permission\",\"Tenant relationship\",\"Decision\"],[\"Alice\",\"orders.read\",\"Order belongs to Alice's tenant\",\"Allow\"],[\"Alice\",\"orders.read\",\"Order belongs to another tenant\",\"Deny\"],[\"Alice\",\"orders.write\",\"Order belongs to Alice's tenant\",\"Allow if role includes write\"],[\"Alice\",\"orders.write\",\"Order belongs to another tenant\",\"Deny\"],[\"Platform support\",\"support.cross_tenant.read\",\"Explicit support scope + audited target tenant\",\"Potentially allow under platform policy\"],[\"Background worker\",\"orders.process\",\"Trusted service scope for job tenant\",\"Allow only for verified job tenant\"]]},\"tunes\":{}},{\"id\":\"h-implementation\",\"type\":\"header\",\"data\":{\"text\":\"Original implementation evidence: Aaasaasa AI CMS\",\"level\":2},\"tunes\":{}},{\"id\":\"impl-note\",\"type\":\"callout\",\"data\":{\"variant\":\"note\",\"title\":\"Original implementation evidence\",\"body\":\"Aaasaasa AI CMS contains a concrete tenant-scoped RBAC implementation. It is useful evidence for how role authorization and tenant scope can be combined, but it should not be presented as proof that every storage, cache or infrastructure layer has complete tenant isolation.\"},\"tunes\":{}},{\"id\":\"p-impl-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"The RBAC service defines typed permission codes such as cms.content.read, shop.orders.write, billing.reconcile and users.roles. System roles map those permissions into named responsibility sets.\"},\"tunes\":{}},{\"id\":\"p-impl-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Role records are created and resolved with a tenantId. System roles are upserted using a composite tenant\u002Fcode identity, and role listing is filtered by tenant.\"},\"tunes\":{}},{\"id\":\"p-impl-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Role update and deletion first resolve the role using both role ID and tenant ID. User-role assignments are also stored and replaced under the current tenant context.\"},\"tunes\":{}},{\"id\":\"p-impl-4\",\"type\":\"paragraph\",\"data\":{\"text\":\"Permission resolution reads explicit user-role assignments scoped by both tenantId and userId. This prevents one tenant's role assignment from automatically becoming another tenant's role assignment.\"},\"tunes\":{}},{\"id\":\"p-impl-5\",\"type\":\"paragraph\",\"data\":{\"text\":\"At API level, administrative RBAC routes resolve a tenant context before creating or modifying roles. This is the correct direction: permission administration itself must respect tenancy.\"},\"tunes\":{}},{\"id\":\"impl-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Observed implementation pattern\",\"Security meaning\"],[\"Typed permission codes\",\"RBAC operation vocabulary is explicit\"],[\"System role → permission maps\",\"Roles aggregate permissions rather than hard-coding users\"],[\"tenantId_code role identity\",\"Same logical role can exist separately per tenant\"],[\"Role lookup uses id + tenantId\",\"Role mutation is tenant-scoped\"],[\"User-role relation stores tenantId\",\"Membership is not globally inferred from role alone\"],[\"Permission resolution uses tenantId + userId\",\"Authorization is evaluated inside tenant context\"]]},\"tunes\":{}},{\"id\":\"impl-boundary\",\"type\":\"callout\",\"data\":{\"variant\":\"warning\",\"title\":\"What this evidence does not prove\",\"body\":\"Tenant-scoped RBAC is one layer. Complete tenant isolation must also cover all tenant-owned resource lookups, databases, caches, files, search\u002Fvector indexes, background jobs, integrations and operational paths. The repository evidence here supports the RBAC\u002Ftenant-scope design pattern, not a claim of independently audited SaaS isolation.\"},\"tunes\":{}},{\"id\":\"h-ai\",\"type\":\"header\",\"data\":{\"text\":\"Why this distinction matters even more for AI agents\",\"level\":2},\"tunes\":{}},{\"id\":\"p-ai-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"AI agents can turn a permission mistake into a sequence of actions. If an agent is given a broad orders.read tool without tenant-scoped enforcement, a reasoning or prompt-injection failure can cause cross-tenant reads at machine speed.\"},\"tunes\":{}},{\"id\":\"p-ai-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Agent tool descriptions can mention tenant constraints, but enforcement must still happen in the trusted runtime\u002Fservice\u002Fdata layer. Natural-language instructions are not an authorization boundary.\"},\"tunes\":{}},{\"id\":\"p-ai-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"The same applies to RAG: an agent can have permission to use the search tool while the search backend must still prevent Tenant A's query from returning Tenant B's chunks.\"},\"tunes\":{}},{\"id\":\"h-tests\",\"type\":\"header\",\"data\":{\"text\":\"Test RBAC and tenant isolation separately\",\"level\":2},\"tunes\":{}},{\"id\":\"tests-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Test family\",\"What it should prove\"],[\"Role demotion test\",\"A user without a permission cannot perform the operation even inside their own tenant\"],[\"Cross-tenant object test\",\"A user with the correct role still cannot access the same resource type in another tenant\"],[\"Identifier tampering\",\"Changing object\u002Ftenant IDs does not cross scope\"],[\"List\u002Fbulk endpoint test\",\"Broad queries return only authorized tenant data\"],[\"Cache reuse test\",\"Two tenants using reused processes\u002Fconnections never receive each other's cached state\"],[\"RLS request-role test\",\"Production request role cannot bypass row policies\"],[\"Async worker test\",\"Tenant context survives queueing and is revalidated at consumption\"],[\"Vector retrieval test\",\"Tenant A query never retrieves Tenant B chunks\"],[\"Platform-admin test\",\"Cross-tenant capability is explicit, narrow and auditable\"],[\"Offboarding test\",\"Tenant data and derived indexes\u002Fcaches are removed according to policy\"]]},\"tunes\":{}},{\"id\":\"p-tests-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"OWASP's authorization regression guidance specifically calls out cross-tenant boundary tests because code changes in caching, queries or shared services can silently break isolation even when role tests continue to pass.\"},\"tunes\":{}},{\"id\":\"h-failures\",\"type\":\"header\",\"data\":{\"text\":\"Common failure modes\",\"level\":2},\"tunes\":{}},{\"id\":\"failures-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Failure mode\",\"Why it fails\"],[\"Check role but not tenant\",\"Valid role becomes cross-tenant authority\"],[\"Trust tenant ID from request\",\"Client controls the isolation selector\"],[\"Scope UI but not API\",\"Hidden buttons do not protect backend resources\"],[\"Tenant-aware detail endpoint, unscoped list endpoint\",\"Bulk reads leak other tenants\"],[\"Tenant filter in most queries\",\"One forgotten path breaks the boundary\"],[\"Global cache keys\",\"Correct database isolation is bypassed by cached data\"],[\"Shared vector index without enforced metadata filters\",\"RAG retrieves another tenant's chunks\"],[\"Queue message tenant ID treated as authorization\",\"Forged or wrongly produced job can cross tenant boundary\"],[\"Platform admin modeled as ordinary ADMIN\",\"Cross-tenant power becomes implicit and difficult to audit\"],[\"Role copied globally across tenant memberships\",\"User receives permissions in tenants where they were never assigned\"],[\"Separate databases but shared privileged credential\",\"Application can still cross databases if its credential is too broad\"],[\"RLS with BYPASSRLS request role\",\"Database policy exists but does not protect the actual request path\"],[\"Random UUIDs treated as isolation\",\"Hard-to-guess identifiers reduce enumeration but do not authorize access\"]]},\"tunes\":{}},{\"id\":\"h-misconceptions\",\"type\":\"header\",\"data\":{\"text\":\"Common misconceptions\",\"level\":2},\"tunes\":{}},{\"id\":\"misconceptions-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Misconception\",\"Correction\"],[\"“RBAC provides tenant isolation.”\",\"RBAC controls permissions; isolation also requires tenant\u002Fresource scoping.\"],[\"“If the user is an admin, tenant checks are unnecessary.”\",\"Admin authority must still have an explicit scope.\"],[\"“Tenant ID in JWT is enough.”\",\"It can be a trusted input only if validated and applied consistently to every protected resource path.\"],[\"“Separate databases remove authorization requirements.”\",\"Users still need operation-level permissions inside their tenant.\"],[\"“A tenant_id column means the system is isolated.”\",\"The field only helps if access paths enforce it.\"],[\"“UUIDs prevent cross-tenant access.”\",\"Unpredictable identifiers are defense in depth, not authorization.\"],[\"“RLS means application code needs no security checks.”\",\"Application authorization, correct DB roles and policy coverage still matter.\"],[\"“One shared vector DB is unsafe.”\",\"It can be safe if isolation is enforceable and verified; physical separation is one option, not the only one.\"],[\"“Platform support needs global ADMIN.”\",\"Cross-tenant support should be a distinct, constrained and auditable authority.\"],[\"“Internal services can skip tenant checks.”\",\"Internal paths can still be compromised or misconfigured and must preserve tenant context.\"]]},\"tunes\":{}},{\"id\":\"h-design\",\"type\":\"header\",\"data\":{\"text\":\"A practical design sequence\",\"level\":2},\"tunes\":{}},{\"id\":\"design-flow\",\"type\":\"processFlow\",\"data\":{\"title\":\"Design permissions and isolation as separate dimensions\",\"orientation\":\"auto\",\"steps\":[{\"label\":\"1. Define tenant ownership\",\"description\":\"Classify which entities and resources are global, tenant-scoped, user-scoped or intentionally cross-tenant.\"},{\"label\":\"2. Define operations\",\"description\":\"Create explicit permissions for reads, writes, publishing, approvals, administration and other business actions.\"},{\"label\":\"3. Define roles\",\"description\":\"Group permissions according to responsibilities without embedding accidental global scope.\"},{\"label\":\"4. Define membership scope\",\"description\":\"Bind role assignments to the tenant\u002Fworkspace\u002Fproject context in which they apply.\"},{\"label\":\"5. Resolve trusted tenant context\",\"description\":\"Derive tenant identity from authenticated, server-verified membership or service authorization.\"},{\"label\":\"6. Enforce resource ownership\",\"description\":\"Apply tenant scope at every tenant-owned data\u002Fservice boundary.\"},{\"label\":\"7. Add defense in depth\",\"description\":\"Use RLS, separate credentials, schemas\u002Fdatabases, storage policies or policy engines where risk justifies them.\"},{\"label\":\"8. Carry scope through derived systems\",\"description\":\"Preserve tenant metadata in cache, search, vector indexes, queues, files and analytics.\"},{\"label\":\"9. Model cross-tenant operations explicitly\",\"description\":\"Separate platform administration and service identities from ordinary tenant roles.\"},{\"label\":\"10. Test both axes\",\"description\":\"Run negative tests for missing permission and for wrong tenant independently.\"},{\"label\":\"11. Audit tenant + permission together\",\"description\":\"Log who acted, in which tenant, on what target and under which authority.\"},{\"label\":\"12. Re-test after schema\u002Fruntime changes\",\"description\":\"Isolation can break when new tables, caches, queues or retrieval paths are introduced.\"}]},\"tunes\":{}},{\"id\":\"h-checklist\",\"type\":\"header\",\"data\":{\"text\":\"RBAC + tenant isolation checklist\",\"level\":2},\"tunes\":{}},{\"id\":\"checklist-table\",\"type\":\"table\",\"data\":{\"withHeadings\":true,\"stretched\":false,\"content\":[[\"Question\",\"Expected answer\"],[\"Who is the principal?\",\"Authenticated user\u002Fservice\u002Fagent identity\"],[\"Which tenant context applies?\",\"Server-verified membership or service scope\"],[\"Which operation is requested?\",\"Typed permission or policy action\"],[\"Does the principal have that permission?\",\"Role\u002Fpolicy decision\"],[\"Who owns the target resource?\",\"Explicit tenant\u002Fglobal\u002Fuser classification\"],[\"Does resource scope match authority?\",\"Tenant-aware lookup\u002Fpolicy\"],[\"Can storage bypass application checks?\",\"Defense-in-depth decision documented\"],[\"Are caches tenant-safe?\",\"Keys\u002Fnamespaces and authorization preserve tenant scope\"],[\"Are files\u002Fblobs tenant-safe?\",\"Object policy and signed URL issuance enforce scope\"],[\"Are async jobs tenant-safe?\",\"Verified context propagates and is revalidated\"],[\"Is RAG\u002Fsearch tenant-safe?\",\"Metadata\u002Fcollection isolation enforced before model context\"],[\"Are cross-tenant admins explicit?\",\"Separate authority, controls and audit\"],[\"Can ordinary credentials bypass isolation?\",\"No, or tightly documented exceptional path\"],[\"Are negative cross-tenant tests automated?\",\"Yes for every relevant access layer\"]]},\"tunes\":{}},{\"id\":\"h-edge\",\"type\":\"header\",\"data\":{\"text\":\"Edge cases and limitations\",\"level\":2},\"tunes\":{}},{\"id\":\"p-edge-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"A user can belong to multiple tenants. The current tenant should therefore be an explicit execution context, not inferred permanently from the user account.\"},\"tunes\":{}},{\"id\":\"p-edge-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"Some resources are intentionally shared between selected tenants, such as collaboration spaces or consortium data. This requires an explicit sharing model; pretending the resource belongs to one tenant and adding exceptions later usually creates ambiguous authorization.\"},\"tunes\":{}},{\"id\":\"p-edge-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"Noisy-neighbor isolation is related but different from confidentiality isolation. A tenant may never see another tenant's data yet still exhaust shared CPU, queue capacity or database connections. Rate limits and resource quotas can therefore be tenant-aware as an availability boundary.\"},\"tunes\":{}},{\"id\":\"p-edge-4\",\"type\":\"paragraph\",\"data\":{\"text\":\"Physical isolation is not automatically secure if control-plane credentials or administrative paths can cross boundaries. Logical isolation is not automatically weak if policies are centrally enforced, least-privileged and thoroughly tested.\"},\"tunes\":{}},{\"id\":\"p-edge-5\",\"type\":\"paragraph\",\"data\":{\"text\":\"Tenant isolation requirements can differ by data class. Public catalog data, billing records and private AI documents may justify different storage and encryption boundaries inside the same SaaS product.\"},\"tunes\":{}},{\"id\":\"h-change\",\"type\":\"header\",\"data\":{\"text\":\"What would change this answer?\",\"level\":2},\"tunes\":{}},{\"id\":\"p-change-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"The exact implementation changes with architecture: serverless APIs, Kubernetes, PostgreSQL, object storage, vector databases and policy engines expose different isolation primitives.\"},\"tunes\":{}},{\"id\":\"p-change-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"The required strength also changes with regulation, customer contracts, data sensitivity, threat model and operational scale. Some tenants may justify siloed databases or infrastructure while others share pooled resources.\"},\"tunes\":{}},{\"id\":\"p-change-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"The conceptual distinction does not change: permission to perform an operation is not the same thing as permission to cross a tenant boundary.\"},\"tunes\":{}},{\"id\":\"h-related\",\"type\":\"header\",\"data\":{\"text\":\"Related canonical knowledge\",\"level\":2},\"tunes\":{}},{\"id\":\"p-related-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"S01 is a security-boundary prerequisite for Enterprise AI Architecture and AI Governance. Once AI tools, RAG or agents operate over multi-tenant data, tenant identity must travel through retrieval, tool execution, memory, caches and audit traces.\"},\"tunes\":{}},{\"id\":\"p-related-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"It also connects directly to Agentic AI: tool capability and role permission must still be constrained by tenant ownership before an agent can read or mutate business resources.\"},\"tunes\":{}},{\"id\":\"ref-agentic\",\"type\":\"referralArticle\",\"data\":{\"url\":\"https:\u002F\u002Fstajic.de\u002Fde\u002Fblog\u002Fmcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained\",\"title\":\"MCP vs A2A vs UCP vs AP2 vs A2UI: The Agent Protocol Stack Explained\",\"excerpt\":\"Protocol interoperability does not replace authorization or tenant isolation. Capability discovery and business authority remain separate architecture concerns.\",\"ctaLabel\":\"Read the protocol stack article\"},\"tunes\":{}},{\"id\":\"p-related-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"For RAG, tenant isolation must be enforced before protected chunks reach model context.\"},\"tunes\":{}},{\"id\":\"ref-rag\",\"type\":\"referralArticle\",\"data\":{\"url\":\"https:\u002F\u002Fstajic.de\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works\",\"title\":\"What Is RAG? The Simplest Explanation of How It Works\",\"excerpt\":\"The retrieval foundation for understanding where tenant-aware source filtering and vector-store isolation must be enforced.\",\"ctaLabel\":\"Read the RAG foundation\"},\"tunes\":{}},{\"id\":\"h-faq\",\"type\":\"header\",\"data\":{\"text\":\"Frequently asked questions\",\"level\":2},\"tunes\":{}},{\"id\":\"faq\",\"type\":\"faq\",\"data\":{\"title\":\"RBAC vs tenant isolation FAQ\",\"items\":[{\"id\":\"faq1\",\"question\":\"What is the difference between RBAC and tenant isolation?\",\"answer\":\"RBAC determines which operations a principal may perform. Tenant isolation determines which tenant's resources those operations may access. Secure multi-tenant applications normally need both.\"},{\"id\":\"faq2\",\"question\":\"Does an ADMIN role automatically allow access to all tenants?\",\"answer\":\"No. ADMIN should have an explicit scope. A tenant administrator normally has broad permissions only inside that tenant, while cross-tenant platform administration should be modeled separately.\"},{\"id\":\"faq3\",\"question\":\"Is authentication enough for tenant isolation?\",\"answer\":\"No. Authentication proves identity. Authorization controls permitted actions. Tenant isolation additionally prevents those actions from reaching the wrong tenant's resources.\"},{\"id\":\"faq4\",\"question\":\"Should tenantId be stored in the JWT?\",\"answer\":\"It can be one input to tenant context, but the server must verify current membership\u002Fauthority and enforce the scope at protected resource boundaries. A claim alone does not replace isolation controls.\"},{\"id\":\"faq5\",\"question\":\"Do I need a separate database per tenant?\",\"answer\":\"Not necessarily. Shared-table, RLS, schema, database, infrastructure and hybrid isolation models can all be valid depending on risk and operational requirements.\"},{\"id\":\"faq6\",\"question\":\"Can PostgreSQL RLS replace tenant filters in application code?\",\"answer\":\"RLS can provide strong defense in depth, but correct database roles, request context, policy coverage and application-level authorization still matter.\"},{\"id\":\"faq7\",\"question\":\"How should RAG enforce tenant isolation?\",\"answer\":\"Tenant\u002Faccess scope should be enforced during retrieval so unauthorized chunks never enter model context. Preserve access metadata through chunking and indexing.\"},{\"id\":\"faq8\",\"question\":\"Can one user have different roles in different tenants?\",\"answer\":\"Yes. This is common in B2B SaaS and is a strong reason to scope role assignments by tenant membership rather than treating roles as globally attached to the user.\"},{\"id\":\"faq9\",\"question\":\"What is the best test for tenant isolation?\",\"answer\":\"Use negative cross-tenant tests: create at least two tenants, give a user valid permissions in one tenant, then prove every protected path denies access to the other tenant's resources.\"}]},\"tunes\":{}},{\"id\":\"h-glossary\",\"type\":\"header\",\"data\":{\"text\":\"Glossary\",\"level\":2},\"tunes\":{}},{\"id\":\"glossary\",\"type\":\"glossary\",\"data\":{\"title\":\"Key multi-tenant security terms\",\"entries\":[{\"term\":\"RBAC\",\"definition\":\"Role-Based Access Control: an authorization model that associates permissions with roles and assigns users or principals to those roles.\",\"anchor\":\"rbac\"},{\"term\":\"Tenant\",\"definition\":\"A customer, organization, workspace or other isolated logical consumer of a shared multi-tenant system.\",\"anchor\":\"tenant\"},{\"term\":\"Tenant isolation\",\"definition\":\"Mechanisms that prevent one tenant from accessing, modifying or receiving another tenant's resources in a shared system.\",\"anchor\":\"tenant-isolation\"},{\"term\":\"Authentication\",\"definition\":\"Verification of the identity of a user, service or other principal.\",\"anchor\":\"authentication\"},{\"term\":\"Authorization\",\"definition\":\"Decision process that determines whether a principal may perform a requested operation on a resource.\",\"anchor\":\"authorization\"},{\"term\":\"Permission\",\"definition\":\"A defined allowed operation or capability such as orders.read or users.write.\",\"anchor\":\"permission\"},{\"term\":\"Role\",\"definition\":\"A named grouping of permissions associated with a responsibility or function.\",\"anchor\":\"role\"},{\"term\":\"ABAC\",\"definition\":\"Attribute-Based Access Control: authorization based on attributes of the principal, resource, action or environment.\",\"anchor\":\"abac\"},{\"term\":\"Row-Level Security\",\"definition\":\"Database policy mechanism that restricts which rows a database role or session may read or modify.\",\"anchor\":\"row-level-security\"},{\"term\":\"Cross-tenant access\",\"definition\":\"Any access path in which a principal operating under one tenant context reaches resources belonging to another tenant.\",\"anchor\":\"cross-tenant-access\"},{\"term\":\"Platform administrator\",\"definition\":\"A privileged operational identity with explicitly modeled authority that may span multiple tenants.\",\"anchor\":\"platform-administrator\"},{\"term\":\"Tenant context\",\"definition\":\"The verified tenant scope under which the current request, job or agent operation executes.\",\"anchor\":\"tenant-context\"}]},\"tunes\":{}},{\"id\":\"h-conclusion\",\"type\":\"header\",\"data\":{\"text\":\"Conclusion\",\"level\":2},\"tunes\":{}},{\"id\":\"p-conclusion-1\",\"type\":\"paragraph\",\"data\":{\"text\":\"RBAC and tenant isolation are complementary, not competing security mechanisms. RBAC structures operational permission; tenant isolation constrains the resource boundary inside which that permission can apply.\"},\"tunes\":{}},{\"id\":\"p-conclusion-2\",\"type\":\"paragraph\",\"data\":{\"text\":\"A robust multi-tenant request therefore needs more than “user has role ADMIN.” It needs a verified principal, verified tenant context, an allowed operation, a tenant-scoped target and enforcement at every resource layer that can carry tenant-owned data.\"},\"tunes\":{}},{\"id\":\"p-conclusion-3\",\"type\":\"paragraph\",\"data\":{\"text\":\"The shortest reliable rule is: authorize the action, then isolate the scope — and never assume one proves the other.\"},\"tunes\":{}},{\"id\":\"h-sources\",\"type\":\"header\",\"data\":{\"text\":\"Primary sources and current guidance\",\"level\":2},\"tunes\":{}},{\"id\":\"p-sources-note\",\"type\":\"paragraph\",\"data\":{\"text\":\"The sources below support the RBAC definition and current tenant-isolation guidance. The Aaasaasa AI CMS section is original implementation evidence and is intentionally bounded to the code patterns that were verified.\"},\"tunes\":{}},{\"id\":\"src-nist-rbac\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fcsrc.nist.gov\u002Fprojects\u002Frole-based-access-control\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"NIST — Role Based Access Control\",\"description\":\"NIST overview of RBAC models and the INCITS RBAC standard, including users, roles, permissions, operations and objects.\"}},\"tunes\":{}},{\"id\":\"src-nist-glossary\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fcsrc.nist.gov\u002Fglossary\u002Fterm\u002Frole_based_access_control\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"NIST CSRC — RBAC glossary\",\"description\":\"Current NIST glossary definitions of role-based access control as permission assignment through roles.\"}},\"tunes\":{}},{\"id\":\"src-aws-isolation\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fwhitepapers\u002Flatest\u002Fsaas-tenant-isolation-strategies\u002Fthe-isolation-mindset.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"AWS — The isolation mindset\",\"description\":\"AWS SaaS guidance explicitly distinguishing authentication\u002Fauthorization from tenant isolation and recommending shared isolation mechanisms.\"}},\"tunes\":{}},{\"id\":\"src-aws-faq\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Ffaq.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"AWS — Multi-tenant authorization FAQ\",\"description\":\"Current guidance explaining the difference between authorization and tenant isolation in SaaS applications.\"}},\"tunes\":{}},{\"id\":\"src-aws-avp\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fsaas-multitenant-api-access-authorization\u002Favp-design-considerations.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"AWS — Multi-tenant design considerations\",\"description\":\"Current SaaS guidance distinguishing tenant isolation from authorization and discussing pooled\u002Fsiloed authorization policy models.\"}},\"tunes\":{}},{\"id\":\"src-owasp-multi\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FMulti_Tenant_Security_Cheat_Sheet.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"OWASP — Multi-Tenant Application Security Cheat Sheet\",\"description\":\"Current practical guidance for tenant context, database isolation, caches, storage, queues, testing and cross-tenant access prevention.\"}},\"tunes\":{}},{\"id\":\"src-owasp-rag\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FRAG_Security_Cheat_Sheet.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"OWASP — RAG Security Cheat Sheet\",\"description\":\"Current guidance requiring access control at retrieval time and tenant isolation for multi-tenant vector stores.\"}},\"tunes\":{}},{\"id\":\"src-owasp-auth-test\",\"type\":\"linkTool\",\"data\":{\"link\":\"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FAuthorization_Regression_Testing_Cheat_Sheet.html\",\"meta\":{\"image\":{\"url\":\"\"},\"title\":\"OWASP — Authorization Regression Testing\",\"description\":\"Current testing guidance including role-demotion and cross-tenant boundary tests.\"}},\"tunes\":{}}],\"version\":\"2.31.6\"}",{"time":2043,"blocks":2044,"version":3028},1791485112883,[2045,2049,2054,2059,2064,2068,2072,2076,2080,2084,2088,2092,2096,2100,2104,2108,2112,2116,2139,2143,2147,2151,2155,2159,2186,2190,2209,2213,2217,2221,2225,2229,2233,2237,2241,2245,2249,2253,2263,2267,2271,2275,2279,2284,2288,2319,2323,2327,2331,2335,2339,2343,2347,2351,2355,2359,2363,2367,2371,2375,2379,2383,2387,2391,2395,2399,2403,2408,2412,2416,2420,2424,2428,2432,2436,2440,2444,2448,2452,2456,2460,2464,2468,2472,2498,2502,2507,2511,2515,2519,2523,2527,2552,2557,2561,2565,2569,2573,2577,2614,2618,2622,2668,2672,2709,2713,2754,2758,2806,2810,2814,2818,2822,2826,2830,2834,2838,2842,2846,2850,2854,2858,2864,2868,2875,2879,2911,2915,2951,2955,2959,2963,2967,2971,2975,2981,2988,2995,3002,3009,3015,3021],{"id":214,"data":2046,"type":217,"tunes":2048},{"text":2047},"RBAC and tenant isolation solve two different security problems in multi-tenant systems. Role-Based Access Control (RBAC) determines what an authenticated principal is allowed to do, such as read orders, edit products or manage users. Tenant isolation determines which tenant's data, resources and execution context that principal is allowed to access. A user can be correctly authenticated and correctly assigned an RBAC role yet still experience a security failure if the application lets that role operate on another tenant's resources.",{},{"id":220,"data":2050,"type":225,"tunes":2053},{"body":2051,"title":2052,"variant":224},"\u003Cstrong>RBAC answers “what may this identity do?” Tenant isolation answers “inside whose boundary may it do it?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>A secure multi-tenant application normally needs both. A tenant administrator may have broad permissions, but those permissions should remain constrained to the administrator's tenant unless an explicitly separate platform-level authority exists.","Direct answer",{},{"id":228,"data":2055,"type":225,"tunes":2058},{"body":2056,"title":2057,"variant":232},"Giving a user the role \u003Ccode>ADMIN\u003C\u002Fcode> does not automatically imply “administrator of tenant A only.” The role must be evaluated together with verified tenant context and the target resource's tenant ownership. Otherwise a valid role can become a cross-tenant privilege.","A role is not a tenant boundary",{},{"id":235,"data":2060,"type":225,"tunes":2063},{"body":2061,"title":2062,"variant":239},"The underlying distinction is stable. NIST defines RBAC around users, roles, permissions, operations and objects. Current AWS SaaS guidance explicitly states that authentication and authorization are not equal to tenant isolation, and that a user can be authenticated and authorized while still accessing another tenant's resources if isolation is not separately enforced. OWASP's current Multi-Tenant Security guidance likewise treats tenant isolation as a cross-layer requirement covering APIs, databases, caches, storage, queues and other shared resources.","Current-source note — 8 October 2026",{},{"id":242,"data":2065,"type":247,"tunes":2067},{"title":2066,"maxLevel":245,"minLevel":246},"Contents",{},{"id":250,"data":2069,"type":41,"tunes":2071},{"text":2070,"level":246},"What RBAC really controls",{},{"id":255,"data":2073,"type":217,"tunes":2075},{"text":2074},"RBAC is an authorization model in which permissions are associated with roles and users are assigned to those roles. The role acts as an administrative abstraction between identities and permissions.",{},{"id":260,"data":2077,"type":217,"tunes":2079},{"text":2078},"NIST's classic RBAC work formalizes this around users, roles, permissions, operations and objects. The practical benefit is that an organization can manage authorization through relatively stable job or responsibility roles rather than attaching every permission directly to every user.",{},{"id":265,"data":2081,"type":217,"tunes":2083},{"text":2082},"A role such as EDITOR can therefore mean: may read content, write content and publish content. A role such as ACCOUNTANT may mean: may read billing data, reconcile invoices and approve settlements.",{},{"id":270,"data":2085,"type":41,"tunes":2087},{"text":2086,"level":246},"What tenant isolation really controls",{},{"id":275,"data":2089,"type":217,"tunes":2091},{"text":2090},"Tenant isolation is the set of mechanisms that prevents one tenant from reading, modifying, influencing or accidentally receiving another tenant's resources in a shared system.",{},{"id":280,"data":2093,"type":217,"tunes":2095},{"text":2094},"The protected boundary is broader than database rows. Tenant-specific state can exist in relational tables, object storage, vector indexes, caches, search indexes, queue messages, files, temporary artifacts, background jobs, analytics, rate limits and infrastructure resources.",{},{"id":285,"data":2097,"type":217,"tunes":2099},{"text":2098},"AWS's SaaS guidance makes the distinction explicit: authorization grants access to resources, while tenant isolation ensures those resources cannot cross the wrong tenant boundary even when infrastructure is shared.",{},{"id":290,"data":2101,"type":41,"tunes":2103},{"text":2102,"level":246},"The simplest example",{},{"id":295,"data":2105,"type":217,"tunes":2107},{"text":2106},"Suppose Alice is an administrator for Tenant A and Bob is an administrator for Tenant B. Both users legitimately hold the same ADMIN role.",{},{"id":300,"data":2109,"type":217,"tunes":2111},{"text":2110},"RBAC can correctly conclude that both users may execute an operation such as users.read. But when Alice requests user ID 847, the application must still verify that user 847 belongs to Tenant A.",{},{"id":305,"data":2113,"type":217,"tunes":2115},{"text":2114},"If the API checks only “Alice has ADMIN” and then executes SELECT * FROM users WHERE id = 847, RBAC succeeded while tenant isolation failed.",{},{"id":310,"data":2117,"type":333,"tunes":2138},{"steps":2118,"title":2137,"orientation":332},[2119,2122,2125,2128,2131,2134],{"label":2120,"description":2121},"1. Authenticate principal","Establish who the user, service or agent is.",{"label":2123,"description":2124},"2. Resolve verified tenant context","Determine which tenant context applies from trusted server-side identity\u002Fmembership information.",{"label":2126,"description":2127},"3. Resolve permission","Evaluate whether the principal's role or policy permits the requested operation.",{"label":2129,"description":2130},"4. Scope the target resource","Verify that the target object belongs to the permitted tenant or explicitly shared scope.",{"label":2132,"description":2133},"5. Enforce at the access boundary","Perform the database, cache, storage, queue or service operation with tenant constraints applied.",{"label":2135,"description":2136},"6. Audit both dimensions","Record principal, tenant, operation, target and result so cross-tenant attempts are visible.","A correct multi-tenant authorization decision",{},{"id":336,"data":2140,"type":41,"tunes":2142},{"text":2141,"level":246},"Where the simple example stops",{},{"id":341,"data":2144,"type":217,"tunes":2146},{"text":2145},"Real systems often contain several classes of identity: tenant users, platform administrators, background workers, integrations, agents and cross-tenant operational services. Some of these legitimately cross tenant boundaries.",{},{"id":346,"data":2148,"type":217,"tunes":2150},{"text":2149},"That does not remove the need for isolation. It means cross-tenant authority must be explicit, narrow and separately auditable rather than emerging accidentally from a global role or unscoped database connection.",{},{"id":351,"data":2152,"type":217,"tunes":2154},{"text":2153},"Tenant isolation can also vary by layer. A product may share application servers while separating databases, or use a shared database with row-level policies while giving premium tenants isolated storage or compute. There is no single universal isolation topology.",{},{"id":356,"data":2156,"type":41,"tunes":2158},{"text":2157,"level":246},"RBAC vs tenant isolation",{},{"id":361,"data":2160,"type":398,"tunes":2185},{"rows":2161,"title":2180,"layout":390,"columns":2181},[2162,2165,2168,2171,2174,2177],{"id":365,"label":2163,"values":2164},"Primary question",[368,368],{"id":370,"label":2166,"values":2167},"Typical unit",[368,368],{"id":374,"label":2169,"values":2170},"Example",[368,368],{"id":378,"label":2172,"values":2173},"Typical failure",[368,368],{"id":382,"label":2175,"values":2176},"Typical implementation",[368,368],{"id":386,"label":2178,"values":2179},"Can it exist alone?",[368,368],"Two different security dimensions",[2182,2183],{"id":393,"label":394},{"id":396,"label":2184},"Tenant isolation",{},{"id":401,"data":2187,"type":41,"tunes":2189},{"text":2188,"level":246},"Authentication, authorization and isolation are three different checks",{},{"id":406,"data":2191,"type":390,"tunes":2208},{"content":2192,"stretched":42,"withHeadings":13},[2193,2197,2201,2205],[2194,2195,2196],"Layer","Question","Example failure",[2198,2199,2200],"Authentication","Who is this principal?","Attacker impersonates Alice",[2202,2203,2204],"Authorization \u002F RBAC","May this principal perform this operation?","Viewer can delete users",[2184,2206,2207],"May this operation reach this tenant\u002Fresource boundary?","Tenant A admin reads Tenant B order",{},{"id":426,"data":2210,"type":217,"tunes":2212},{"text":2211},"These checks are related but non-substitutable. Authentication can be perfect while authorization fails. Authorization can be correct while tenant isolation fails. A secure SaaS request path needs all applicable boundaries.",{},{"id":431,"data":2214,"type":41,"tunes":2216},{"text":2215,"level":246},"Roles need a scope",{},{"id":436,"data":2218,"type":217,"tunes":2220},{"text":2219},"The word ADMIN is incomplete without scope. It can mean platform administrator, tenant administrator, project administrator, workspace administrator or administrator of one subsystem.",{},{"id":441,"data":2222,"type":217,"tunes":2224},{"text":2223},"In multi-tenant systems, role assignment should normally be associated with tenant membership or another explicit resource scope. The same user may legitimately be ADMIN in Tenant A and VIEWER in Tenant B.",{},{"id":446,"data":2226,"type":217,"tunes":2228},{"text":2227},"A global role model that ignores this distinction can create privilege leakage even when the permission map itself is correct.",{},{"id":451,"data":2230,"type":41,"tunes":2232},{"text":2231,"level":246},"Tenant context must come from a trusted path",{},{"id":456,"data":2234,"type":217,"tunes":2236},{"text":2235},"A tenant ID supplied by the client is useful as a selector, but it is not proof of authority. The server must derive or verify tenant membership against authenticated identity and current authorization data.",{},{"id":461,"data":2238,"type":217,"tunes":2240},{"text":2239},"OWASP's current multi-tenant guidance recommends establishing tenant context early in the request lifecycle and explicitly warns against treating client headers or request parameters as authorization proof.",{},{"id":466,"data":2242,"type":217,"tunes":2244},{"text":2243},"This matters because a trivial request modification from tenant=A to tenant=B must not be sufficient to cross the isolation boundary.",{},{"id":471,"data":2246,"type":41,"tunes":2248},{"text":2247,"level":246},"Tenant scope belongs in the resource lookup",{},{"id":476,"data":2250,"type":217,"tunes":2252},{"text":2251},"A common application-level isolation pattern is to include tenant scope in the same query that resolves the resource.",{},{"id":481,"data":2254,"type":390,"tunes":2262},{"content":2255,"stretched":42,"withHeadings":13},[2256,2259,2260,2261],[2257,2258],"Weak lookup","Stronger tenant-scoped lookup",[488,489],[491,492],[494,495],{},{"id":498,"data":2264,"type":217,"tunes":2266},{"text":2265},"This pattern is not the only possible isolation mechanism, but it keeps tenant ownership close to the data access operation and prevents an object ID from becoming a cross-tenant capability.",{},{"id":503,"data":2268,"type":41,"tunes":2270},{"text":2269,"level":246},"Application checks are useful, but isolation should not depend on perfect developer behavior",{},{"id":508,"data":2272,"type":217,"tunes":2274},{"text":2273},"AWS's isolation guidance explicitly warns against leaving isolation enforcement only to service developers. In a large codebase, eventually one query, cache key or worker path may omit tenant scope.",{},{"id":513,"data":2276,"type":217,"tunes":2278},{"text":2277},"Defense in depth can therefore move isolation into shared middleware, repository\u002Fservice layers, policy engines, database Row-Level Security, dedicated credentials, separate schemas or separate databases depending on risk and architecture.",{},{"id":518,"data":2280,"type":225,"tunes":2283},{"body":2281,"title":2282,"variant":522},"The strongest boundary is one that ordinary application code cannot casually bypass by omitting one \u003Ccode>tenantId\u003C\u002Fcode> condition.","Isolation should be hard to forget",{},{"id":525,"data":2285,"type":41,"tunes":2287},{"text":2286,"level":246},"Database isolation strategies",{},{"id":530,"data":2289,"type":390,"tunes":2318},{"content":2290,"stretched":42,"withHeadings":13},[2291,2295,2299,2303,2307,2311,2315],[2292,2293,2294],"Strategy","Boundary","Strength \u002F trade-off",[2296,2297,2298],"Shared tables + tenant key","Row\u002Fapplication policy","Operationally efficient; requires exhaustive tenant scoping and strong tests",[2300,2301,2302],"Shared tables + database RLS","Database policy boundary","Reduces dependence on every application query; requires correct roles, session\u002Ftransaction tenant context and policy coverage",[2304,2305,2306],"Separate schemas","Namespace \u002F DB-role boundary","Stronger logical separation; more operational complexity",[2308,2309,2310],"Separate databases","Database \u002F credential boundary","Strong isolation and simpler blast-radius story; higher provisioning and operations cost",[2312,2313,2314],"Separate infrastructure\u002Faccount","Infrastructure boundary","Strongest coarse-grained separation; highest cost and operational overhead",[558,2316,2317],"Per workload\u002Fdata class","Allows stronger isolation only where risk\u002Fcompliance justifies it",{},{"id":563,"data":2320,"type":217,"tunes":2322},{"text":2321},"OWASP's current Multi-Tenant Security Cheat Sheet lists separate databases, separate schemas, shared tables with row-level controls and hybrid models. The correct model depends on threat level, compliance, performance and operational cost.",{},{"id":568,"data":2324,"type":41,"tunes":2326},{"text":2325,"level":246},"PostgreSQL Row-Level Security can provide defense in depth",{},{"id":573,"data":2328,"type":217,"tunes":2330},{"text":2329},"With shared tables, PostgreSQL Row-Level Security can enforce a tenant predicate at the database layer so ordinary queries cannot see rows outside the active tenant policy.",{},{"id":578,"data":2332,"type":217,"tunes":2334},{"text":2333},"However, RLS is not magic. PostgreSQL superusers and roles with BYPASSRLS can bypass row policies. OWASP therefore recommends using a least-privileged request-path role and testing the same connection\u002Fpooling mode used in production.",{},{"id":583,"data":2336,"type":217,"tunes":2338},{"text":2337},"Connection reuse is another important edge: tenant context must be set and reset safely for every transaction\u002Frequest so one pooled connection cannot leak prior tenant state.",{},{"id":588,"data":2340,"type":41,"tunes":2342},{"text":2341,"level":246},"Tenant isolation must include caches",{},{"id":593,"data":2344,"type":217,"tunes":2346},{"text":2345},"A database query can be perfectly scoped and still leak data through a shared cache key.",{},{"id":598,"data":2348,"type":217,"tunes":2350},{"text":2349},"If user:42 exists in both Tenant A and Tenant B, a global cache key can return the wrong tenant's value. Tenant-sensitive cache keys should include every attribute that changes visibility or result semantics, commonly tenant, user, locale, feature set or permission version.",{},{"id":603,"data":2352,"type":217,"tunes":2354},{"text":2353},"Cache partitioning is defense in depth, not a replacement for authorization. The request still needs to be authorized before protected cached content is returned.",{},{"id":608,"data":2356,"type":41,"tunes":2358},{"text":2357,"level":246},"Files and object storage need their own tenant boundary",{},{"id":613,"data":2360,"type":217,"tunes":2362},{"text":2361},"Object storage should distinguish global, tenant-scoped and user-scoped objects. A folder prefix alone is only a naming convention unless access policy actually constrains reads and writes.",{},{"id":618,"data":2364,"type":217,"tunes":2366},{"text":2365},"Stronger designs may use tenant-aware object keys, bucket policies, separate buckets\u002Faccounts or tenant-specific encryption keys where risk or compliance requires stronger isolation.",{},{"id":623,"data":2368,"type":217,"tunes":2370},{"text":2369},"Signed URLs must be authorized before issuance and scoped to the exact object and operation. Possession of an object identifier should not itself grant cross-tenant access.",{},{"id":628,"data":2372,"type":41,"tunes":2374},{"text":2373,"level":246},"Background jobs and queues can break isolation",{},{"id":633,"data":2376,"type":217,"tunes":2378},{"text":2377},"Async jobs often leave the original HTTP request context, which makes tenant propagation easy to mishandle. A queue message containing tenantId is not sufficient proof that the producer was authorized.",{},{"id":638,"data":2380,"type":217,"tunes":2382},{"text":2381},"The worker should carry a verified service\u002Fuser identity or trusted job envelope, re-establish tenant context and re-authorize consequential operations at the consumer boundary.",{},{"id":643,"data":2384,"type":217,"tunes":2386},{"text":2385},"Tenant isolation also includes availability. One tenant should not be able to monopolize shared workers, queues, connection pools or compute in ways that materially degrade other tenants.",{},{"id":648,"data":2388,"type":41,"tunes":2390},{"text":2389,"level":246},"Search and RAG need tenant-aware retrieval",{},{"id":653,"data":2392,"type":217,"tunes":2394},{"text":2393},"Multi-tenant AI introduces another copy of the isolation problem. Documents may be chunked, embedded and stored in a vector index after ingestion.",{},{"id":658,"data":2396,"type":217,"tunes":2398},{"text":2397},"OWASP's current RAG security guidance states that access control must be enforced at retrieval time and that chunks from Tenant A must not be retrieved by queries from Tenant B. Document-level permissions cannot simply be assumed to survive chunking automatically.",{},{"id":663,"data":2400,"type":217,"tunes":2402},{"text":2401},"The vector index therefore needs tenant\u002Faccess metadata or physically\u002Flogically separate collections according to the isolation design. Retrieval filters should be applied before unauthorized content can enter model context.",{},{"id":668,"data":2404,"type":225,"tunes":2407},{"body":2405,"title":2406,"variant":232},"Do not retrieve cross-tenant chunks and then instruct the language model to ignore them. Once protected data enters model context, the isolation boundary has already failed.","The model must never be the tenant filter",{},{"id":674,"data":2409,"type":41,"tunes":2411},{"text":2410,"level":246},"Derived data inherits tenant sensitivity",{},{"id":679,"data":2413,"type":217,"tunes":2415},{"text":2414},"Embeddings, search indexes, thumbnails, generated summaries, caches, analytics rows and AI responses are derived from source data. Their tenant scope should follow the source unless an explicit transformation creates a legitimate shared\u002Fglobal artifact.",{},{"id":684,"data":2417,"type":217,"tunes":2419},{"text":2418},"Deletion and offboarding must therefore propagate beyond the canonical row. Removing a tenant document while leaving searchable chunks or cached summaries can retain cross-tenant or post-retention exposure.",{},{"id":689,"data":2421,"type":41,"tunes":2423},{"text":2422,"level":246},"Not everything belongs to a tenant",{},{"id":694,"data":2425,"type":217,"tunes":2427},{"text":2426},"Multi-tenant platforms often have intentionally global resources: product taxonomies, public templates, system permissions, feature definitions or public content.",{},{"id":699,"data":2429,"type":217,"tunes":2431},{"text":2430},"The safest model is explicit classification: global, tenant-scoped, user-scoped or explicitly cross-tenant. Ambiguous resources are where accidental leakage begins.",{},{"id":704,"data":2433,"type":217,"tunes":2435},{"text":2434},"An intentionally shared object should have a documented reason for being global rather than simply lacking a tenant association.",{},{"id":709,"data":2437,"type":41,"tunes":2439},{"text":2438,"level":246},"Platform administrators require a different authority model",{},{"id":714,"data":2441,"type":217,"tunes":2443},{"text":2442},"A platform operator may need to inspect multiple tenants for support, compliance or infrastructure operations. Modeling this as an ordinary tenant ADMIN with accidental global database access weakens both security and auditability.",{},{"id":719,"data":2445,"type":217,"tunes":2447},{"text":2446},"A better design uses a distinct platform identity or explicit cross-tenant permission, stronger authentication, purpose limitation, detailed audit and, where appropriate, approval or break-glass controls.",{},{"id":724,"data":2449,"type":217,"tunes":2451},{"text":2450},"Cross-tenant access should therefore be a named capability, not the absence of a tenant filter.",{},{"id":729,"data":2453,"type":41,"tunes":2455},{"text":2454,"level":246},"RBAC can be combined with attributes",{},{"id":734,"data":2457,"type":217,"tunes":2459},{"text":2458},"Some decisions depend on more than role. Tenant membership, region, resource owner, subscription tier, time, project membership or data classification can all affect access.",{},{"id":739,"data":2461,"type":217,"tunes":2463},{"text":2462},"RBAC and ABAC are not mutually exclusive. AWS's current multi-tenant authorization guidance discusses RBAC, ABAC and hybrid models. A role can define broad responsibility while attributes constrain which concrete resource instance can be accessed.",{},{"id":744,"data":2465,"type":217,"tunes":2467},{"text":2466},"The key architecture rule remains: do not encode tenant isolation only as an incidental role name if tenant identity is a first-class resource boundary.",{},{"id":749,"data":2469,"type":41,"tunes":2471},{"text":2470,"level":246},"Authorization decisions are at least two-dimensional",{},{"id":754,"data":2473,"type":390,"tunes":2497},{"content":2474,"stretched":42,"withHeadings":13},[2475,2480,2483,2486,2488,2489,2493],[2476,2477,2478,2479],"Principal","Role permission","Tenant relationship","Decision",[763,764,2481,2482],"Order belongs to Alice's tenant","Allow",[763,764,2484,2485],"Order belongs to another tenant","Deny",[763,771,2481,2487],"Allow if role includes write",[763,771,2484,2485],[2490,776,2491,2492],"Platform support","Explicit support scope + audited target tenant","Potentially allow under platform policy",[2494,781,2495,2496],"Background worker","Trusted service scope for job tenant","Allow only for verified job tenant",{},{"id":786,"data":2499,"type":41,"tunes":2501},{"text":2500,"level":246},"Original implementation evidence: Aaasaasa AI CMS",{},{"id":791,"data":2503,"type":225,"tunes":2506},{"body":2504,"title":2505,"variant":239},"Aaasaasa AI CMS contains a concrete tenant-scoped RBAC implementation. It is useful evidence for how role authorization and tenant scope can be combined, but it should not be presented as proof that every storage, cache or infrastructure layer has complete tenant isolation.","Original implementation evidence",{},{"id":797,"data":2508,"type":217,"tunes":2510},{"text":2509},"The RBAC service defines typed permission codes such as cms.content.read, shop.orders.write, billing.reconcile and users.roles. System roles map those permissions into named responsibility sets.",{},{"id":802,"data":2512,"type":217,"tunes":2514},{"text":2513},"Role records are created and resolved with a tenantId. System roles are upserted using a composite tenant\u002Fcode identity, and role listing is filtered by tenant.",{},{"id":807,"data":2516,"type":217,"tunes":2518},{"text":2517},"Role update and deletion first resolve the role using both role ID and tenant ID. User-role assignments are also stored and replaced under the current tenant context.",{},{"id":812,"data":2520,"type":217,"tunes":2522},{"text":2521},"Permission resolution reads explicit user-role assignments scoped by both tenantId and userId. This prevents one tenant's role assignment from automatically becoming another tenant's role assignment.",{},{"id":817,"data":2524,"type":217,"tunes":2526},{"text":2525},"At API level, administrative RBAC routes resolve a tenant context before creating or modifying roles. This is the correct direction: permission administration itself must respect tenancy.",{},{"id":822,"data":2528,"type":390,"tunes":2551},{"content":2529,"stretched":42,"withHeadings":13},[2530,2533,2536,2539,2542,2545,2548],[2531,2532],"Observed implementation pattern","Security meaning",[2534,2535],"Typed permission codes","RBAC operation vocabulary is explicit",[2537,2538],"System role → permission maps","Roles aggregate permissions rather than hard-coding users",[2540,2541],"tenantId_code role identity","Same logical role can exist separately per tenant",[2543,2544],"Role lookup uses id + tenantId","Role mutation is tenant-scoped",[2546,2547],"User-role relation stores tenantId","Membership is not globally inferred from role alone",[2549,2550],"Permission resolution uses tenantId + userId","Authorization is evaluated inside tenant context",{},{"id":848,"data":2553,"type":225,"tunes":2556},{"body":2554,"title":2555,"variant":232},"Tenant-scoped RBAC is one layer. Complete tenant isolation must also cover all tenant-owned resource lookups, databases, caches, files, search\u002Fvector indexes, background jobs, integrations and operational paths. The repository evidence here supports the RBAC\u002Ftenant-scope design pattern, not a claim of independently audited SaaS isolation.","What this evidence does not prove",{},{"id":854,"data":2558,"type":41,"tunes":2560},{"text":2559,"level":246},"Why this distinction matters even more for AI agents",{},{"id":859,"data":2562,"type":217,"tunes":2564},{"text":2563},"AI agents can turn a permission mistake into a sequence of actions. If an agent is given a broad orders.read tool without tenant-scoped enforcement, a reasoning or prompt-injection failure can cause cross-tenant reads at machine speed.",{},{"id":864,"data":2566,"type":217,"tunes":2568},{"text":2567},"Agent tool descriptions can mention tenant constraints, but enforcement must still happen in the trusted runtime\u002Fservice\u002Fdata layer. Natural-language instructions are not an authorization boundary.",{},{"id":869,"data":2570,"type":217,"tunes":2572},{"text":2571},"The same applies to RAG: an agent can have permission to use the search tool while the search backend must still prevent Tenant A's query from returning Tenant B's chunks.",{},{"id":874,"data":2574,"type":41,"tunes":2576},{"text":2575,"level":246},"Test RBAC and tenant isolation separately",{},{"id":879,"data":2578,"type":390,"tunes":2613},{"content":2579,"stretched":42,"withHeadings":13},[2580,2583,2586,2589,2592,2595,2598,2601,2604,2607,2610],[2581,2582],"Test family","What it should prove",[2584,2585],"Role demotion test","A user without a permission cannot perform the operation even inside their own tenant",[2587,2588],"Cross-tenant object test","A user with the correct role still cannot access the same resource type in another tenant",[2590,2591],"Identifier tampering","Changing object\u002Ftenant IDs does not cross scope",[2593,2594],"List\u002Fbulk endpoint test","Broad queries return only authorized tenant data",[2596,2597],"Cache reuse test","Two tenants using reused processes\u002Fconnections never receive each other's cached state",[2599,2600],"RLS request-role test","Production request role cannot bypass row policies",[2602,2603],"Async worker test","Tenant context survives queueing and is revalidated at consumption",[2605,2606],"Vector retrieval test","Tenant A query never retrieves Tenant B chunks",[2608,2609],"Platform-admin test","Cross-tenant capability is explicit, narrow and auditable",[2611,2612],"Offboarding test","Tenant data and derived indexes\u002Fcaches are removed according to policy",{},{"id":917,"data":2615,"type":217,"tunes":2617},{"text":2616},"OWASP's authorization regression guidance specifically calls out cross-tenant boundary tests because code changes in caching, queries or shared services can silently break isolation even when role tests continue to pass.",{},{"id":922,"data":2619,"type":41,"tunes":2621},{"text":2620,"level":246},"Common failure modes",{},{"id":927,"data":2623,"type":390,"tunes":2667},{"content":2624,"stretched":42,"withHeadings":13},[2625,2628,2631,2634,2637,2640,2643,2646,2649,2652,2655,2658,2661,2664],[2626,2627],"Failure mode","Why it fails",[2629,2630],"Check role but not tenant","Valid role becomes cross-tenant authority",[2632,2633],"Trust tenant ID from request","Client controls the isolation selector",[2635,2636],"Scope UI but not API","Hidden buttons do not protect backend resources",[2638,2639],"Tenant-aware detail endpoint, unscoped list endpoint","Bulk reads leak other tenants",[2641,2642],"Tenant filter in most queries","One forgotten path breaks the boundary",[2644,2645],"Global cache keys","Correct database isolation is bypassed by cached data",[2647,2648],"Shared vector index without enforced metadata filters","RAG retrieves another tenant's chunks",[2650,2651],"Queue message tenant ID treated as authorization","Forged or wrongly produced job can cross tenant boundary",[2653,2654],"Platform admin modeled as ordinary ADMIN","Cross-tenant power becomes implicit and difficult to audit",[2656,2657],"Role copied globally across tenant memberships","User receives permissions in tenants where they were never assigned",[2659,2660],"Separate databases but shared privileged credential","Application can still cross databases if its credential is too broad",[2662,2663],"RLS with BYPASSRLS request role","Database policy exists but does not protect the actual request path",[2665,2666],"Random UUIDs treated as isolation","Hard-to-guess identifiers reduce enumeration but do not authorize access",{},{"id":974,"data":2669,"type":41,"tunes":2671},{"text":2670,"level":246},"Common misconceptions",{},{"id":979,"data":2673,"type":390,"tunes":2708},{"content":2674,"stretched":42,"withHeadings":13},[2675,2678,2681,2684,2687,2690,2693,2696,2699,2702,2705],[2676,2677],"Misconception","Correction",[2679,2680],"“RBAC provides tenant isolation.”","RBAC controls permissions; isolation also requires tenant\u002Fresource scoping.",[2682,2683],"“If the user is an admin, tenant checks are unnecessary.”","Admin authority must still have an explicit scope.",[2685,2686],"“Tenant ID in JWT is enough.”","It can be a trusted input only if validated and applied consistently to every protected resource path.",[2688,2689],"“Separate databases remove authorization requirements.”","Users still need operation-level permissions inside their tenant.",[2691,2692],"“A tenant_id column means the system is isolated.”","The field only helps if access paths enforce it.",[2694,2695],"“UUIDs prevent cross-tenant access.”","Unpredictable identifiers are defense in depth, not authorization.",[2697,2698],"“RLS means application code needs no security checks.”","Application authorization, correct DB roles and policy coverage still matter.",[2700,2701],"“One shared vector DB is unsafe.”","It can be safe if isolation is enforceable and verified; physical separation is one option, not the only one.",[2703,2704],"“Platform support needs global ADMIN.”","Cross-tenant support should be a distinct, constrained and auditable authority.",[2706,2707],"“Internal services can skip tenant checks.”","Internal paths can still be compromised or misconfigured and must preserve tenant context.",{},{"id":1017,"data":2710,"type":41,"tunes":2712},{"text":2711,"level":246},"A practical design sequence",{},{"id":1022,"data":2714,"type":333,"tunes":2753},{"steps":2715,"title":2752,"orientation":332},[2716,2719,2722,2725,2728,2731,2734,2737,2740,2743,2746,2749],{"label":2717,"description":2718},"1. Define tenant ownership","Classify which entities and resources are global, tenant-scoped, user-scoped or intentionally cross-tenant.",{"label":2720,"description":2721},"2. Define operations","Create explicit permissions for reads, writes, publishing, approvals, administration and other business actions.",{"label":2723,"description":2724},"3. Define roles","Group permissions according to responsibilities without embedding accidental global scope.",{"label":2726,"description":2727},"4. Define membership scope","Bind role assignments to the tenant\u002Fworkspace\u002Fproject context in which they apply.",{"label":2729,"description":2730},"5. Resolve trusted tenant context","Derive tenant identity from authenticated, server-verified membership or service authorization.",{"label":2732,"description":2733},"6. Enforce resource ownership","Apply tenant scope at every tenant-owned data\u002Fservice boundary.",{"label":2735,"description":2736},"7. Add defense in depth","Use RLS, separate credentials, schemas\u002Fdatabases, storage policies or policy engines where risk justifies them.",{"label":2738,"description":2739},"8. Carry scope through derived systems","Preserve tenant metadata in cache, search, vector indexes, queues, files and analytics.",{"label":2741,"description":2742},"9. Model cross-tenant operations explicitly","Separate platform administration and service identities from ordinary tenant roles.",{"label":2744,"description":2745},"10. Test both axes","Run negative tests for missing permission and for wrong tenant independently.",{"label":2747,"description":2748},"11. Audit tenant + permission together","Log who acted, in which tenant, on what target and under which authority.",{"label":2750,"description":2751},"12. Re-test after schema\u002Fruntime changes","Isolation can break when new tables, caches, queues or retrieval paths are introduced.","Design permissions and isolation as separate dimensions",{},{"id":1064,"data":2755,"type":41,"tunes":2757},{"text":2756,"level":246},"RBAC + tenant isolation checklist",{},{"id":1069,"data":2759,"type":390,"tunes":2805},{"content":2760,"stretched":42,"withHeadings":13},[2761,2763,2766,2769,2772,2775,2778,2781,2784,2787,2790,2793,2796,2799,2802],[2195,2762],"Expected answer",[2764,2765],"Who is the principal?","Authenticated user\u002Fservice\u002Fagent identity",[2767,2768],"Which tenant context applies?","Server-verified membership or service scope",[2770,2771],"Which operation is requested?","Typed permission or policy action",[2773,2774],"Does the principal have that permission?","Role\u002Fpolicy decision",[2776,2777],"Who owns the target resource?","Explicit tenant\u002Fglobal\u002Fuser classification",[2779,2780],"Does resource scope match authority?","Tenant-aware lookup\u002Fpolicy",[2782,2783],"Can storage bypass application checks?","Defense-in-depth decision documented",[2785,2786],"Are caches tenant-safe?","Keys\u002Fnamespaces and authorization preserve tenant scope",[2788,2789],"Are files\u002Fblobs tenant-safe?","Object policy and signed URL issuance enforce scope",[2791,2792],"Are async jobs tenant-safe?","Verified context propagates and is revalidated",[2794,2795],"Is RAG\u002Fsearch tenant-safe?","Metadata\u002Fcollection isolation enforced before model context",[2797,2798],"Are cross-tenant admins explicit?","Separate authority, controls and audit",[2800,2801],"Can ordinary credentials bypass isolation?","No, or tightly documented exceptional path",[2803,2804],"Are negative cross-tenant tests automated?","Yes for every relevant access layer",{},{"id":1118,"data":2807,"type":41,"tunes":2809},{"text":2808,"level":246},"Edge cases and limitations",{},{"id":1123,"data":2811,"type":217,"tunes":2813},{"text":2812},"A user can belong to multiple tenants. The current tenant should therefore be an explicit execution context, not inferred permanently from the user account.",{},{"id":1128,"data":2815,"type":217,"tunes":2817},{"text":2816},"Some resources are intentionally shared between selected tenants, such as collaboration spaces or consortium data. This requires an explicit sharing model; pretending the resource belongs to one tenant and adding exceptions later usually creates ambiguous authorization.",{},{"id":1133,"data":2819,"type":217,"tunes":2821},{"text":2820},"Noisy-neighbor isolation is related but different from confidentiality isolation. A tenant may never see another tenant's data yet still exhaust shared CPU, queue capacity or database connections. Rate limits and resource quotas can therefore be tenant-aware as an availability boundary.",{},{"id":1138,"data":2823,"type":217,"tunes":2825},{"text":2824},"Physical isolation is not automatically secure if control-plane credentials or administrative paths can cross boundaries. Logical isolation is not automatically weak if policies are centrally enforced, least-privileged and thoroughly tested.",{},{"id":1143,"data":2827,"type":217,"tunes":2829},{"text":2828},"Tenant isolation requirements can differ by data class. Public catalog data, billing records and private AI documents may justify different storage and encryption boundaries inside the same SaaS product.",{},{"id":1148,"data":2831,"type":41,"tunes":2833},{"text":2832,"level":246},"What would change this answer?",{},{"id":1153,"data":2835,"type":217,"tunes":2837},{"text":2836},"The exact implementation changes with architecture: serverless APIs, Kubernetes, PostgreSQL, object storage, vector databases and policy engines expose different isolation primitives.",{},{"id":1158,"data":2839,"type":217,"tunes":2841},{"text":2840},"The required strength also changes with regulation, customer contracts, data sensitivity, threat model and operational scale. Some tenants may justify siloed databases or infrastructure while others share pooled resources.",{},{"id":1163,"data":2843,"type":217,"tunes":2845},{"text":2844},"The conceptual distinction does not change: permission to perform an operation is not the same thing as permission to cross a tenant boundary.",{},{"id":1168,"data":2847,"type":41,"tunes":2849},{"text":2848,"level":246},"Related canonical knowledge",{},{"id":1173,"data":2851,"type":217,"tunes":2853},{"text":2852},"S01 is a security-boundary prerequisite for Enterprise AI Architecture and AI Governance. Once AI tools, RAG or agents operate over multi-tenant data, tenant identity must travel through retrieval, tool execution, memory, caches and audit traces.",{},{"id":1178,"data":2855,"type":217,"tunes":2857},{"text":2856},"It also connects directly to Agentic AI: tool capability and role permission must still be constrained by tenant ownership before an agent can read or mutate business resources.",{},{"id":1183,"data":2859,"type":1189,"tunes":2863},{"url":1185,"title":2860,"excerpt":2861,"ctaLabel":2862},"MCP vs A2A vs UCP vs AP2 vs A2UI: The Agent Protocol Stack Explained","Protocol interoperability does not replace authorization or tenant isolation. Capability discovery and business authority remain separate architecture concerns.","Read the protocol stack article",{},{"id":1192,"data":2865,"type":217,"tunes":2867},{"text":2866},"For RAG, tenant isolation must be enforced before protected chunks reach model context.",{},{"id":1197,"data":2869,"type":1189,"tunes":2874},{"url":2870,"title":2871,"excerpt":2872,"ctaLabel":2873},"https:\u002F\u002Fstajic.de\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works","What Is RAG? The Simplest Explanation of How It Works","The retrieval foundation for understanding where tenant-aware source filtering and vector-store isolation must be enforced.","Read the RAG foundation",{},{"id":1205,"data":2876,"type":41,"tunes":2878},{"text":2877,"level":246},"Frequently asked questions",{},{"id":1210,"data":2880,"type":1210,"tunes":2910},{"items":2881,"title":2909},[2882,2885,2888,2891,2894,2897,2900,2903,2906],{"id":1214,"answer":2883,"question":2884},"RBAC determines which operations a principal may perform. Tenant isolation determines which tenant's resources those operations may access. Secure multi-tenant applications normally need both.","What is the difference between RBAC and tenant isolation?",{"id":1218,"answer":2886,"question":2887},"No. ADMIN should have an explicit scope. A tenant administrator normally has broad permissions only inside that tenant, while cross-tenant platform administration should be modeled separately.","Does an ADMIN role automatically allow access to all tenants?",{"id":1222,"answer":2889,"question":2890},"No. Authentication proves identity. Authorization controls permitted actions. Tenant isolation additionally prevents those actions from reaching the wrong tenant's resources.","Is authentication enough for tenant isolation?",{"id":1226,"answer":2892,"question":2893},"It can be one input to tenant context, but the server must verify current membership\u002Fauthority and enforce the scope at protected resource boundaries. A claim alone does not replace isolation controls.","Should tenantId be stored in the JWT?",{"id":1230,"answer":2895,"question":2896},"Not necessarily. Shared-table, RLS, schema, database, infrastructure and hybrid isolation models can all be valid depending on risk and operational requirements.","Do I need a separate database per tenant?",{"id":1234,"answer":2898,"question":2899},"RLS can provide strong defense in depth, but correct database roles, request context, policy coverage and application-level authorization still matter.","Can PostgreSQL RLS replace tenant filters in application code?",{"id":1238,"answer":2901,"question":2902},"Tenant\u002Faccess scope should be enforced during retrieval so unauthorized chunks never enter model context. Preserve access metadata through chunking and indexing.","How should RAG enforce tenant isolation?",{"id":1242,"answer":2904,"question":2905},"Yes. This is common in B2B SaaS and is a strong reason to scope role assignments by tenant membership rather than treating roles as globally attached to the user.","Can one user have different roles in different tenants?",{"id":1246,"answer":2907,"question":2908},"Use negative cross-tenant tests: create at least two tenants, give a user valid permissions in one tenant, then prove every protected path denies access to the other tenant's resources.","What is the best test for tenant isolation?","RBAC vs tenant isolation FAQ",{},{"id":1252,"data":2912,"type":41,"tunes":2914},{"text":2913,"level":246},"Glossary",{},{"id":1257,"data":2916,"type":1257,"tunes":2950},{"title":2917,"entries":2918},"Key multi-tenant security terms",[2919,2921,2924,2926,2928,2931,2934,2937,2939,2941,2944,2947],{"term":394,"anchor":393,"definition":2920},"Role-Based Access Control: an authorization model that associates permissions with roles and assigns users or principals to those roles.",{"term":2922,"anchor":396,"definition":2923},"Tenant","A customer, organization, workspace or other isolated logical consumer of a shared multi-tenant system.",{"term":2184,"anchor":1268,"definition":2925},"Mechanisms that prevent one tenant from accessing, modifying or receiving another tenant's resources in a shared system.",{"term":2198,"anchor":1271,"definition":2927},"Verification of the identity of a user, service or other principal.",{"term":2929,"anchor":1275,"definition":2930},"Authorization","Decision process that determines whether a principal may perform a requested operation on a resource.",{"term":2932,"anchor":1279,"definition":2933},"Permission","A defined allowed operation or capability such as orders.read or users.write.",{"term":2935,"anchor":1283,"definition":2936},"Role","A named grouping of permissions associated with a responsibility or function.",{"term":1286,"anchor":1287,"definition":2938},"Attribute-Based Access Control: authorization based on attributes of the principal, resource, action or environment.",{"term":1290,"anchor":1291,"definition":2940},"Database policy mechanism that restricts which rows a database role or session may read or modify.",{"term":2942,"anchor":1295,"definition":2943},"Cross-tenant access","Any access path in which a principal operating under one tenant context reaches resources belonging to another tenant.",{"term":2945,"anchor":1299,"definition":2946},"Platform administrator","A privileged operational identity with explicitly modeled authority that may span multiple tenants.",{"term":2948,"anchor":1303,"definition":2949},"Tenant context","The verified tenant scope under which the current request, job or agent operation executes.",{},{"id":1307,"data":2952,"type":41,"tunes":2954},{"text":2953,"level":246},"Conclusion",{},{"id":1312,"data":2956,"type":217,"tunes":2958},{"text":2957},"RBAC and tenant isolation are complementary, not competing security mechanisms. RBAC structures operational permission; tenant isolation constrains the resource boundary inside which that permission can apply.",{},{"id":1317,"data":2960,"type":217,"tunes":2962},{"text":2961},"A robust multi-tenant request therefore needs more than “user has role ADMIN.” It needs a verified principal, verified tenant context, an allowed operation, a tenant-scoped target and enforcement at every resource layer that can carry tenant-owned data.",{},{"id":1322,"data":2964,"type":217,"tunes":2966},{"text":2965},"The shortest reliable rule is: authorize the action, then isolate the scope — and never assume one proves the other.",{},{"id":1327,"data":2968,"type":41,"tunes":2970},{"text":2969,"level":246},"Primary sources and current guidance",{},{"id":1332,"data":2972,"type":217,"tunes":2974},{"text":2973},"The sources below support the RBAC definition and current tenant-isolation guidance. The Aaasaasa AI CMS section is original implementation evidence and is intentionally bounded to the code patterns that were verified.",{},{"id":1337,"data":2976,"type":1344,"tunes":2980},{"link":1339,"meta":2977},{"image":2978,"title":1342,"description":2979},{"url":368},"NIST overview of RBAC models and the INCITS RBAC standard, including users, roles, permissions, operations and objects.",{},{"id":1347,"data":2982,"type":1344,"tunes":2987},{"link":1349,"meta":2983},{"image":2984,"title":2985,"description":2986},{"url":368},"NIST CSRC — RBAC glossary","Current NIST glossary definitions of role-based access control as permission assignment through roles.",{},{"id":1356,"data":2989,"type":1344,"tunes":2994},{"link":1358,"meta":2990},{"image":2991,"title":2992,"description":2993},{"url":368},"AWS — The isolation mindset","AWS SaaS guidance explicitly distinguishing authentication\u002Fauthorization from tenant isolation and recommending shared isolation mechanisms.",{},{"id":1365,"data":2996,"type":1344,"tunes":3001},{"link":1367,"meta":2997},{"image":2998,"title":2999,"description":3000},{"url":368},"AWS — Multi-tenant authorization FAQ","Current guidance explaining the difference between authorization and tenant isolation in SaaS applications.",{},{"id":1374,"data":3003,"type":1344,"tunes":3008},{"link":1376,"meta":3004},{"image":3005,"title":3006,"description":3007},{"url":368},"AWS — Multi-tenant design considerations","Current SaaS guidance distinguishing tenant isolation from authorization and discussing pooled\u002Fsiloed authorization policy models.",{},{"id":1383,"data":3010,"type":1344,"tunes":3014},{"link":1385,"meta":3011},{"image":3012,"title":1388,"description":3013},{"url":368},"Current practical guidance for tenant context, database isolation, caches, storage, queues, testing and cross-tenant access prevention.",{},{"id":1392,"data":3016,"type":1344,"tunes":3020},{"link":1394,"meta":3017},{"image":3018,"title":1397,"description":3019},{"url":368},"Current guidance requiring access control at retrieval time and tenant isolation for multi-tenant vector stores.",{},{"id":1401,"data":3022,"type":1344,"tunes":3027},{"link":1403,"meta":3023},{"image":3024,"title":3025,"description":3026},{"url":368},"OWASP — Authorization Regression Testing","Current testing guidance including role-demotion and cross-tenant boundary tests.",{},"2.31.6","RBAC controls what a user may do; tenant isolation controls which tenant’s resources that action may reach. Learn why multi-tenant SaaS security requires both boundaries.","Post erfolgreich abgerufen",{"items":3032,"source":3116,"manualIds":3117,"manualMatchedIds":3118},[3033,3040,3047,3054,3061,3068,3075,3082,3089,3096,3103,3109],{"id":3034,"slug":3035,"title":3036,"excerpt":3037,"featuredImage":3038,"publishedAt":3039},"472","why-more-context-can-make-ai-answers-worse","Warum mehr Kontext KI-Antworten verschlechtern kann","Ein größeres Kontextfenster garantiert keine bessere Antwort. Dieser Artikel erklärt, wie Signalverwässerung, widersprüchliche Belege, veralteter Zustand, Positionssensitivität und verlustbehaftete Kompression die KI-Zuverlässigkeit verringern können—und stellt einen praktischen Context Pressure Test vor.","\u002Fuploads\u002F2026\u002F09\u002Fwhy-more-context-can-make-ai-answers-worse-1790351615793-2ntv2v.webp","2026-09-25T11:51:00.000Z",{"id":3041,"slug":3042,"title":3043,"excerpt":3044,"featuredImage":3045,"publishedAt":3046},"481","generative-ai-explained-models-retrieval-tools-and-applications-are-not-the-same-thing","Generative KI erklärt: Modelle, Retrieval, Tools und Anwendungen sind nicht dasselbe","Generative KI ist mehr als ein Modell. Erfahren Sie, wie Modelle, Retrieval, Tools, Kontext, Runtimes und Anwendungen in Produktions-KI-Systemen zusammenwirken.","\u002Fuploads\u002F2026\u002F10\u002Fgenerative-ai-explained-models-retrieval-tools-and-applications-are-not-the-same-thing-1791475411822-pp0dvz.webp","2026-10-08T12:00:00.000Z",{"id":3048,"slug":3049,"title":3050,"excerpt":3051,"featuredImage":3052,"publishedAt":3053},"480","when-should-an-ai-stop-trusting-its-own-knowledge-the-retrieval-trigger","Wann sollte eine KI aufhören, ihrem eigenen Wissen zu vertrauen? — Der Retrieval-Trigger","Ein KI-Modell benötigt nicht für jede Frage einen Retrieval. Das wichtige Problem ist zu erkennen, wann sein internes Wissen nicht mehr ausreicht. Der Retrieval-Trigger ist eine praktische Entscheidungsgrenze, die bestimmt, wann ein KI-System aufhören sollte, sich allein auf das Modellwissen zu verlassen, und vor der Beantwortung externe Evidenz einholen sollte.","\u002Fuploads\u002F2026\u002F09\u002Fwhen-should-an-ai-stop-trusting-its-own-knowledge-the-retrieval-trigger-1790574991244-f4rpyg.webp","2026-09-28T01:49:00.000Z",{"id":3055,"slug":3056,"title":3057,"excerpt":3058,"featuredImage":3059,"publishedAt":3060},"476","mcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained","MCP vs A2A vs UCP vs AP2 vs A2UI: Der Agenten-Protokoll-Stack erklärt","MCP, A2A, UCP, AP2 und A2UI werden oft als konkurrierende Agentenstandards dargestellt. Sie lösen größtenteils unterschiedliche Interoperabilitätsprobleme. Dieser Leitfaden ordnet jedes Protokoll der Grenze zu, die es tatsächlich standardisiert—und zeigt, wie sie in einem Produktionssystem zusammenarbeiten können.","\u002Fuploads\u002F2026\u002F09\u002Fmcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained-1790352625869-2ezle0.webp","2026-09-25T12:09:00.000Z",{"id":3062,"slug":3063,"title":3064,"excerpt":3065,"featuredImage":3066,"publishedAt":3067},"494","air-gapped-ai-how-ai-systems-work-without-internet-or-cloud-access","Luftgetrennte KI: Wie KI-Systeme ohne Internet- oder Cloud-Zugriff funktionieren","Air-gapped AI führt Modelle, RAG und KI-Anwendungen innerhalb einer isolierten Sicherheitsdomäne ohne Internet- oder Cloud-Abhängigkeiten aus. Erfahren Sie, wie Modelle, Daten, Updates und Tools offline funktionieren.","\u002Fuploads\u002F2026\u002F10\u002Fair-gapped-ai-how-ai-systems-work-without-internet-or-cloud-access-1791487983978-e6xqf0.webp","2026-10-08T11:32:00.000Z",{"id":3069,"slug":3070,"title":3071,"excerpt":3072,"featuredImage":3073,"publishedAt":3074},"486","source-of-truth-in-ai-systems-where-reliable-knowledge-actually-comes-from","Wahrheitsquelle in KI-Systemen: Woher verlässliches Wissen tatsächlich stammt","Eine Quelle der Wahrheit definiert, welche Quelle für einen bestimmten Fakt oder Zustand maßgeblich ist. Erfahren Sie, wie sie sich von RAG, Provenienz, Gedächtnis, Kontext, Vektordatenbanken und Systemen of Record unterscheidet.","\u002Fuploads\u002F2026\u002F10\u002Fsource-of-truth-in-ai-systems-where-reliable-knowledge-actually-comes-from-1791479103235-6bq9em.webp","2026-10-08T13:02:00.000Z",{"id":3076,"slug":3077,"title":3078,"excerpt":3079,"featuredImage":3080,"publishedAt":3081},"471","how-to-know-whether-an-ai-agent-actually-used-the-right-evidence","Wie man erkennt, ob ein KI-Agent tatsächlich die richtigen Belege verwendet hat","Ein KI-Agent kann Quellen zitieren und trotzdem die falschen Belege verwenden. Dieser Artikel stellt eine praktische Methode zur Überprüfung der Belegung von Behauptungen, der Quellenautorität, der Anwendbarkeit, der Herkunft sowie der Frage vor, ob die Belege die Antwort tatsächlich beeinflusst haben.","\u002Fuploads\u002F2026\u002F09\u002Fhow-to-know-whether-an-ai-agent-actually-used-the-right-evidence-1790351317188-o5z9ve.webp","2026-09-25T11:47:00.000Z",{"id":3083,"slug":3084,"title":3085,"excerpt":3086,"featuredImage":3087,"publishedAt":3088},"488","what-is-context-engineering-what-the-model-receives-before-it-answers","Was ist Context Engineering? Was das Modell erhält, bevor es antwortet","Context Engineering gestaltet, welche Informationen ein KI-Modell vor der Inferenz erhält, einschließlich Prompts, Retrieval, Speicher, Anwendungszustand, Tool-Ergebnissen und Konversationsverlauf.","\u002Fuploads\u002F2026\u002F10\u002Fwhat-is-context-engineering-what-the-model-receives-before-it-answers-1791480653258-018kcv.webp","2026-10-08T13:29:00.000Z",{"id":3090,"slug":3091,"title":3092,"excerpt":3093,"featuredImage":3094,"publishedAt":3095},"466","the-gpu-is-not-the-product-future-proof-private-ai-architecture","Die GPU ist nicht das Produkt: Zukunftssichere private KI-Architektur","Private KI-Infrastruktur sollte nicht um eine einzige GPU oder ein einziges Modell herum konzipiert werden. Ein resilienterer Ansatz kombiniert schnelle Inferenz-GPUs, speicherstarke KI-Systeme, physische KI-Knoten und optionale Frontier-Cloud-Modelle hinter einer fähigkeitsbewussten Routing-Schicht.","\u002Fuploads\u002F2026\u002F09\u002Fthe-gpu-is-not-the-product-future-proof-private-ai-architecture-1790140878812-8hsl39.webp","2026-09-23T01:19:00.000Z",{"id":3097,"slug":3098,"title":3099,"excerpt":3100,"featuredImage":3101,"publishedAt":3102},"484","what-is-an-ai-platform-architect-models-data-runtime-security-and-operations","Was ist ein KI-Plattform-Architekt? Modelle, Daten, Laufzeitumgebung, Sicherheit und Betrieb","Ein KI-Plattform-Architekt entwirft wiederverwendbare KI-Grundlagen über Modelle, Anbieter, Retrieval, Agenten, Identität, Sicherheit, Evaluierung, Observability und Betrieb hinweg.","\u002Fuploads\u002F2026\u002F10\u002Fwhat-is-an-ai-platform-architect-models-data-runtime-security-and-operations-1791477229171-ou3zcc.webp","2026-10-08T12:32:00.000Z",{"id":3104,"slug":3105,"title":1200,"excerpt":3106,"featuredImage":3107,"publishedAt":3108},"478","what-is-rag-the-simplest-explanation-of-how-it-works","RAG klingt kompliziert, aber die Idee ist einfach: Bevor eine KI antwortet, sucht sie zunächst nützliche Informationen aus einer Wissensquelle und gibt diese Informationen an das Sprachmodell weiter. Dieser Leitfaden erklärt RAG, LLMs, Zustand, Gedächtnis und Werkzeuge anhand eines einfachen mentalen Modells.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works-1790377492124-khjagt.webp","2026-09-25T19:03:00.000Z",{"id":3110,"slug":3111,"title":3112,"excerpt":3113,"featuredImage":3114,"publishedAt":3115},"489","agentic-ai-explained-when-an-ai-system-can-plan-use-tools-and-act","Agentische KI erklärt: Wenn ein KI-System planen, Werkzeuge nutzen und handeln kann","Agentische KI verwendet Modelle innerhalb mehrstufiger Ausführungsschleifen, in denen sie Werkzeuge auswählen, Ergebnisse beobachten, den Zustand aktualisieren und ihre nächste Aktion innerhalb expliziter Laufzeit- und Berechtigungsgrenzen anpassen können.","\u002Fuploads\u002F2026\u002F10\u002Fagentic-ai-explained-when-an-ai-system-can-plan-use-tools-and-act-1791481499084-wnji2a.webp","2026-10-08T11:43:00.000Z","fallback",[],[]]