[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"portal-settings:stajic:es":3,"public-menus:all":38,"post:rbac-vs-tenant-isolation-two-different-security-boundaries:es":205,"related:post:rbac-vs-tenant-isolation-two-different-security-boundaries:es:1":3035},{"statusCode":4,"data":5,"message":37},200,{"tenantId":6,"lang":7,"defaultLang":8,"siteUrl":9,"contactEmail":10,"brandName":11,"logoUrl":12,"siteName":11,"siteDescription":13,"ogImage":10,"robotsIndex":14,"socialLinks":10,"reservedSlugs":10,"seoPolicy":15},"stajic","es","de","https:\u002F\u002Fstajic.de",null,"Stajic Platform","\u002FLogo_Planet.svg","Stajic Portal",true,{"branding":16,"relatedContent":17,"crossDomainLinks":18},{"logoUrl":12},{"enabled":14},[19,22,25,28,31,34],{"url":20,"label":21,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Ffigure.rocks","figure.rocks",{"url":23,"label":24,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Floving.rocks","loving.rocks",{"url":26,"label":27,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.com","bazify.com",{"url":29,"label":30,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.de","bazify.de",{"url":32,"label":33,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.at","bazify.at",{"url":35,"label":36,"isActive":14,"showInFooter":14,"includeInSameAs":14},"https:\u002F\u002Fbazify.ba","bazify.ba","Portal settings resolved",[39,45],{"id":40,"name":41,"location":42,"isActive":14,"isDefault":43,"items":44},1,"main-navigation","header",false,[],{"id":46,"name":47,"location":48,"isActive":14,"isDefault":14,"items":49},4,"main-menu","sidebar",[50,66,79,93,103,118,133],{"id":51,"title":52,"url":60,"target":61,"icon":62,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":64,"portfolioId":10,"children":65},"item-18",{"de":53,"en":54,"es":55,"fr":56,"it":54,"ru":57,"sr":58,"zh":59},"Startseite","Home","Inicio","Accueil","Главная","Почетна","首页","\u002Ffull-stack-web-developer-munich-performance-seo-and-maintainable-builds","_self","i-lucide-home","page",111,[],{"id":67,"title":68,"url":75,"target":61,"icon":76,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":77,"portfolioId":10,"children":78},"item-22",{"de":69,"en":69,"es":70,"fr":69,"it":71,"ru":72,"sr":73,"zh":74},"Vision","Visión","Visione","Видение","Визија","想象","\u002Fueber-uns-webdesign-muenchen-webaplikation","i-lucide-eye",113,[],{"id":80,"title":81,"url":89,"target":61,"icon":90,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":91,"portfolioId":10,"children":92},"item-19",{"de":82,"en":83,"es":84,"fr":83,"it":85,"ru":86,"sr":87,"zh":88},"Leistungen","Services","Servicios","Servizi","Услуги","Услуге","服务","\u002Fservices-dienstleistungen-muenchen","i-lucide-wrench",116,[],{"id":94,"title":95,"url":99,"target":61,"icon":100,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":101,"portfolioId":10,"children":102},"item-23",{"de":96,"en":96,"es":96,"fr":96,"it":96,"ru":97,"sr":97,"zh":98},"Blog","Блог","博客","\u002Fblog","i-lucide-book-open",112,[],{"id":104,"title":105,"url":114,"target":61,"icon":115,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":116,"portfolioId":10,"children":117},"item-32",{"de":106,"en":107,"es":108,"fr":109,"it":110,"ru":111,"sr":112,"zh":113},"Neue Technologien","New Technologies","Nuevas tecnologías","Nouvelles technologies","Nuove tecnologie","Новые технологии","Нове технологије","新技术！","\u002Fneue-webtechnologien","i-lucide-sparkles",122,[],{"id":119,"title":120,"url":129,"target":61,"icon":130,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":131,"portfolioId":10,"children":132},"item-20",{"de":121,"en":122,"es":123,"fr":124,"it":125,"ru":126,"sr":127,"zh":128},"Kontakt","Contact us!","Contacto","Contact","Contatto","Контакт","Контактирајте нас","联系我们！","\u002Fcontact","i-lucide-mail",115,[],{"id":134,"title":135,"url":144,"target":61,"icon":145,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":146,"portfolioId":10,"children":147},"item-21",{"de":136,"en":137,"es":138,"fr":139,"it":140,"ru":141,"sr":142,"zh":143},"Unsere Arbeit","Our Work","Nuestro trabajo","Nos réalisations","I nostri lavori","Наши работы","Наши радови","文件夹","\u002Fportfolio","i-lucide-briefcase",114,[148,161,175,181,193],{"id":149,"title":150,"url":144,"target":61,"icon":159,"isActive":14,"type":63,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":146,"portfolioId":10,"children":160},"item-24",{"de":151,"en":152,"es":153,"fr":154,"it":155,"ru":156,"sr":157,"zh":158},"Alle Projekte","All Projects","Todos los proyectos","Tous les projets","Tutti i progetti","Все проекты","Сви пројекти","所有项目","i-lucide-grid-3x3",[],{"id":162,"title":163,"url":171,"target":61,"icon":172,"isActive":14,"type":173,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":10,"children":174},"item-29",{"de":164,"en":165,"es":166,"fr":167,"it":168,"ru":169,"sr":170,"zh":143},"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":176,"title":177,"url":179,"target":61,"icon":172,"isActive":14,"type":173,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":10,"children":180},"item-28",{"de":178,"en":178,"es":178,"fr":178,"it":178,"ru":178,"sr":178,"zh":178},"Solr Suggester","\u002Fportfolio\u002Fsolr-fuzzy-suggester-und-solr-infix-suggester-abfrage-ueber-ajax-und-filterung",[],{"id":182,"title":183,"url":191,"target":61,"icon":172,"isActive":14,"type":173,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":10,"children":192},"item-27",{"de":184,"en":185,"es":186,"fr":187,"it":188,"ru":189,"sr":190,"zh":185},"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":194,"title":195,"url":203,"target":61,"icon":172,"isActive":14,"type":173,"productId":10,"categoryId":10,"shopCategoryId":10,"articleId":10,"pageId":10,"portfolioId":10,"children":204},"item-31",{"de":196,"en":197,"es":198,"fr":199,"it":200,"ru":201,"sr":202,"zh":197},"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":206,"message":3034},{"id":207,"title":208,"slug":209,"content":210,"contentJson":211,"excerpt":1410,"featuredImage":1411,"featuredImageAlt":1412,"featuredImageCaption":10,"featuredImageTitle":10,"featuredImageCopyright":10,"featuredImageAuthor":10,"featuredImageSourceUrl":10,"featuredImageLicense":10,"featuredImageIsAiGenerated":43,"status":1413,"publishedAt":1414,"createdAt":1415,"updatedAt":1416,"seoLocalePaths":1417,"categories":1426,"author":1439,"translations":1444},"490","RBAC vs Aislamiento de Inquilinos: Dos Límites de Seguridad Diferentes","rbac-vs-tenant-isolation-two-different-security-boundaries","\u003Cp>RBAC y el aislamiento de inquilinos resuelven dos problemas de seguridad diferentes en sistemas multiinquilino. El Control de Acceso Basado en Roles (RBAC) determina qué puede hacer un principal autenticado, como leer pedidos, editar productos o gestionar usuarios. El aislamiento de inquilinos determina a qué datos, recursos y contexto de ejecución de qué inquilino puede acceder ese principal. Un usuario puede estar correctamente autenticado y correctamente asignado a un rol RBAC y aun así experimentar una falla de seguridad si la aplicación permite que ese rol opere sobre los recursos de otro inquilino.\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\">Respuesta directa\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">\u003Cstrong>RBAC responde “¿qué puede hacer esta identidad?” El aislamiento de inquilinos responde “¿dentro de cuyo límite puede hacerlo?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Una aplicación multiinquilino segura normalmente necesita ambos. Un administrador de inquilino puede tener permisos amplios, pero esos permisos deben permanecer restringidos al inquilino del administrador a menos que exista una autoridad explícitamente separada a nivel de plataforma.\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\">Un rol no es un límite de inquilino\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Dar a un usuario el rol \u003Ccode>ADMIN\u003C\u002Fcode> no implica automáticamente “administrador solo del inquilino A”. El rol debe evaluarse junto con el contexto de inquilino verificado y la propiedad de inquilino del recurso objetivo. De lo contrario, un rol válido puede convertirse en un privilegio entre inquilinos.\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\">Nota de fuente actual — 8 de octubre de 2026\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">La distinción subyacente es estable. NIST define RBAC en torno a usuarios, roles, permisos, operaciones y objetos. La guía actual de AWS SaaS afirma explícitamente que la autenticación y la autorización no equivalen al aislamiento de inquilinos, y que un usuario puede estar autenticado y autorizado mientras sigue accediendo a los recursos de otro inquilino si el aislamiento no se aplica por separado. La guía actual de Seguridad Multiinquilino de OWASP también trata el aislamiento de inquilinos como un requisito transversal que abarca API, bases de datos, cachés, almacenamiento, colas y otros recursos compartidos.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cnav class=\"editorjs-toc\" data-editorjs-toc=\"true\" aria-label=\"Contenido\">\u003Cstrong class=\"editorjs-toc__title\">Contenido\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\">Qué controla realmente RBAC\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-10\" class=\"editorjs-toc__link\">Qué controla realmente el aislamiento de inquilinos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-14\" class=\"editorjs-toc__link\">El ejemplo más simple\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-19\" class=\"editorjs-toc__link\">Dónde se detiene el ejemplo simple\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-23\" class=\"editorjs-toc__link\">RBAC vs aislamiento de inquilinos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-25\" class=\"editorjs-toc__link\">Autenticación, autorización y aislamiento son tres verificaciones diferentes\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-28\" class=\"editorjs-toc__link\">Los roles necesitan un alcance\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-32\" class=\"editorjs-toc__link\">El contexto del inquilino debe provenir de una ruta confiable\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-36\" class=\"editorjs-toc__link\">El alcance del inquilino pertenece a la búsqueda de recursos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-40\" class=\"editorjs-toc__link\">Las comprobaciones en la aplicación son útiles, pero el aislamiento no debería depender de un comportamiento perfecto del desarrollador\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-44\" class=\"editorjs-toc__link\">Estrategias de aislamiento de bases de datos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-47\" class=\"editorjs-toc__link\">La seguridad a nivel de fila de PostgreSQL puede proporcionar defensa en profundidad\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-51\" class=\"editorjs-toc__link\">El aislamiento de inquilinos debe incluir cachés\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-55\" class=\"editorjs-toc__link\">Los archivos y el almacenamiento de objetos necesitan su propia frontera de inquilino\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-59\" class=\"editorjs-toc__link\">Los trabajos en segundo plano y las colas pueden romper el aislamiento\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-63\" class=\"editorjs-toc__link\">La búsqueda y RAG necesitan recuperación con reconocimiento de inquilino\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-68\" class=\"editorjs-toc__link\">Los datos derivados heredan la sensibilidad del inquilino\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-71\" class=\"editorjs-toc__link\">No todo pertenece a un inquilino\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-75\" class=\"editorjs-toc__link\">Los administradores de plataforma requieren un modelo de autoridad diferente\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-79\" class=\"editorjs-toc__link\">RBAC se puede combinar con atributos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-83\" class=\"editorjs-toc__link\">Las decisiones de autorización son al menos bidimensionales\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-85\" class=\"editorjs-toc__link\">Evidencia de implementación original: Aaasaasa AI CMS\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-94\" class=\"editorjs-toc__link\">Por qué esta distinción importa aún más para los agentes de IA\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-98\" class=\"editorjs-toc__link\">Probar RBAC y aislamiento de inquilinos por separado\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-101\" class=\"editorjs-toc__link\">Modos de falla comunes\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-103\" class=\"editorjs-toc__link\">Conceptos erróneos comunes\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-105\" class=\"editorjs-toc__link\">Una secuencia de diseño práctica\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-107\" class=\"editorjs-toc__link\">Lista de verificación de RBAC + aislamiento de inquilinos\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-109\" class=\"editorjs-toc__link\">Casos límite y limitaciones\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-115\" class=\"editorjs-toc__link\">¿Qué cambiaría esta respuesta?\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-119\" class=\"editorjs-toc__link\">Conocimiento canónico relacionado\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-125\" class=\"editorjs-toc__link\">Preguntas frecuentes\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-127\" class=\"editorjs-toc__link\">Glosario\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-129\" class=\"editorjs-toc__link\">Conclusión\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-133\" class=\"editorjs-toc__link\">Fuentes primarias y orientación actual\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Fol>\u003C\u002Fnav>\n\u003Ch2 id=\"section-6\">Qué controla realmente RBAC\u003C\u002Fh2>\n\u003Cp>RBAC es un modelo de autorización en el que los permisos se asocian con roles y los usuarios se asignan a esos roles. El rol actúa como una abstracción administrativa entre identidades y permisos.\u003C\u002Fp>\n\u003Cp>El trabajo clásico de NIST sobre RBAC formaliza esto en torno a usuarios, roles, permisos, operaciones y objetos. El beneficio práctico es que una organización puede gestionar la autorización mediante roles relativamente estables de puesto o responsabilidad en lugar de adjuntar cada permiso directamente a cada usuario.\u003C\u002Fp>\n\u003Cp>Un rol como EDITOR puede por lo tanto significar: puede leer contenido, escribir contenido y publicar contenido. Un rol como CONTADOR puede significar: puede leer datos de facturación, conciliar facturas y aprobar liquidaciones.\u003C\u002Fp>\n\u003Ch2 id=\"section-10\">Qué controla realmente el aislamiento de inquilinos\u003C\u002Fh2>\n\u003Cp>El aislamiento de inquilinos es el conjunto de mecanismos que impide que un inquilino lea, modifique, influya o reciba accidentalmente los recursos de otro inquilino en un sistema compartido.\u003C\u002Fp>\n\u003Cp>El límite protegido es más amplio que las filas de una base de datos. El estado específico de un inquilino puede existir en tablas relacionales, almacenamiento de objetos, índices vectoriales, cachés, índices de búsqueda, mensajes de cola, archivos, artefactos temporales, trabajos en segundo plano, analíticas, límites de velocidad y recursos de infraestructura.\u003C\u002Fp>\n\u003Cp>La guía de AWS para SaaS hace explícita la distinción: la autorización otorga acceso a recursos, mientras que el aislamiento de inquilinos garantiza que esos recursos no crucen el límite de inquilino incorrecto incluso cuando la infraestructura es compartida.\u003C\u002Fp>\n\u003Ch2 id=\"section-14\">El ejemplo más simple\u003C\u002Fh2>\n\u003Cp>Supongamos que Alice es administradora del Inquilino A y Bob es administrador del Inquilino B. Ambos usuarios tienen legítimamente el mismo rol ADMIN.\u003C\u002Fp>\n\u003Cp>RBAC puede concluir correctamente que ambos usuarios pueden ejecutar una operación como users.read. Pero cuando Alice solicita el ID de usuario 847, la aplicación aún debe verificar que el usuario 847 pertenece al Inquilino A.\u003C\u002Fp>\n\u003Cp>Si la API solo verifica “Alice tiene ADMIN” y luego ejecuta SELECT * FROM users WHERE id = 847, RBAC tuvo éxito mientras que el aislamiento de inquilinos falló.\u003C\u002Fp>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Una decisión correcta de autorización multiinquilino\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. Autenticar al principal\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Establecer quién es el usuario, servicio o agente.\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. Resolver el contexto de inquilino verificado\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Determinar qué contexto de inquilino aplica a partir de información confiable de identidad\u002Fpertenencia del lado del servidor.\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. Resolver el permiso\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Evaluar si el rol o la política del principal permite la operación solicitada.\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. Acotar el recurso objetivo\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Verificar que el objeto objetivo pertenece al inquilino permitido o a un ámbito explícitamente compartido.\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. Aplicar en el límite de acceso\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Realizar la operación de base de datos, caché, almacenamiento, cola o servicio con las restricciones de inquilino aplicadas.\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. Auditar ambas dimensiones\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Registrar principal, inquilino, operación, objetivo y resultado para que los intentos entre inquilinos sean visibles.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-19\">Dónde se detiene el ejemplo simple\u003C\u002Fh2>\n\u003Cp>Los sistemas reales a menudo contienen varias clases de identidad: usuarios de inquilinos, administradores de plataforma, trabajadores en segundo plano, integraciones, agentes y servicios operativos entre inquilinos. Algunos de estos cruzan legítimamente los límites de los inquilinos.\u003C\u002Fp>\n\u003Cp>Eso no elimina la necesidad de aislamiento. Significa que la autoridad entre inquilinos debe ser explícita, estrecha y auditable por separado en lugar de surgir accidentalmente de un rol global o una conexión de base de datos sin alcance.\u003C\u002Fp>\n\u003Cp>El aislamiento de inquilinos también puede variar según la capa. Un producto puede compartir servidores de aplicaciones mientras separa las bases de datos, o usar una base de datos compartida con políticas a nivel de fila mientras otorga a los inquilinos premium almacenamiento o cómputo aislado. No existe una única topología de aislamiento universal.\u003C\u002Fp>\n\u003Ch2 id=\"section-23\">RBAC vs aislamiento de inquilinos\u003C\u002Fh2>\n\u003Csection class=\"editorjs-comparison my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Dos dimensiones de seguridad diferentes\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\">Aislamiento de inquilinos\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\">Pregunta principal\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\">Unidad típica\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\">Ejemplo\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\">Fallo típico\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\">Implementación típica\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\">¿Puede existir solo?\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\">Autenticación, autorización y aislamiento son tres verificaciones diferentes\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\">Capa\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Pregunta\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Fallo de ejemplo\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autenticación\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Quién es este principal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El atacante se hace pasar por Alice\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autorización \u002F RBAC\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Puede este principal realizar esta operación?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El visor puede eliminar usuarios\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Aislamiento de inquilinos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Puede esta operación alcanzar este límite de inquilino\u002Frecurso?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El administrador del inquilino A lee el pedido del inquilino B\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Estas verificaciones están relacionadas pero no son sustituibles. La autenticación puede ser perfecta mientras la autorización falla. La autorización puede ser correcta mientras el aislamiento de inquilinos falla. Una ruta de solicitud SaaS segura necesita todos los límites aplicables.\u003C\u002Fp>\n\u003Ch2 id=\"section-28\">Los roles necesitan un alcance\u003C\u002Fh2>\n\u003Cp>La palabra ADMIN está incompleta sin alcance. Puede significar administrador de plataforma, administrador de inquilino, administrador de proyecto, administrador de espacio de trabajo o administrador de un subsistema.\u003C\u002Fp>\n\u003Cp>En sistemas multiinquilino, la asignación de roles normalmente debe asociarse con la membresía del inquilino u otro alcance de recurso explícito. El mismo usuario puede ser legítimamente ADMIN en el inquilino A y VIEWER en el inquilino B.\u003C\u002Fp>\n\u003Cp>Un modelo de rol global que ignora esta distinción puede crear fugas de privilegios incluso cuando el mapa de permisos en sí es correcto.\u003C\u002Fp>\n\u003Ch2 id=\"section-32\">El contexto del inquilino debe provenir de una ruta confiable\u003C\u002Fh2>\n\u003Cp>Un ID de inquilino proporcionado por el cliente es útil como selector, pero no es prueba de autoridad. El servidor debe derivar o verificar la membresía del inquilino contra la identidad autenticada y los datos de autorización actuales.\u003C\u002Fp>\n\u003Cp>La guía multiinquilino actual de OWASP recomienda establecer el contexto del inquilino temprano en el ciclo de vida de la solicitud y advierte explícitamente contra tratar los encabezados del cliente o los parámetros de solicitud como prueba de autorización.\u003C\u002Fp>\n\u003Cp>Esto importa porque una modificación trivial de la solicitud de inquilino=A a inquilino=B no debe ser suficiente para cruzar el límite de aislamiento.\u003C\u002Fp>\n\u003Ch2 id=\"section-36\">El alcance del inquilino pertenece a la búsqueda de recursos\u003C\u002Fh2>\n\u003Cp>Un patrón común de aislamiento a nivel de aplicación es incluir el alcance del inquilino en la misma consulta que resuelve el recurso.\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\">Búsqueda débil\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Búsqueda con alcance de inquilino más fuerte\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>Este patrón no es el único mecanismo de aislamiento posible, pero mantiene la propiedad del inquilino cerca de la operación de acceso a datos y evita que un ID de objeto se convierta en una capacidad entre inquilinos.\u003C\u002Fp>\n\u003Ch2 id=\"section-40\">Las comprobaciones en la aplicación son útiles, pero el aislamiento no debería depender de un comportamiento perfecto del desarrollador\u003C\u002Fh2>\n\u003Cp>La guía de aislamiento de AWS advierte explícitamente contra dejar la aplicación del aislamiento solo en manos de los desarrolladores de servicios. En una base de código grande, eventualmente una consulta, clave de caché o ruta de trabajo puede omitir el alcance del inquilino.\u003C\u002Fp>\n\u003Cp>La defensa en profundidad puede, por lo tanto, trasladar el aislamiento a middleware compartido, capas de repositorio\u002Fservicio, motores de políticas, seguridad a nivel de fila de la base de datos, credenciales dedicadas, esquemas separados o bases de datos separadas según el riesgo y la arquitectura.\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\">El aislamiento debería ser difícil de olvidar\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">El límite más fuerte es aquel que el código de aplicación ordinario no puede eludir casualmente al omitir una condición \u003Ccode>tenantId\u003C\u002Fcode>.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-44\">Estrategias de aislamiento de bases de datos\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\">Estrategia\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Límite\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Fortaleza \u002F compensación\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Tablas compartidas + clave de inquilino\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Política de fila\u002Faplicación\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Eficiente operativamente; requiere alcance de inquilino exhaustivo y pruebas sólidas\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Tablas compartidas + RLS de base de datos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Límite de política de base de datos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Reduce la dependencia de cada consulta de la aplicación; requiere roles correctos, contexto de inquilino de sesión\u002Ftransacción y cobertura de políticas\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Esquemas separados\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Límite de espacio de nombres \u002F rol de BD\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separación lógica más fuerte; mayor complejidad operativa\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bases de datos separadas\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Límite de base de datos \u002F credenciales\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Aislamiento fuerte y una historia de radio de impacto más simple; mayor costo de aprovisionamiento y operaciones\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Infraestructura\u002Fcuenta separada\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Límite de infraestructura\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Separación de grano grueso más fuerte; mayor costo y sobrecarga operativa\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Híbrido\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Por carga de trabajo\u002Fclase de datos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Permite un aislamiento más fuerte solo donde el riesgo\u002Fcumplimiento lo justifica\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>La hoja de referencia actual de seguridad multiinquilino de OWASP enumera bases de datos separadas, esquemas separados, tablas compartidas con controles a nivel de fila y modelos híbridos. El modelo correcto depende del nivel de amenaza, el cumplimiento, el rendimiento y el costo operativo.\u003C\u002Fp>\n\u003Ch2 id=\"section-47\">La seguridad a nivel de fila de PostgreSQL puede proporcionar defensa en profundidad\u003C\u002Fh2>\n\u003Cp>Con tablas compartidas, la seguridad a nivel de fila de PostgreSQL puede aplicar un predicado de inquilino en la capa de base de datos para que las consultas ordinarias no puedan ver filas fuera de la política de inquilino activa.\u003C\u002Fp>\n\u003Cp>Sin embargo, RLS no es mágico. Los superusuarios de PostgreSQL y los roles con BYPASSRLS pueden eludir las políticas de fila. Por lo tanto, OWASP recomienda usar un rol de ruta de solicitud con privilegios mínimos y probar el mismo modo de conexión\u002Fagrupación utilizado en producción.\u003C\u002Fp>\n\u003Cp>La reutilización de conexiones es otro borde importante: el contexto del inquilino debe establecerse y restablecerse de forma segura para cada transacción\u002Fsolicitud para que una conexión agrupada no pueda filtrar el estado previo del inquilino.\u003C\u002Fp>\n\u003Ch2 id=\"section-51\">El aislamiento de inquilinos debe incluir cachés\u003C\u002Fh2>\n\u003Cp>Una consulta de base de datos puede tener un alcance perfecto y aún así filtrar datos a través de una clave de caché compartida.\u003C\u002Fp>\n\u003Cp>Si user:42 existe tanto en el Inquilino A como en el Inquilino B, una clave de caché global puede devolver el valor del inquilino incorrecto. Las claves de caché sensibles al inquilino deben incluir cada atributo que cambie la visibilidad o la semántica del resultado, comúnmente inquilino, usuario, configuración regional, conjunto de características o versión de permisos.\u003C\u002Fp>\n\u003Cp>La partición de caché es defensa en profundidad, no un reemplazo de la autorización. La solicitud aún debe autorizarse antes de que se devuelva el contenido protegido en caché.\u003C\u002Fp>\n\u003Ch2 id=\"section-55\">Los archivos y el almacenamiento de objetos necesitan su propia frontera de inquilino\u003C\u002Fh2>\n\u003Cp>El almacenamiento de objetos debe distinguir entre objetos globales, con alcance de inquilino y con alcance de usuario. Un prefijo de carpeta por sí solo es únicamente una convención de nombres, a menos que la política de acceso realmente restrinja las lecturas y escrituras.\u003C\u002Fp>\n\u003Cp>Los diseños más sólidos pueden usar claves de objeto con reconocimiento de inquilino, políticas de bucket, buckets\u002Fcuentas separados o claves de cifrado específicas del inquilino cuando el riesgo o el cumplimiento exijan un aislamiento más fuerte.\u003C\u002Fp>\n\u003Cp>Las URL firmadas deben autorizarse antes de su emisión y limitarse al objeto y la operación exactos. La posesión de un identificador de objeto no debería por sí misma otorgar acceso entre inquilinos.\u003C\u002Fp>\n\u003Ch2 id=\"section-59\">Los trabajos en segundo plano y las colas pueden romper el aislamiento\u003C\u002Fh2>\n\u003Cp>Los trabajos asíncronos a menudo abandonan el contexto de la solicitud HTTP original, lo que hace fácil manejar mal la propagación del inquilino. Un mensaje de cola que contiene tenantId no es prueba suficiente de que el productor estuviera autorizado.\u003C\u002Fp>\n\u003Cp>El worker debe llevar una identidad de servicio\u002Fusuario verificada o un sobre de trabajo confiable, restablecer el contexto del inquilino y volver a autorizar las operaciones consecuentes en la frontera del consumidor.\u003C\u002Fp>\n\u003Cp>El aislamiento de inquilinos también incluye la disponibilidad. Un inquilino no debería poder monopolizar workers, colas, pools de conexiones o cómputo compartidos de manera que degrade materialmente a otros inquilinos.\u003C\u002Fp>\n\u003Ch2 id=\"section-63\">La búsqueda y RAG necesitan recuperación con reconocimiento de inquilino\u003C\u002Fh2>\n\u003Cp>La IA multiinquilino introduce otra copia del problema de aislamiento. Los documentos pueden dividirse en fragmentos, incrustarse y almacenarse en un índice vectorial después de la ingesta.\u003C\u002Fp>\n\u003Cp>La guía actual de seguridad de RAG de OWASP establece que el control de acceso debe aplicarse en el momento de la recuperación y que los fragmentos del Inquilino A no deben ser recuperados por consultas del Inquilino B. No se puede simplemente asumir que los permisos a nivel de documento sobreviven automáticamente a la fragmentación.\u003C\u002Fp>\n\u003Cp>Por lo tanto, el índice vectorial necesita metadatos de inquilino\u002Facceso o colecciones física o lógicamente separadas según el diseño de aislamiento. Los filtros de recuperación deben aplicarse antes de que contenido no autorizado pueda entrar en el contexto del modelo.\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\">El modelo nunca debe ser el filtro de inquilino\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">No recupere fragmentos entre inquilinos y luego indique al modelo de lenguaje que los ignore. Una vez que los datos protegidos entran en el contexto del modelo, la frontera de aislamiento ya ha fallado.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-68\">Los datos derivados heredan la sensibilidad del inquilino\u003C\u002Fh2>\n\u003Cp>Las incrustaciones, los índices de búsqueda, las miniaturas, los resúmenes generados, las cachés, las filas de analítica y las respuestas de IA se derivan de los datos de origen. Su alcance de inquilino debe seguir a la fuente, a menos que una transformación explícita cree un artefacto compartido\u002Fglobal legítimo.\u003C\u002Fp>\n\u003Cp>Por lo tanto, la eliminación y la baja deben propagarse más allá de la fila canónica. Eliminar un documento de inquilino mientras se dejan fragmentos buscables o resúmenes en caché puede mantener la exposición entre inquilinos o posterior a la retención.\u003C\u002Fp>\n\u003Ch2 id=\"section-71\">No todo pertenece a un inquilino\u003C\u002Fh2>\n\u003Cp>Las plataformas multiinquilino a menudo tienen recursos intencionalmente globales: taxonomías de productos, plantillas públicas, permisos del sistema, definiciones de características o contenido público.\u003C\u002Fp>\n\u003Cp>El modelo más seguro es la clasificación explícita: global, con alcance de inquilino, con alcance de usuario o explícitamente entre inquilinos. Los recursos ambiguos son donde comienza la fuga accidental.\u003C\u002Fp>\n\u003Cp>Un objeto compartido intencionalmente debe tener una razón documentada para ser global en lugar de simplemente carecer de una asociación de inquilino.\u003C\u002Fp>\n\u003Ch2 id=\"section-75\">Los administradores de plataforma requieren un modelo de autoridad diferente\u003C\u002Fh2>\n\u003Cp>Un operador de plataforma puede necesitar inspeccionar múltiples inquilinos para soporte, cumplimiento u operaciones de infraestructura. Modelar esto como un ADMIN de inquilino ordinario con acceso global accidental a la base de datos debilita tanto la seguridad como la auditabilidad.\u003C\u002Fp>\n\u003Cp>Un mejor diseño utiliza una identidad de plataforma distinta o un permiso explícito entre inquilinos, autenticación más fuerte, limitación de propósito, auditoría detallada y, cuando corresponda, controles de aprobación o de acceso de emergencia.\u003C\u002Fp>\n\u003Cp>Por lo tanto, el acceso entre inquilinos debe ser una capacidad nombrada, no la ausencia de un filtro de inquilino.\u003C\u002Fp>\n\u003Ch2 id=\"section-79\">RBAC se puede combinar con atributos\u003C\u002Fh2>\n\u003Cp>Algunas decisiones dependen de más que el rol. La pertenencia al inquilino, la región, el propietario del recurso, el nivel de suscripción, el tiempo, la pertenencia al proyecto o la clasificación de datos pueden afectar el acceso.\u003C\u002Fp>\n\u003Cp>RBAC y ABAC no son mutuamente excluyentes. La guía actual de autorización multiinquilino de AWS analiza modelos RBAC, ABAC e híbridos. Un rol puede definir una responsabilidad amplia mientras que los atributos restringen qué instancia de recurso concreta se puede acceder.\u003C\u002Fp>\n\u003Cp>La regla clave de arquitectura sigue siendo: no codifique el aislamiento de inquilinos solo como un nombre de rol incidental si la identidad del inquilino es un límite de recurso de primera clase.\u003C\u002Fp>\n\u003Ch2 id=\"section-83\">Las decisiones de autorización son al menos bidimensionales\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\">Principal\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Permiso de rol\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Relación de inquilino\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Decisión\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\">El pedido pertenece al inquilino de Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Permitir\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\">El pedido pertenece a otro inquilino\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Denegar\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\">El pedido pertenece al inquilino de Alice\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Permitir si el rol incluye escritura\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\">El pedido pertenece a otro inquilino\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Denegar\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Soporte de plataforma\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\">Alcance de soporte explícito + inquilino objetivo auditado\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Potencialmente permitir bajo política de plataforma\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Trabajador en segundo plano\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\">Alcance de servicio confiable para el inquilino del trabajo\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Permitir solo para el inquilino del trabajo verificado\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-85\">Evidencia de implementación original: 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\">Evidencia de implementación original\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Aaasaasa AI CMS contiene una implementación concreta de RBAC con alcance de inquilino. Es evidencia útil de cómo se pueden combinar la autorización de roles y el alcance de inquilino, pero no debe presentarse como prueba de que cada capa de almacenamiento, caché o infraestructura tenga un aislamiento de inquilino completo.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cp>El servicio RBAC define códigos de permiso tipados como cms.content.read, shop.orders.write, billing.reconcile y users.roles. Los roles del sistema asignan esos permisos a conjuntos de responsabilidad nombrados.\u003C\u002Fp>\n\u003Cp>Los registros de roles se crean y resuelven con un tenantId. Los roles del sistema se insertan o actualizan utilizando una identidad compuesta de inquilino\u002Fcódigo, y el listado de roles se filtra por inquilino.\u003C\u002Fp>\n\u003Cp>La actualización y eliminación de roles primero resuelven el rol utilizando tanto el ID del rol como el ID del inquilino. Las asignaciones de rol de usuario también se almacenan y reemplazan bajo el contexto del inquilino actual.\u003C\u002Fp>\n\u003Cp>La resolución de permisos lee asignaciones explícitas de rol de usuario con alcance tanto de tenantId como de userId. Esto evita que la asignación de rol de un inquilino se convierta automáticamente en la asignación de rol de otro inquilino.\u003C\u002Fp>\n\u003Cp>A nivel de API, las rutas administrativas de RBAC resuelven un contexto de inquilino antes de crear o modificar roles. Esta es la dirección correcta: la administración de permisos en sí misma debe respetar la multi-tenencia.\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\">Patrón de implementación observado\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Significado de seguridad\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Códigos de permiso tipados\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El vocabulario de operaciones RBAC es explícito\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mapas de rol de sistema → permisos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los roles agregan permisos en lugar de codificar usuarios de forma rígida\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Identidad de rol tenantId_code\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El mismo rol lógico puede existir por separado por inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La búsqueda de roles usa id + tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La mutación de roles está limitada al inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La relación usuario-rol almacena tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La pertenencia no se infiere globalmente solo del rol\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La resolución de permisos usa tenantId + userId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La autorización se evalúa dentro del contexto del inquilino\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\">Lo que esta evidencia no prueba\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">El RBAC con alcance de inquilino es una capa. El aislamiento completo de inquilinos también debe cubrir todas las búsquedas de recursos propiedad del inquilino, bases de datos, cachés, archivos, índices de búsqueda\u002Fvectoriales, trabajos en segundo plano, integraciones y rutas operativas. La evidencia del repositorio aquí respalda el patrón de diseño de RBAC\u002Falcance de inquilino, no una afirmación de aislamiento SaaS auditado de forma independiente.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-94\">Por qué esta distinción importa aún más para los agentes de IA\u003C\u002Fh2>\n\u003Cp>Los agentes de IA pueden convertir un error de permisos en una secuencia de acciones. Si a un agente se le da una herramienta amplia orders.read sin aplicación con alcance de inquilino, una falla de razonamiento o de inyección de prompts puede causar lecturas entre inquilinos a velocidad de máquina.\u003C\u002Fp>\n\u003Cp>Las descripciones de herramientas del agente pueden mencionar restricciones de inquilino, pero la aplicación aún debe ocurrir en la capa confiable de tiempo de ejecución\u002Fservicio\u002Fdatos. Las instrucciones en lenguaje natural no son una frontera de autorización.\u003C\u002Fp>\n\u003Cp>Lo mismo se aplica a RAG: un agente puede tener permiso para usar la herramienta de búsqueda mientras el backend de búsqueda aún debe evitar que la consulta del Inquilino A devuelva fragmentos del Inquilino B.\u003C\u002Fp>\n\u003Ch2 id=\"section-98\">Probar RBAC y aislamiento de inquilinos por separado\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\">Familia de pruebas\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Qué debería probar\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de degradación de rol\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Un usuario sin un permiso no puede realizar la operación incluso dentro de su propio inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de objeto entre inquilinos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Un usuario con el rol correcto aún no puede acceder al mismo tipo de recurso en otro inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Manipulación de identificadores\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Cambiar los ID de objeto\u002Finquilino no cruza el alcance\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de endpoint de listado\u002Fmasivo\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Las consultas amplias devuelven solo datos de inquilinos autorizados\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de reutilización de caché\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dos inquilinos que usan procesos\u002Fconexiones reutilizados nunca reciben el estado en caché del otro\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de rol de solicitud RLS\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El rol de solicitud de producción no puede eludir las políticas de fila\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de trabajador asíncrono\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El contexto del inquilino sobrevive al encolado y se revalida al consumirse\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de recuperación vectorial\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La consulta del Inquilino A nunca recupera fragmentos del Inquilino B\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de administrador de plataforma\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La capacidad entre inquilinos es explícita, limitada y auditable\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Prueba de baja de servicio\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los datos del inquilino y los índices\u002Fcachés derivados se eliminan según la política\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>La guía de regresión de autorización de OWASP señala específicamente las pruebas de frontera entre inquilinos porque los cambios de código en cachés, consultas o servicios compartidos pueden romper silenciosamente el aislamiento incluso cuando las pruebas de roles siguen pasando.\u003C\u002Fp>\n\u003Ch2 id=\"section-101\">Modos de falla comunes\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\">Modo de falla\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Por qué falla\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verificar el rol pero no el inquilino\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Un rol válido se convierte en autoridad entre inquilinos\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Confiar en el ID de inquilino de la solicitud\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El cliente controla el selector de aislamiento\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Delimitar la UI pero no la API\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los botones ocultos no protegen los recursos del backend\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Endpoint de detalle con reconocimiento de inquilino, endpoint de listado sin alcance\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Las lecturas masivas filtran otros inquilinos\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Filtro de inquilino en la mayoría de las consultas\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Una ruta olvidada rompe la frontera\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Claves de caché globales\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El aislamiento correcto de la base de datos se elude mediante datos en caché\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Índice vectorial compartido sin filtros de metadatos aplicados\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RAG recupera fragmentos de otro inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">ID de inquilino del mensaje de cola tratado como autorización\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Un trabajo falsificado o producido incorrectamente puede cruzar la frontera de inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Administrador de plataforma modelado como ADMIN ordinario\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El poder entre inquilinos se vuelve implícito y difícil de auditar\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Rol copiado globalmente entre pertenencias de inquilinos\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El usuario recibe permisos en inquilinos donde nunca fue asignado\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Bases de datos separadas pero credencial privilegiada compartida\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La aplicación aún puede cruzar bases de datos si su credencial es demasiado amplia\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RLS con rol de solicitud BYPASSRLS\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La política de base de datos existe pero no protege la ruta de solicitud real\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">UUID aleatorios tratados como aislamiento\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los identificadores difíciles de adivinar reducen la enumeración pero no autorizan el acceso\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-103\">Conceptos erróneos comunes\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\">Concepto erróneo\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Corrección\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“RBAC proporciona aislamiento de inquilinos.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RBAC controla permisos; el aislamiento también requiere alcance de inquilino\u002Frecurso.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Si el usuario es administrador, las verificaciones de inquilino son innecesarias.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La autoridad de administrador aún debe tener un alcance explícito.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“El ID de inquilino en el JWT es suficiente.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Puede ser una entrada confiable solo si se valida y se aplica de manera consistente a cada ruta de recurso protegida.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Bases de datos separadas eliminan los requisitos de autorización.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los usuarios aún necesitan permisos a nivel de operación dentro de su inquilino.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Una columna tenant_id significa que el sistema está aislado.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El campo solo ayuda si las rutas de acceso lo aplican.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Los UUID previenen el acceso entre inquilinos.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Los identificadores impredecibles son defensa en profundidad, no autorización.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“RLS significa que el código de la aplicación no necesita verificaciones de seguridad.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La autorización de la aplicación, los roles de base de datos correctos y la cobertura de políticas aún importan.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Una base de datos vectorial compartida es insegura.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Puede ser segura si el aislamiento es aplicable y verificado; la separación física es una opción, no la única.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“El soporte de plataforma necesita ADMIN global.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El soporte entre inquilinos debe ser una autoridad distinta, restringida y auditable.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">“Los servicios internos pueden omitir las verificaciones de inquilino.”\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Las rutas internas aún pueden verse comprometidas o mal configuradas y deben preservar el contexto del inquilino.\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-105\">Una secuencia de diseño práctica\u003C\u002Fh2>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Diseñar permisos y aislamiento como dimensiones separadas\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. Definir la propiedad del inquilino\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Clasificar qué entidades y recursos son globales, con alcance de inquilino, con alcance de usuario o intencionalmente entre inquilinos.\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. Definir operaciones\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Crear permisos explícitos para lecturas, escrituras, publicación, aprobaciones, administración y otras acciones comerciales.\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. Definir roles\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Agrupar permisos según responsabilidades sin incorporar un alcance global accidental.\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. Definir el alcance de pertenencia\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Vincular las asignaciones de roles al contexto de inquilino\u002Fespacio de trabajo\u002Fproyecto en el que se aplican.\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. Resolver el contexto de inquilino confiable\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Derivar la identidad del inquilino a partir de la pertenencia autenticada y verificada por el servidor o la autorización del servicio.\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. Aplicar la propiedad de los recursos\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Aplicar el alcance de inquilino en cada frontera de datos\u002Fservicio propiedad del inquilino.\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. Agregar defensa en profundidad\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Usar RLS, credenciales separadas, esquemas\u002Fbases de datos, políticas de almacenamiento o motores de políticas donde el riesgo lo justifique.\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. Llevar el alcance a través de sistemas derivados\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Preservar los metadatos del inquilino en caché, búsqueda, índices vectoriales, colas, archivos y analítica.\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. Modelar explícitamente las operaciones entre inquilinos\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Separar la administración de la plataforma y las identidades de servicio de los roles ordinarios de inquilino.\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. Probar ambos ejes\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Ejecutar pruebas negativas para permiso faltante y para inquilino incorrecto de forma independiente.\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. Auditar inquilino + permiso juntos\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Registrar quién actuó, en qué inquilino, sobre qué objetivo y bajo qué autoridad.\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. Volver a probar después de cambios de esquema\u002Ftiempo de ejecución\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">El aislamiento puede romperse cuando se introducen nuevas tablas, cachés, colas o rutas de recuperación.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-107\">Lista de verificación de RBAC + aislamiento de inquilinos\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\">Pregunta\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Respuesta esperada\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Quién es el principal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Identidad de usuario\u002Fservicio\u002Fagente autenticada\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Qué contexto de inquilino aplica?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Pertenencia verificada por el servidor o alcance del servicio\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Qué operación se solicita?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Permiso tipado o acción de política\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿El principal tiene ese permiso?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Decisión de rol\u002Fpolítica\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Quién es propietario del recurso objetivo?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Clasificación explícita de inquilino\u002Fglobal\u002Fusuario\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿El alcance del recurso coincide con la autoridad?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Búsqueda\u002Fpolítica con reconocimiento de inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿El almacenamiento puede eludir las verificaciones de la aplicación?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Decisión de defensa en profundidad documentada\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Las cachés son seguras para inquilinos?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Las claves\u002Fespacios de nombres y la autorización preservan el alcance del inquilino\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Los archivos\u002Fblobs son seguros para inquilinos?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">La política de objetos y la emisión de URL firmadas aplican el alcance\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Los trabajos asíncronos son seguros para inquilinos?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">El contexto verificado se propaga y se revalida\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿RAG\u002Fbúsqueda es seguro para inquilinos?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Aislamiento de metadatos\u002Fcolecciones aplicado antes del contexto del modelo\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Los administradores entre inquilinos son explícitos?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autoridad, controles y auditoría separados\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Las credenciales ordinarias pueden eludir el aislamiento?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">No, o una ruta excepcional estrictamente documentada\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">¿Las pruebas negativas entre inquilinos están automatizadas?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sí para cada capa de acceso relevante\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-109\">Casos límite y limitaciones\u003C\u002Fh2>\n\u003Cp>Un usuario puede pertenecer a múltiples inquilinos. Por lo tanto, el inquilino actual debe ser un contexto de ejecución explícito, no inferido permanentemente de la cuenta de usuario.\u003C\u002Fp>\n\u003Cp>Algunos recursos se comparten intencionalmente entre inquilinos seleccionados, como espacios de colaboración o datos de consorcio. Esto requiere un modelo de compartición explícito; pretender que el recurso pertenece a un inquilino y añadir excepciones después suele crear autorización ambigua.\u003C\u002Fp>\n\u003Cp>El aislamiento de vecinos ruidosos está relacionado pero es diferente del aislamiento de confidencialidad. Un inquilino puede nunca ver los datos de otro inquilino y aun así agotar la CPU compartida, la capacidad de cola o las conexiones de base de datos. Por lo tanto, los límites de velocidad y las cuotas de recursos pueden ser conscientes del inquilino como un límite de disponibilidad.\u003C\u002Fp>\n\u003Cp>El aislamiento físico no es automáticamente seguro si las credenciales del plano de control o las rutas administrativas pueden cruzar límites. El aislamiento lógico no es automáticamente débil si las políticas se aplican centralmente, con privilegios mínimos y se prueban exhaustivamente.\u003C\u002Fp>\n\u003Cp>Los requisitos de aislamiento de inquilinos pueden diferir según la clase de datos. Los datos de catálogo público, los registros de facturación y los documentos privados de IA pueden justificar diferentes límites de almacenamiento y cifrado dentro del mismo producto SaaS.\u003C\u002Fp>\n\u003Ch2 id=\"section-115\">¿Qué cambiaría esta respuesta?\u003C\u002Fh2>\n\u003Cp>La implementación exacta cambia con la arquitectura: las API sin servidor, Kubernetes, PostgreSQL, el almacenamiento de objetos, las bases de datos vectoriales y los motores de políticas exponen diferentes primitivas de aislamiento.\u003C\u002Fp>\n\u003Cp>La fuerza requerida también cambia con la regulación, los contratos de clientes, la sensibilidad de los datos, el modelo de amenaza y la escala operativa. Algunos inquilinos pueden justificar bases de datos o infraestructura en silos, mientras que otros comparten recursos agrupados.\u003C\u002Fp>\n\u003Cp>La distinción conceptual no cambia: el permiso para realizar una operación no es lo mismo que el permiso para cruzar un límite de inquilino.\u003C\u002Fp>\n\u003Ch2 id=\"section-119\">Conocimiento canónico relacionado\u003C\u002Fh2>\n\u003Cp>S01 es un requisito previo de límite de seguridad para la Arquitectura de IA Empresarial y la Gobernanza de IA. Una vez que las herramientas de IA, RAG o los agentes operan sobre datos multiinquilino, la identidad del inquilino debe viajar a través de la recuperación, la ejecución de herramientas, la memoria, las cachés y los rastros de auditoría.\u003C\u002Fp>\n\u003Cp>También se conecta directamente con la IA Agéntica: la capacidad de la herramienta y el permiso de rol aún deben estar restringidos por la propiedad del inquilino antes de que un agente pueda leer o modificar recursos empresariales.\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: La pila de protocolos de agentes explicada\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">La interoperabilidad de protocolos no reemplaza la autorización ni el aislamiento de inquilinos. El descubrimiento de capacidades y la autoridad empresarial siguen siendo preocupaciones arquitectónicas separadas.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Leer el artículo sobre la pila de protocolos →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Cp>Para RAG, el aislamiento de inquilinos debe aplicarse antes de que los fragmentos protegidos lleguen al contexto del modelo.\u003C\u002Fp>\n\u003Caside class=\"editorjs-referral my-6\">\u003Ca href=\"https:\u002F\u002Fstajic.de\u002Fes\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\">¿Qué es RAG? La explicación más simple de cómo funciona\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">La base de recuperación para entender dónde deben aplicarse el filtrado de fuentes consciente del inquilino y el aislamiento del almacén vectorial.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Leer los fundamentos de RAG →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Ch2 id=\"section-125\">Preguntas frecuentes\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\">Preguntas frecuentes sobre RBAC vs aislamiento de inquilinos\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\">¿Cuál es la diferencia entre RBAC y el aislamiento de inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RBAC determina qué operaciones puede realizar un principal. El aislamiento de inquilinos determina a qué recursos de qué inquilino pueden acceder esas operaciones. Las aplicaciones multiinquilino seguras normalmente necesitan ambos.\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\">¿Un rol ADMIN permite automáticamente el acceso a todos los inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">No. ADMIN debe tener un alcance explícito. Un administrador de inquilino normalmente tiene permisos amplios solo dentro de ese inquilino, mientras que la administración de plataforma entre inquilinos debe modelarse por separado.\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\">¿Es suficiente la autenticación para el aislamiento de inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">No. La autenticación prueba la identidad. La autorización controla las acciones permitidas. El aislamiento de inquilinos además evita que esas acciones lleguen a los recursos del inquilino equivocado.\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\">¿Debería almacenarse tenantId en el JWT?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Puede ser una entrada al contexto del inquilino, pero el servidor debe verificar la membresía\u002Fautoridad actual y aplicar el alcance en los límites de recursos protegidos. Una afirmación por sí sola no reemplaza los controles de aislamiento.\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\">¿Necesito una base de datos separada por inquilino?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">No necesariamente. Los modelos de tabla compartida, RLS, esquema, base de datos, infraestructura e aislamiento híbrido pueden ser válidos según los requisitos de riesgo y operativos.\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\">¿Puede PostgreSQL RLS reemplazar los filtros de inquilino en el código de la aplicación?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RLS puede proporcionar una fuerte defensa en profundidad, pero los roles de base de datos correctos, el contexto de la solicitud, la cobertura de políticas y la autorización a nivel de aplicación siguen siendo importantes.\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\">¿Cómo debería RAG aplicar el aislamiento de inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">El alcance de inquilino\u002Facceso debe aplicarse durante la recuperación para que los fragmentos no autorizados nunca entren en el contexto del modelo. Preserve los metadatos de acceso a través del chunking y la indexación.\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\">¿Puede un usuario tener diferentes roles en diferentes inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Sí. Esto es común en SaaS B2B y es una fuerte razón para delimitar las asignaciones de roles por membresía de inquilino en lugar de tratar los roles como adjuntos globalmente al usuario.\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\">¿Cuál es la mejor prueba para el aislamiento de inquilinos?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Use pruebas negativas entre inquilinos: cree al menos dos inquilinos, otorgue a un usuario permisos válidos en un inquilino, luego demuestre que cada ruta protegida deniega el acceso a los recursos del otro inquilino.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-127\">Glosario\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\">Términos clave de seguridad multiinquilino\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\">Control de acceso basado en roles: un modelo de autorización que asocia permisos con roles y asigna usuarios o principales a esos roles.\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\">Inquilino\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Un cliente, organización, espacio de trabajo u otro consumidor lógico aislado de un sistema multiinquilino compartido.\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\">Aislamiento de inquilinos\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Mecanismos que impiden que un inquilino acceda, modifique o reciba los recursos de otro inquilino en un sistema compartido.\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\">Autenticación\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Verificación de la identidad de un usuario, servicio u otro principal.\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\">Autorización\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Proceso de decisión que determina si un principal puede realizar una operación solicitada sobre un recurso.\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\">Permiso\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Una operación o capacidad permitida definida, como orders.read o 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\">Rol\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Una agrupación nombrada de permisos asociada con una responsabilidad o función.\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\">Control de acceso basado en atributos: autorización basada en atributos del principal, recurso, acción o entorno.\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\">Seguridad a nivel de fila\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Mecanismo de política de base de datos que restringe qué filas puede leer o modificar un rol o sesión de base de datos.\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\">Acceso entre inquilinos\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Cualquier ruta de acceso en la que un principal que opera bajo el contexto de un inquilino alcanza recursos pertenecientes a otro inquilino.\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\">Administrador de plataforma\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Una identidad operativa privilegiada con autoridad modelada explícitamente que puede abarcar múltiples inquilinos.\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\">Contexto de inquilino\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">El ámbito de inquilino verificado bajo el cual se ejecuta la solicitud, trabajo o operación de agente actual.\u003C\u002Fdd>\u003C\u002Fdiv>\u003C\u002Fdl>\u003C\u002Fsection>\n\u003Ch2 id=\"section-129\">Conclusión\u003C\u002Fh2>\n\u003Cp>RBAC y el aislamiento de inquilinos son mecanismos de seguridad complementarios, no competidores. RBAC estructura el permiso operativo; el aislamiento de inquilinos restringe el límite de recursos dentro del cual ese permiso puede aplicarse.\u003C\u002Fp>\n\u003Cp>Por lo tanto, una solicitud multiinquilino robusta necesita más que “el usuario tiene el rol ADMIN”. Necesita un principal verificado, un contexto de inquilino verificado, una operación permitida, un objetivo con alcance de inquilino y aplicación en cada capa de recursos que pueda contener datos propiedad del inquilino.\u003C\u002Fp>\n\u003Cp>La regla confiable más corta es: autoriza la acción, luego aísla el alcance — y nunca asumas que uno prueba el otro.\u003C\u002Fp>\n\u003Ch2 id=\"section-133\">Fuentes primarias y orientación actual\u003C\u002Fh2>\n\u003Cp>Las fuentes a continuación respaldan la definición de RBAC y la orientación actual sobre aislamiento de inquilinos. La sección de Aaasaasa AI CMS es evidencia de implementación original y está intencionalmente limitada a los patrones de código que fueron verificados.\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 — Control de acceso basado en roles\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Descripción general de NIST de los modelos RBAC y el estándar INCITS RBAC, incluidos usuarios, roles, permisos, operaciones y objetos.\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 — Glosario RBAC\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Definiciones actuales del glosario de NIST sobre control de acceso basado en roles como asignación de permisos a través de roles.\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 — La mentalidad de aislamiento\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación de AWS SaaS que distingue explícitamente la autenticación\u002Fautorización del aislamiento de inquilinos y recomienda mecanismos de aislamiento compartidos.\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 — Preguntas frecuentes sobre autorización multiinquilino\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación actual que explica la diferencia entre autorización y aislamiento de inquilinos en aplicaciones SaaS.\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 — Consideraciones de diseño multiinquilino\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación actual de SaaS que distingue el aislamiento de inquilinos de la autorización y analiza modelos de políticas de autorización agrupados\u002Faislados.\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 — Hoja de referencia de seguridad de aplicaciones multiinquilino\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación práctica actual para el contexto de inquilino, aislamiento de base de datos, cachés, almacenamiento, colas, pruebas y prevención de acceso entre inquilinos.\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 — Hoja de referencia de seguridad de RAG\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación actual que exige control de acceso en el momento de la recuperación y aislamiento de inquilinos para almacenes vectoriales multiinquilino.\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 — Pruebas de regresión de autorización\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Orientación actual de pruebas que incluye pruebas de degradación de roles y límites entre inquilinos.\u003C\u002Fp>\u003C\u002Fa>",{"time":212,"blocks":213,"version":1409},1791485306527,[214,220,228,235,242,250,255,260,265,270,275,280,285,290,295,300,305,310,336,341,346,351,356,361,401,406,426,431,436,441,446,451,456,461,466,471,476,481,498,503,508,513,518,525,530,563,568,573,578,583,588,593,598,603,608,613,618,623,628,633,638,643,648,653,658,663,668,674,679,684,689,694,699,704,709,714,719,724,729,734,739,744,749,754,786,791,797,802,807,812,817,822,848,854,859,864,869,874,879,917,922,927,974,979,1017,1022,1064,1069,1118,1123,1128,1133,1138,1143,1148,1153,1158,1163,1168,1173,1178,1183,1192,1197,1205,1210,1252,1257,1306,1311,1316,1321,1326,1331,1336,1346,1355,1364,1373,1382,1391,1400],{"id":215,"data":216,"type":218,"tunes":219},"intro",{"text":217},"RBAC y el aislamiento de inquilinos resuelven dos problemas de seguridad diferentes en sistemas multiinquilino. El Control de Acceso Basado en Roles (RBAC) determina qué puede hacer un principal autenticado, como leer pedidos, editar productos o gestionar usuarios. El aislamiento de inquilinos determina a qué datos, recursos y contexto de ejecución de qué inquilino puede acceder ese principal. Un usuario puede estar correctamente autenticado y correctamente asignado a un rol RBAC y aun así experimentar una falla de seguridad si la aplicación permite que ese rol opere sobre los recursos de otro inquilino.","paragraph",{},{"id":221,"data":222,"type":226,"tunes":227},"direct",{"body":223,"title":224,"variant":225},"\u003Cstrong>RBAC responde “¿qué puede hacer esta identidad?” El aislamiento de inquilinos responde “¿dentro de cuyo límite puede hacerlo?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Una aplicación multiinquilino segura normalmente necesita ambos. Un administrador de inquilino puede tener permisos amplios, pero esos permisos deben permanecer restringidos al inquilino del administrador a menos que exista una autoridad explícitamente separada a nivel de plataforma.","Respuesta directa","info","callout",{},{"id":229,"data":230,"type":226,"tunes":234},"boundary",{"body":231,"title":232,"variant":233},"Dar a un usuario el rol \u003Ccode>ADMIN\u003C\u002Fcode> no implica automáticamente “administrador solo del inquilino A”. El rol debe evaluarse junto con el contexto de inquilino verificado y la propiedad de inquilino del recurso objetivo. De lo contrario, un rol válido puede convertirse en un privilegio entre inquilinos.","Un rol no es un límite de inquilino","warning",{},{"id":236,"data":237,"type":226,"tunes":241},"current",{"body":238,"title":239,"variant":240},"La distinción subyacente es estable. NIST define RBAC en torno a usuarios, roles, permisos, operaciones y objetos. La guía actual de AWS SaaS afirma explícitamente que la autenticación y la autorización no equivalen al aislamiento de inquilinos, y que un usuario puede estar autenticado y autorizado mientras sigue accediendo a los recursos de otro inquilino si el aislamiento no se aplica por separado. La guía actual de Seguridad Multiinquilino de OWASP también trata el aislamiento de inquilinos como un requisito transversal que abarca API, bases de datos, cachés, almacenamiento, colas y otros recursos compartidos.","Nota de fuente actual — 8 de octubre de 2026","note",{},{"id":243,"data":244,"type":248,"tunes":249},"toc",{"title":245,"maxLevel":246,"minLevel":247},"Contenido",3,2,"tableOfContents",{},{"id":251,"data":252,"type":42,"tunes":254},"h-meaning",{"text":253,"level":247},"Qué controla realmente RBAC",{},{"id":256,"data":257,"type":218,"tunes":259},"p-rbac-1",{"text":258},"RBAC es un modelo de autorización en el que los permisos se asocian con roles y los usuarios se asignan a esos roles. El rol actúa como una abstracción administrativa entre identidades y permisos.",{},{"id":261,"data":262,"type":218,"tunes":264},"p-rbac-2",{"text":263},"El trabajo clásico de NIST sobre RBAC formaliza esto en torno a usuarios, roles, permisos, operaciones y objetos. El beneficio práctico es que una organización puede gestionar la autorización mediante roles relativamente estables de puesto o responsabilidad en lugar de adjuntar cada permiso directamente a cada usuario.",{},{"id":266,"data":267,"type":218,"tunes":269},"p-rbac-3",{"text":268},"Un rol como EDITOR puede por lo tanto significar: puede leer contenido, escribir contenido y publicar contenido. Un rol como CONTADOR puede significar: puede leer datos de facturación, conciliar facturas y aprobar liquidaciones.",{},{"id":271,"data":272,"type":42,"tunes":274},"h-tenant",{"text":273,"level":247},"Qué controla realmente el aislamiento de inquilinos",{},{"id":276,"data":277,"type":218,"tunes":279},"p-tenant-1",{"text":278},"El aislamiento de inquilinos es el conjunto de mecanismos que impide que un inquilino lea, modifique, influya o reciba accidentalmente los recursos de otro inquilino en un sistema compartido.",{},{"id":281,"data":282,"type":218,"tunes":284},"p-tenant-2",{"text":283},"El límite protegido es más amplio que las filas de una base de datos. El estado específico de un inquilino puede existir en tablas relacionales, almacenamiento de objetos, índices vectoriales, cachés, índices de búsqueda, mensajes de cola, archivos, artefactos temporales, trabajos en segundo plano, analíticas, límites de velocidad y recursos de infraestructura.",{},{"id":286,"data":287,"type":218,"tunes":289},"p-tenant-3",{"text":288},"La guía de AWS para SaaS hace explícita la distinción: la autorización otorga acceso a recursos, mientras que el aislamiento de inquilinos garantiza que esos recursos no crucen el límite de inquilino incorrecto incluso cuando la infraestructura es compartida.",{},{"id":291,"data":292,"type":42,"tunes":294},"h-simple",{"text":293,"level":247},"El ejemplo más simple",{},{"id":296,"data":297,"type":218,"tunes":299},"p-simple-1",{"text":298},"Supongamos que Alice es administradora del Inquilino A y Bob es administrador del Inquilino B. Ambos usuarios tienen legítimamente el mismo rol ADMIN.",{},{"id":301,"data":302,"type":218,"tunes":304},"p-simple-2",{"text":303},"RBAC puede concluir correctamente que ambos usuarios pueden ejecutar una operación como users.read. Pero cuando Alice solicita el ID de usuario 847, la aplicación aún debe verificar que el usuario 847 pertenece al Inquilino A.",{},{"id":306,"data":307,"type":218,"tunes":309},"p-simple-3",{"text":308},"Si la API solo verifica “Alice tiene ADMIN” y luego ejecuta SELECT * FROM users WHERE id = 847, RBAC tuvo éxito mientras que el aislamiento de inquilinos falló.",{},{"id":311,"data":312,"type":334,"tunes":335},"simple-flow",{"steps":313,"title":332,"orientation":333},[314,317,320,323,326,329],{"label":315,"description":316},"1. Autenticar al principal","Establecer quién es el usuario, servicio o agente.",{"label":318,"description":319},"2. Resolver el contexto de inquilino verificado","Determinar qué contexto de inquilino aplica a partir de información confiable de identidad\u002Fpertenencia del lado del servidor.",{"label":321,"description":322},"3. Resolver el permiso","Evaluar si el rol o la política del principal permite la operación solicitada.",{"label":324,"description":325},"4. Acotar el recurso objetivo","Verificar que el objeto objetivo pertenece al inquilino permitido o a un ámbito explícitamente compartido.",{"label":327,"description":328},"5. Aplicar en el límite de acceso","Realizar la operación de base de datos, caché, almacenamiento, cola o servicio con las restricciones de inquilino aplicadas.",{"label":330,"description":331},"6. Auditar ambas dimensiones","Registrar principal, inquilino, operación, objetivo y resultado para que los intentos entre inquilinos sean visibles.","Una decisión correcta de autorización multiinquilino","auto","processFlow",{},{"id":337,"data":338,"type":42,"tunes":340},"h-stops",{"text":339,"level":247},"Dónde se detiene el ejemplo simple",{},{"id":342,"data":343,"type":218,"tunes":345},"p-stops-1",{"text":344},"Los sistemas reales a menudo contienen varias clases de identidad: usuarios de inquilinos, administradores de plataforma, trabajadores en segundo plano, integraciones, agentes y servicios operativos entre inquilinos. Algunos de estos cruzan legítimamente los límites de los inquilinos.",{},{"id":347,"data":348,"type":218,"tunes":350},"p-stops-2",{"text":349},"Eso no elimina la necesidad de aislamiento. Significa que la autoridad entre inquilinos debe ser explícita, estrecha y auditable por separado en lugar de surgir accidentalmente de un rol global o una conexión de base de datos sin alcance.",{},{"id":352,"data":353,"type":218,"tunes":355},"p-stops-3",{"text":354},"El aislamiento de inquilinos también puede variar según la capa. Un producto puede compartir servidores de aplicaciones mientras separa las bases de datos, o usar una base de datos compartida con políticas a nivel de fila mientras otorga a los inquilinos premium almacenamiento o cómputo aislado. No existe una única topología de aislamiento universal.",{},{"id":357,"data":358,"type":42,"tunes":360},"h-compare",{"text":359,"level":247},"RBAC vs aislamiento de inquilinos",{},{"id":362,"data":363,"type":399,"tunes":400},"core-comparison",{"rows":364,"title":390,"layout":391,"columns":392},[365,370,374,378,382,386],{"id":366,"label":367,"values":368},"question","Pregunta principal",[369,369],"",{"id":371,"label":372,"values":373},"unit","Unidad típica",[369,369],{"id":375,"label":376,"values":377},"example","Ejemplo",[369,369],{"id":379,"label":380,"values":381},"failure","Fallo típico",[369,369],{"id":383,"label":384,"values":385},"implementation","Implementación típica",[369,369],{"id":387,"label":388,"values":389},"scope","¿Puede existir solo?",[369,369],"Dos dimensiones de seguridad diferentes","table",[393,396],{"id":394,"label":395},"rbac","RBAC",{"id":397,"label":398},"tenant","Aislamiento de inquilinos","comparison",{},{"id":402,"data":403,"type":42,"tunes":405},"h-authn",{"text":404,"level":247},"Autenticación, autorización y aislamiento son tres verificaciones diferentes",{},{"id":407,"data":408,"type":391,"tunes":425},"three-checks",{"content":409,"stretched":43,"withHeadings":14},[410,414,418,422],[411,412,413],"Capa","Pregunta","Fallo de ejemplo",[415,416,417],"Autenticación","¿Quién es este principal?","El atacante se hace pasar por Alice",[419,420,421],"Autorización \u002F RBAC","¿Puede este principal realizar esta operación?","El visor puede eliminar usuarios",[398,423,424],"¿Puede esta operación alcanzar este límite de inquilino\u002Frecurso?","El administrador del inquilino A lee el pedido del inquilino B",{},{"id":427,"data":428,"type":218,"tunes":430},"p-authn-1",{"text":429},"Estas verificaciones están relacionadas pero no son sustituibles. La autenticación puede ser perfecta mientras la autorización falla. La autorización puede ser correcta mientras el aislamiento de inquilinos falla. Una ruta de solicitud SaaS segura necesita todos los límites aplicables.",{},{"id":432,"data":433,"type":42,"tunes":435},"h-role-scope",{"text":434,"level":247},"Los roles necesitan un alcance",{},{"id":437,"data":438,"type":218,"tunes":440},"p-role-scope-1",{"text":439},"La palabra ADMIN está incompleta sin alcance. Puede significar administrador de plataforma, administrador de inquilino, administrador de proyecto, administrador de espacio de trabajo o administrador de un subsistema.",{},{"id":442,"data":443,"type":218,"tunes":445},"p-role-scope-2",{"text":444},"En sistemas multiinquilino, la asignación de roles normalmente debe asociarse con la membresía del inquilino u otro alcance de recurso explícito. El mismo usuario puede ser legítimamente ADMIN en el inquilino A y VIEWER en el inquilino B.",{},{"id":447,"data":448,"type":218,"tunes":450},"p-role-scope-3",{"text":449},"Un modelo de rol global que ignora esta distinción puede crear fugas de privilegios incluso cuando el mapa de permisos en sí es correcto.",{},{"id":452,"data":453,"type":42,"tunes":455},"h-context",{"text":454,"level":247},"El contexto del inquilino debe provenir de una ruta confiable",{},{"id":457,"data":458,"type":218,"tunes":460},"p-context-1",{"text":459},"Un ID de inquilino proporcionado por el cliente es útil como selector, pero no es prueba de autoridad. El servidor debe derivar o verificar la membresía del inquilino contra la identidad autenticada y los datos de autorización actuales.",{},{"id":462,"data":463,"type":218,"tunes":465},"p-context-2",{"text":464},"La guía multiinquilino actual de OWASP recomienda establecer el contexto del inquilino temprano en el ciclo de vida de la solicitud y advierte explícitamente contra tratar los encabezados del cliente o los parámetros de solicitud como prueba de autorización.",{},{"id":467,"data":468,"type":218,"tunes":470},"p-context-3",{"text":469},"Esto importa porque una modificación trivial de la solicitud de inquilino=A a inquilino=B no debe ser suficiente para cruzar el límite de aislamiento.",{},{"id":472,"data":473,"type":42,"tunes":475},"h-query",{"text":474,"level":247},"El alcance del inquilino pertenece a la búsqueda de recursos",{},{"id":477,"data":478,"type":218,"tunes":480},"p-query-1",{"text":479},"Un patrón común de aislamiento a nivel de aplicación es incluir el alcance del inquilino en la misma consulta que resuelve el recurso.",{},{"id":482,"data":483,"type":391,"tunes":497},"query-table",{"content":484,"stretched":43,"withHeadings":14},[485,488,491,494],[486,487],"Búsqueda débil","Búsqueda con alcance de inquilino más fuerte",[489,490],"findFirst({ where: { id } })","findFirst({ where: { id, tenantId } })",[492,493],"UPDATE orders SET ... WHERE id = ?","UPDATE orders SET ... WHERE id = ? AND tenant_id = ?",[495,496],"cache.get('user:' + id)","cache.get('tenant:' + tenantId + ':user:' + id)",{},{"id":499,"data":500,"type":218,"tunes":502},"p-query-2",{"text":501},"Este patrón no es el único mecanismo de aislamiento posible, pero mantiene la propiedad del inquilino cerca de la operación de acceso a datos y evita que un ID de objeto se convierta en una capacidad entre inquilinos.",{},{"id":504,"data":505,"type":42,"tunes":507},"h-defense",{"text":506,"level":247},"Las comprobaciones en la aplicación son útiles, pero el aislamiento no debería depender de un comportamiento perfecto del desarrollador",{},{"id":509,"data":510,"type":218,"tunes":512},"p-defense-1",{"text":511},"La guía de aislamiento de AWS advierte explícitamente contra dejar la aplicación del aislamiento solo en manos de los desarrolladores de servicios. En una base de código grande, eventualmente una consulta, clave de caché o ruta de trabajo puede omitir el alcance del inquilino.",{},{"id":514,"data":515,"type":218,"tunes":517},"p-defense-2",{"text":516},"La defensa en profundidad puede, por lo tanto, trasladar el aislamiento a middleware compartido, capas de repositorio\u002Fservicio, motores de políticas, seguridad a nivel de fila de la base de datos, credenciales dedicadas, esquemas separados o bases de datos separadas según el riesgo y la arquitectura.",{},{"id":519,"data":520,"type":226,"tunes":524},"defense-rule",{"body":521,"title":522,"variant":523},"El límite más fuerte es aquel que el código de aplicación ordinario no puede eludir casualmente al omitir una condición \u003Ccode>tenantId\u003C\u002Fcode>.","El aislamiento debería ser difícil de olvidar","success",{},{"id":526,"data":527,"type":42,"tunes":529},"h-db",{"text":528,"level":247},"Estrategias de aislamiento de bases de datos",{},{"id":531,"data":532,"type":391,"tunes":562},"db-table",{"content":533,"stretched":43,"withHeadings":14},[534,538,542,546,550,554,558],[535,536,537],"Estrategia","Límite","Fortaleza \u002F compensación",[539,540,541],"Tablas compartidas + clave de inquilino","Política de fila\u002Faplicación","Eficiente operativamente; requiere alcance de inquilino exhaustivo y pruebas sólidas",[543,544,545],"Tablas compartidas + RLS de base de datos","Límite de política de base de datos","Reduce la dependencia de cada consulta de la aplicación; requiere roles correctos, contexto de inquilino de sesión\u002Ftransacción y cobertura de políticas",[547,548,549],"Esquemas separados","Límite de espacio de nombres \u002F rol de BD","Separación lógica más fuerte; mayor complejidad operativa",[551,552,553],"Bases de datos separadas","Límite de base de datos \u002F credenciales","Aislamiento fuerte y una historia de radio de impacto más simple; mayor costo de aprovisionamiento y operaciones",[555,556,557],"Infraestructura\u002Fcuenta separada","Límite de infraestructura","Separación de grano grueso más fuerte; mayor costo y sobrecarga operativa",[559,560,561],"Híbrido","Por carga de trabajo\u002Fclase de datos","Permite un aislamiento más fuerte solo donde el riesgo\u002Fcumplimiento lo justifica",{},{"id":564,"data":565,"type":218,"tunes":567},"p-db-1",{"text":566},"La hoja de referencia actual de seguridad multiinquilino de OWASP enumera bases de datos separadas, esquemas separados, tablas compartidas con controles a nivel de fila y modelos híbridos. El modelo correcto depende del nivel de amenaza, el cumplimiento, el rendimiento y el costo operativo.",{},{"id":569,"data":570,"type":42,"tunes":572},"h-rls",{"text":571,"level":247},"La seguridad a nivel de fila de PostgreSQL puede proporcionar defensa en profundidad",{},{"id":574,"data":575,"type":218,"tunes":577},"p-rls-1",{"text":576},"Con tablas compartidas, la seguridad a nivel de fila de PostgreSQL puede aplicar un predicado de inquilino en la capa de base de datos para que las consultas ordinarias no puedan ver filas fuera de la política de inquilino activa.",{},{"id":579,"data":580,"type":218,"tunes":582},"p-rls-2",{"text":581},"Sin embargo, RLS no es mágico. Los superusuarios de PostgreSQL y los roles con BYPASSRLS pueden eludir las políticas de fila. Por lo tanto, OWASP recomienda usar un rol de ruta de solicitud con privilegios mínimos y probar el mismo modo de conexión\u002Fagrupación utilizado en producción.",{},{"id":584,"data":585,"type":218,"tunes":587},"p-rls-3",{"text":586},"La reutilización de conexiones es otro borde importante: el contexto del inquilino debe establecerse y restablecerse de forma segura para cada transacción\u002Fsolicitud para que una conexión agrupada no pueda filtrar el estado previo del inquilino.",{},{"id":589,"data":590,"type":42,"tunes":592},"h-cache",{"text":591,"level":247},"El aislamiento de inquilinos debe incluir cachés",{},{"id":594,"data":595,"type":218,"tunes":597},"p-cache-1",{"text":596},"Una consulta de base de datos puede tener un alcance perfecto y aún así filtrar datos a través de una clave de caché compartida.",{},{"id":599,"data":600,"type":218,"tunes":602},"p-cache-2",{"text":601},"Si user:42 existe tanto en el Inquilino A como en el Inquilino B, una clave de caché global puede devolver el valor del inquilino incorrecto. Las claves de caché sensibles al inquilino deben incluir cada atributo que cambie la visibilidad o la semántica del resultado, comúnmente inquilino, usuario, configuración regional, conjunto de características o versión de permisos.",{},{"id":604,"data":605,"type":218,"tunes":607},"p-cache-3",{"text":606},"La partición de caché es defensa en profundidad, no un reemplazo de la autorización. La solicitud aún debe autorizarse antes de que se devuelva el contenido protegido en caché.",{},{"id":609,"data":610,"type":42,"tunes":612},"h-storage",{"text":611,"level":247},"Los archivos y el almacenamiento de objetos necesitan su propia frontera de inquilino",{},{"id":614,"data":615,"type":218,"tunes":617},"p-storage-1",{"text":616},"El almacenamiento de objetos debe distinguir entre objetos globales, con alcance de inquilino y con alcance de usuario. Un prefijo de carpeta por sí solo es únicamente una convención de nombres, a menos que la política de acceso realmente restrinja las lecturas y escrituras.",{},{"id":619,"data":620,"type":218,"tunes":622},"p-storage-2",{"text":621},"Los diseños más sólidos pueden usar claves de objeto con reconocimiento de inquilino, políticas de bucket, buckets\u002Fcuentas separados o claves de cifrado específicas del inquilino cuando el riesgo o el cumplimiento exijan un aislamiento más fuerte.",{},{"id":624,"data":625,"type":218,"tunes":627},"p-storage-3",{"text":626},"Las URL firmadas deben autorizarse antes de su emisión y limitarse al objeto y la operación exactos. La posesión de un identificador de objeto no debería por sí misma otorgar acceso entre inquilinos.",{},{"id":629,"data":630,"type":42,"tunes":632},"h-queues",{"text":631,"level":247},"Los trabajos en segundo plano y las colas pueden romper el aislamiento",{},{"id":634,"data":635,"type":218,"tunes":637},"p-queue-1",{"text":636},"Los trabajos asíncronos a menudo abandonan el contexto de la solicitud HTTP original, lo que hace fácil manejar mal la propagación del inquilino. Un mensaje de cola que contiene tenantId no es prueba suficiente de que el productor estuviera autorizado.",{},{"id":639,"data":640,"type":218,"tunes":642},"p-queue-2",{"text":641},"El worker debe llevar una identidad de servicio\u002Fusuario verificada o un sobre de trabajo confiable, restablecer el contexto del inquilino y volver a autorizar las operaciones consecuentes en la frontera del consumidor.",{},{"id":644,"data":645,"type":218,"tunes":647},"p-queue-3",{"text":646},"El aislamiento de inquilinos también incluye la disponibilidad. Un inquilino no debería poder monopolizar workers, colas, pools de conexiones o cómputo compartidos de manera que degrade materialmente a otros inquilinos.",{},{"id":649,"data":650,"type":42,"tunes":652},"h-search",{"text":651,"level":247},"La búsqueda y RAG necesitan recuperación con reconocimiento de inquilino",{},{"id":654,"data":655,"type":218,"tunes":657},"p-search-1",{"text":656},"La IA multiinquilino introduce otra copia del problema de aislamiento. Los documentos pueden dividirse en fragmentos, incrustarse y almacenarse en un índice vectorial después de la ingesta.",{},{"id":659,"data":660,"type":218,"tunes":662},"p-search-2",{"text":661},"La guía actual de seguridad de RAG de OWASP establece que el control de acceso debe aplicarse en el momento de la recuperación y que los fragmentos del Inquilino A no deben ser recuperados por consultas del Inquilino B. No se puede simplemente asumir que los permisos a nivel de documento sobreviven automáticamente a la fragmentación.",{},{"id":664,"data":665,"type":218,"tunes":667},"p-search-3",{"text":666},"Por lo tanto, el índice vectorial necesita metadatos de inquilino\u002Facceso o colecciones física o lógicamente separadas según el diseño de aislamiento. Los filtros de recuperación deben aplicarse antes de que contenido no autorizado pueda entrar en el contexto del modelo.",{},{"id":669,"data":670,"type":226,"tunes":673},"rag-rule",{"body":671,"title":672,"variant":233},"No recupere fragmentos entre inquilinos y luego indique al modelo de lenguaje que los ignore. Una vez que los datos protegidos entran en el contexto del modelo, la frontera de aislamiento ya ha fallado.","El modelo nunca debe ser el filtro de inquilino",{},{"id":675,"data":676,"type":42,"tunes":678},"h-derived",{"text":677,"level":247},"Los datos derivados heredan la sensibilidad del inquilino",{},{"id":680,"data":681,"type":218,"tunes":683},"p-derived-1",{"text":682},"Las incrustaciones, los índices de búsqueda, las miniaturas, los resúmenes generados, las cachés, las filas de analítica y las respuestas de IA se derivan de los datos de origen. Su alcance de inquilino debe seguir a la fuente, a menos que una transformación explícita cree un artefacto compartido\u002Fglobal legítimo.",{},{"id":685,"data":686,"type":218,"tunes":688},"p-derived-2",{"text":687},"Por lo tanto, la eliminación y la baja deben propagarse más allá de la fila canónica. Eliminar un documento de inquilino mientras se dejan fragmentos buscables o resúmenes en caché puede mantener la exposición entre inquilinos o posterior a la retención.",{},{"id":690,"data":691,"type":42,"tunes":693},"h-shared",{"text":692,"level":247},"No todo pertenece a un inquilino",{},{"id":695,"data":696,"type":218,"tunes":698},"p-shared-1",{"text":697},"Las plataformas multiinquilino a menudo tienen recursos intencionalmente globales: taxonomías de productos, plantillas públicas, permisos del sistema, definiciones de características o contenido público.",{},{"id":700,"data":701,"type":218,"tunes":703},"p-shared-2",{"text":702},"El modelo más seguro es la clasificación explícita: global, con alcance de inquilino, con alcance de usuario o explícitamente entre inquilinos. Los recursos ambiguos son donde comienza la fuga accidental.",{},{"id":705,"data":706,"type":218,"tunes":708},"p-shared-3",{"text":707},"Un objeto compartido intencionalmente debe tener una razón documentada para ser global en lugar de simplemente carecer de una asociación de inquilino.",{},{"id":710,"data":711,"type":42,"tunes":713},"h-platform-admin",{"text":712,"level":247},"Los administradores de plataforma requieren un modelo de autoridad diferente",{},{"id":715,"data":716,"type":218,"tunes":718},"p-platform-1",{"text":717},"Un operador de plataforma puede necesitar inspeccionar múltiples inquilinos para soporte, cumplimiento u operaciones de infraestructura. Modelar esto como un ADMIN de inquilino ordinario con acceso global accidental a la base de datos debilita tanto la seguridad como la auditabilidad.",{},{"id":720,"data":721,"type":218,"tunes":723},"p-platform-2",{"text":722},"Un mejor diseño utiliza una identidad de plataforma distinta o un permiso explícito entre inquilinos, autenticación más fuerte, limitación de propósito, auditoría detallada y, cuando corresponda, controles de aprobación o de acceso de emergencia.",{},{"id":725,"data":726,"type":218,"tunes":728},"p-platform-3",{"text":727},"Por lo tanto, el acceso entre inquilinos debe ser una capacidad nombrada, no la ausencia de un filtro de inquilino.",{},{"id":730,"data":731,"type":42,"tunes":733},"h-abac",{"text":732,"level":247},"RBAC se puede combinar con atributos",{},{"id":735,"data":736,"type":218,"tunes":738},"p-abac-1",{"text":737},"Algunas decisiones dependen de más que el rol. La pertenencia al inquilino, la región, el propietario del recurso, el nivel de suscripción, el tiempo, la pertenencia al proyecto o la clasificación de datos pueden afectar el acceso.",{},{"id":740,"data":741,"type":218,"tunes":743},"p-abac-2",{"text":742},"RBAC y ABAC no son mutuamente excluyentes. La guía actual de autorización multiinquilino de AWS analiza modelos RBAC, ABAC e híbridos. Un rol puede definir una responsabilidad amplia mientras que los atributos restringen qué instancia de recurso concreta se puede acceder.",{},{"id":745,"data":746,"type":218,"tunes":748},"p-abac-3",{"text":747},"La regla clave de arquitectura sigue siendo: no codifique el aislamiento de inquilinos solo como un nombre de rol incidental si la identidad del inquilino es un límite de recurso de primera clase.",{},{"id":750,"data":751,"type":42,"tunes":753},"h-matrix",{"text":752,"level":247},"Las decisiones de autorización son al menos bidimensionales",{},{"id":755,"data":756,"type":391,"tunes":785},"matrix-table",{"content":757,"stretched":43,"withHeadings":14},[758,763,768,771,774,775,780],[759,760,761,762],"Principal","Permiso de rol","Relación de inquilino","Decisión",[764,765,766,767],"Alice","orders.read","El pedido pertenece al inquilino de Alice","Permitir",[764,765,769,770],"El pedido pertenece a otro inquilino","Denegar",[764,772,766,773],"orders.write","Permitir si el rol incluye escritura",[764,772,769,770],[776,777,778,779],"Soporte de plataforma","support.cross_tenant.read","Alcance de soporte explícito + inquilino objetivo auditado","Potencialmente permitir bajo política de plataforma",[781,782,783,784],"Trabajador en segundo plano","orders.process","Alcance de servicio confiable para el inquilino del trabajo","Permitir solo para el inquilino del trabajo verificado",{},{"id":787,"data":788,"type":42,"tunes":790},"h-implementation",{"text":789,"level":247},"Evidencia de implementación original: Aaasaasa AI CMS",{},{"id":792,"data":793,"type":226,"tunes":796},"impl-note",{"body":794,"title":795,"variant":240},"Aaasaasa AI CMS contiene una implementación concreta de RBAC con alcance de inquilino. Es evidencia útil de cómo se pueden combinar la autorización de roles y el alcance de inquilino, pero no debe presentarse como prueba de que cada capa de almacenamiento, caché o infraestructura tenga un aislamiento de inquilino completo.","Evidencia de implementación original",{},{"id":798,"data":799,"type":218,"tunes":801},"p-impl-1",{"text":800},"El servicio RBAC define códigos de permiso tipados como cms.content.read, shop.orders.write, billing.reconcile y users.roles. Los roles del sistema asignan esos permisos a conjuntos de responsabilidad nombrados.",{},{"id":803,"data":804,"type":218,"tunes":806},"p-impl-2",{"text":805},"Los registros de roles se crean y resuelven con un tenantId. Los roles del sistema se insertan o actualizan utilizando una identidad compuesta de inquilino\u002Fcódigo, y el listado de roles se filtra por inquilino.",{},{"id":808,"data":809,"type":218,"tunes":811},"p-impl-3",{"text":810},"La actualización y eliminación de roles primero resuelven el rol utilizando tanto el ID del rol como el ID del inquilino. Las asignaciones de rol de usuario también se almacenan y reemplazan bajo el contexto del inquilino actual.",{},{"id":813,"data":814,"type":218,"tunes":816},"p-impl-4",{"text":815},"La resolución de permisos lee asignaciones explícitas de rol de usuario con alcance tanto de tenantId como de userId. Esto evita que la asignación de rol de un inquilino se convierta automáticamente en la asignación de rol de otro inquilino.",{},{"id":818,"data":819,"type":218,"tunes":821},"p-impl-5",{"text":820},"A nivel de API, las rutas administrativas de RBAC resuelven un contexto de inquilino antes de crear o modificar roles. Esta es la dirección correcta: la administración de permisos en sí misma debe respetar la multi-tenencia.",{},{"id":823,"data":824,"type":391,"tunes":847},"impl-table",{"content":825,"stretched":43,"withHeadings":14},[826,829,832,835,838,841,844],[827,828],"Patrón de implementación observado","Significado de seguridad",[830,831],"Códigos de permiso tipados","El vocabulario de operaciones RBAC es explícito",[833,834],"Mapas de rol de sistema → permisos","Los roles agregan permisos en lugar de codificar usuarios de forma rígida",[836,837],"Identidad de rol tenantId_code","El mismo rol lógico puede existir por separado por inquilino",[839,840],"La búsqueda de roles usa id + tenantId","La mutación de roles está limitada al inquilino",[842,843],"La relación usuario-rol almacena tenantId","La pertenencia no se infiere globalmente solo del rol",[845,846],"La resolución de permisos usa tenantId + userId","La autorización se evalúa dentro del contexto del inquilino",{},{"id":849,"data":850,"type":226,"tunes":853},"impl-boundary",{"body":851,"title":852,"variant":233},"El RBAC con alcance de inquilino es una capa. El aislamiento completo de inquilinos también debe cubrir todas las búsquedas de recursos propiedad del inquilino, bases de datos, cachés, archivos, índices de búsqueda\u002Fvectoriales, trabajos en segundo plano, integraciones y rutas operativas. La evidencia del repositorio aquí respalda el patrón de diseño de RBAC\u002Falcance de inquilino, no una afirmación de aislamiento SaaS auditado de forma independiente.","Lo que esta evidencia no prueba",{},{"id":855,"data":856,"type":42,"tunes":858},"h-ai",{"text":857,"level":247},"Por qué esta distinción importa aún más para los agentes de IA",{},{"id":860,"data":861,"type":218,"tunes":863},"p-ai-1",{"text":862},"Los agentes de IA pueden convertir un error de permisos en una secuencia de acciones. Si a un agente se le da una herramienta amplia orders.read sin aplicación con alcance de inquilino, una falla de razonamiento o de inyección de prompts puede causar lecturas entre inquilinos a velocidad de máquina.",{},{"id":865,"data":866,"type":218,"tunes":868},"p-ai-2",{"text":867},"Las descripciones de herramientas del agente pueden mencionar restricciones de inquilino, pero la aplicación aún debe ocurrir en la capa confiable de tiempo de ejecución\u002Fservicio\u002Fdatos. Las instrucciones en lenguaje natural no son una frontera de autorización.",{},{"id":870,"data":871,"type":218,"tunes":873},"p-ai-3",{"text":872},"Lo mismo se aplica a RAG: un agente puede tener permiso para usar la herramienta de búsqueda mientras el backend de búsqueda aún debe evitar que la consulta del Inquilino A devuelva fragmentos del Inquilino B.",{},{"id":875,"data":876,"type":42,"tunes":878},"h-tests",{"text":877,"level":247},"Probar RBAC y aislamiento de inquilinos por separado",{},{"id":880,"data":881,"type":391,"tunes":916},"tests-table",{"content":882,"stretched":43,"withHeadings":14},[883,886,889,892,895,898,901,904,907,910,913],[884,885],"Familia de pruebas","Qué debería probar",[887,888],"Prueba de degradación de rol","Un usuario sin un permiso no puede realizar la operación incluso dentro de su propio inquilino",[890,891],"Prueba de objeto entre inquilinos","Un usuario con el rol correcto aún no puede acceder al mismo tipo de recurso en otro inquilino",[893,894],"Manipulación de identificadores","Cambiar los ID de objeto\u002Finquilino no cruza el alcance",[896,897],"Prueba de endpoint de listado\u002Fmasivo","Las consultas amplias devuelven solo datos de inquilinos autorizados",[899,900],"Prueba de reutilización de caché","Dos inquilinos que usan procesos\u002Fconexiones reutilizados nunca reciben el estado en caché del otro",[902,903],"Prueba de rol de solicitud RLS","El rol de solicitud de producción no puede eludir las políticas de fila",[905,906],"Prueba de trabajador asíncrono","El contexto del inquilino sobrevive al encolado y se revalida al consumirse",[908,909],"Prueba de recuperación vectorial","La consulta del Inquilino A nunca recupera fragmentos del Inquilino B",[911,912],"Prueba de administrador de plataforma","La capacidad entre inquilinos es explícita, limitada y auditable",[914,915],"Prueba de baja de servicio","Los datos del inquilino y los índices\u002Fcachés derivados se eliminan según la política",{},{"id":918,"data":919,"type":218,"tunes":921},"p-tests-1",{"text":920},"La guía de regresión de autorización de OWASP señala específicamente las pruebas de frontera entre inquilinos porque los cambios de código en cachés, consultas o servicios compartidos pueden romper silenciosamente el aislamiento incluso cuando las pruebas de roles siguen pasando.",{},{"id":923,"data":924,"type":42,"tunes":926},"h-failures",{"text":925,"level":247},"Modos de falla comunes",{},{"id":928,"data":929,"type":391,"tunes":973},"failures-table",{"content":930,"stretched":43,"withHeadings":14},[931,934,937,940,943,946,949,952,955,958,961,964,967,970],[932,933],"Modo de falla","Por qué falla",[935,936],"Verificar el rol pero no el inquilino","Un rol válido se convierte en autoridad entre inquilinos",[938,939],"Confiar en el ID de inquilino de la solicitud","El cliente controla el selector de aislamiento",[941,942],"Delimitar la UI pero no la API","Los botones ocultos no protegen los recursos del backend",[944,945],"Endpoint de detalle con reconocimiento de inquilino, endpoint de listado sin alcance","Las lecturas masivas filtran otros inquilinos",[947,948],"Filtro de inquilino en la mayoría de las consultas","Una ruta olvidada rompe la frontera",[950,951],"Claves de caché globales","El aislamiento correcto de la base de datos se elude mediante datos en caché",[953,954],"Índice vectorial compartido sin filtros de metadatos aplicados","RAG recupera fragmentos de otro inquilino",[956,957],"ID de inquilino del mensaje de cola tratado como autorización","Un trabajo falsificado o producido incorrectamente puede cruzar la frontera de inquilino",[959,960],"Administrador de plataforma modelado como ADMIN ordinario","El poder entre inquilinos se vuelve implícito y difícil de auditar",[962,963],"Rol copiado globalmente entre pertenencias de inquilinos","El usuario recibe permisos en inquilinos donde nunca fue asignado",[965,966],"Bases de datos separadas pero credencial privilegiada compartida","La aplicación aún puede cruzar bases de datos si su credencial es demasiado amplia",[968,969],"RLS con rol de solicitud BYPASSRLS","La política de base de datos existe pero no protege la ruta de solicitud real",[971,972],"UUID aleatorios tratados como aislamiento","Los identificadores difíciles de adivinar reducen la enumeración pero no autorizan el acceso",{},{"id":975,"data":976,"type":42,"tunes":978},"h-misconceptions",{"text":977,"level":247},"Conceptos erróneos comunes",{},{"id":980,"data":981,"type":391,"tunes":1016},"misconceptions-table",{"content":982,"stretched":43,"withHeadings":14},[983,986,989,992,995,998,1001,1004,1007,1010,1013],[984,985],"Concepto erróneo","Corrección",[987,988],"“RBAC proporciona aislamiento de inquilinos.”","RBAC controla permisos; el aislamiento también requiere alcance de inquilino\u002Frecurso.",[990,991],"“Si el usuario es administrador, las verificaciones de inquilino son innecesarias.”","La autoridad de administrador aún debe tener un alcance explícito.",[993,994],"“El ID de inquilino en el JWT es suficiente.”","Puede ser una entrada confiable solo si se valida y se aplica de manera consistente a cada ruta de recurso protegida.",[996,997],"“Bases de datos separadas eliminan los requisitos de autorización.”","Los usuarios aún necesitan permisos a nivel de operación dentro de su inquilino.",[999,1000],"“Una columna tenant_id significa que el sistema está aislado.”","El campo solo ayuda si las rutas de acceso lo aplican.",[1002,1003],"“Los UUID previenen el acceso entre inquilinos.”","Los identificadores impredecibles son defensa en profundidad, no autorización.",[1005,1006],"“RLS significa que el código de la aplicación no necesita verificaciones de seguridad.”","La autorización de la aplicación, los roles de base de datos correctos y la cobertura de políticas aún importan.",[1008,1009],"“Una base de datos vectorial compartida es insegura.”","Puede ser segura si el aislamiento es aplicable y verificado; la separación física es una opción, no la única.",[1011,1012],"“El soporte de plataforma necesita ADMIN global.”","El soporte entre inquilinos debe ser una autoridad distinta, restringida y auditable.",[1014,1015],"“Los servicios internos pueden omitir las verificaciones de inquilino.”","Las rutas internas aún pueden verse comprometidas o mal configuradas y deben preservar el contexto del inquilino.",{},{"id":1018,"data":1019,"type":42,"tunes":1021},"h-design",{"text":1020,"level":247},"Una secuencia de diseño práctica",{},{"id":1023,"data":1024,"type":334,"tunes":1063},"design-flow",{"steps":1025,"title":1062,"orientation":333},[1026,1029,1032,1035,1038,1041,1044,1047,1050,1053,1056,1059],{"label":1027,"description":1028},"1. Definir la propiedad del inquilino","Clasificar qué entidades y recursos son globales, con alcance de inquilino, con alcance de usuario o intencionalmente entre inquilinos.",{"label":1030,"description":1031},"2. Definir operaciones","Crear permisos explícitos para lecturas, escrituras, publicación, aprobaciones, administración y otras acciones comerciales.",{"label":1033,"description":1034},"3. Definir roles","Agrupar permisos según responsabilidades sin incorporar un alcance global accidental.",{"label":1036,"description":1037},"4. Definir el alcance de pertenencia","Vincular las asignaciones de roles al contexto de inquilino\u002Fespacio de trabajo\u002Fproyecto en el que se aplican.",{"label":1039,"description":1040},"5. Resolver el contexto de inquilino confiable","Derivar la identidad del inquilino a partir de la pertenencia autenticada y verificada por el servidor o la autorización del servicio.",{"label":1042,"description":1043},"6. Aplicar la propiedad de los recursos","Aplicar el alcance de inquilino en cada frontera de datos\u002Fservicio propiedad del inquilino.",{"label":1045,"description":1046},"7. Agregar defensa en profundidad","Usar RLS, credenciales separadas, esquemas\u002Fbases de datos, políticas de almacenamiento o motores de políticas donde el riesgo lo justifique.",{"label":1048,"description":1049},"8. Llevar el alcance a través de sistemas derivados","Preservar los metadatos del inquilino en caché, búsqueda, índices vectoriales, colas, archivos y analítica.",{"label":1051,"description":1052},"9. Modelar explícitamente las operaciones entre inquilinos","Separar la administración de la plataforma y las identidades de servicio de los roles ordinarios de inquilino.",{"label":1054,"description":1055},"10. Probar ambos ejes","Ejecutar pruebas negativas para permiso faltante y para inquilino incorrecto de forma independiente.",{"label":1057,"description":1058},"11. Auditar inquilino + permiso juntos","Registrar quién actuó, en qué inquilino, sobre qué objetivo y bajo qué autoridad.",{"label":1060,"description":1061},"12. Volver a probar después de cambios de esquema\u002Ftiempo de ejecución","El aislamiento puede romperse cuando se introducen nuevas tablas, cachés, colas o rutas de recuperación.","Diseñar permisos y aislamiento como dimensiones separadas",{},{"id":1065,"data":1066,"type":42,"tunes":1068},"h-checklist",{"text":1067,"level":247},"Lista de verificación de RBAC + aislamiento de inquilinos",{},{"id":1070,"data":1071,"type":391,"tunes":1117},"checklist-table",{"content":1072,"stretched":43,"withHeadings":14},[1073,1075,1078,1081,1084,1087,1090,1093,1096,1099,1102,1105,1108,1111,1114],[412,1074],"Respuesta esperada",[1076,1077],"¿Quién es el principal?","Identidad de usuario\u002Fservicio\u002Fagente autenticada",[1079,1080],"¿Qué contexto de inquilino aplica?","Pertenencia verificada por el servidor o alcance del servicio",[1082,1083],"¿Qué operación se solicita?","Permiso tipado o acción de política",[1085,1086],"¿El principal tiene ese permiso?","Decisión de rol\u002Fpolítica",[1088,1089],"¿Quién es propietario del recurso objetivo?","Clasificación explícita de inquilino\u002Fglobal\u002Fusuario",[1091,1092],"¿El alcance del recurso coincide con la autoridad?","Búsqueda\u002Fpolítica con reconocimiento de inquilino",[1094,1095],"¿El almacenamiento puede eludir las verificaciones de la aplicación?","Decisión de defensa en profundidad documentada",[1097,1098],"¿Las cachés son seguras para inquilinos?","Las claves\u002Fespacios de nombres y la autorización preservan el alcance del inquilino",[1100,1101],"¿Los archivos\u002Fblobs son seguros para inquilinos?","La política de objetos y la emisión de URL firmadas aplican el alcance",[1103,1104],"¿Los trabajos asíncronos son seguros para inquilinos?","El contexto verificado se propaga y se revalida",[1106,1107],"¿RAG\u002Fbúsqueda es seguro para inquilinos?","Aislamiento de metadatos\u002Fcolecciones aplicado antes del contexto del modelo",[1109,1110],"¿Los administradores entre inquilinos son explícitos?","Autoridad, controles y auditoría separados",[1112,1113],"¿Las credenciales ordinarias pueden eludir el aislamiento?","No, o una ruta excepcional estrictamente documentada",[1115,1116],"¿Las pruebas negativas entre inquilinos están automatizadas?","Sí para cada capa de acceso relevante",{},{"id":1119,"data":1120,"type":42,"tunes":1122},"h-edge",{"text":1121,"level":247},"Casos límite y limitaciones",{},{"id":1124,"data":1125,"type":218,"tunes":1127},"p-edge-1",{"text":1126},"Un usuario puede pertenecer a múltiples inquilinos. Por lo tanto, el inquilino actual debe ser un contexto de ejecución explícito, no inferido permanentemente de la cuenta de usuario.",{},{"id":1129,"data":1130,"type":218,"tunes":1132},"p-edge-2",{"text":1131},"Algunos recursos se comparten intencionalmente entre inquilinos seleccionados, como espacios de colaboración o datos de consorcio. Esto requiere un modelo de compartición explícito; pretender que el recurso pertenece a un inquilino y añadir excepciones después suele crear autorización ambigua.",{},{"id":1134,"data":1135,"type":218,"tunes":1137},"p-edge-3",{"text":1136},"El aislamiento de vecinos ruidosos está relacionado pero es diferente del aislamiento de confidencialidad. Un inquilino puede nunca ver los datos de otro inquilino y aun así agotar la CPU compartida, la capacidad de cola o las conexiones de base de datos. Por lo tanto, los límites de velocidad y las cuotas de recursos pueden ser conscientes del inquilino como un límite de disponibilidad.",{},{"id":1139,"data":1140,"type":218,"tunes":1142},"p-edge-4",{"text":1141},"El aislamiento físico no es automáticamente seguro si las credenciales del plano de control o las rutas administrativas pueden cruzar límites. El aislamiento lógico no es automáticamente débil si las políticas se aplican centralmente, con privilegios mínimos y se prueban exhaustivamente.",{},{"id":1144,"data":1145,"type":218,"tunes":1147},"p-edge-5",{"text":1146},"Los requisitos de aislamiento de inquilinos pueden diferir según la clase de datos. Los datos de catálogo público, los registros de facturación y los documentos privados de IA pueden justificar diferentes límites de almacenamiento y cifrado dentro del mismo producto SaaS.",{},{"id":1149,"data":1150,"type":42,"tunes":1152},"h-change",{"text":1151,"level":247},"¿Qué cambiaría esta respuesta?",{},{"id":1154,"data":1155,"type":218,"tunes":1157},"p-change-1",{"text":1156},"La implementación exacta cambia con la arquitectura: las API sin servidor, Kubernetes, PostgreSQL, el almacenamiento de objetos, las bases de datos vectoriales y los motores de políticas exponen diferentes primitivas de aislamiento.",{},{"id":1159,"data":1160,"type":218,"tunes":1162},"p-change-2",{"text":1161},"La fuerza requerida también cambia con la regulación, los contratos de clientes, la sensibilidad de los datos, el modelo de amenaza y la escala operativa. Algunos inquilinos pueden justificar bases de datos o infraestructura en silos, mientras que otros comparten recursos agrupados.",{},{"id":1164,"data":1165,"type":218,"tunes":1167},"p-change-3",{"text":1166},"La distinción conceptual no cambia: el permiso para realizar una operación no es lo mismo que el permiso para cruzar un límite de inquilino.",{},{"id":1169,"data":1170,"type":42,"tunes":1172},"h-related",{"text":1171,"level":247},"Conocimiento canónico relacionado",{},{"id":1174,"data":1175,"type":218,"tunes":1177},"p-related-1",{"text":1176},"S01 es un requisito previo de límite de seguridad para la Arquitectura de IA Empresarial y la Gobernanza de IA. Una vez que las herramientas de IA, RAG o los agentes operan sobre datos multiinquilino, la identidad del inquilino debe viajar a través de la recuperación, la ejecución de herramientas, la memoria, las cachés y los rastros de auditoría.",{},{"id":1179,"data":1180,"type":218,"tunes":1182},"p-related-2",{"text":1181},"También se conecta directamente con la IA Agéntica: la capacidad de la herramienta y el permiso de rol aún deben estar restringidos por la propiedad del inquilino antes de que un agente pueda leer o modificar recursos empresariales.",{},{"id":1184,"data":1185,"type":1190,"tunes":1191},"ref-agentic",{"url":1186,"title":1187,"excerpt":1188,"ctaLabel":1189},"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: La pila de protocolos de agentes explicada","La interoperabilidad de protocolos no reemplaza la autorización ni el aislamiento de inquilinos. El descubrimiento de capacidades y la autoridad empresarial siguen siendo preocupaciones arquitectónicas separadas.","Leer el artículo sobre la pila de protocolos","referralArticle",{},{"id":1193,"data":1194,"type":218,"tunes":1196},"p-related-3",{"text":1195},"Para RAG, el aislamiento de inquilinos debe aplicarse antes de que los fragmentos protegidos lleguen al contexto del modelo.",{},{"id":1198,"data":1199,"type":1190,"tunes":1204},"ref-rag",{"url":1200,"title":1201,"excerpt":1202,"ctaLabel":1203},"https:\u002F\u002Fstajic.de\u002Fes\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works","¿Qué es RAG? La explicación más simple de cómo funciona","La base de recuperación para entender dónde deben aplicarse el filtrado de fuentes consciente del inquilino y el aislamiento del almacén vectorial.","Leer los fundamentos de RAG",{},{"id":1206,"data":1207,"type":42,"tunes":1209},"h-faq",{"text":1208,"level":247},"Preguntas frecuentes",{},{"id":1211,"data":1212,"type":1211,"tunes":1251},"faq",{"items":1213,"title":1250},[1214,1218,1222,1226,1230,1234,1238,1242,1246],{"id":1215,"answer":1216,"question":1217},"faq1","RBAC determina qué operaciones puede realizar un principal. El aislamiento de inquilinos determina a qué recursos de qué inquilino pueden acceder esas operaciones. Las aplicaciones multiinquilino seguras normalmente necesitan ambos.","¿Cuál es la diferencia entre RBAC y el aislamiento de inquilinos?",{"id":1219,"answer":1220,"question":1221},"faq2","No. ADMIN debe tener un alcance explícito. Un administrador de inquilino normalmente tiene permisos amplios solo dentro de ese inquilino, mientras que la administración de plataforma entre inquilinos debe modelarse por separado.","¿Un rol ADMIN permite automáticamente el acceso a todos los inquilinos?",{"id":1223,"answer":1224,"question":1225},"faq3","No. La autenticación prueba la identidad. La autorización controla las acciones permitidas. El aislamiento de inquilinos además evita que esas acciones lleguen a los recursos del inquilino equivocado.","¿Es suficiente la autenticación para el aislamiento de inquilinos?",{"id":1227,"answer":1228,"question":1229},"faq4","Puede ser una entrada al contexto del inquilino, pero el servidor debe verificar la membresía\u002Fautoridad actual y aplicar el alcance en los límites de recursos protegidos. Una afirmación por sí sola no reemplaza los controles de aislamiento.","¿Debería almacenarse tenantId en el JWT?",{"id":1231,"answer":1232,"question":1233},"faq5","No necesariamente. Los modelos de tabla compartida, RLS, esquema, base de datos, infraestructura e aislamiento híbrido pueden ser válidos según los requisitos de riesgo y operativos.","¿Necesito una base de datos separada por inquilino?",{"id":1235,"answer":1236,"question":1237},"faq6","RLS puede proporcionar una fuerte defensa en profundidad, pero los roles de base de datos correctos, el contexto de la solicitud, la cobertura de políticas y la autorización a nivel de aplicación siguen siendo importantes.","¿Puede PostgreSQL RLS reemplazar los filtros de inquilino en el código de la aplicación?",{"id":1239,"answer":1240,"question":1241},"faq7","El alcance de inquilino\u002Facceso debe aplicarse durante la recuperación para que los fragmentos no autorizados nunca entren en el contexto del modelo. Preserve los metadatos de acceso a través del chunking y la indexación.","¿Cómo debería RAG aplicar el aislamiento de inquilinos?",{"id":1243,"answer":1244,"question":1245},"faq8","Sí. Esto es común en SaaS B2B y es una fuerte razón para delimitar las asignaciones de roles por membresía de inquilino en lugar de tratar los roles como adjuntos globalmente al usuario.","¿Puede un usuario tener diferentes roles en diferentes inquilinos?",{"id":1247,"answer":1248,"question":1249},"faq9","Use pruebas negativas entre inquilinos: cree al menos dos inquilinos, otorgue a un usuario permisos válidos en un inquilino, luego demuestre que cada ruta protegida deniega el acceso a los recursos del otro inquilino.","¿Cuál es la mejor prueba para el aislamiento de inquilinos?","Preguntas frecuentes sobre RBAC vs aislamiento de inquilinos",{},{"id":1253,"data":1254,"type":42,"tunes":1256},"h-glossary",{"text":1255,"level":247},"Glosario",{},{"id":1258,"data":1259,"type":1258,"tunes":1305},"glossary",{"title":1260,"entries":1261},"Términos clave de seguridad multiinquilino",[1262,1264,1267,1270,1273,1277,1281,1285,1289,1293,1297,1301],{"term":395,"anchor":394,"definition":1263},"Control de acceso basado en roles: un modelo de autorización que asocia permisos con roles y asigna usuarios o principales a esos roles.",{"term":1265,"anchor":397,"definition":1266},"Inquilino","Un cliente, organización, espacio de trabajo u otro consumidor lógico aislado de un sistema multiinquilino compartido.",{"term":398,"anchor":1268,"definition":1269},"tenant-isolation","Mecanismos que impiden que un inquilino acceda, modifique o reciba los recursos de otro inquilino en un sistema compartido.",{"term":415,"anchor":1271,"definition":1272},"authentication","Verificación de la identidad de un usuario, servicio u otro principal.",{"term":1274,"anchor":1275,"definition":1276},"Autorización","authorization","Proceso de decisión que determina si un principal puede realizar una operación solicitada sobre un recurso.",{"term":1278,"anchor":1279,"definition":1280},"Permiso","permission","Una operación o capacidad permitida definida, como orders.read o users.write.",{"term":1282,"anchor":1283,"definition":1284},"Rol","role","Una agrupación nombrada de permisos asociada con una responsabilidad o función.",{"term":1286,"anchor":1287,"definition":1288},"ABAC","abac","Control de acceso basado en atributos: autorización basada en atributos del principal, recurso, acción o entorno.",{"term":1290,"anchor":1291,"definition":1292},"Seguridad a nivel de fila","row-level-security","Mecanismo de política de base de datos que restringe qué filas puede leer o modificar un rol o sesión de base de datos.",{"term":1294,"anchor":1295,"definition":1296},"Acceso entre inquilinos","cross-tenant-access","Cualquier ruta de acceso en la que un principal que opera bajo el contexto de un inquilino alcanza recursos pertenecientes a otro inquilino.",{"term":1298,"anchor":1299,"definition":1300},"Administrador de plataforma","platform-administrator","Una identidad operativa privilegiada con autoridad modelada explícitamente que puede abarcar múltiples inquilinos.",{"term":1302,"anchor":1303,"definition":1304},"Contexto de inquilino","tenant-context","El ámbito de inquilino verificado bajo el cual se ejecuta la solicitud, trabajo o operación de agente actual.",{},{"id":1307,"data":1308,"type":42,"tunes":1310},"h-conclusion",{"text":1309,"level":247},"Conclusión",{},{"id":1312,"data":1313,"type":218,"tunes":1315},"p-conclusion-1",{"text":1314},"RBAC y el aislamiento de inquilinos son mecanismos de seguridad complementarios, no competidores. RBAC estructura el permiso operativo; el aislamiento de inquilinos restringe el límite de recursos dentro del cual ese permiso puede aplicarse.",{},{"id":1317,"data":1318,"type":218,"tunes":1320},"p-conclusion-2",{"text":1319},"Por lo tanto, una solicitud multiinquilino robusta necesita más que “el usuario tiene el rol ADMIN”. Necesita un principal verificado, un contexto de inquilino verificado, una operación permitida, un objetivo con alcance de inquilino y aplicación en cada capa de recursos que pueda contener datos propiedad del inquilino.",{},{"id":1322,"data":1323,"type":218,"tunes":1325},"p-conclusion-3",{"text":1324},"La regla confiable más corta es: autoriza la acción, luego aísla el alcance — y nunca asumas que uno prueba el otro.",{},{"id":1327,"data":1328,"type":42,"tunes":1330},"h-sources",{"text":1329,"level":247},"Fuentes primarias y orientación actual",{},{"id":1332,"data":1333,"type":218,"tunes":1335},"p-sources-note",{"text":1334},"Las fuentes a continuación respaldan la definición de RBAC y la orientación actual sobre aislamiento de inquilinos. La sección de Aaasaasa AI CMS es evidencia de implementación original y está intencionalmente limitada a los patrones de código que fueron verificados.",{},{"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":369},"NIST — Control de acceso basado en roles","Descripción general de NIST de los modelos RBAC y el estándar INCITS RBAC, incluidos usuarios, roles, permisos, operaciones y objetos.","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":369},"NIST CSRC — Glosario RBAC","Definiciones actuales del glosario de NIST sobre control de acceso basado en roles como asignación de permisos a través de roles.",{},{"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":369},"AWS — La mentalidad de aislamiento","Orientación de AWS SaaS que distingue explícitamente la autenticación\u002Fautorización del aislamiento de inquilinos y recomienda mecanismos de aislamiento compartidos.",{},{"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":369},"AWS — Preguntas frecuentes sobre autorización multiinquilino","Orientación actual que explica la diferencia entre autorización y aislamiento de inquilinos en aplicaciones SaaS.",{},{"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":369},"AWS — Consideraciones de diseño multiinquilino","Orientación actual de SaaS que distingue el aislamiento de inquilinos de la autorización y analiza modelos de políticas de autorización agrupados\u002Faislados.",{},{"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":369},"OWASP — Hoja de referencia de seguridad de aplicaciones multiinquilino","Orientación práctica actual para el contexto de inquilino, aislamiento de base de datos, cachés, almacenamiento, colas, pruebas y prevención de acceso entre inquilinos.",{},{"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":369},"OWASP — Hoja de referencia de seguridad de RAG","Orientación actual que exige control de acceso en el momento de la recuperación y aislamiento de inquilinos para almacenes vectoriales multiinquilino.",{},{"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":369},"OWASP — Pruebas de regresión de autorización","Orientación actual de pruebas que incluye pruebas de degradación de roles y límites entre inquilinos.",{},"2.31","El RBAC controla lo que un usuario puede hacer; el aislamiento de inquilinos controla a qué recursos de qué inquilino puede llegar esa acción. Descubre por qué la seguridad SaaS multiinquilino requiere ambos límites.","\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,"Política y límites de datos","policy-and-data",{"id":1432,"name":1433,"slug":1434},57,"Límites de datos","data-boundaries",{"id":1436,"name":1437,"slug":1438},64,"Arquitectura de la información","information-architecture",{"id":1440,"login":1441,"email":1442,"displayName":1443},"20","rooth8233","aleksandar@stajic.de","Aleksandar Stajić",[1445,2441],{"lang":1446,"title":1447,"content":1448,"contentJson":1449,"excerpt":2440},"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":1450,"blocks":1451,"version":2439},1791485112883,[1452,1456,1461,1466,1471,1475,1479,1483,1487,1491,1495,1499,1503,1507,1511,1515,1519,1523,1546,1550,1554,1558,1562,1566,1593,1597,1616,1620,1624,1628,1632,1636,1640,1644,1648,1652,1656,1660,1670,1674,1678,1682,1686,1691,1695,1727,1731,1735,1739,1743,1747,1751,1755,1759,1763,1767,1771,1775,1779,1783,1787,1791,1795,1799,1803,1807,1811,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1905,1909,1914,1918,1922,1926,1930,1934,1959,1964,1968,1972,1976,1980,1984,2021,2025,2029,2075,2079,2116,2120,2161,2165,2213,2217,2221,2225,2229,2233,2237,2241,2245,2249,2253,2257,2261,2265,2271,2275,2282,2286,2318,2322,2359,2363,2367,2371,2375,2379,2383,2390,2397,2404,2411,2418,2425,2432],{"id":215,"data":1453,"type":218,"tunes":1455},{"text":1454},"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":221,"data":1457,"type":226,"tunes":1460},{"body":1458,"title":1459,"variant":225},"\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":229,"data":1462,"type":226,"tunes":1465},{"body":1463,"title":1464,"variant":233},"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":236,"data":1467,"type":226,"tunes":1470},{"body":1468,"title":1469,"variant":240},"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":243,"data":1472,"type":248,"tunes":1474},{"title":1473,"maxLevel":246,"minLevel":247},"Contents",{},{"id":251,"data":1476,"type":42,"tunes":1478},{"text":1477,"level":247},"What RBAC really controls",{},{"id":256,"data":1480,"type":218,"tunes":1482},{"text":1481},"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":261,"data":1484,"type":218,"tunes":1486},{"text":1485},"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":266,"data":1488,"type":218,"tunes":1490},{"text":1489},"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":271,"data":1492,"type":42,"tunes":1494},{"text":1493,"level":247},"What tenant isolation really controls",{},{"id":276,"data":1496,"type":218,"tunes":1498},{"text":1497},"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":281,"data":1500,"type":218,"tunes":1502},{"text":1501},"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":286,"data":1504,"type":218,"tunes":1506},{"text":1505},"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":291,"data":1508,"type":42,"tunes":1510},{"text":1509,"level":247},"The simplest example",{},{"id":296,"data":1512,"type":218,"tunes":1514},{"text":1513},"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":301,"data":1516,"type":218,"tunes":1518},{"text":1517},"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":306,"data":1520,"type":218,"tunes":1522},{"text":1521},"If the API checks only “Alice has ADMIN” and then executes SELECT * FROM users WHERE id = 847, RBAC succeeded while tenant isolation failed.",{},{"id":311,"data":1524,"type":334,"tunes":1545},{"steps":1525,"title":1544,"orientation":333},[1526,1529,1532,1535,1538,1541],{"label":1527,"description":1528},"1. Authenticate principal","Establish who the user, service or agent is.",{"label":1530,"description":1531},"2. Resolve verified tenant context","Determine which tenant context applies from trusted server-side identity\u002Fmembership information.",{"label":1533,"description":1534},"3. Resolve permission","Evaluate whether the principal's role or policy permits the requested operation.",{"label":1536,"description":1537},"4. Scope the target resource","Verify that the target object belongs to the permitted tenant or explicitly shared scope.",{"label":1539,"description":1540},"5. Enforce at the access boundary","Perform the database, cache, storage, queue or service operation with tenant constraints applied.",{"label":1542,"description":1543},"6. Audit both dimensions","Record principal, tenant, operation, target and result so cross-tenant attempts are visible.","A correct multi-tenant authorization decision",{},{"id":337,"data":1547,"type":42,"tunes":1549},{"text":1548,"level":247},"Where the simple example stops",{},{"id":342,"data":1551,"type":218,"tunes":1553},{"text":1552},"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":347,"data":1555,"type":218,"tunes":1557},{"text":1556},"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":352,"data":1559,"type":218,"tunes":1561},{"text":1560},"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":357,"data":1563,"type":42,"tunes":1565},{"text":1564,"level":247},"RBAC vs tenant isolation",{},{"id":362,"data":1567,"type":399,"tunes":1592},{"rows":1568,"title":1587,"layout":391,"columns":1588},[1569,1572,1575,1578,1581,1584],{"id":366,"label":1570,"values":1571},"Primary question",[369,369],{"id":371,"label":1573,"values":1574},"Typical unit",[369,369],{"id":375,"label":1576,"values":1577},"Example",[369,369],{"id":379,"label":1579,"values":1580},"Typical failure",[369,369],{"id":383,"label":1582,"values":1583},"Typical implementation",[369,369],{"id":387,"label":1585,"values":1586},"Can it exist alone?",[369,369],"Two different security dimensions",[1589,1590],{"id":394,"label":395},{"id":397,"label":1591},"Tenant isolation",{},{"id":402,"data":1594,"type":42,"tunes":1596},{"text":1595,"level":247},"Authentication, authorization and isolation are three different checks",{},{"id":407,"data":1598,"type":391,"tunes":1615},{"content":1599,"stretched":43,"withHeadings":14},[1600,1604,1608,1612],[1601,1602,1603],"Layer","Question","Example failure",[1605,1606,1607],"Authentication","Who is this principal?","Attacker impersonates Alice",[1609,1610,1611],"Authorization \u002F RBAC","May this principal perform this operation?","Viewer can delete users",[1591,1613,1614],"May this operation reach this tenant\u002Fresource boundary?","Tenant A admin reads Tenant B order",{},{"id":427,"data":1617,"type":218,"tunes":1619},{"text":1618},"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":432,"data":1621,"type":42,"tunes":1623},{"text":1622,"level":247},"Roles need a scope",{},{"id":437,"data":1625,"type":218,"tunes":1627},{"text":1626},"The word ADMIN is incomplete without scope. It can mean platform administrator, tenant administrator, project administrator, workspace administrator or administrator of one subsystem.",{},{"id":442,"data":1629,"type":218,"tunes":1631},{"text":1630},"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":447,"data":1633,"type":218,"tunes":1635},{"text":1634},"A global role model that ignores this distinction can create privilege leakage even when the permission map itself is correct.",{},{"id":452,"data":1637,"type":42,"tunes":1639},{"text":1638,"level":247},"Tenant context must come from a trusted path",{},{"id":457,"data":1641,"type":218,"tunes":1643},{"text":1642},"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":462,"data":1645,"type":218,"tunes":1647},{"text":1646},"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":467,"data":1649,"type":218,"tunes":1651},{"text":1650},"This matters because a trivial request modification from tenant=A to tenant=B must not be sufficient to cross the isolation boundary.",{},{"id":472,"data":1653,"type":42,"tunes":1655},{"text":1654,"level":247},"Tenant scope belongs in the resource lookup",{},{"id":477,"data":1657,"type":218,"tunes":1659},{"text":1658},"A common application-level isolation pattern is to include tenant scope in the same query that resolves the resource.",{},{"id":482,"data":1661,"type":391,"tunes":1669},{"content":1662,"stretched":43,"withHeadings":14},[1663,1666,1667,1668],[1664,1665],"Weak lookup","Stronger tenant-scoped lookup",[489,490],[492,493],[495,496],{},{"id":499,"data":1671,"type":218,"tunes":1673},{"text":1672},"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":504,"data":1675,"type":42,"tunes":1677},{"text":1676,"level":247},"Application checks are useful, but isolation should not depend on perfect developer behavior",{},{"id":509,"data":1679,"type":218,"tunes":1681},{"text":1680},"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":514,"data":1683,"type":218,"tunes":1685},{"text":1684},"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":519,"data":1687,"type":226,"tunes":1690},{"body":1688,"title":1689,"variant":523},"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":526,"data":1692,"type":42,"tunes":1694},{"text":1693,"level":247},"Database isolation strategies",{},{"id":531,"data":1696,"type":391,"tunes":1726},{"content":1697,"stretched":43,"withHeadings":14},[1698,1702,1706,1710,1714,1718,1722],[1699,1700,1701],"Strategy","Boundary","Strength \u002F trade-off",[1703,1704,1705],"Shared tables + tenant key","Row\u002Fapplication policy","Operationally efficient; requires exhaustive tenant scoping and strong tests",[1707,1708,1709],"Shared tables + database RLS","Database policy boundary","Reduces dependence on every application query; requires correct roles, session\u002Ftransaction tenant context and policy coverage",[1711,1712,1713],"Separate schemas","Namespace \u002F DB-role boundary","Stronger logical separation; more operational complexity",[1715,1716,1717],"Separate databases","Database \u002F credential boundary","Strong isolation and simpler blast-radius story; higher provisioning and operations cost",[1719,1720,1721],"Separate infrastructure\u002Faccount","Infrastructure boundary","Strongest coarse-grained separation; highest cost and operational overhead",[1723,1724,1725],"Hybrid","Per workload\u002Fdata class","Allows stronger isolation only where risk\u002Fcompliance justifies it",{},{"id":564,"data":1728,"type":218,"tunes":1730},{"text":1729},"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":569,"data":1732,"type":42,"tunes":1734},{"text":1733,"level":247},"PostgreSQL Row-Level Security can provide defense in depth",{},{"id":574,"data":1736,"type":218,"tunes":1738},{"text":1737},"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":579,"data":1740,"type":218,"tunes":1742},{"text":1741},"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":584,"data":1744,"type":218,"tunes":1746},{"text":1745},"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":589,"data":1748,"type":42,"tunes":1750},{"text":1749,"level":247},"Tenant isolation must include caches",{},{"id":594,"data":1752,"type":218,"tunes":1754},{"text":1753},"A database query can be perfectly scoped and still leak data through a shared cache key.",{},{"id":599,"data":1756,"type":218,"tunes":1758},{"text":1757},"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":604,"data":1760,"type":218,"tunes":1762},{"text":1761},"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":609,"data":1764,"type":42,"tunes":1766},{"text":1765,"level":247},"Files and object storage need their own tenant boundary",{},{"id":614,"data":1768,"type":218,"tunes":1770},{"text":1769},"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":619,"data":1772,"type":218,"tunes":1774},{"text":1773},"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":624,"data":1776,"type":218,"tunes":1778},{"text":1777},"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":629,"data":1780,"type":42,"tunes":1782},{"text":1781,"level":247},"Background jobs and queues can break isolation",{},{"id":634,"data":1784,"type":218,"tunes":1786},{"text":1785},"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":639,"data":1788,"type":218,"tunes":1790},{"text":1789},"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":644,"data":1792,"type":218,"tunes":1794},{"text":1793},"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":649,"data":1796,"type":42,"tunes":1798},{"text":1797,"level":247},"Search and RAG need tenant-aware retrieval",{},{"id":654,"data":1800,"type":218,"tunes":1802},{"text":1801},"Multi-tenant AI introduces another copy of the isolation problem. Documents may be chunked, embedded and stored in a vector index after ingestion.",{},{"id":659,"data":1804,"type":218,"tunes":1806},{"text":1805},"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":664,"data":1808,"type":218,"tunes":1810},{"text":1809},"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":669,"data":1812,"type":226,"tunes":1815},{"body":1813,"title":1814,"variant":233},"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":675,"data":1817,"type":42,"tunes":1819},{"text":1818,"level":247},"Derived data inherits tenant sensitivity",{},{"id":680,"data":1821,"type":218,"tunes":1823},{"text":1822},"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":685,"data":1825,"type":218,"tunes":1827},{"text":1826},"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":690,"data":1829,"type":42,"tunes":1831},{"text":1830,"level":247},"Not everything belongs to a tenant",{},{"id":695,"data":1833,"type":218,"tunes":1835},{"text":1834},"Multi-tenant platforms often have intentionally global resources: product taxonomies, public templates, system permissions, feature definitions or public content.",{},{"id":700,"data":1837,"type":218,"tunes":1839},{"text":1838},"The safest model is explicit classification: global, tenant-scoped, user-scoped or explicitly cross-tenant. Ambiguous resources are where accidental leakage begins.",{},{"id":705,"data":1841,"type":218,"tunes":1843},{"text":1842},"An intentionally shared object should have a documented reason for being global rather than simply lacking a tenant association.",{},{"id":710,"data":1845,"type":42,"tunes":1847},{"text":1846,"level":247},"Platform administrators require a different authority model",{},{"id":715,"data":1849,"type":218,"tunes":1851},{"text":1850},"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":720,"data":1853,"type":218,"tunes":1855},{"text":1854},"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":725,"data":1857,"type":218,"tunes":1859},{"text":1858},"Cross-tenant access should therefore be a named capability, not the absence of a tenant filter.",{},{"id":730,"data":1861,"type":42,"tunes":1863},{"text":1862,"level":247},"RBAC can be combined with attributes",{},{"id":735,"data":1865,"type":218,"tunes":1867},{"text":1866},"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":740,"data":1869,"type":218,"tunes":1871},{"text":1870},"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":745,"data":1873,"type":218,"tunes":1875},{"text":1874},"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":750,"data":1877,"type":42,"tunes":1879},{"text":1878,"level":247},"Authorization decisions are at least two-dimensional",{},{"id":755,"data":1881,"type":391,"tunes":1904},{"content":1882,"stretched":43,"withHeadings":14},[1883,1887,1890,1893,1895,1896,1900],[759,1884,1885,1886],"Role permission","Tenant relationship","Decision",[764,765,1888,1889],"Order belongs to Alice's tenant","Allow",[764,765,1891,1892],"Order belongs to another tenant","Deny",[764,772,1888,1894],"Allow if role includes write",[764,772,1891,1892],[1897,777,1898,1899],"Platform support","Explicit support scope + audited target tenant","Potentially allow under platform policy",[1901,782,1902,1903],"Background worker","Trusted service scope for job tenant","Allow only for verified job tenant",{},{"id":787,"data":1906,"type":42,"tunes":1908},{"text":1907,"level":247},"Original implementation evidence: Aaasaasa AI CMS",{},{"id":792,"data":1910,"type":226,"tunes":1913},{"body":1911,"title":1912,"variant":240},"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":798,"data":1915,"type":218,"tunes":1917},{"text":1916},"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":803,"data":1919,"type":218,"tunes":1921},{"text":1920},"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":808,"data":1923,"type":218,"tunes":1925},{"text":1924},"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":813,"data":1927,"type":218,"tunes":1929},{"text":1928},"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":818,"data":1931,"type":218,"tunes":1933},{"text":1932},"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":823,"data":1935,"type":391,"tunes":1958},{"content":1936,"stretched":43,"withHeadings":14},[1937,1940,1943,1946,1949,1952,1955],[1938,1939],"Observed implementation pattern","Security meaning",[1941,1942],"Typed permission codes","RBAC operation vocabulary is explicit",[1944,1945],"System role → permission maps","Roles aggregate permissions rather than hard-coding users",[1947,1948],"tenantId_code role identity","Same logical role can exist separately per tenant",[1950,1951],"Role lookup uses id + tenantId","Role mutation is tenant-scoped",[1953,1954],"User-role relation stores tenantId","Membership is not globally inferred from role alone",[1956,1957],"Permission resolution uses tenantId + userId","Authorization is evaluated inside tenant context",{},{"id":849,"data":1960,"type":226,"tunes":1963},{"body":1961,"title":1962,"variant":233},"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":855,"data":1965,"type":42,"tunes":1967},{"text":1966,"level":247},"Why this distinction matters even more for AI agents",{},{"id":860,"data":1969,"type":218,"tunes":1971},{"text":1970},"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":865,"data":1973,"type":218,"tunes":1975},{"text":1974},"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":870,"data":1977,"type":218,"tunes":1979},{"text":1978},"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":875,"data":1981,"type":42,"tunes":1983},{"text":1982,"level":247},"Test RBAC and tenant isolation separately",{},{"id":880,"data":1985,"type":391,"tunes":2020},{"content":1986,"stretched":43,"withHeadings":14},[1987,1990,1993,1996,1999,2002,2005,2008,2011,2014,2017],[1988,1989],"Test family","What it should prove",[1991,1992],"Role demotion test","A user without a permission cannot perform the operation even inside their own tenant",[1994,1995],"Cross-tenant object test","A user with the correct role still cannot access the same resource type in another tenant",[1997,1998],"Identifier tampering","Changing object\u002Ftenant IDs does not cross scope",[2000,2001],"List\u002Fbulk endpoint test","Broad queries return only authorized tenant data",[2003,2004],"Cache reuse test","Two tenants using reused processes\u002Fconnections never receive each other's cached state",[2006,2007],"RLS request-role test","Production request role cannot bypass row policies",[2009,2010],"Async worker test","Tenant context survives queueing and is revalidated at consumption",[2012,2013],"Vector retrieval test","Tenant A query never retrieves Tenant B chunks",[2015,2016],"Platform-admin test","Cross-tenant capability is explicit, narrow and auditable",[2018,2019],"Offboarding test","Tenant data and derived indexes\u002Fcaches are removed according to policy",{},{"id":918,"data":2022,"type":218,"tunes":2024},{"text":2023},"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":923,"data":2026,"type":42,"tunes":2028},{"text":2027,"level":247},"Common failure modes",{},{"id":928,"data":2030,"type":391,"tunes":2074},{"content":2031,"stretched":43,"withHeadings":14},[2032,2035,2038,2041,2044,2047,2050,2053,2056,2059,2062,2065,2068,2071],[2033,2034],"Failure mode","Why it fails",[2036,2037],"Check role but not tenant","Valid role becomes cross-tenant authority",[2039,2040],"Trust tenant ID from request","Client controls the isolation selector",[2042,2043],"Scope UI but not API","Hidden buttons do not protect backend resources",[2045,2046],"Tenant-aware detail endpoint, unscoped list endpoint","Bulk reads leak other tenants",[2048,2049],"Tenant filter in most queries","One forgotten path breaks the boundary",[2051,2052],"Global cache keys","Correct database isolation is bypassed by cached data",[2054,2055],"Shared vector index without enforced metadata filters","RAG retrieves another tenant's chunks",[2057,2058],"Queue message tenant ID treated as authorization","Forged or wrongly produced job can cross tenant boundary",[2060,2061],"Platform admin modeled as ordinary ADMIN","Cross-tenant power becomes implicit and difficult to audit",[2063,2064],"Role copied globally across tenant memberships","User receives permissions in tenants where they were never assigned",[2066,2067],"Separate databases but shared privileged credential","Application can still cross databases if its credential is too broad",[2069,2070],"RLS with BYPASSRLS request role","Database policy exists but does not protect the actual request path",[2072,2073],"Random UUIDs treated as isolation","Hard-to-guess identifiers reduce enumeration but do not authorize access",{},{"id":975,"data":2076,"type":42,"tunes":2078},{"text":2077,"level":247},"Common misconceptions",{},{"id":980,"data":2080,"type":391,"tunes":2115},{"content":2081,"stretched":43,"withHeadings":14},[2082,2085,2088,2091,2094,2097,2100,2103,2106,2109,2112],[2083,2084],"Misconception","Correction",[2086,2087],"“RBAC provides tenant isolation.”","RBAC controls permissions; isolation also requires tenant\u002Fresource scoping.",[2089,2090],"“If the user is an admin, tenant checks are unnecessary.”","Admin authority must still have an explicit scope.",[2092,2093],"“Tenant ID in JWT is enough.”","It can be a trusted input only if validated and applied consistently to every protected resource path.",[2095,2096],"“Separate databases remove authorization requirements.”","Users still need operation-level permissions inside their tenant.",[2098,2099],"“A tenant_id column means the system is isolated.”","The field only helps if access paths enforce it.",[2101,2102],"“UUIDs prevent cross-tenant access.”","Unpredictable identifiers are defense in depth, not authorization.",[2104,2105],"“RLS means application code needs no security checks.”","Application authorization, correct DB roles and policy coverage still matter.",[2107,2108],"“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.",[2110,2111],"“Platform support needs global ADMIN.”","Cross-tenant support should be a distinct, constrained and auditable authority.",[2113,2114],"“Internal services can skip tenant checks.”","Internal paths can still be compromised or misconfigured and must preserve tenant context.",{},{"id":1018,"data":2117,"type":42,"tunes":2119},{"text":2118,"level":247},"A practical design sequence",{},{"id":1023,"data":2121,"type":334,"tunes":2160},{"steps":2122,"title":2159,"orientation":333},[2123,2126,2129,2132,2135,2138,2141,2144,2147,2150,2153,2156],{"label":2124,"description":2125},"1. Define tenant ownership","Classify which entities and resources are global, tenant-scoped, user-scoped or intentionally cross-tenant.",{"label":2127,"description":2128},"2. Define operations","Create explicit permissions for reads, writes, publishing, approvals, administration and other business actions.",{"label":2130,"description":2131},"3. Define roles","Group permissions according to responsibilities without embedding accidental global scope.",{"label":2133,"description":2134},"4. Define membership scope","Bind role assignments to the tenant\u002Fworkspace\u002Fproject context in which they apply.",{"label":2136,"description":2137},"5. Resolve trusted tenant context","Derive tenant identity from authenticated, server-verified membership or service authorization.",{"label":2139,"description":2140},"6. Enforce resource ownership","Apply tenant scope at every tenant-owned data\u002Fservice boundary.",{"label":2142,"description":2143},"7. Add defense in depth","Use RLS, separate credentials, schemas\u002Fdatabases, storage policies or policy engines where risk justifies them.",{"label":2145,"description":2146},"8. Carry scope through derived systems","Preserve tenant metadata in cache, search, vector indexes, queues, files and analytics.",{"label":2148,"description":2149},"9. Model cross-tenant operations explicitly","Separate platform administration and service identities from ordinary tenant roles.",{"label":2151,"description":2152},"10. Test both axes","Run negative tests for missing permission and for wrong tenant independently.",{"label":2154,"description":2155},"11. Audit tenant + permission together","Log who acted, in which tenant, on what target and under which authority.",{"label":2157,"description":2158},"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":1065,"data":2162,"type":42,"tunes":2164},{"text":2163,"level":247},"RBAC + tenant isolation checklist",{},{"id":1070,"data":2166,"type":391,"tunes":2212},{"content":2167,"stretched":43,"withHeadings":14},[2168,2170,2173,2176,2179,2182,2185,2188,2191,2194,2197,2200,2203,2206,2209],[1602,2169],"Expected answer",[2171,2172],"Who is the principal?","Authenticated user\u002Fservice\u002Fagent identity",[2174,2175],"Which tenant context applies?","Server-verified membership or service scope",[2177,2178],"Which operation is requested?","Typed permission or policy action",[2180,2181],"Does the principal have that permission?","Role\u002Fpolicy decision",[2183,2184],"Who owns the target resource?","Explicit tenant\u002Fglobal\u002Fuser classification",[2186,2187],"Does resource scope match authority?","Tenant-aware lookup\u002Fpolicy",[2189,2190],"Can storage bypass application checks?","Defense-in-depth decision documented",[2192,2193],"Are caches tenant-safe?","Keys\u002Fnamespaces and authorization preserve tenant scope",[2195,2196],"Are files\u002Fblobs tenant-safe?","Object policy and signed URL issuance enforce scope",[2198,2199],"Are async jobs tenant-safe?","Verified context propagates and is revalidated",[2201,2202],"Is RAG\u002Fsearch tenant-safe?","Metadata\u002Fcollection isolation enforced before model context",[2204,2205],"Are cross-tenant admins explicit?","Separate authority, controls and audit",[2207,2208],"Can ordinary credentials bypass isolation?","No, or tightly documented exceptional path",[2210,2211],"Are negative cross-tenant tests automated?","Yes for every relevant access layer",{},{"id":1119,"data":2214,"type":42,"tunes":2216},{"text":2215,"level":247},"Edge cases and limitations",{},{"id":1124,"data":2218,"type":218,"tunes":2220},{"text":2219},"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":1129,"data":2222,"type":218,"tunes":2224},{"text":2223},"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":1134,"data":2226,"type":218,"tunes":2228},{"text":2227},"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":1139,"data":2230,"type":218,"tunes":2232},{"text":2231},"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":1144,"data":2234,"type":218,"tunes":2236},{"text":2235},"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":1149,"data":2238,"type":42,"tunes":2240},{"text":2239,"level":247},"What would change this answer?",{},{"id":1154,"data":2242,"type":218,"tunes":2244},{"text":2243},"The exact implementation changes with architecture: serverless APIs, Kubernetes, PostgreSQL, object storage, vector databases and policy engines expose different isolation primitives.",{},{"id":1159,"data":2246,"type":218,"tunes":2248},{"text":2247},"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":1164,"data":2250,"type":218,"tunes":2252},{"text":2251},"The conceptual distinction does not change: permission to perform an operation is not the same thing as permission to cross a tenant boundary.",{},{"id":1169,"data":2254,"type":42,"tunes":2256},{"text":2255,"level":247},"Related canonical knowledge",{},{"id":1174,"data":2258,"type":218,"tunes":2260},{"text":2259},"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":1179,"data":2262,"type":218,"tunes":2264},{"text":2263},"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":1184,"data":2266,"type":1190,"tunes":2270},{"url":1186,"title":2267,"excerpt":2268,"ctaLabel":2269},"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":1193,"data":2272,"type":218,"tunes":2274},{"text":2273},"For RAG, tenant isolation must be enforced before protected chunks reach model context.",{},{"id":1198,"data":2276,"type":1190,"tunes":2281},{"url":2277,"title":2278,"excerpt":2279,"ctaLabel":2280},"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":1206,"data":2283,"type":42,"tunes":2285},{"text":2284,"level":247},"Frequently asked questions",{},{"id":1211,"data":2287,"type":1211,"tunes":2317},{"items":2288,"title":2316},[2289,2292,2295,2298,2301,2304,2307,2310,2313],{"id":1215,"answer":2290,"question":2291},"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":1219,"answer":2293,"question":2294},"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":1223,"answer":2296,"question":2297},"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":1227,"answer":2299,"question":2300},"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":1231,"answer":2302,"question":2303},"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":1235,"answer":2305,"question":2306},"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":1239,"answer":2308,"question":2309},"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":1243,"answer":2311,"question":2312},"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":1247,"answer":2314,"question":2315},"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":1253,"data":2319,"type":42,"tunes":2321},{"text":2320,"level":247},"Glossary",{},{"id":1258,"data":2323,"type":1258,"tunes":2358},{"title":2324,"entries":2325},"Key multi-tenant security terms",[2326,2328,2331,2333,2335,2338,2341,2344,2346,2349,2352,2355],{"term":395,"anchor":394,"definition":2327},"Role-Based Access Control: an authorization model that associates permissions with roles and assigns users or principals to those roles.",{"term":2329,"anchor":397,"definition":2330},"Tenant","A customer, organization, workspace or other isolated logical consumer of a shared multi-tenant system.",{"term":1591,"anchor":1268,"definition":2332},"Mechanisms that prevent one tenant from accessing, modifying or receiving another tenant's resources in a shared system.",{"term":1605,"anchor":1271,"definition":2334},"Verification of the identity of a user, service or other principal.",{"term":2336,"anchor":1275,"definition":2337},"Authorization","Decision process that determines whether a principal may perform a requested operation on a resource.",{"term":2339,"anchor":1279,"definition":2340},"Permission","A defined allowed operation or capability such as orders.read or users.write.",{"term":2342,"anchor":1283,"definition":2343},"Role","A named grouping of permissions associated with a responsibility or function.",{"term":1286,"anchor":1287,"definition":2345},"Attribute-Based Access Control: authorization based on attributes of the principal, resource, action or environment.",{"term":2347,"anchor":1291,"definition":2348},"Row-Level Security","Database policy mechanism that restricts which rows a database role or session may read or modify.",{"term":2350,"anchor":1295,"definition":2351},"Cross-tenant access","Any access path in which a principal operating under one tenant context reaches resources belonging to another tenant.",{"term":2353,"anchor":1299,"definition":2354},"Platform administrator","A privileged operational identity with explicitly modeled authority that may span multiple tenants.",{"term":2356,"anchor":1303,"definition":2357},"Tenant context","The verified tenant scope under which the current request, job or agent operation executes.",{},{"id":1307,"data":2360,"type":42,"tunes":2362},{"text":2361,"level":247},"Conclusion",{},{"id":1312,"data":2364,"type":218,"tunes":2366},{"text":2365},"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":2368,"type":218,"tunes":2370},{"text":2369},"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":2372,"type":218,"tunes":2374},{"text":2373},"The shortest reliable rule is: authorize the action, then isolate the scope — and never assume one proves the other.",{},{"id":1327,"data":2376,"type":42,"tunes":2378},{"text":2377,"level":247},"Primary sources and current guidance",{},{"id":1332,"data":2380,"type":218,"tunes":2382},{"text":2381},"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":2384,"type":1344,"tunes":2389},{"link":1339,"meta":2385},{"image":2386,"title":2387,"description":2388},{"url":369},"NIST — Role Based Access Control","NIST overview of RBAC models and the INCITS RBAC standard, including users, roles, permissions, operations and objects.",{},{"id":1347,"data":2391,"type":1344,"tunes":2396},{"link":1349,"meta":2392},{"image":2393,"title":2394,"description":2395},{"url":369},"NIST CSRC — RBAC glossary","Current NIST glossary definitions of role-based access control as permission assignment through roles.",{},{"id":1356,"data":2398,"type":1344,"tunes":2403},{"link":1358,"meta":2399},{"image":2400,"title":2401,"description":2402},{"url":369},"AWS — The isolation mindset","AWS SaaS guidance explicitly distinguishing authentication\u002Fauthorization from tenant isolation and recommending shared isolation mechanisms.",{},{"id":1365,"data":2405,"type":1344,"tunes":2410},{"link":1367,"meta":2406},{"image":2407,"title":2408,"description":2409},{"url":369},"AWS — Multi-tenant authorization FAQ","Current guidance explaining the difference between authorization and tenant isolation in SaaS applications.",{},{"id":1374,"data":2412,"type":1344,"tunes":2417},{"link":1376,"meta":2413},{"image":2414,"title":2415,"description":2416},{"url":369},"AWS — Multi-tenant design considerations","Current SaaS guidance distinguishing tenant isolation from authorization and discussing pooled\u002Fsiloed authorization policy models.",{},{"id":1383,"data":2419,"type":1344,"tunes":2424},{"link":1385,"meta":2420},{"image":2421,"title":2422,"description":2423},{"url":369},"OWASP — Multi-Tenant Application Security Cheat Sheet","Current practical guidance for tenant context, database isolation, caches, storage, queues, testing and cross-tenant access prevention.",{},{"id":1392,"data":2426,"type":1344,"tunes":2431},{"link":1394,"meta":2427},{"image":2428,"title":2429,"description":2430},{"url":369},"OWASP — RAG Security Cheat Sheet","Current guidance requiring access control at retrieval time and tenant isolation for multi-tenant vector stores.",{},{"id":1401,"data":2433,"type":1344,"tunes":2438},{"link":1403,"meta":2434},{"image":2435,"title":2436,"description":2437},{"url":369},"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.",{"lang":7,"title":208,"content":210,"contentJson":2442,"excerpt":1410},{"time":212,"blocks":2443,"version":1409},[2444,2447,2450,2453,2456,2459,2462,2465,2468,2471,2474,2477,2480,2483,2486,2489,2492,2495,2505,2508,2511,2514,2517,2520,2539,2542,2550,2553,2556,2559,2562,2565,2568,2571,2574,2577,2580,2583,2591,2594,2597,2600,2603,2606,2609,2620,2623,2626,2629,2632,2635,2638,2641,2644,2647,2650,2653,2656,2659,2662,2665,2668,2671,2674,2677,2680,2683,2686,2689,2692,2695,2698,2701,2704,2707,2710,2713,2716,2719,2722,2725,2728,2731,2734,2745,2748,2751,2754,2757,2760,2763,2766,2777,2780,2783,2786,2789,2792,2795,2810,2813,2816,2834,2837,2852,2855,2871,2874,2893,2896,2899,2902,2905,2908,2911,2914,2917,2920,2923,2926,2929,2932,2935,2938,2941,2944,2957,2960,2976,2979,2982,2985,2988,2991,2994,2999,3004,3009,3014,3019,3024,3029],{"id":215,"data":2445,"type":218,"tunes":2446},{"text":217},{},{"id":221,"data":2448,"type":226,"tunes":2449},{"body":223,"title":224,"variant":225},{},{"id":229,"data":2451,"type":226,"tunes":2452},{"body":231,"title":232,"variant":233},{},{"id":236,"data":2454,"type":226,"tunes":2455},{"body":238,"title":239,"variant":240},{},{"id":243,"data":2457,"type":248,"tunes":2458},{"title":245,"maxLevel":246,"minLevel":247},{},{"id":251,"data":2460,"type":42,"tunes":2461},{"text":253,"level":247},{},{"id":256,"data":2463,"type":218,"tunes":2464},{"text":258},{},{"id":261,"data":2466,"type":218,"tunes":2467},{"text":263},{},{"id":266,"data":2469,"type":218,"tunes":2470},{"text":268},{},{"id":271,"data":2472,"type":42,"tunes":2473},{"text":273,"level":247},{},{"id":276,"data":2475,"type":218,"tunes":2476},{"text":278},{},{"id":281,"data":2478,"type":218,"tunes":2479},{"text":283},{},{"id":286,"data":2481,"type":218,"tunes":2482},{"text":288},{},{"id":291,"data":2484,"type":42,"tunes":2485},{"text":293,"level":247},{},{"id":296,"data":2487,"type":218,"tunes":2488},{"text":298},{},{"id":301,"data":2490,"type":218,"tunes":2491},{"text":303},{},{"id":306,"data":2493,"type":218,"tunes":2494},{"text":308},{},{"id":311,"data":2496,"type":334,"tunes":2504},{"steps":2497,"title":332,"orientation":333},[2498,2499,2500,2501,2502,2503],{"label":315,"description":316},{"label":318,"description":319},{"label":321,"description":322},{"label":324,"description":325},{"label":327,"description":328},{"label":330,"description":331},{},{"id":337,"data":2506,"type":42,"tunes":2507},{"text":339,"level":247},{},{"id":342,"data":2509,"type":218,"tunes":2510},{"text":344},{},{"id":347,"data":2512,"type":218,"tunes":2513},{"text":349},{},{"id":352,"data":2515,"type":218,"tunes":2516},{"text":354},{},{"id":357,"data":2518,"type":42,"tunes":2519},{"text":359,"level":247},{},{"id":362,"data":2521,"type":399,"tunes":2538},{"rows":2522,"title":390,"layout":391,"columns":2535},[2523,2525,2527,2529,2531,2533],{"id":366,"label":367,"values":2524},[369,369],{"id":371,"label":372,"values":2526},[369,369],{"id":375,"label":376,"values":2528},[369,369],{"id":379,"label":380,"values":2530},[369,369],{"id":383,"label":384,"values":2532},[369,369],{"id":387,"label":388,"values":2534},[369,369],[2536,2537],{"id":394,"label":395},{"id":397,"label":398},{},{"id":402,"data":2540,"type":42,"tunes":2541},{"text":404,"level":247},{},{"id":407,"data":2543,"type":391,"tunes":2549},{"content":2544,"stretched":43,"withHeadings":14},[2545,2546,2547,2548],[411,412,413],[415,416,417],[419,420,421],[398,423,424],{},{"id":427,"data":2551,"type":218,"tunes":2552},{"text":429},{},{"id":432,"data":2554,"type":42,"tunes":2555},{"text":434,"level":247},{},{"id":437,"data":2557,"type":218,"tunes":2558},{"text":439},{},{"id":442,"data":2560,"type":218,"tunes":2561},{"text":444},{},{"id":447,"data":2563,"type":218,"tunes":2564},{"text":449},{},{"id":452,"data":2566,"type":42,"tunes":2567},{"text":454,"level":247},{},{"id":457,"data":2569,"type":218,"tunes":2570},{"text":459},{},{"id":462,"data":2572,"type":218,"tunes":2573},{"text":464},{},{"id":467,"data":2575,"type":218,"tunes":2576},{"text":469},{},{"id":472,"data":2578,"type":42,"tunes":2579},{"text":474,"level":247},{},{"id":477,"data":2581,"type":218,"tunes":2582},{"text":479},{},{"id":482,"data":2584,"type":391,"tunes":2590},{"content":2585,"stretched":43,"withHeadings":14},[2586,2587,2588,2589],[486,487],[489,490],[492,493],[495,496],{},{"id":499,"data":2592,"type":218,"tunes":2593},{"text":501},{},{"id":504,"data":2595,"type":42,"tunes":2596},{"text":506,"level":247},{},{"id":509,"data":2598,"type":218,"tunes":2599},{"text":511},{},{"id":514,"data":2601,"type":218,"tunes":2602},{"text":516},{},{"id":519,"data":2604,"type":226,"tunes":2605},{"body":521,"title":522,"variant":523},{},{"id":526,"data":2607,"type":42,"tunes":2608},{"text":528,"level":247},{},{"id":531,"data":2610,"type":391,"tunes":2619},{"content":2611,"stretched":43,"withHeadings":14},[2612,2613,2614,2615,2616,2617,2618],[535,536,537],[539,540,541],[543,544,545],[547,548,549],[551,552,553],[555,556,557],[559,560,561],{},{"id":564,"data":2621,"type":218,"tunes":2622},{"text":566},{},{"id":569,"data":2624,"type":42,"tunes":2625},{"text":571,"level":247},{},{"id":574,"data":2627,"type":218,"tunes":2628},{"text":576},{},{"id":579,"data":2630,"type":218,"tunes":2631},{"text":581},{},{"id":584,"data":2633,"type":218,"tunes":2634},{"text":586},{},{"id":589,"data":2636,"type":42,"tunes":2637},{"text":591,"level":247},{},{"id":594,"data":2639,"type":218,"tunes":2640},{"text":596},{},{"id":599,"data":2642,"type":218,"tunes":2643},{"text":601},{},{"id":604,"data":2645,"type":218,"tunes":2646},{"text":606},{},{"id":609,"data":2648,"type":42,"tunes":2649},{"text":611,"level":247},{},{"id":614,"data":2651,"type":218,"tunes":2652},{"text":616},{},{"id":619,"data":2654,"type":218,"tunes":2655},{"text":621},{},{"id":624,"data":2657,"type":218,"tunes":2658},{"text":626},{},{"id":629,"data":2660,"type":42,"tunes":2661},{"text":631,"level":247},{},{"id":634,"data":2663,"type":218,"tunes":2664},{"text":636},{},{"id":639,"data":2666,"type":218,"tunes":2667},{"text":641},{},{"id":644,"data":2669,"type":218,"tunes":2670},{"text":646},{},{"id":649,"data":2672,"type":42,"tunes":2673},{"text":651,"level":247},{},{"id":654,"data":2675,"type":218,"tunes":2676},{"text":656},{},{"id":659,"data":2678,"type":218,"tunes":2679},{"text":661},{},{"id":664,"data":2681,"type":218,"tunes":2682},{"text":666},{},{"id":669,"data":2684,"type":226,"tunes":2685},{"body":671,"title":672,"variant":233},{},{"id":675,"data":2687,"type":42,"tunes":2688},{"text":677,"level":247},{},{"id":680,"data":2690,"type":218,"tunes":2691},{"text":682},{},{"id":685,"data":2693,"type":218,"tunes":2694},{"text":687},{},{"id":690,"data":2696,"type":42,"tunes":2697},{"text":692,"level":247},{},{"id":695,"data":2699,"type":218,"tunes":2700},{"text":697},{},{"id":700,"data":2702,"type":218,"tunes":2703},{"text":702},{},{"id":705,"data":2705,"type":218,"tunes":2706},{"text":707},{},{"id":710,"data":2708,"type":42,"tunes":2709},{"text":712,"level":247},{},{"id":715,"data":2711,"type":218,"tunes":2712},{"text":717},{},{"id":720,"data":2714,"type":218,"tunes":2715},{"text":722},{},{"id":725,"data":2717,"type":218,"tunes":2718},{"text":727},{},{"id":730,"data":2720,"type":42,"tunes":2721},{"text":732,"level":247},{},{"id":735,"data":2723,"type":218,"tunes":2724},{"text":737},{},{"id":740,"data":2726,"type":218,"tunes":2727},{"text":742},{},{"id":745,"data":2729,"type":218,"tunes":2730},{"text":747},{},{"id":750,"data":2732,"type":42,"tunes":2733},{"text":752,"level":247},{},{"id":755,"data":2735,"type":391,"tunes":2744},{"content":2736,"stretched":43,"withHeadings":14},[2737,2738,2739,2740,2741,2742,2743],[759,760,761,762],[764,765,766,767],[764,765,769,770],[764,772,766,773],[764,772,769,770],[776,777,778,779],[781,782,783,784],{},{"id":787,"data":2746,"type":42,"tunes":2747},{"text":789,"level":247},{},{"id":792,"data":2749,"type":226,"tunes":2750},{"body":794,"title":795,"variant":240},{},{"id":798,"data":2752,"type":218,"tunes":2753},{"text":800},{},{"id":803,"data":2755,"type":218,"tunes":2756},{"text":805},{},{"id":808,"data":2758,"type":218,"tunes":2759},{"text":810},{},{"id":813,"data":2761,"type":218,"tunes":2762},{"text":815},{},{"id":818,"data":2764,"type":218,"tunes":2765},{"text":820},{},{"id":823,"data":2767,"type":391,"tunes":2776},{"content":2768,"stretched":43,"withHeadings":14},[2769,2770,2771,2772,2773,2774,2775],[827,828],[830,831],[833,834],[836,837],[839,840],[842,843],[845,846],{},{"id":849,"data":2778,"type":226,"tunes":2779},{"body":851,"title":852,"variant":233},{},{"id":855,"data":2781,"type":42,"tunes":2782},{"text":857,"level":247},{},{"id":860,"data":2784,"type":218,"tunes":2785},{"text":862},{},{"id":865,"data":2787,"type":218,"tunes":2788},{"text":867},{},{"id":870,"data":2790,"type":218,"tunes":2791},{"text":872},{},{"id":875,"data":2793,"type":42,"tunes":2794},{"text":877,"level":247},{},{"id":880,"data":2796,"type":391,"tunes":2809},{"content":2797,"stretched":43,"withHeadings":14},[2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808],[884,885],[887,888],[890,891],[893,894],[896,897],[899,900],[902,903],[905,906],[908,909],[911,912],[914,915],{},{"id":918,"data":2811,"type":218,"tunes":2812},{"text":920},{},{"id":923,"data":2814,"type":42,"tunes":2815},{"text":925,"level":247},{},{"id":928,"data":2817,"type":391,"tunes":2833},{"content":2818,"stretched":43,"withHeadings":14},[2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830,2831,2832],[932,933],[935,936],[938,939],[941,942],[944,945],[947,948],[950,951],[953,954],[956,957],[959,960],[962,963],[965,966],[968,969],[971,972],{},{"id":975,"data":2835,"type":42,"tunes":2836},{"text":977,"level":247},{},{"id":980,"data":2838,"type":391,"tunes":2851},{"content":2839,"stretched":43,"withHeadings":14},[2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850],[984,985],[987,988],[990,991],[993,994],[996,997],[999,1000],[1002,1003],[1005,1006],[1008,1009],[1011,1012],[1014,1015],{},{"id":1018,"data":2853,"type":42,"tunes":2854},{"text":1020,"level":247},{},{"id":1023,"data":2856,"type":334,"tunes":2870},{"steps":2857,"title":1062,"orientation":333},[2858,2859,2860,2861,2862,2863,2864,2865,2866,2867,2868,2869],{"label":1027,"description":1028},{"label":1030,"description":1031},{"label":1033,"description":1034},{"label":1036,"description":1037},{"label":1039,"description":1040},{"label":1042,"description":1043},{"label":1045,"description":1046},{"label":1048,"description":1049},{"label":1051,"description":1052},{"label":1054,"description":1055},{"label":1057,"description":1058},{"label":1060,"description":1061},{},{"id":1065,"data":2872,"type":42,"tunes":2873},{"text":1067,"level":247},{},{"id":1070,"data":2875,"type":391,"tunes":2892},{"content":2876,"stretched":43,"withHeadings":14},[2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889,2890,2891],[412,1074],[1076,1077],[1079,1080],[1082,1083],[1085,1086],[1088,1089],[1091,1092],[1094,1095],[1097,1098],[1100,1101],[1103,1104],[1106,1107],[1109,1110],[1112,1113],[1115,1116],{},{"id":1119,"data":2894,"type":42,"tunes":2895},{"text":1121,"level":247},{},{"id":1124,"data":2897,"type":218,"tunes":2898},{"text":1126},{},{"id":1129,"data":2900,"type":218,"tunes":2901},{"text":1131},{},{"id":1134,"data":2903,"type":218,"tunes":2904},{"text":1136},{},{"id":1139,"data":2906,"type":218,"tunes":2907},{"text":1141},{},{"id":1144,"data":2909,"type":218,"tunes":2910},{"text":1146},{},{"id":1149,"data":2912,"type":42,"tunes":2913},{"text":1151,"level":247},{},{"id":1154,"data":2915,"type":218,"tunes":2916},{"text":1156},{},{"id":1159,"data":2918,"type":218,"tunes":2919},{"text":1161},{},{"id":1164,"data":2921,"type":218,"tunes":2922},{"text":1166},{},{"id":1169,"data":2924,"type":42,"tunes":2925},{"text":1171,"level":247},{},{"id":1174,"data":2927,"type":218,"tunes":2928},{"text":1176},{},{"id":1179,"data":2930,"type":218,"tunes":2931},{"text":1181},{},{"id":1184,"data":2933,"type":1190,"tunes":2934},{"url":1186,"title":1187,"excerpt":1188,"ctaLabel":1189},{},{"id":1193,"data":2936,"type":218,"tunes":2937},{"text":1195},{},{"id":1198,"data":2939,"type":1190,"tunes":2940},{"url":1200,"title":1201,"excerpt":1202,"ctaLabel":1203},{},{"id":1206,"data":2942,"type":42,"tunes":2943},{"text":1208,"level":247},{},{"id":1211,"data":2945,"type":1211,"tunes":2956},{"items":2946,"title":1250},[2947,2948,2949,2950,2951,2952,2953,2954,2955],{"id":1215,"answer":1216,"question":1217},{"id":1219,"answer":1220,"question":1221},{"id":1223,"answer":1224,"question":1225},{"id":1227,"answer":1228,"question":1229},{"id":1231,"answer":1232,"question":1233},{"id":1235,"answer":1236,"question":1237},{"id":1239,"answer":1240,"question":1241},{"id":1243,"answer":1244,"question":1245},{"id":1247,"answer":1248,"question":1249},{},{"id":1253,"data":2958,"type":42,"tunes":2959},{"text":1255,"level":247},{},{"id":1258,"data":2961,"type":1258,"tunes":2975},{"title":1260,"entries":2962},[2963,2964,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974],{"term":395,"anchor":394,"definition":1263},{"term":1265,"anchor":397,"definition":1266},{"term":398,"anchor":1268,"definition":1269},{"term":415,"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":2977,"type":42,"tunes":2978},{"text":1309,"level":247},{},{"id":1312,"data":2980,"type":218,"tunes":2981},{"text":1314},{},{"id":1317,"data":2983,"type":218,"tunes":2984},{"text":1319},{},{"id":1322,"data":2986,"type":218,"tunes":2987},{"text":1324},{},{"id":1327,"data":2989,"type":42,"tunes":2990},{"text":1329,"level":247},{},{"id":1332,"data":2992,"type":218,"tunes":2993},{"text":1334},{},{"id":1337,"data":2995,"type":1344,"tunes":2998},{"link":1339,"meta":2996},{"image":2997,"title":1342,"description":1343},{"url":369},{},{"id":1347,"data":3000,"type":1344,"tunes":3003},{"link":1349,"meta":3001},{"image":3002,"title":1352,"description":1353},{"url":369},{},{"id":1356,"data":3005,"type":1344,"tunes":3008},{"link":1358,"meta":3006},{"image":3007,"title":1361,"description":1362},{"url":369},{},{"id":1365,"data":3010,"type":1344,"tunes":3013},{"link":1367,"meta":3011},{"image":3012,"title":1370,"description":1371},{"url":369},{},{"id":1374,"data":3015,"type":1344,"tunes":3018},{"link":1376,"meta":3016},{"image":3017,"title":1379,"description":1380},{"url":369},{},{"id":1383,"data":3020,"type":1344,"tunes":3023},{"link":1385,"meta":3021},{"image":3022,"title":1388,"description":1389},{"url":369},{},{"id":1392,"data":3025,"type":1344,"tunes":3028},{"link":1394,"meta":3026},{"image":3027,"title":1397,"description":1398},{"url":369},{},{"id":1401,"data":3030,"type":1344,"tunes":3033},{"link":1403,"meta":3031},{"image":3032,"title":1406,"description":1407},{"url":369},{},"Post erfolgreich abgerufen",{"items":3036,"source":3120,"manualIds":3121,"manualMatchedIds":3122},[3037,3044,3051,3058,3065,3072,3079,3086,3093,3100,3106,3113],{"id":3038,"slug":3039,"title":3040,"excerpt":3041,"featuredImage":3042,"publishedAt":3043},"363","front-und-backend-entwicklung","Desarrollo Front- y Backend","El desarrollo front-end y back-end es una parte esencial del desarrollo web e implica la creación de aplicaciones web y sitios web. El desarrollo front-end se centra en la interfaz de usuario, mientras que el desarrollo back-end es responsable de la programación y gestión del lado del servidor.","\u002Fuploads\u002F2026\u002F03\u002Ffront-und-backend-entwicklung-1774872219531-wyu4i1.webp","2023-04-12T11:11:00.000Z",{"id":3045,"slug":3046,"title":3047,"excerpt":3048,"featuredImage":3049,"publishedAt":3050},"495","sovereign-ai-control-of-models-data-infrastructure-and-dependencies","IA soberana: control de modelos, datos, infraestructura y dependencias","La IA soberana se trata del control efectivo sobre los modelos, los datos, la infraestructura, el software, las operaciones y las dependencias estratégicas, no simplemente de dónde está alojado un modelo de IA.","\u002Fuploads\u002F2026\u002F10\u002Fsovereign-ai-control-of-models-data-infrastructure-and-dependencies-1791488833132-niy85x.webp","2026-10-08T15:45:00.000Z",{"id":3052,"slug":3053,"title":3054,"excerpt":3055,"featuredImage":3056,"publishedAt":3057},"468","ai-agent-memory-is-not-rag-how-to-separate-memory-retrieval-state-and-context","La memoria del agente de IA no es RAG: cómo separar memoria, recuperación, estado y contexto","La memoria del agente, RAG, el estado y el contexto a menudo se usan como si fueran intercambiables. No lo son. Este modelo práctico de arquitectura separa las cuatro capas, muestra dónde pertenece cada una y explica qué se rompe cuando los sistemas las colapsan en una sola.","\u002Fuploads\u002F2026\u002F09\u002Fai-agent-memory-is-not-rag-how-to-separate-memory-retrieval-state-and-context-1790350560308-np0xy6.webp","2026-09-25T11:34:00.000Z",{"id":3059,"slug":3060,"title":3061,"excerpt":3062,"featuredImage":3063,"publishedAt":3064},"364","tipps-fuer-die-verbesserung-der-seo-suchmaschinenoptimierung","Dominando el flujo de trabajo SEO: Estrategias de optimización esenciales para el crecimiento orgánico","Un flujo de trabajo SEO estructurado es crucial para un crecimiento orgánico sostenible. Aprende las diez estrategias fundamentales, desde la investigación de palabras clave y la optimización técnica hasta la calidad del contenido y el análisis de rendimiento.","\u002Fuploads\u002F2026\u002F03\u002Ftipps-fuer-die-verbesserung-der-seo-suchmaschinenoptimierung-1774866098131-hwkzrg.webp","2024-01-26T06:35:00.000Z",{"id":3066,"slug":3067,"title":3068,"excerpt":3069,"featuredImage":3070,"publishedAt":3071},"489","agentic-ai-explained-when-an-ai-system-can-plan-use-tools-and-act","IA agéntica explicada: cuando un sistema de IA puede planificar, usar herramientas y actuar","La IA agéntica utiliza modelos dentro de bucles de ejecución de varios pasos, donde pueden elegir herramientas, observar resultados, actualizar el estado y adaptar su siguiente acción dentro de límites explícitos de tiempo de ejecución y permisos.","\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",{"id":3073,"slug":3074,"title":3075,"excerpt":3076,"featuredImage":3077,"publishedAt":3078},"470","what-should-an-ai-agent-remember-forget-recompute-or-retrieve-again","¿Qué debería recordar, olvidar, recalcular o volver a recuperar un agente de IA?","Los agentes de larga duración no deberían recordarlo todo. Este artículo proporciona un modelo práctico de ciclo de vida para decidir qué pertenece a la memoria duradera, qué se debería recuperar de nuevo, qué es más seguro recalcular y qué debería expirar o ser sustituido.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-should-an-ai-agent-remember-forget-recompute-or-retrieve-again-1790351131087-iehz28.webp","2026-09-25T09:43:00.000Z",{"id":3080,"slug":3081,"title":3082,"excerpt":3083,"featuredImage":3084,"publishedAt":3085},"472","why-more-context-can-make-ai-answers-worse","Por qué más contexto puede empeorar las respuestas de la IA","Una ventana de contexto más grande no garantiza una mejor respuesta. Este artículo explica cómo la dilución de la señal, la evidencia contradictoria, el estado obsoleto, la sensibilidad a la posición y la compresión con pérdidas pueden reducir la fiabilidad de la IA—e introduce una práctica Prueba de Presión de Contexto.","\u002Fuploads\u002F2026\u002F09\u002Fwhy-more-context-can-make-ai-answers-worse-1790351615793-2ntv2v.webp","2026-09-25T11:51:00.000Z",{"id":3087,"slug":3088,"title":3089,"excerpt":3090,"featuredImage":3091,"publishedAt":3092},"481","generative-ai-explained-models-retrieval-tools-and-applications-are-not-the-same-thing","IA generativa explicada: modelos, recuperación, herramientas y aplicaciones no son lo mismo","La IA generativa es más que un modelo. Aprende cómo los modelos, la recuperación, las herramientas, el contexto, los entornos de ejecución y las aplicaciones encajan en los sistemas de IA en producción.","\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":3094,"slug":3095,"title":3096,"excerpt":3097,"featuredImage":3098,"publishedAt":3099},"467","the-answer-validity-boundary-the-missing-layer-between-relevance-and-reliable-ai-answers","El límite de validez de la respuesta: la capa faltante entre la relevancia y las respuestas fiables de la IA","Una fuente puede ser relevante, autorizada y aun así ser incorrecta para la pregunta que se plantea. La capa que falta es la aplicabilidad: las condiciones bajo las cuales una respuesta es válida y los cambios que obligan a reconsiderarla. Este artículo presenta el Límite de Validez de la Respuesta como un patrón de diseño de fuentes para personas, sistemas de búsqueda con IA y sistemas RAG.","\u002Fuploads\u002F2026\u002F09\u002Fthe-answer-validity-boundary-the-missing-layer-between-relevance-and-reliable-ai-answers-1790272901306-1g5jly.webp","2026-09-24T11:59:00.000Z",{"id":3101,"slug":3102,"title":1187,"excerpt":3103,"featuredImage":3104,"publishedAt":3105},"476","mcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained","MCP, A2A, UCP, AP2 y A2UI a menudo se presentan como estándares de agentes competidores. En su mayoría, resuelven diferentes problemas de interoperabilidad. Esta guía mapea cada protocolo con el límite que realmente estandariza—y muestra cómo pueden funcionar juntos en un sistema de producción.","\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":3107,"slug":3108,"title":3109,"excerpt":3110,"featuredImage":3111,"publishedAt":3112},"478","what-is-rag-the-simplest-explanation-of-how-it-works","¿Qué es RAG? La explicación más sencilla de cómo funciona","RAG suena complicado, pero la idea es simple: antes de que una IA responda, primero busca información útil de una fuente de conocimiento y le da esa información al modelo de lenguaje. Esta guía explica RAG, los LLM, el estado, la memoria y las herramientas usando un modelo mental simple.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works-1790377492124-khjagt.webp","2026-09-25T19:03:00.000Z",{"id":3114,"slug":3115,"title":3116,"excerpt":3117,"featuredImage":3118,"publishedAt":3119},"471","how-to-know-whether-an-ai-agent-actually-used-the-right-evidence","Cómo saber si un agente de IA realmente utilizó la evidencia correcta","Un agente de IA puede citar fuentes y aun así usar la evidencia incorrecta. Este artículo presenta un método práctico para verificar el respaldo de las afirmaciones, la autoridad de la fuente, la aplicabilidad, la procedencia y si la evidencia realmente influyó en la respuesta.","\u002Fuploads\u002F2026\u002F09\u002Fhow-to-know-whether-an-ai-agent-actually-used-the-right-evidence-1790351317188-o5z9ve.webp","2026-09-25T11:47:00.000Z","fallback",[],[]]