[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"portal-settings:stajic:sr":3,"public-menus:all":38,"post:rbac-vs-tenant-isolation-two-different-security-boundaries:sr":205,"related:post:rbac-vs-tenant-isolation-two-different-security-boundaries:sr:1":3033},{"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","sr","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":3032},{"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 naspram izolacije zakupaca: dve različite bezbednosne granice","rbac-vs-tenant-isolation-two-different-security-boundaries","\u003Cp>RBAC i izolacija zakupaca rešavaju dva različita bezbednosna problema u sistemima sa više zakupaca. Kontrola pristupa zasnovana na ulogama (RBAC) određuje šta autentifikovani principal sme da radi, kao što je čitanje porudžbina, uređivanje proizvoda ili upravljanje korisnicima. Izolacija zakupaca određuje kojem zakupcu podaci, resursi i kontekst izvršavanja taj principal sme da pristupi. Korisnik može biti ispravno autentifikovan i ispravno mu dodeljena RBAC uloga, a ipak doživeti bezbednosni propust ako aplikacija dozvoli toj ulozi da radi sa resursima drugog zakupca.\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\">Direktan odgovor\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">\u003Cstrong>RBAC odgovara na pitanje „šta ovaj identitet sme da radi?” Izolacija zakupaca odgovara na pitanje „unutar čije granice to sme da radi?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Bezbedna aplikacija sa više zakupaca obično zahteva oba. Administrator zakupca može imati široka ovlašćenja, ali ta ovlašćenja treba da ostanu ograničena na zakupca administratora, osim ako postoji eksplicitno odvojen autoritet na nivou platforme.\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\">Uloga nije granica zakupca\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Dodeljivanje korisniku uloge \u003Ccode>ADMIN\u003C\u002Fcode> ne podrazumeva automatski „administrator samo zakupca A”. Uloga se mora procenjivati zajedno sa verifikovanim kontekstom zakupca i vlasništvom ciljnog resursa nad zakupcem. U suprotnom, validna uloga može postati privilegija preko granica zakupaca.\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\">Napomena o aktuelnim izvorima — 8. oktobar 2026.\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Osnovna razlika je stabilna. NIST definiše RBAC oko korisnika, uloga, dozvola, operacija i objekata. Aktuelne AWS SaaS smernice eksplicitno navode da autentifikacija i autorizacija nisu jednake izolaciji zakupaca i da korisnik može biti autentifikovan i autorizovan, a ipak pristupati resursima drugog zakupca ako izolacija nije posebno sprovedena. OWASP-ove aktuelne smernice za bezbednost u okruženju sa više zakupaca takođe tretiraju izolaciju zakupaca kao zahtev koji se proteže kroz sve slojeve, obuhvatajući API-je, baze podataka, keševe, skladišta, redove i druge deljene resurse.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cnav class=\"editorjs-toc\" data-editorjs-toc=\"true\" aria-label=\"Sadržaj\">\u003Cstrong class=\"editorjs-toc__title\">Sadržaj\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\">Šta RBAC zaista kontroliše\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-10\" class=\"editorjs-toc__link\">Šta izolacija zakupaca zaista kontroliše\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-14\" class=\"editorjs-toc__link\">Najjednostavniji primer\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-19\" class=\"editorjs-toc__link\">Gde se jednostavan primer zaustavlja\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-23\" class=\"editorjs-toc__link\">RBAC naspram izolacije zakupaca\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-25\" class=\"editorjs-toc__link\">Autentifikacija, autorizacija i izolacija su tri različite provere\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-28\" class=\"editorjs-toc__link\">Uloge zahtevaju opseg\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-32\" class=\"editorjs-toc__link\">Kontekst zakupca mora doći iz pouzdanog puta\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-36\" class=\"editorjs-toc__link\">Opseg zakupca pripada pretrazi resursa\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-40\" class=\"editorjs-toc__link\">Provere u aplikaciji su korisne, ali izolacija ne bi trebalo da zavisi od savršenog ponašanja programera\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-44\" class=\"editorjs-toc__link\">Strategije izolacije baze podataka\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-47\" class=\"editorjs-toc__link\">PostgreSQL Row-Level Security može pružiti odbranu u dubinu\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-51\" class=\"editorjs-toc__link\">Izolacija zakupca mora uključivati keševe\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-55\" class=\"editorjs-toc__link\">Skladištenje datoteka i objekata zahteva sopstvenu granicu tenanta\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-59\" class=\"editorjs-toc__link\">Pozadinski poslovi i redovi mogu narušiti izolaciju\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-63\" class=\"editorjs-toc__link\">Pretraga i RAG zahtevaju preuzimanje svesno tenanta\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-68\" class=\"editorjs-toc__link\">Izvedeni podaci nasleđuju osetljivost tenanta\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-71\" class=\"editorjs-toc__link\">Nije sve vlasništvo tenanta\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-75\" class=\"editorjs-toc__link\">Administratori platforme zahtevaju drugačiji model ovlašćenja\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-79\" class=\"editorjs-toc__link\">RBAC se može kombinovati sa atributima\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-83\" class=\"editorjs-toc__link\">Odluke o autorizaciji su najmanje dvodimenzionalne\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-85\" class=\"editorjs-toc__link\">Dokaz originalne implementacije: Aaasaasa AI CMS\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-94\" class=\"editorjs-toc__link\">Zašto je ova razlika još važnija za AI agente\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-98\" class=\"editorjs-toc__link\">Testirajte RBAC i izolaciju zakupaca odvojeno\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-101\" class=\"editorjs-toc__link\">Uobičajeni načini neuspeha\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-103\" class=\"editorjs-toc__link\">Uobičajene zablude\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-105\" class=\"editorjs-toc__link\">Praktičan redosled dizajna\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-107\" class=\"editorjs-toc__link\">RBAC + kontrolna lista izolacije zakupaca\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-109\" class=\"editorjs-toc__link\">Rubni slučajevi i ograničenja\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-115\" class=\"editorjs-toc__link\">Šta bi promenilo ovaj odgovor?\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-119\" class=\"editorjs-toc__link\">Povezano kanonsko znanje\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-125\" class=\"editorjs-toc__link\">Često postavljana pitanja\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-127\" class=\"editorjs-toc__link\">Pojmovnik\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-129\" class=\"editorjs-toc__link\">Zaključak\u003C\u002Fa>\u003C\u002Fli>\u003Cli class=\"editorjs-toc__item\">\u003Ca href=\"#section-133\" class=\"editorjs-toc__link\">Primarni izvori i aktuelne smernice\u003C\u002Fa>\u003C\u002Fli>\u003C\u002Fol>\u003C\u002Fnav>\n\u003Ch2 id=\"section-6\">Šta RBAC zaista kontroliše\u003C\u002Fh2>\n\u003Cp>RBAC je model autorizacije u kojem su dozvole povezane sa ulogama, a korisnici su dodeljeni tim ulogama. Uloga deluje kao administrativna apstrakcija između identiteta i dozvola.\u003C\u002Fp>\n\u003Cp>NIST-ov klasičan rad o RBAC-u formalizuje ovo oko korisnika, uloga, dozvola, operacija i objekata. Praktična korist je da organizacija može da upravlja autorizacijom kroz relativno stabilne uloge zasnovane na poslu ili odgovornosti, umesto da svaku dozvolu direktno povezuje sa svakim korisnikom.\u003C\u002Fp>\n\u003Cp>Uloga kao što je EDITOR može stoga da znači: može da čita sadržaj, piše sadržaj i objavljuje sadržaj. Uloga kao što je ACCOUNTANT može da znači: može da čita podatke za naplatu, usklađuje fakture i odobrava poravnanja.\u003C\u002Fp>\n\u003Ch2 id=\"section-10\">Šta izolacija zakupaca zaista kontroliše\u003C\u002Fh2>\n\u003Cp>Izolacija zakupaca je skup mehanizama koji sprečavaju da jedan zakupac čita, menja, utiče na ili slučajno primi resurse drugog zakupca u deljenom sistemu.\u003C\u002Fp>\n\u003Cp>Zaštićena granica je šira od redova u bazi podataka. Stanje specifično za zakupca može postojati u relacionim tabelama, objektnom skladištu, vektorskim indeksima, keševima, indeksima pretrage, porukama u redovima, fajlovima, privremenim artefaktima, pozadinskim poslovima, analitici, ograničenjima brzine i infrastrukturnim resursima.\u003C\u002Fp>\n\u003Cp>AWS-ove SaaS smernice jasno prave razliku: autorizacija odobrava pristup resursima, dok izolacija zakupaca obezbeđuje da ti resursi ne mogu preći pogrešnu granicu zakupca čak i kada je infrastruktura deljena.\u003C\u002Fp>\n\u003Ch2 id=\"section-14\">Najjednostavniji primer\u003C\u002Fh2>\n\u003Cp>Pretpostavimo da je Alice administrator za Zakupca A, a Bob administrator za Zakupca B. Oba korisnika legitimno imaju istu ADMIN ulogu.\u003C\u002Fp>\n\u003Cp>RBAC može ispravno zaključiti da oba korisnika mogu izvršiti operaciju kao što je users.read. Ali kada Alice zatraži korisnika sa ID-jem 847, aplikacija i dalje mora da verifikuje da korisnik 847 pripada Zakupcu A.\u003C\u002Fp>\n\u003Cp>Ako API proverava samo „Alice ima ADMIN” i zatim izvršava SELECT * FROM users WHERE id = 847, RBAC je uspeo, dok je izolacija zakupaca podbacila.\u003C\u002Fp>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Ispravna odluka o autorizaciji u okruženju sa više zakupaca\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. Autentifikuj principal\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Utvrdi ko je korisnik, servis ili agent.\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. Razreši verifikovani kontekst zakupca\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Odredi koji kontekst zakupca se primenjuje na osnovu pouzdanih informacija o identitetu\u002Fčlanstvu na strani servera.\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. Razreši dozvolu\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Proceni da li uloga ili politika principala dozvoljava traženu operaciju.\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. Ograniči ciljni resurs\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Verifikuj da ciljni objekat pripada dozvoljenom zakupcu ili eksplicitno deljenom opsegu.\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. Primeni na granici pristupa\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Izvrši operaciju nad bazom podataka, kešom, skladištem, redom ili servisom uz primenjena ograničenja zakupca.\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. Revidiraj obe dimenzije\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Zabeleži principal, zakupca, operaciju, cilj i rezultat kako bi pokušaji prelaska granica zakupaca bili vidljivi.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-19\">Gde se jednostavan primer zaustavlja\u003C\u002Fh2>\n\u003Cp>Stvarni sistemi često sadrže nekoliko klasa identiteta: korisnike zakupca, administratore platforme, pozadinske radnike, integracije, agente i operativne servise između zakupaca. Neki od njih legitimno prelaze granice zakupaca.\u003C\u002Fp>\n\u003Cp>To ne uklanja potrebu za izolacijom. To znači da autoritet između zakupaca mora biti eksplicitan, uzak i odvojeno revidiran, a ne da nastaje slučajno iz globalne uloge ili neograničene veze sa bazom podataka.\u003C\u002Fp>\n\u003Cp>Izolacija zakupaca takođe može varirati po sloju. Proizvod može deliti aplikacione servere dok razdvaja baze podataka, ili koristiti deljenu bazu podataka sa politikama na nivou reda dok premium zakupcima daje izolovano skladištenje ili računarske resurse. Ne postoji jedna univerzalna topologija izolacije.\u003C\u002Fp>\n\u003Ch2 id=\"section-23\">RBAC naspram izolacije zakupaca\u003C\u002Fh2>\n\u003Csection class=\"editorjs-comparison my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Dve različite bezbednosne dimenzije\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\">Izolacija zakupaca\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\">Primarno pitanje\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\">Tipična jedinica\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\">Primer\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\">Tipičan neuspeh\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\">Tipična implementacija\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\">Može li postojati samo?\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\">Autentifikacija, autorizacija i izolacija su tri različite provere\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\">Sloj\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Pitanje\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Primer neuspeha\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autentifikacija\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ko je ovaj principal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Napadač se predstavlja kao Alice\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autorizacija \u002F RBAC\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Može li ovaj principal izvršiti ovu operaciju?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Viewer može obrisati korisnike\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Izolacija zakupaca\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Može li ova operacija dosegnuti ovu granicu zakupca\u002Fresursa?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Administrator zakupca A čita porudžbinu zakupca B\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Ove provere su povezane ali se ne mogu međusobno zameniti. Autentifikacija može biti savršena dok autorizacija ne uspe. Autorizacija može biti ispravna dok izolacija zakupaca ne uspe. Bezbedna SaaS putanja zahteva sve primenljive granice.\u003C\u002Fp>\n\u003Ch2 id=\"section-28\">Uloge zahtevaju opseg\u003C\u002Fh2>\n\u003Cp>Reč ADMIN je nepotpuna bez opsega. Može značiti administrator platforme, administrator zakupca, administrator projekta, administrator radnog prostora ili administrator jednog podsistema.\u003C\u002Fp>\n\u003Cp>U sistemima sa više zakupaca, dodela uloga bi normalno trebalo da bude povezana sa članstvom u zakupcu ili drugim eksplicitnim opsegom resursa. Isti korisnik može legitimno biti ADMIN u zakupcu A i VIEWER u zakupcu B.\u003C\u002Fp>\n\u003Cp>Globalni model uloga koji ignoriše ovu razliku može stvoriti curenje privilegija čak i kada je sama mapa dozvola ispravna.\u003C\u002Fp>\n\u003Ch2 id=\"section-32\">Kontekst zakupca mora doći iz pouzdanog puta\u003C\u002Fh2>\n\u003Cp>ID zakupca koji dostavlja klijent je koristan kao selektor, ali nije dokaz autoriteta. Server mora izvesti ili verifikovati članstvo u zakupcu na osnovu autentifikovanog identiteta i trenutnih podataka o autorizaciji.\u003C\u002Fp>\n\u003Cp>OWASP-ove trenutne smernice za multi-tenant preporučuju uspostavljanje konteksta zakupca rano u životnom ciklusu zahteva i eksplicitno upozoravaju da se klijentski zaglavlja ili parametri zahteva ne tretiraju kao dokaz autorizacije.\u003C\u002Fp>\n\u003Cp>Ovo je važno jer trivijalna izmena zahteva sa tenant=A na tenant=B ne sme biti dovoljna da se pređe granica izolacije.\u003C\u002Fp>\n\u003Ch2 id=\"section-36\">Opseg zakupca pripada pretrazi resursa\u003C\u002Fh2>\n\u003Cp>Uobičajen obrazac izolacije na nivou aplikacije je uključivanje opsega zakupca u isti upit koji razrešava resurs.\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\">Slabo pretraživanje\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Jače pretraživanje sa opsegom zakupca\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>Ovaj obrazac nije jedini mogući mehanizam izolacije, ali zadržava vlasništvo nad zakupcem blizu operacije pristupa podacima i sprečava da ID objekta postane sposobnost za pristup drugim zakupcima.\u003C\u002Fp>\n\u003Ch2 id=\"section-40\">Provere u aplikaciji su korisne, ali izolacija ne bi trebalo da zavisi od savršenog ponašanja programera\u003C\u002Fh2>\n\u003Cp>AWS smernice za izolaciju eksplicitno upozoravaju da se sprovođenje izolacije ne prepušta samo programerima servisa. U velikoj bazi koda, vremenom će neki upit, keš ključ ili putanja radnika možda izostaviti opseg zakupca.\u003C\u002Fp>\n\u003Cp>Odbrana u dubinu stoga može preneti izolaciju u deljeni middleware, slojeve repozitorijuma\u002Fservisa, mehanizme politika, bezbednost na nivou redova baze podataka, namenske akreditive, odvojene šeme ili odvojene baze podataka u zavisnosti od rizika i arhitekture.\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\">Izolaciju bi trebalo teško zaboraviti\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Najjača granica je ona koju običan aplikativni kod ne može lako zaobići izostavljanjem jednog uslova \u003Ccode>tenantId\u003C\u002Fcode>.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-44\">Strategije izolacije baze podataka\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\">Strategija\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Granica\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Snaga \u002F kompromis\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Deljene tabele + ključ zakupca\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Politika reda\u002Faplikacije\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Operativno efikasno; zahteva iscrpno određivanje opsega zakupca i jake testove\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Deljene tabele + RLS baze podataka\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Granica politike baze podataka\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Smanjuje zavisnost od svakog upita aplikacije; zahteva ispravne uloge, kontekst zakupca sesije\u002Ftransakcije i pokrivenost politikama\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odvojene šeme\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Granica imenskog prostora \u002F DB uloge\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Jača logička razdvojenost; veća operativna složenost\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odvojene baze podataka\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Granica baze podataka \u002F akreditiva\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Jaka izolacija i jednostavnija priča o domenu uticaja; veći troškovi obezbeđivanja i operacija\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odvojena infrastruktura\u002Fnalog\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Granica infrastrukture\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Najjača gruba razdvojenost; najveći trošak i operativni overhead\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Hibridno\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Po radnom opterećenju\u002Fklasi podataka\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Omogućava jaču izolaciju samo tamo gde rizik\u002Fusaglašenost to opravdava\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>OWASP-ova aktuelna Multi-Tenant Security Cheat Sheet navodi odvojene baze podataka, odvojene šeme, deljene tabele sa kontrolama na nivou redova i hibridne modele. Ispravan model zavisi od nivoa pretnje, usaglašenosti, performansi i operativnih troškova.\u003C\u002Fp>\n\u003Ch2 id=\"section-47\">PostgreSQL Row-Level Security može pružiti odbranu u dubinu\u003C\u002Fh2>\n\u003Cp>Sa deljenim tabelama, PostgreSQL Row-Level Security može sprovesti predikat zakupca na nivou baze podataka tako da obični upiti ne mogu videti redove van aktivne politike zakupca.\u003C\u002Fp>\n\u003Cp>Međutim, RLS nije magija. PostgreSQL superkorisnici i uloge sa BYPASSRLS mogu zaobići politike redova. OWASP stoga preporučuje korišćenje uloge sa najmanjim privilegijama na putu zahteva i testiranje istog režima konekcije\u002Fpooling-a koji se koristi u produkciji.\u003C\u002Fp>\n\u003Cp>Ponovno korišćenje konekcije je još jedna važna ivica: kontekst zakupca mora biti bezbedno postavljen i resetovan za svaku transakciju\u002Fzahtev kako jedna pooled konekcija ne bi mogla da procuri prethodno stanje zakupca.\u003C\u002Fp>\n\u003Ch2 id=\"section-51\">Izolacija zakupca mora uključivati keševe\u003C\u002Fh2>\n\u003Cp>Upit baze podataka može biti savršeno ograničen i ipak procuriti podatke kroz deljeni keš ključ.\u003C\u002Fp>\n\u003Cp>Ako user:42 postoji i kod Zakupca A i kod Zakupca B, globalni keš ključ može vratiti vrednost pogrešnog zakupca. Keš ključevi osetljivi na zakupca treba da uključe svaki atribut koji menja vidljivost ili semantiku rezultata, obično zakupca, korisnika, lokal, skup funkcija ili verziju dozvole.\u003C\u002Fp>\n\u003Cp>Particionisanje keša je odbrana u dubinu, a ne zamena za autorizaciju. Zahtev i dalje mora biti autorizovan pre nego što se vrati zaštićeni keširani sadržaj.\u003C\u002Fp>\n\u003Ch2 id=\"section-55\">Skladištenje datoteka i objekata zahteva sopstvenu granicu tenanta\u003C\u002Fh2>\n\u003Cp>Skladištenje objekata treba da razlikuje globalne, objekte u okviru tenanta i objekte u okviru korisnika. Sam prefiks foldera je samo konvencija imenovanja osim ako politika pristupa zaista ograničava čitanje i pisanje.\u003C\u002Fp>\n\u003Cp>Robusniji dizajni mogu koristiti ključeve objekata svesne tenanta, politike bucket-a, odvojene bucket-e\u002Fnaloge ili ključeve za šifrovanje specifične za tenanta kada rizik ili usklađenost zahtevaju jaču izolaciju.\u003C\u002Fp>\n\u003Cp>Potpisani URL-ovi moraju biti autorizovani pre izdavanja i ograničeni na tačan objekat i operaciju. posedovanje identifikatora objekta samo po sebi ne bi trebalo da daje pristup između tenanata.\u003C\u002Fp>\n\u003Ch2 id=\"section-59\">Pozadinski poslovi i redovi mogu narušiti izolaciju\u003C\u002Fh2>\n\u003Cp>Asinhroni poslovi često napuštaju kontekst originalnog HTTP zahteva, što olakšava pogrešno rukovanje propagacijom tenanta. Poruka u redu koja sadrži tenantId nije dovoljan dokaz da je producent bio autorizovan.\u003C\u002Fp>\n\u003Cp>Radnik treba da nosi verifikovani identitet servisa\u002Fkorisnika ili pouzdan omot posla, ponovo uspostavi kontekst tenanta i ponovo autorizuje posledične operacije na granici potrošača.\u003C\u002Fp>\n\u003Cp>Izolacija tenanta takođe uključuje dostupnost. Jedan tenant ne bi trebalo da može monopolizovati deljene radnike, redove, bazene konekcija ili računske resurse na način koji materijalno degradira druge tenante.\u003C\u002Fp>\n\u003Ch2 id=\"section-63\">Pretraga i RAG zahtevaju preuzimanje svesno tenanta\u003C\u002Fh2>\n\u003Cp>Multi-tenant AI uvodi još jednu kopiju problema izolacije. Dokumenti mogu biti podeljeni u delove, ugrađeni i sačuvani u vektorskom indeksu nakon unosa.\u003C\u002Fp>\n\u003Cp>OWASP-ove trenutne smernice za RAG bezbednost navode da kontrola pristupa mora biti sprovedena u trenutku preuzimanja i da delovi od Tenanta A ne smeju biti preuzeti upitima od Tenanta B. Ne može se jednostavno pretpostaviti da dozvole na nivou dokumenta automatski preživljavaju deljenje.\u003C\u002Fp>\n\u003Cp>Vektorski indeks stoga zahteva metapodatke o tenantu\u002Fpristupu ili fizički\u002Flogički odvojene kolekcije u skladu sa dizajnom izolacije. Filteri za preuzimanje treba da se primenjuju pre nego što neovlašćeni sadržaj može ući u kontekst modela.\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\">Model nikada ne sme biti filter tenanta\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Ne preuzimajte delove između tenanata i zatim ne instruirajte jezički model da ih ignoriše. Kada zaštićeni podaci uđu u kontekst modela, granica izolacije je već narušena.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-68\">Izvedeni podaci nasleđuju osetljivost tenanta\u003C\u002Fh2>\n\u003Cp>Ugrađivanja, indeksi pretrage, sličice, generisani rezimei, keševi, redovi analitike i AI odgovori izvedeni su iz izvornih podataka. Njihov obim tenanta treba da prati izvor osim ako eksplicitna transformacija stvara legitiman deljeni\u002Fglobalni artefakt.\u003C\u002Fp>\n\u003Cp>Brisanje i odjava stoga moraju da se propagiraju izvan kanonskog reda. Uklanjanje dokumenta tenanta dok ostaju delovi koji se mogu pretraživati ili keširani rezimei može zadržati izloženost između tenanata ili nakon perioda zadržavanja.\u003C\u002Fp>\n\u003Ch2 id=\"section-71\">Nije sve vlasništvo tenanta\u003C\u002Fh2>\n\u003Cp>Multi-tenant platforme često imaju namerno globalne resurse: taksonomije proizvoda, javne šablone, sistemske dozvole, definicije funkcija ili javni sadržaj.\u003C\u002Fp>\n\u003Cp>Najbezbedniji model je eksplicitna klasifikacija: globalno, u okviru zakupca, u okviru korisnika ili eksplicitno između zakupaca. Nejasni resursi su mesto gde počinje slučajno curenje.\u003C\u002Fp>\n\u003Cp>Namerno deljeni objekat treba da ima dokumentovan razlog zašto je globalan, a ne da mu jednostavno nedostaje povezanost sa zakupcem.\u003C\u002Fp>\n\u003Ch2 id=\"section-75\">Administratori platforme zahtevaju drugačiji model ovlašćenja\u003C\u002Fh2>\n\u003Cp>Operater platforme može morati da pregleda više zakupaca radi podrške, usklađenosti ili infrastrukturnih operacija. Modelovanje ovoga kao običnog ADMIN-a zakupca sa slučajnim globalnim pristupom bazi podataka slabi i bezbednost i mogućnost revizije.\u003C\u002Fp>\n\u003Cp>Bolji dizajn koristi poseban identitet platforme ili eksplicitnu dozvolu između zakupaca, jaču autentifikaciju, ograničenje svrhe, detaljnu reviziju i, gde je prikladno, kontrole odobrenja ili prinudnog pristupa.\u003C\u002Fp>\n\u003Cp>Pristup između zakupaca bi stoga trebalo da bude imenovana sposobnost, a ne odsustvo filtera zakupca.\u003C\u002Fp>\n\u003Ch2 id=\"section-79\">RBAC se može kombinovati sa atributima\u003C\u002Fh2>\n\u003Cp>Neke odluke zavise od više od uloge. Članstvo u zakupcu, region, vlasnik resursa, nivo pretplate, vreme, članstvo u projektu ili klasifikacija podataka mogu uticati na pristup.\u003C\u002Fp>\n\u003Cp>RBAC i ABAC se ne isključuju međusobno. AWS-ove trenutne smernice za autorizaciju u više zakupaca razmatraju RBAC, ABAC i hibridne modele. Uloga može definisati široku odgovornost dok atributi ograničavaju kojoj konkretnoj instanci resursa se može pristupiti.\u003C\u002Fp>\n\u003Cp>Ključno arhitektonsko pravilo ostaje: ne kodirajte izolaciju zakupaca samo kao slučajni naziv uloge ako je identitet zakupca granica resursa prvog reda.\u003C\u002Fp>\n\u003Ch2 id=\"section-83\">Odluke o autorizaciji su najmanje dvodimenzionalne\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\">Dozvola uloge\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Odnos sa zakupcem\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Odluka\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\">Porudžbina pripada Alisinom zakupcu\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dozvoli\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\">Porudžbina pripada drugom zakupcu\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odbij\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\">Porudžbina pripada Alisinom zakupcu\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dozvoli ako uloga uključuje pisanje\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\">Porudžbina pripada drugom zakupcu\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odbij\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Platform support\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">support.cross_tenant.read\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Eksplicitni obim podrške + revidirani ciljni zakupac\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Potencijalno dozvoli pod politikom platforme\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Background worker\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">orders.process\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Obim pouzdane usluge za zakupca posla\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dozvoli samo za verifikovanog zakupca posla\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-85\">Dokaz originalne implementacije: 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\">Dokaz originalne implementacije\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">Aaasaasa AI CMS sadrži konkretnu RBAC implementaciju u okviru zakupca. Koristan je dokaz kako se autorizacija uloga i obim zakupca mogu kombinovati, ali ga ne treba predstavljati kao dokaz da svaki sloj skladištenja, keša ili infrastrukture ima potpunu izolaciju zakupaca.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Cp>RBAC servis definiše tipizirane kodove dozvola kao što su cms.content.read, shop.orders.write, billing.reconcile i users.roles. Sistemske uloge mapiraju te dozvole u imenovane skupove odgovornosti.\u003C\u002Fp>\n\u003Cp>Zapisi uloga se kreiraju i razrešavaju sa tenantId. Sistemske uloge se ažuriraju ili ubacuju korišćenjem složenog identiteta zakupac\u002Fkod, a listanje uloga je filtrirano po zakupcu.\u003C\u002Fp>\n\u003Cp>Ažuriranje i brisanje uloge prvo razrešava ulogu koristeći i ID uloge i ID zakupca. Dodele uloga korisnicima se takođe čuvaju i zamenjuju u okviru trenutnog konteksta zakupca.\u003C\u002Fp>\n\u003Cp>Razrešavanje dozvola čita eksplicitne dodele uloga korisnicima ograničene i tenantId i userId. Ovo sprečava da dodela uloge jednog zakupca automatski postane dodela uloge drugog zakupca.\u003C\u002Fp>\n\u003Cp>Na API nivou, administrativne RBAC rute razrešavaju kontekst zakupca pre kreiranja ili izmene uloga. To je ispravan smer: administracija dozvola i sama mora poštovati zakupništvo.\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\">Uočeni obrazac implementacije\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Bezbednosno značenje\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Tipizirani kodovi dozvola\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RBAC rečnik operacija je eksplicitan\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Sistemska uloga → mape dozvola\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Uloge agregiraju dozvole umesto hardkodiranja korisnika\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">tenantId_code identitet uloge\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ista logička uloga može postojati odvojeno po zakupcu\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Pretraga uloge koristi id + tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Izmena uloge je ograničena na zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Relacija korisnik-uloga čuva tenantId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Članstvo se ne izvodi globalno samo iz uloge\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Razrešavanje dozvola koristi tenantId + userId\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autorizacija se evaluira unutar konteksta zakupca\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\">Šta ovi dokazi ne dokazuju\u003C\u002Fstrong>\u003Cdiv class=\"text-gray-700 dark:text-gray-200\">RBAC ograničen na zakupca je jedan sloj. Potpuna izolacija zakupaca mora takođe pokriti sve pretrage resursa u vlasništvu zakupca, baze podataka, keševe, fajlove, pretrage\u002Fvektorske indekse, pozadinske poslove, integracije i operativne putanje. Dokazi iz repozitorijuma ovde podržavaju obrazac dizajna RBAC\u002Fopsega zakupca, a ne tvrdnju o nezavisno revidiranoj SaaS izolaciji.\u003C\u002Fdiv>\u003C\u002Faside>\n\u003Ch2 id=\"section-94\">Zašto je ova razlika još važnija za AI agente\u003C\u002Fh2>\n\u003Cp>AI agenti mogu pretvoriti grešku u dozvolama u niz akcija. Ako agent dobije široki alat orders.read bez prinude ograničene na zakupca, greška u rezonovanju ili prompt-injection može izazvati čitanje između zakupaca mašinskom brzinom.\u003C\u002Fp>\n\u003Cp>Opisi alata agenta mogu pominjati ograničenja zakupca, ali prinuda se i dalje mora odvijati u pouzdanom sloju izvršavanja\u002Fusluge\u002Fpodataka. Uputstva na prirodnom jeziku nisu granica autorizacije.\u003C\u002Fp>\n\u003Cp>Isto važi i za RAG: agent može imati dozvolu da koristi alat za pretragu, dok pozadina pretrage i dalje mora sprečiti da upit Zakupca A vrati delove Zakupca B.\u003C\u002Fp>\n\u003Ch2 id=\"section-98\">Testirajte RBAC i izolaciju zakupaca odvojeno\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\">Porodica testova\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Šta bi trebalo da dokaže\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test degradacije uloge\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Korisnik bez dozvole ne može izvršiti operaciju čak ni unutar svog zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test objekta između zakupaca\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Korisnik sa ispravnom ulogom i dalje ne može pristupiti istoj vrsti resursa u drugom zakupcu\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Krivotvorenje identifikatora\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Promena ID-jeva objekata\u002Fzakupaca ne prelazi opseg\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test liste\u002Fgrupnih endpointa\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Široki upiti vraćaju samo autorizovane podatke zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test ponovne upotrebe keša\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Dva zakupca koja koriste ponovo upotrebljene procese\u002Fveze nikada ne primaju keširano stanje onog drugog\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test RLS uloge zahteva\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Produkcijska uloga zahteva ne može zaobići politike redova\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test asinhronog radnika\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Kontekst zakupca preživljava stavljanje u red i ponovo se validira pri potrošnji\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test vektorske pretrage\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Upit Zakupca A nikada ne pronalazi delove Zakupca B\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test platformskog administratora\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mogućnost između zakupaca je eksplicitna, uska i revizibilna\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Test odjave\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Podaci zakupca i izvedeni indeksi\u002Fkeševi se uklanjaju u skladu sa politikom\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>OWASP smernice za regresiju autorizacije posebno ističu testove granica između zakupaca jer promene koda u keširanju, upitima ili deljenim uslugama mogu tiho pokvariti izolaciju čak i kada testovi uloga nastave da prolaze.\u003C\u002Fp>\n\u003Ch2 id=\"section-101\">Uobičajeni načini neuspeha\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\">Način neuspeha\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Zašto ne uspeva\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Provera uloge ali ne i zakupca\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Validna uloga postaje autoritet između zakupaca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verovanje ID-ju zakupca iz zahteva\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Klijent kontroliše selektor izolacije\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ograničavanje UI ali ne i API-ja\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Skrivena dugmad ne štite pozadinske resurse\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Endpoint za detalje svestan zakupca, endpoint liste bez opsega\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Grupna čitanja otkrivaju druge zakupce\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Filter zakupca u većini upita\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Jedna zaboravljena putanja kvari granicu\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Globalni ključevi keša\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ispravna izolacija baze podataka se zaobilazi keširanim podacima\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Deljeni vektorski indeks bez prinudnih filtera metapodataka\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RAG pronalazi delove drugog zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">ID zakupca u poruci reda tretiran kao autorizacija\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Krivotvoren ili pogrešno proizveden posao može preći granicu zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Platformski administrator modelovan kao običan ADMIN\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Moć između zakupaca postaje implicitna i teška za reviziju\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Uloga kopirana globalno kroz članstva u zakupcima\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Korisnik dobija dozvole u zakupcima gde nikada nije dodeljen\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odvojene baze podataka ali deljeni privilegovani akreditiv\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Aplikacija i dalje može preći baze podataka ako je njen akreditiv preširok\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RLS sa BYPASSRLS ulogom zahteva\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Politika baze podataka postoji ali ne štiti stvarnu putanju zahteva\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Nasumični UUID-ovi tretirani kao izolacija\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Teško pogodivi identifikatori smanjuju nabrajanje ali ne autorizuju pristup\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-103\">Uobičajene zablude\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\">Zabluda\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Ispravka\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„RBAC obezbeđuje izolaciju zakupaca.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">RBAC kontroliše dozvole; izolacija takođe zahteva opseg zakupca\u002Fresursa.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Ako je korisnik administrator, provere zakupca nisu potrebne.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Administratorski autoritet i dalje mora imati eksplicitan opseg.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„ID zakupca u JWT-u je dovoljan.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Može biti pouzdan ulaz samo ako se validira i primenjuje dosledno na svaku zaštićenu putanju resursa.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Odvojene baze podataka uklanjaju zahteve za autorizacijom.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Korisnicima su i dalje potrebne dozvole na nivou operacija unutar njihovog zakupca.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Kolona tenant_id znači da je sistem izolovan.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Polje pomaže samo ako putanje pristupa ga primenjuju.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„UUID-ovi sprečavaju pristup između zakupaca.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Nepredvidivi identifikatori su odbrana u dubinu, a ne autorizacija.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„RLS znači da aplikacijski kod ne treba bezbednosne provere.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Aplikacijska autorizacija, ispravne DB uloge i pokrivenost politikama su i dalje važni.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Jedna deljena vektorska baza je nesigurna.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Može biti sigurna ako je izolacija sprovodiva i verifikovana; fizičko razdvajanje je jedna opcija, ne jedina.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Platformska podrška zahteva globalnog ADMIN-a.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Podrška između zakupaca treba da bude poseban, ograničen i revizibilan autoritet.\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">„Interni servisi mogu preskočiti provere zakupca.“\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Interne putanje i dalje mogu biti kompromitovane ili pogrešno konfigurisane i moraju sačuvati kontekst zakupca.\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-105\">Praktičan redosled dizajna\u003C\u002Fh2>\n\u003Csection class=\"editorjs-process my-6\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">Dizajnirajte dozvole i izolaciju kao odvojene dimenzije\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. Definišite vlasništvo zakupca\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Klasifikujte koji entiteti i resursi su globalni, ograničeni na zakupca, ograničeni na korisnika ili namerno između zakupaca.\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. Definišite operacije\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Kreirajte eksplicitne dozvole za čitanje, pisanje, objavljivanje, odobravanje, administraciju i druge poslovne akcije.\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. Definišite uloge\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Grupirajte dozvole prema odgovornostima bez ugrađivanja slučajnog globalnog opsega.\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. Definišite opseg članstva\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Vežite dodele uloga za kontekst zakupca\u002Fradnog prostora\u002Fprojekta u kojem se primenjuju.\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. Razrešite pouzdan kontekst zakupca\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Izvedite identitet zakupca iz autentifikovanog, na serveru verifikovanog članstva ili autorizacije servisa.\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. Primenite vlasništvo resursa\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Primenite opseg zakupca na svakoj granici podataka\u002Fusluga u vlasništvu zakupca.\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. Dodajte odbranu u dubinu\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Koristite RLS, odvojene akreditive, šeme\u002Fbaze podataka, politike skladištenja ili mašine politika gde rizik to opravdava.\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. Prenesite opseg kroz izvedene sisteme\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Sačuvajte metapodatke zakupca u kešu, pretrazi, vektorskim indeksima, redovima, fajlovima i analitici.\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. Modelujte operacije između zakupaca eksplicitno\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Odvojite platformsku administraciju i identitete servisa od običnih uloga zakupca.\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. Testirajte obe ose\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Pokrenite negativne testove za nedostajuću dozvolu i za pogrešnog zakupca nezavisno.\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. Revidirajte zakupca + dozvolu zajedno\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Beležite ko je delovao, u kom zakupcu, na kom cilju i pod kojim autoritetom.\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. Ponovo testirajte nakon promena šeme\u002Fizvršavanja\u003C\u002Fdiv>\u003Cdiv class=\"mt-1 text-sm text-gray-600 dark:text-gray-300\">Izolacija se može pokvariti kada se uvedu nove tabele, keševi, redovi ili putanje pronalaženja.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-107\">RBAC + kontrolna lista izolacije zakupaca\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\">Pitanje\u003C\u002Fth>\u003Cth class=\"border border-gray-300 px-4 py-2 text-left font-semibold\">Očekivani odgovor\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ko je principal?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Autentifikovani identitet korisnika\u002Fservisa\u002Fagenta\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Koji kontekst zakupca se primenjuje?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Na serveru verifikovano članstvo ili opseg servisa\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Koja operacija se zahteva?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Tipizirana dozvola ili akcija politike\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li principal ima tu dozvolu?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odluka o ulozi\u002Fpolitici\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ko je vlasnik ciljnog resursa?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Eksplicitna klasifikacija zakupca\u002Fglobalnog\u002Fkorisnika\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li se opseg resursa poklapa sa autoritetom?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Pretraga\u002Fpolitika svesna zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Može li skladište zaobići aplikacijske provere?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odluka o odbrani u dubinu dokumentovana\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su keševi sigurni za zakupce?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ključevi\u002Fimenski prostori i autorizacija čuvaju opseg zakupca\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su fajlovi\u002Fblobovi sigurni za zakupce?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Politika objekata i izdavanje potpisanih URL-ova primenjuju opseg\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su asinhroni poslovi sigurni za zakupce?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Verifikovani kontekst se propagira i ponovo validira\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su RAG\u002Fpretraga sigurni za zakupce?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Izolacija metapodataka\u002Fkolekcija se primenjuje pre konteksta modela\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su administratori između zakupaca eksplicitni?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Odvojen autoritet, kontrole i revizija\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Mogu li obični akreditivi zaobići izolaciju?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Ne, ili strogo dokumentovana izuzetna putanja\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da li su negativni testovi između zakupaca automatizovani?\u003C\u002Ftd>\u003Ctd class=\"border border-gray-300 px-4 py-2\">Da za svaki relevantni sloj pristupa\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Ch2 id=\"section-109\">Rubni slučajevi i ograničenja\u003C\u002Fh2>\n\u003Cp>Korisnik može pripadati većem broju tenanata. Trenutni tenant bi stoga trebalo da bude eksplicitni kontekst izvršavanja, a ne da se trajno izvodi iz korisničkog naloga.\u003C\u002Fp>\n\u003Cp>Neki resursi se namerno dele između odabranih tenanata, kao što su prostori za saradnju ili podaci konzorcijuma. To zahteva eksplicitni model deljenja; pretvaranje da resurs pripada jednom tenantu i dodavanje izuzetaka kasnije obično stvara dvosmislenu autorizaciju.\u003C\u002Fp>\n\u003Cp>Izolacija od bučnih suseda je povezana, ali različita od izolacije poverljivosti. Tenant možda nikada neće videti podatke drugog tenanta, ali i dalje može da iscrpi deljene CPU resurse, kapacitet reda čekanja ili veze sa bazom podataka. Ograničenja brzine i kvote resursa stoga mogu biti svesne tenanta kao granica dostupnosti.\u003C\u002Fp>\n\u003Cp>Fizička izolacija nije automatski bezbedna ako akreditivi kontrolne ravni ili administrativne putanje mogu preći granice. Logička izolacija nije automatski slaba ako se politike centralno sprovode, uz najmanje privilegije i temeljno testiranje.\u003C\u002Fp>\n\u003Cp>Zahtevi za izolaciju tenanata mogu se razlikovati po klasi podataka. Podaci javnog kataloga, evidencija naplate i privatni AI dokumenti mogu opravdati različite granice skladištenja i enkripcije unutar istog SaaS proizvoda.\u003C\u002Fp>\n\u003Ch2 id=\"section-115\">Šta bi promenilo ovaj odgovor?\u003C\u002Fh2>\n\u003Cp>Tačna implementacija se menja u zavisnosti od arhitekture: serverless API-ji, Kubernetes, PostgreSQL, skladištenje objekata, vektorske baze podataka i mehanizmi politika izlažu različite primitive izolacije.\u003C\u002Fp>\n\u003Cp>Potrebna snaga se takođe menja u zavisnosti od regulative, ugovora sa klijentima, osetljivosti podataka, modela pretnji i operativnog obima. Neki tenanti mogu opravdati izolovane baze podataka ili infrastrukturu, dok drugi dele zajedničke resurse.\u003C\u002Fp>\n\u003Cp>Konceptualna razlika se ne menja: dozvola za izvršavanje operacije nije isto što i dozvola za prelazak granice tenanta.\u003C\u002Fp>\n\u003Ch2 id=\"section-119\">Povezano kanonsko znanje\u003C\u002Fh2>\n\u003Cp>S01 je preduslov bezbednosne granice za Enterprise AI Architecture i AI Governance. Kada AI alati, RAG ili agenti rade nad podacima više tenanata, identitet tenanta mora da putuje kroz pretragu, izvršavanje alata, memoriju, keševe i revizorske tragove.\u003C\u002Fp>\n\u003Cp>Takođe se direktno povezuje sa Agentic AI: sposobnost alata i dozvola uloge i dalje moraju biti ograničene vlasništvom tenanta pre nego što agent može da čita ili menja poslovne resurse.\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: Objašnjen protokolni stek agenata\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">Interoperabilnost protokola ne zamenjuje autorizaciju ili izolaciju tenanata. Otkrivanje sposobnosti i poslovni autoritet ostaju odvojene arhitektonske brige.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Pročitajte članak o protokolarnom steku →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Cp>Za RAG, izolacija tenanata mora biti sprovedena pre nego što zaštićeni delovi dođu u kontekst modela.\u003C\u002Fp>\n\u003Caside class=\"editorjs-referral my-6\">\u003Ca href=\"https:\u002F\u002Fstajic.de\u002Fsr\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\">Šta je RAG? Najjednostavnije objašnjenje kako funkcioniše\u003C\u002Fstrong>\u003Cp class=\"mt-2 text-sm text-gray-600 dark:text-gray-300\">Osnova pretrage za razumevanje gde se mora sprovesti filtriranje izvora svesno tenanta i izolacija vektorskog skladišta.\u003C\u002Fp>\u003Cspan class=\"mt-3 inline-flex text-sm font-medium text-primary-600 dark:text-primary-400\">Pročitajte osnove RAG-a →\u003C\u002Fspan>\u003C\u002Fdiv>\u003C\u002Fa>\u003C\u002Faside>\n\u003Ch2 id=\"section-125\">Često postavljana pitanja\u003C\u002Fh2>\n\u003Csection class=\"editorjs-faq my-6 rounded-xl border border-gray-200 p-5 dark:border-gray-700\">\u003Ch3 class=\"mb-3 text-lg font-semibold\">RBAC vs izolacija tenanata - često postavljana pitanja\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\">Koja je razlika između RBAC-a i izolacije tenanata?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RBAC određuje koje operacije principal može da izvrši. Izolacija tenanata određuje kojim resursima tog tenanta te operacije mogu da pristupe. Bezbedne aplikacije sa više tenanata obično zahtevaju oboje.\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\">Da li ADMIN uloga automatski dozvoljava pristup svim tenantima?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Ne. ADMIN bi trebalo da ima eksplicitni obim. Administrator tenanta obično ima široke dozvole samo unutar tog tenanta, dok administraciju platforme između tenanata treba modelovati odvojeno.\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\">Da li je autentifikacija dovoljna za izolaciju tenanata?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Ne. Autentifikacija dokazuje identitet. Autorizacija kontroliše dozvoljene radnje. Izolacija tenanata dodatno sprečava da te radnje dosegnu resurse pogrešnog tenanta.\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\">Da li tenantId treba čuvati u JWT-u?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Može biti jedan od ulaza u kontekst tenanta, ali server mora da verifikuje trenutno članstvo\u002Fovlašćenje i sprovede obim na granicama zaštićenih resursa. Sam zahtev ne zamenjuje kontrolne mehanizme izolacije.\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\">Da li mi je potrebna odvojena baza podataka za svaki tenant?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Ne nužno. Modeli izolacije sa deljenim tabelama, RLS-om, šemom, bazom podataka, infrastrukturom i hibridni modeli mogu svi biti validni u zavisnosti od rizika i operativnih zahteva.\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\">Može li PostgreSQL RLS da zameni filtere tenanata u aplikativnom kodu?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">RLS može da pruži snažnu odbranu u dubinu, ali ispravne uloge baze podataka, kontekst zahteva, pokrivenost politikama i autorizacija na nivou aplikacije i dalje su važni.\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\">Kako RAG treba da sprovede izolaciju tenanata?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Obim tenanta\u002Fpristupa treba sprovesti tokom pretrage tako da neovlašćeni delovi nikada ne uđu u kontekst modela. Sačuvajte metapodatke pristupa kroz deljenje na delove i indeksiranje.\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\">Može li jedan korisnik imati različite uloge u različitim tenantima?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Da. To je uobičajeno u B2B SaaS-u i snažan razlog da se dodele uloga ograniče članstvom u tenantu, umesto da se uloge tretiraju kao globalno vezane za korisnika.\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\">Koji je najbolji test za izolaciju tenanata?\u003C\u002Fh4>\u003Cdiv class=\"mt-2 text-gray-600 dark:text-gray-300\">Koristite negativne testove između tenanata: kreirajte najmanje dva tenanta, dajte korisniku validne dozvole u jednom tenantu, zatim dokažite da svaka zaštićena putanja odbija pristup resursima drugog tenanta.\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\n\u003Ch2 id=\"section-127\">Pojmovnik\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\">Ključni pojmovi bezbednosti više zakupaca\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\">Kontrola pristupa zasnovana na ulogama: model autorizacije koji povezuje dozvole sa ulogama i dodeljuje korisnike ili subjekte tim ulogama.\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\">Zakupac\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Korisnik, organizacija, radni prostor ili drugi izolovani logički potrošač deljenog sistema sa više zakupaca.\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\">Izolacija zakupaca\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Mehanizmi koji sprečavaju jednog zakupca da pristupa, menja ili prima resurse drugog zakupca u deljenom sistemu.\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\">Autentifikacija\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Provera identiteta korisnika, servisa ili drugog subjekta.\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\">Autorizacija\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Proces odlučivanja koji utvrđuje da li subjekat može da izvrši traženu operaciju nad resursom.\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\">Dozvola\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Definisana dozvoljena operacija ili sposobnost, kao što su orders.read ili 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\">Uloga\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Imenovana grupa dozvola povezana sa odgovornošću ili funkcijom.\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\">Kontrola pristupa zasnovana na atributima: autorizacija zasnovana na atributima subjekta, resursa, radnje ili okruženja.\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\">Bezbednost na nivou reda\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Mehanizam politike baze podataka koji ograničava koje redove uloga ili sesija baze podataka može da čita ili menja.\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\">Pristup između zakupaca\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Svaki put pristupa u kojem subjekat koji deluje u kontekstu jednog zakupca dospeva do resursa koji pripadaju drugom zakupcu.\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\">Administrator platforme\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Privilegovani operativni identitet sa eksplicitno modelovanim ovlašćenjem koje može da obuhvata više zakupaca.\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\">Kontekst zakupca\u003C\u002Fdt>\u003Cdd class=\"mt-1 text-gray-600 dark:text-gray-300\">Verifikovani obim zakupca pod kojim se izvršava trenutni zahtev, posao ili operacija agenta.\u003C\u002Fdd>\u003C\u002Fdiv>\u003C\u002Fdl>\u003C\u002Fsection>\n\u003Ch2 id=\"section-129\">Zaključak\u003C\u002Fh2>\n\u003Cp>RBAC i izolacija zakupaca su komplementarni, a ne konkurentski bezbednosni mehanizmi. RBAC strukturira operativne dozvole; izolacija zakupaca ograničava granicu resursa unutar koje te dozvole mogu da se primenjuju.\u003C\u002Fp>\n\u003Cp>Robustan zahtev sa više zakupaca stoga zahteva više od „korisnik ima ulogu ADMIN“. Potreban je verifikovani subjekat, verifikovani kontekst zakupca, dozvoljena operacija, cilj u okviru zakupca i primena na svakom sloju resursa koji može da nosi podatke u vlasništvu zakupca.\u003C\u002Fp>\n\u003Cp>Najkraće pouzdano pravilo je: autorizuj radnju, zatim izoluj obim — i nikada ne pretpostavljaj da jedno dokazuje drugo.\u003C\u002Fp>\n\u003Ch2 id=\"section-133\">Primarni izvori i aktuelne smernice\u003C\u002Fh2>\n\u003Cp>Izvori navedeni u nastavku podržavaju definiciju RBAC-a i aktuelne smernice za izolaciju zakupaca. Odsek Aaasaasa AI CMS predstavlja originalne dokaze o implementaciji i namerno je ograničen na obrasce koda koji su verifikovani.\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 — Kontrola pristupa zasnovana na ulogama\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">NIST pregled RBAC modela i INCITS RBAC standarda, uključujući korisnike, uloge, dozvole, operacije i objekte.\u003C\u002Fp>\u003C\u002Fa>\n\u003Ca href=\"https:\u002F\u002Fcsrc.nist.gov\u002Fglossary\u002Fterm\u002Frole_based_access_control\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"editorjs-link-tool block border border-gray-200 dark:border-gray-700 rounded-lg p-4 transition text-gray-900 dark:text-gray-100 hover:border-primary-500 hover:bg-primary-50 dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-gray-100\">\u003Cstrong class=\"block font-semibold\">NIST CSRC — RBAC pojmovnik\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne NIST definicije kontrole pristupa zasnovane na ulogama kao dodele dozvola putem uloga.\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 — Način razmišljanja o izolaciji\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">AWS SaaS smernice koje eksplicitno razlikuju autentifikaciju\u002Fautorizaciju od izolacije zakupaca i preporučuju deljene mehanizme izolacije.\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 — Česta pitanja o autorizaciji sa više zakupaca\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne smernice koje objašnjavaju razliku između autorizacije i izolacije zakupaca u SaaS aplikacijama.\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 — Razmatranja dizajna sa više zakupaca\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne SaaS smernice koje razlikuju izolaciju zakupaca od autorizacije i razmatraju modele politike autorizacije sa udruženim\u002Fizolovanim resursima.\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 — Šalabahter za bezbednost aplikacija sa više zakupaca\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne praktične smernice za kontekst zakupca, izolaciju baze podataka, keševe, skladištenje, redove, testiranje i sprečavanje pristupa između zakupaca.\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 — Šalabahter za bezbednost RAG-a\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne smernice koje zahtevaju kontrolu pristupa u trenutku preuzimanja i izolaciju zakupaca za vektorske baze podataka sa više zakupaca.\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 — Regresiono testiranje autorizacije\u003C\u002Fstrong>\u003Cp class=\"text-sm text-gray-600 dark:text-gray-400\">Aktuelne smernice za testiranje, uključujući testove degradacije uloga i granica između zakupaca.\u003C\u002Fp>\u003C\u002Fa>",{"time":212,"blocks":213,"version":1409},1791485253462,[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 i izolacija zakupaca rešavaju dva različita bezbednosna problema u sistemima sa više zakupaca. Kontrola pristupa zasnovana na ulogama (RBAC) određuje šta autentifikovani principal sme da radi, kao što je čitanje porudžbina, uređivanje proizvoda ili upravljanje korisnicima. Izolacija zakupaca određuje kojem zakupcu podaci, resursi i kontekst izvršavanja taj principal sme da pristupi. Korisnik može biti ispravno autentifikovan i ispravno mu dodeljena RBAC uloga, a ipak doživeti bezbednosni propust ako aplikacija dozvoli toj ulozi da radi sa resursima drugog zakupca.","paragraph",{},{"id":221,"data":222,"type":226,"tunes":227},"direct",{"body":223,"title":224,"variant":225},"\u003Cstrong>RBAC odgovara na pitanje „šta ovaj identitet sme da radi?” Izolacija zakupaca odgovara na pitanje „unutar čije granice to sme da radi?”\u003C\u002Fstrong>\u003Cbr>\u003Cbr>Bezbedna aplikacija sa više zakupaca obično zahteva oba. Administrator zakupca može imati široka ovlašćenja, ali ta ovlašćenja treba da ostanu ograničena na zakupca administratora, osim ako postoji eksplicitno odvojen autoritet na nivou platforme.","Direktan odgovor","info","callout",{},{"id":229,"data":230,"type":226,"tunes":234},"boundary",{"body":231,"title":232,"variant":233},"Dodeljivanje korisniku uloge \u003Ccode>ADMIN\u003C\u002Fcode> ne podrazumeva automatski „administrator samo zakupca A”. Uloga se mora procenjivati zajedno sa verifikovanim kontekstom zakupca i vlasništvom ciljnog resursa nad zakupcem. U suprotnom, validna uloga može postati privilegija preko granica zakupaca.","Uloga nije granica zakupca","warning",{},{"id":236,"data":237,"type":226,"tunes":241},"current",{"body":238,"title":239,"variant":240},"Osnovna razlika je stabilna. NIST definiše RBAC oko korisnika, uloga, dozvola, operacija i objekata. Aktuelne AWS SaaS smernice eksplicitno navode da autentifikacija i autorizacija nisu jednake izolaciji zakupaca i da korisnik može biti autentifikovan i autorizovan, a ipak pristupati resursima drugog zakupca ako izolacija nije posebno sprovedena. OWASP-ove aktuelne smernice za bezbednost u okruženju sa više zakupaca takođe tretiraju izolaciju zakupaca kao zahtev koji se proteže kroz sve slojeve, obuhvatajući API-je, baze podataka, keševe, skladišta, redove i druge deljene resurse.","Napomena o aktuelnim izvorima — 8. oktobar 2026.","note",{},{"id":243,"data":244,"type":248,"tunes":249},"toc",{"title":245,"maxLevel":246,"minLevel":247},"Sadržaj",3,2,"tableOfContents",{},{"id":251,"data":252,"type":42,"tunes":254},"h-meaning",{"text":253,"level":247},"Šta RBAC zaista kontroliše",{},{"id":256,"data":257,"type":218,"tunes":259},"p-rbac-1",{"text":258},"RBAC je model autorizacije u kojem su dozvole povezane sa ulogama, a korisnici su dodeljeni tim ulogama. Uloga deluje kao administrativna apstrakcija između identiteta i dozvola.",{},{"id":261,"data":262,"type":218,"tunes":264},"p-rbac-2",{"text":263},"NIST-ov klasičan rad o RBAC-u formalizuje ovo oko korisnika, uloga, dozvola, operacija i objekata. Praktična korist je da organizacija može da upravlja autorizacijom kroz relativno stabilne uloge zasnovane na poslu ili odgovornosti, umesto da svaku dozvolu direktno povezuje sa svakim korisnikom.",{},{"id":266,"data":267,"type":218,"tunes":269},"p-rbac-3",{"text":268},"Uloga kao što je EDITOR može stoga da znači: može da čita sadržaj, piše sadržaj i objavljuje sadržaj. Uloga kao što je ACCOUNTANT može da znači: može da čita podatke za naplatu, usklađuje fakture i odobrava poravnanja.",{},{"id":271,"data":272,"type":42,"tunes":274},"h-tenant",{"text":273,"level":247},"Šta izolacija zakupaca zaista kontroliše",{},{"id":276,"data":277,"type":218,"tunes":279},"p-tenant-1",{"text":278},"Izolacija zakupaca je skup mehanizama koji sprečavaju da jedan zakupac čita, menja, utiče na ili slučajno primi resurse drugog zakupca u deljenom sistemu.",{},{"id":281,"data":282,"type":218,"tunes":284},"p-tenant-2",{"text":283},"Zaštićena granica je šira od redova u bazi podataka. Stanje specifično za zakupca može postojati u relacionim tabelama, objektnom skladištu, vektorskim indeksima, keševima, indeksima pretrage, porukama u redovima, fajlovima, privremenim artefaktima, pozadinskim poslovima, analitici, ograničenjima brzine i infrastrukturnim resursima.",{},{"id":286,"data":287,"type":218,"tunes":289},"p-tenant-3",{"text":288},"AWS-ove SaaS smernice jasno prave razliku: autorizacija odobrava pristup resursima, dok izolacija zakupaca obezbeđuje da ti resursi ne mogu preći pogrešnu granicu zakupca čak i kada je infrastruktura deljena.",{},{"id":291,"data":292,"type":42,"tunes":294},"h-simple",{"text":293,"level":247},"Najjednostavniji primer",{},{"id":296,"data":297,"type":218,"tunes":299},"p-simple-1",{"text":298},"Pretpostavimo da je Alice administrator za Zakupca A, a Bob administrator za Zakupca B. Oba korisnika legitimno imaju istu ADMIN ulogu.",{},{"id":301,"data":302,"type":218,"tunes":304},"p-simple-2",{"text":303},"RBAC može ispravno zaključiti da oba korisnika mogu izvršiti operaciju kao što je users.read. Ali kada Alice zatraži korisnika sa ID-jem 847, aplikacija i dalje mora da verifikuje da korisnik 847 pripada Zakupcu A.",{},{"id":306,"data":307,"type":218,"tunes":309},"p-simple-3",{"text":308},"Ako API proverava samo „Alice ima ADMIN” i zatim izvršava SELECT * FROM users WHERE id = 847, RBAC je uspeo, dok je izolacija zakupaca podbacila.",{},{"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. Autentifikuj principal","Utvrdi ko je korisnik, servis ili agent.",{"label":318,"description":319},"2. Razreši verifikovani kontekst zakupca","Odredi koji kontekst zakupca se primenjuje na osnovu pouzdanih informacija o identitetu\u002Fčlanstvu na strani servera.",{"label":321,"description":322},"3. Razreši dozvolu","Proceni da li uloga ili politika principala dozvoljava traženu operaciju.",{"label":324,"description":325},"4. Ograniči ciljni resurs","Verifikuj da ciljni objekat pripada dozvoljenom zakupcu ili eksplicitno deljenom opsegu.",{"label":327,"description":328},"5. Primeni na granici pristupa","Izvrši operaciju nad bazom podataka, kešom, skladištem, redom ili servisom uz primenjena ograničenja zakupca.",{"label":330,"description":331},"6. Revidiraj obe dimenzije","Zabeleži principal, zakupca, operaciju, cilj i rezultat kako bi pokušaji prelaska granica zakupaca bili vidljivi.","Ispravna odluka o autorizaciji u okruženju sa više zakupaca","auto","processFlow",{},{"id":337,"data":338,"type":42,"tunes":340},"h-stops",{"text":339,"level":247},"Gde se jednostavan primer zaustavlja",{},{"id":342,"data":343,"type":218,"tunes":345},"p-stops-1",{"text":344},"Stvarni sistemi često sadrže nekoliko klasa identiteta: korisnike zakupca, administratore platforme, pozadinske radnike, integracije, agente i operativne servise između zakupaca. Neki od njih legitimno prelaze granice zakupaca.",{},{"id":347,"data":348,"type":218,"tunes":350},"p-stops-2",{"text":349},"To ne uklanja potrebu za izolacijom. To znači da autoritet između zakupaca mora biti eksplicitan, uzak i odvojeno revidiran, a ne da nastaje slučajno iz globalne uloge ili neograničene veze sa bazom podataka.",{},{"id":352,"data":353,"type":218,"tunes":355},"p-stops-3",{"text":354},"Izolacija zakupaca takođe može varirati po sloju. Proizvod može deliti aplikacione servere dok razdvaja baze podataka, ili koristiti deljenu bazu podataka sa politikama na nivou reda dok premium zakupcima daje izolovano skladištenje ili računarske resurse. Ne postoji jedna univerzalna topologija izolacije.",{},{"id":357,"data":358,"type":42,"tunes":360},"h-compare",{"text":359,"level":247},"RBAC naspram izolacije zakupaca",{},{"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","Primarno pitanje",[369,369],"",{"id":371,"label":372,"values":373},"unit","Tipična jedinica",[369,369],{"id":375,"label":376,"values":377},"example","Primer",[369,369],{"id":379,"label":380,"values":381},"failure","Tipičan neuspeh",[369,369],{"id":383,"label":384,"values":385},"implementation","Tipična implementacija",[369,369],{"id":387,"label":388,"values":389},"scope","Može li postojati samo?",[369,369],"Dve različite bezbednosne dimenzije","table",[393,396],{"id":394,"label":395},"rbac","RBAC",{"id":397,"label":398},"tenant","Izolacija zakupaca","comparison",{},{"id":402,"data":403,"type":42,"tunes":405},"h-authn",{"text":404,"level":247},"Autentifikacija, autorizacija i izolacija su tri različite provere",{},{"id":407,"data":408,"type":391,"tunes":425},"three-checks",{"content":409,"stretched":43,"withHeadings":14},[410,414,418,422],[411,412,413],"Sloj","Pitanje","Primer neuspeha",[415,416,417],"Autentifikacija","Ko je ovaj principal?","Napadač se predstavlja kao Alice",[419,420,421],"Autorizacija \u002F RBAC","Može li ovaj principal izvršiti ovu operaciju?","Viewer može obrisati korisnike",[398,423,424],"Može li ova operacija dosegnuti ovu granicu zakupca\u002Fresursa?","Administrator zakupca A čita porudžbinu zakupca B",{},{"id":427,"data":428,"type":218,"tunes":430},"p-authn-1",{"text":429},"Ove provere su povezane ali se ne mogu međusobno zameniti. Autentifikacija može biti savršena dok autorizacija ne uspe. Autorizacija može biti ispravna dok izolacija zakupaca ne uspe. Bezbedna SaaS putanja zahteva sve primenljive granice.",{},{"id":432,"data":433,"type":42,"tunes":435},"h-role-scope",{"text":434,"level":247},"Uloge zahtevaju opseg",{},{"id":437,"data":438,"type":218,"tunes":440},"p-role-scope-1",{"text":439},"Reč ADMIN je nepotpuna bez opsega. Može značiti administrator platforme, administrator zakupca, administrator projekta, administrator radnog prostora ili administrator jednog podsistema.",{},{"id":442,"data":443,"type":218,"tunes":445},"p-role-scope-2",{"text":444},"U sistemima sa više zakupaca, dodela uloga bi normalno trebalo da bude povezana sa članstvom u zakupcu ili drugim eksplicitnim opsegom resursa. Isti korisnik može legitimno biti ADMIN u zakupcu A i VIEWER u zakupcu B.",{},{"id":447,"data":448,"type":218,"tunes":450},"p-role-scope-3",{"text":449},"Globalni model uloga koji ignoriše ovu razliku može stvoriti curenje privilegija čak i kada je sama mapa dozvola ispravna.",{},{"id":452,"data":453,"type":42,"tunes":455},"h-context",{"text":454,"level":247},"Kontekst zakupca mora doći iz pouzdanog puta",{},{"id":457,"data":458,"type":218,"tunes":460},"p-context-1",{"text":459},"ID zakupca koji dostavlja klijent je koristan kao selektor, ali nije dokaz autoriteta. Server mora izvesti ili verifikovati članstvo u zakupcu na osnovu autentifikovanog identiteta i trenutnih podataka o autorizaciji.",{},{"id":462,"data":463,"type":218,"tunes":465},"p-context-2",{"text":464},"OWASP-ove trenutne smernice za multi-tenant preporučuju uspostavljanje konteksta zakupca rano u životnom ciklusu zahteva i eksplicitno upozoravaju da se klijentski zaglavlja ili parametri zahteva ne tretiraju kao dokaz autorizacije.",{},{"id":467,"data":468,"type":218,"tunes":470},"p-context-3",{"text":469},"Ovo je važno jer trivijalna izmena zahteva sa tenant=A na tenant=B ne sme biti dovoljna da se pređe granica izolacije.",{},{"id":472,"data":473,"type":42,"tunes":475},"h-query",{"text":474,"level":247},"Opseg zakupca pripada pretrazi resursa",{},{"id":477,"data":478,"type":218,"tunes":480},"p-query-1",{"text":479},"Uobičajen obrazac izolacije na nivou aplikacije je uključivanje opsega zakupca u isti upit koji razrešava resurs.",{},{"id":482,"data":483,"type":391,"tunes":497},"query-table",{"content":484,"stretched":43,"withHeadings":14},[485,488,491,494],[486,487],"Slabo pretraživanje","Jače pretraživanje sa opsegom zakupca",[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},"Ovaj obrazac nije jedini mogući mehanizam izolacije, ali zadržava vlasništvo nad zakupcem blizu operacije pristupa podacima i sprečava da ID objekta postane sposobnost za pristup drugim zakupcima.",{},{"id":504,"data":505,"type":42,"tunes":507},"h-defense",{"text":506,"level":247},"Provere u aplikaciji su korisne, ali izolacija ne bi trebalo da zavisi od savršenog ponašanja programera",{},{"id":509,"data":510,"type":218,"tunes":512},"p-defense-1",{"text":511},"AWS smernice za izolaciju eksplicitno upozoravaju da se sprovođenje izolacije ne prepušta samo programerima servisa. U velikoj bazi koda, vremenom će neki upit, keš ključ ili putanja radnika možda izostaviti opseg zakupca.",{},{"id":514,"data":515,"type":218,"tunes":517},"p-defense-2",{"text":516},"Odbrana u dubinu stoga može preneti izolaciju u deljeni middleware, slojeve repozitorijuma\u002Fservisa, mehanizme politika, bezbednost na nivou redova baze podataka, namenske akreditive, odvojene šeme ili odvojene baze podataka u zavisnosti od rizika i arhitekture.",{},{"id":519,"data":520,"type":226,"tunes":524},"defense-rule",{"body":521,"title":522,"variant":523},"Najjača granica je ona koju običan aplikativni kod ne može lako zaobići izostavljanjem jednog uslova \u003Ccode>tenantId\u003C\u002Fcode>.","Izolaciju bi trebalo teško zaboraviti","success",{},{"id":526,"data":527,"type":42,"tunes":529},"h-db",{"text":528,"level":247},"Strategije izolacije baze podataka",{},{"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],"Strategija","Granica","Snaga \u002F kompromis",[539,540,541],"Deljene tabele + ključ zakupca","Politika reda\u002Faplikacije","Operativno efikasno; zahteva iscrpno određivanje opsega zakupca i jake testove",[543,544,545],"Deljene tabele + RLS baze podataka","Granica politike baze podataka","Smanjuje zavisnost od svakog upita aplikacije; zahteva ispravne uloge, kontekst zakupca sesije\u002Ftransakcije i pokrivenost politikama",[547,548,549],"Odvojene šeme","Granica imenskog prostora \u002F DB uloge","Jača logička razdvojenost; veća operativna složenost",[551,552,553],"Odvojene baze podataka","Granica baze podataka \u002F akreditiva","Jaka izolacija i jednostavnija priča o domenu uticaja; veći troškovi obezbeđivanja i operacija",[555,556,557],"Odvojena infrastruktura\u002Fnalog","Granica infrastrukture","Najjača gruba razdvojenost; najveći trošak i operativni overhead",[559,560,561],"Hibridno","Po radnom opterećenju\u002Fklasi podataka","Omogućava jaču izolaciju samo tamo gde rizik\u002Fusaglašenost to opravdava",{},{"id":564,"data":565,"type":218,"tunes":567},"p-db-1",{"text":566},"OWASP-ova aktuelna Multi-Tenant Security Cheat Sheet navodi odvojene baze podataka, odvojene šeme, deljene tabele sa kontrolama na nivou redova i hibridne modele. Ispravan model zavisi od nivoa pretnje, usaglašenosti, performansi i operativnih troškova.",{},{"id":569,"data":570,"type":42,"tunes":572},"h-rls",{"text":571,"level":247},"PostgreSQL Row-Level Security može pružiti odbranu u dubinu",{},{"id":574,"data":575,"type":218,"tunes":577},"p-rls-1",{"text":576},"Sa deljenim tabelama, PostgreSQL Row-Level Security može sprovesti predikat zakupca na nivou baze podataka tako da obični upiti ne mogu videti redove van aktivne politike zakupca.",{},{"id":579,"data":580,"type":218,"tunes":582},"p-rls-2",{"text":581},"Međutim, RLS nije magija. PostgreSQL superkorisnici i uloge sa BYPASSRLS mogu zaobići politike redova. OWASP stoga preporučuje korišćenje uloge sa najmanjim privilegijama na putu zahteva i testiranje istog režima konekcije\u002Fpooling-a koji se koristi u produkciji.",{},{"id":584,"data":585,"type":218,"tunes":587},"p-rls-3",{"text":586},"Ponovno korišćenje konekcije je još jedna važna ivica: kontekst zakupca mora biti bezbedno postavljen i resetovan za svaku transakciju\u002Fzahtev kako jedna pooled konekcija ne bi mogla da procuri prethodno stanje zakupca.",{},{"id":589,"data":590,"type":42,"tunes":592},"h-cache",{"text":591,"level":247},"Izolacija zakupca mora uključivati keševe",{},{"id":594,"data":595,"type":218,"tunes":597},"p-cache-1",{"text":596},"Upit baze podataka može biti savršeno ograničen i ipak procuriti podatke kroz deljeni keš ključ.",{},{"id":599,"data":600,"type":218,"tunes":602},"p-cache-2",{"text":601},"Ako user:42 postoji i kod Zakupca A i kod Zakupca B, globalni keš ključ može vratiti vrednost pogrešnog zakupca. Keš ključevi osetljivi na zakupca treba da uključe svaki atribut koji menja vidljivost ili semantiku rezultata, obično zakupca, korisnika, lokal, skup funkcija ili verziju dozvole.",{},{"id":604,"data":605,"type":218,"tunes":607},"p-cache-3",{"text":606},"Particionisanje keša je odbrana u dubinu, a ne zamena za autorizaciju. Zahtev i dalje mora biti autorizovan pre nego što se vrati zaštićeni keširani sadržaj.",{},{"id":609,"data":610,"type":42,"tunes":612},"h-storage",{"text":611,"level":247},"Skladištenje datoteka i objekata zahteva sopstvenu granicu tenanta",{},{"id":614,"data":615,"type":218,"tunes":617},"p-storage-1",{"text":616},"Skladištenje objekata treba da razlikuje globalne, objekte u okviru tenanta i objekte u okviru korisnika. Sam prefiks foldera je samo konvencija imenovanja osim ako politika pristupa zaista ograničava čitanje i pisanje.",{},{"id":619,"data":620,"type":218,"tunes":622},"p-storage-2",{"text":621},"Robusniji dizajni mogu koristiti ključeve objekata svesne tenanta, politike bucket-a, odvojene bucket-e\u002Fnaloge ili ključeve za šifrovanje specifične za tenanta kada rizik ili usklađenost zahtevaju jaču izolaciju.",{},{"id":624,"data":625,"type":218,"tunes":627},"p-storage-3",{"text":626},"Potpisani URL-ovi moraju biti autorizovani pre izdavanja i ograničeni na tačan objekat i operaciju. posedovanje identifikatora objekta samo po sebi ne bi trebalo da daje pristup između tenanata.",{},{"id":629,"data":630,"type":42,"tunes":632},"h-queues",{"text":631,"level":247},"Pozadinski poslovi i redovi mogu narušiti izolaciju",{},{"id":634,"data":635,"type":218,"tunes":637},"p-queue-1",{"text":636},"Asinhroni poslovi često napuštaju kontekst originalnog HTTP zahteva, što olakšava pogrešno rukovanje propagacijom tenanta. Poruka u redu koja sadrži tenantId nije dovoljan dokaz da je producent bio autorizovan.",{},{"id":639,"data":640,"type":218,"tunes":642},"p-queue-2",{"text":641},"Radnik treba da nosi verifikovani identitet servisa\u002Fkorisnika ili pouzdan omot posla, ponovo uspostavi kontekst tenanta i ponovo autorizuje posledične operacije na granici potrošača.",{},{"id":644,"data":645,"type":218,"tunes":647},"p-queue-3",{"text":646},"Izolacija tenanta takođe uključuje dostupnost. Jedan tenant ne bi trebalo da može monopolizovati deljene radnike, redove, bazene konekcija ili računske resurse na način koji materijalno degradira druge tenante.",{},{"id":649,"data":650,"type":42,"tunes":652},"h-search",{"text":651,"level":247},"Pretraga i RAG zahtevaju preuzimanje svesno tenanta",{},{"id":654,"data":655,"type":218,"tunes":657},"p-search-1",{"text":656},"Multi-tenant AI uvodi još jednu kopiju problema izolacije. Dokumenti mogu biti podeljeni u delove, ugrađeni i sačuvani u vektorskom indeksu nakon unosa.",{},{"id":659,"data":660,"type":218,"tunes":662},"p-search-2",{"text":661},"OWASP-ove trenutne smernice za RAG bezbednost navode da kontrola pristupa mora biti sprovedena u trenutku preuzimanja i da delovi od Tenanta A ne smeju biti preuzeti upitima od Tenanta B. Ne može se jednostavno pretpostaviti da dozvole na nivou dokumenta automatski preživljavaju deljenje.",{},{"id":664,"data":665,"type":218,"tunes":667},"p-search-3",{"text":666},"Vektorski indeks stoga zahteva metapodatke o tenantu\u002Fpristupu ili fizički\u002Flogički odvojene kolekcije u skladu sa dizajnom izolacije. Filteri za preuzimanje treba da se primenjuju pre nego što neovlašćeni sadržaj može ući u kontekst modela.",{},{"id":669,"data":670,"type":226,"tunes":673},"rag-rule",{"body":671,"title":672,"variant":233},"Ne preuzimajte delove između tenanata i zatim ne instruirajte jezički model da ih ignoriše. Kada zaštićeni podaci uđu u kontekst modela, granica izolacije je već narušena.","Model nikada ne sme biti filter tenanta",{},{"id":675,"data":676,"type":42,"tunes":678},"h-derived",{"text":677,"level":247},"Izvedeni podaci nasleđuju osetljivost tenanta",{},{"id":680,"data":681,"type":218,"tunes":683},"p-derived-1",{"text":682},"Ugrađivanja, indeksi pretrage, sličice, generisani rezimei, keševi, redovi analitike i AI odgovori izvedeni su iz izvornih podataka. Njihov obim tenanta treba da prati izvor osim ako eksplicitna transformacija stvara legitiman deljeni\u002Fglobalni artefakt.",{},{"id":685,"data":686,"type":218,"tunes":688},"p-derived-2",{"text":687},"Brisanje i odjava stoga moraju da se propagiraju izvan kanonskog reda. Uklanjanje dokumenta tenanta dok ostaju delovi koji se mogu pretraživati ili keširani rezimei može zadržati izloženost između tenanata ili nakon perioda zadržavanja.",{},{"id":690,"data":691,"type":42,"tunes":693},"h-shared",{"text":692,"level":247},"Nije sve vlasništvo tenanta",{},{"id":695,"data":696,"type":218,"tunes":698},"p-shared-1",{"text":697},"Multi-tenant platforme često imaju namerno globalne resurse: taksonomije proizvoda, javne šablone, sistemske dozvole, definicije funkcija ili javni sadržaj.",{},{"id":700,"data":701,"type":218,"tunes":703},"p-shared-2",{"text":702},"Najbezbedniji model je eksplicitna klasifikacija: globalno, u okviru zakupca, u okviru korisnika ili eksplicitno između zakupaca. Nejasni resursi su mesto gde počinje slučajno curenje.",{},{"id":705,"data":706,"type":218,"tunes":708},"p-shared-3",{"text":707},"Namerno deljeni objekat treba da ima dokumentovan razlog zašto je globalan, a ne da mu jednostavno nedostaje povezanost sa zakupcem.",{},{"id":710,"data":711,"type":42,"tunes":713},"h-platform-admin",{"text":712,"level":247},"Administratori platforme zahtevaju drugačiji model ovlašćenja",{},{"id":715,"data":716,"type":218,"tunes":718},"p-platform-1",{"text":717},"Operater platforme može morati da pregleda više zakupaca radi podrške, usklađenosti ili infrastrukturnih operacija. Modelovanje ovoga kao običnog ADMIN-a zakupca sa slučajnim globalnim pristupom bazi podataka slabi i bezbednost i mogućnost revizije.",{},{"id":720,"data":721,"type":218,"tunes":723},"p-platform-2",{"text":722},"Bolji dizajn koristi poseban identitet platforme ili eksplicitnu dozvolu između zakupaca, jaču autentifikaciju, ograničenje svrhe, detaljnu reviziju i, gde je prikladno, kontrole odobrenja ili prinudnog pristupa.",{},{"id":725,"data":726,"type":218,"tunes":728},"p-platform-3",{"text":727},"Pristup između zakupaca bi stoga trebalo da bude imenovana sposobnost, a ne odsustvo filtera zakupca.",{},{"id":730,"data":731,"type":42,"tunes":733},"h-abac",{"text":732,"level":247},"RBAC se može kombinovati sa atributima",{},{"id":735,"data":736,"type":218,"tunes":738},"p-abac-1",{"text":737},"Neke odluke zavise od više od uloge. Članstvo u zakupcu, region, vlasnik resursa, nivo pretplate, vreme, članstvo u projektu ili klasifikacija podataka mogu uticati na pristup.",{},{"id":740,"data":741,"type":218,"tunes":743},"p-abac-2",{"text":742},"RBAC i ABAC se ne isključuju međusobno. AWS-ove trenutne smernice za autorizaciju u više zakupaca razmatraju RBAC, ABAC i hibridne modele. Uloga može definisati široku odgovornost dok atributi ograničavaju kojoj konkretnoj instanci resursa se može pristupiti.",{},{"id":745,"data":746,"type":218,"tunes":748},"p-abac-3",{"text":747},"Ključno arhitektonsko pravilo ostaje: ne kodirajte izolaciju zakupaca samo kao slučajni naziv uloge ako je identitet zakupca granica resursa prvog reda.",{},{"id":750,"data":751,"type":42,"tunes":753},"h-matrix",{"text":752,"level":247},"Odluke o autorizaciji su najmanje dvodimenzionalne",{},{"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","Dozvola uloge","Odnos sa zakupcem","Odluka",[764,765,766,767],"Alice","orders.read","Porudžbina pripada Alisinom zakupcu","Dozvoli",[764,765,769,770],"Porudžbina pripada drugom zakupcu","Odbij",[764,772,766,773],"orders.write","Dozvoli ako uloga uključuje pisanje",[764,772,769,770],[776,777,778,779],"Platform support","support.cross_tenant.read","Eksplicitni obim podrške + revidirani ciljni zakupac","Potencijalno dozvoli pod politikom platforme",[781,782,783,784],"Background worker","orders.process","Obim pouzdane usluge za zakupca posla","Dozvoli samo za verifikovanog zakupca posla",{},{"id":787,"data":788,"type":42,"tunes":790},"h-implementation",{"text":789,"level":247},"Dokaz originalne implementacije: Aaasaasa AI CMS",{},{"id":792,"data":793,"type":226,"tunes":796},"impl-note",{"body":794,"title":795,"variant":240},"Aaasaasa AI CMS sadrži konkretnu RBAC implementaciju u okviru zakupca. Koristan je dokaz kako se autorizacija uloga i obim zakupca mogu kombinovati, ali ga ne treba predstavljati kao dokaz da svaki sloj skladištenja, keša ili infrastrukture ima potpunu izolaciju zakupaca.","Dokaz originalne implementacije",{},{"id":798,"data":799,"type":218,"tunes":801},"p-impl-1",{"text":800},"RBAC servis definiše tipizirane kodove dozvola kao što su cms.content.read, shop.orders.write, billing.reconcile i users.roles. Sistemske uloge mapiraju te dozvole u imenovane skupove odgovornosti.",{},{"id":803,"data":804,"type":218,"tunes":806},"p-impl-2",{"text":805},"Zapisi uloga se kreiraju i razrešavaju sa tenantId. Sistemske uloge se ažuriraju ili ubacuju korišćenjem složenog identiteta zakupac\u002Fkod, a listanje uloga je filtrirano po zakupcu.",{},{"id":808,"data":809,"type":218,"tunes":811},"p-impl-3",{"text":810},"Ažuriranje i brisanje uloge prvo razrešava ulogu koristeći i ID uloge i ID zakupca. Dodele uloga korisnicima se takođe čuvaju i zamenjuju u okviru trenutnog konteksta zakupca.",{},{"id":813,"data":814,"type":218,"tunes":816},"p-impl-4",{"text":815},"Razrešavanje dozvola čita eksplicitne dodele uloga korisnicima ograničene i tenantId i userId. Ovo sprečava da dodela uloge jednog zakupca automatski postane dodela uloge drugog zakupca.",{},{"id":818,"data":819,"type":218,"tunes":821},"p-impl-5",{"text":820},"Na API nivou, administrativne RBAC rute razrešavaju kontekst zakupca pre kreiranja ili izmene uloga. To je ispravan smer: administracija dozvola i sama mora poštovati zakupništvo.",{},{"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],"Uočeni obrazac implementacije","Bezbednosno značenje",[830,831],"Tipizirani kodovi dozvola","RBAC rečnik operacija je eksplicitan",[833,834],"Sistemska uloga → mape dozvola","Uloge agregiraju dozvole umesto hardkodiranja korisnika",[836,837],"tenantId_code identitet uloge","Ista logička uloga može postojati odvojeno po zakupcu",[839,840],"Pretraga uloge koristi id + tenantId","Izmena uloge je ograničena na zakupca",[842,843],"Relacija korisnik-uloga čuva tenantId","Članstvo se ne izvodi globalno samo iz uloge",[845,846],"Razrešavanje dozvola koristi tenantId + userId","Autorizacija se evaluira unutar konteksta zakupca",{},{"id":849,"data":850,"type":226,"tunes":853},"impl-boundary",{"body":851,"title":852,"variant":233},"RBAC ograničen na zakupca je jedan sloj. Potpuna izolacija zakupaca mora takođe pokriti sve pretrage resursa u vlasništvu zakupca, baze podataka, keševe, fajlove, pretrage\u002Fvektorske indekse, pozadinske poslove, integracije i operativne putanje. Dokazi iz repozitorijuma ovde podržavaju obrazac dizajna RBAC\u002Fopsega zakupca, a ne tvrdnju o nezavisno revidiranoj SaaS izolaciji.","Šta ovi dokazi ne dokazuju",{},{"id":855,"data":856,"type":42,"tunes":858},"h-ai",{"text":857,"level":247},"Zašto je ova razlika još važnija za AI agente",{},{"id":860,"data":861,"type":218,"tunes":863},"p-ai-1",{"text":862},"AI agenti mogu pretvoriti grešku u dozvolama u niz akcija. Ako agent dobije široki alat orders.read bez prinude ograničene na zakupca, greška u rezonovanju ili prompt-injection može izazvati čitanje između zakupaca mašinskom brzinom.",{},{"id":865,"data":866,"type":218,"tunes":868},"p-ai-2",{"text":867},"Opisi alata agenta mogu pominjati ograničenja zakupca, ali prinuda se i dalje mora odvijati u pouzdanom sloju izvršavanja\u002Fusluge\u002Fpodataka. Uputstva na prirodnom jeziku nisu granica autorizacije.",{},{"id":870,"data":871,"type":218,"tunes":873},"p-ai-3",{"text":872},"Isto važi i za RAG: agent može imati dozvolu da koristi alat za pretragu, dok pozadina pretrage i dalje mora sprečiti da upit Zakupca A vrati delove Zakupca B.",{},{"id":875,"data":876,"type":42,"tunes":878},"h-tests",{"text":877,"level":247},"Testirajte RBAC i izolaciju zakupaca odvojeno",{},{"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],"Porodica testova","Šta bi trebalo da dokaže",[887,888],"Test degradacije uloge","Korisnik bez dozvole ne može izvršiti operaciju čak ni unutar svog zakupca",[890,891],"Test objekta između zakupaca","Korisnik sa ispravnom ulogom i dalje ne može pristupiti istoj vrsti resursa u drugom zakupcu",[893,894],"Krivotvorenje identifikatora","Promena ID-jeva objekata\u002Fzakupaca ne prelazi opseg",[896,897],"Test liste\u002Fgrupnih endpointa","Široki upiti vraćaju samo autorizovane podatke zakupca",[899,900],"Test ponovne upotrebe keša","Dva zakupca koja koriste ponovo upotrebljene procese\u002Fveze nikada ne primaju keširano stanje onog drugog",[902,903],"Test RLS uloge zahteva","Produkcijska uloga zahteva ne može zaobići politike redova",[905,906],"Test asinhronog radnika","Kontekst zakupca preživljava stavljanje u red i ponovo se validira pri potrošnji",[908,909],"Test vektorske pretrage","Upit Zakupca A nikada ne pronalazi delove Zakupca B",[911,912],"Test platformskog administratora","Mogućnost između zakupaca je eksplicitna, uska i revizibilna",[914,915],"Test odjave","Podaci zakupca i izvedeni indeksi\u002Fkeševi se uklanjaju u skladu sa politikom",{},{"id":918,"data":919,"type":218,"tunes":921},"p-tests-1",{"text":920},"OWASP smernice za regresiju autorizacije posebno ističu testove granica između zakupaca jer promene koda u keširanju, upitima ili deljenim uslugama mogu tiho pokvariti izolaciju čak i kada testovi uloga nastave da prolaze.",{},{"id":923,"data":924,"type":42,"tunes":926},"h-failures",{"text":925,"level":247},"Uobičajeni načini neuspeha",{},{"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],"Način neuspeha","Zašto ne uspeva",[935,936],"Provera uloge ali ne i zakupca","Validna uloga postaje autoritet između zakupaca",[938,939],"Verovanje ID-ju zakupca iz zahteva","Klijent kontroliše selektor izolacije",[941,942],"Ograničavanje UI ali ne i API-ja","Skrivena dugmad ne štite pozadinske resurse",[944,945],"Endpoint za detalje svestan zakupca, endpoint liste bez opsega","Grupna čitanja otkrivaju druge zakupce",[947,948],"Filter zakupca u većini upita","Jedna zaboravljena putanja kvari granicu",[950,951],"Globalni ključevi keša","Ispravna izolacija baze podataka se zaobilazi keširanim podacima",[953,954],"Deljeni vektorski indeks bez prinudnih filtera metapodataka","RAG pronalazi delove drugog zakupca",[956,957],"ID zakupca u poruci reda tretiran kao autorizacija","Krivotvoren ili pogrešno proizveden posao može preći granicu zakupca",[959,960],"Platformski administrator modelovan kao običan ADMIN","Moć između zakupaca postaje implicitna i teška za reviziju",[962,963],"Uloga kopirana globalno kroz članstva u zakupcima","Korisnik dobija dozvole u zakupcima gde nikada nije dodeljen",[965,966],"Odvojene baze podataka ali deljeni privilegovani akreditiv","Aplikacija i dalje može preći baze podataka ako je njen akreditiv preširok",[968,969],"RLS sa BYPASSRLS ulogom zahteva","Politika baze podataka postoji ali ne štiti stvarnu putanju zahteva",[971,972],"Nasumični UUID-ovi tretirani kao izolacija","Teško pogodivi identifikatori smanjuju nabrajanje ali ne autorizuju pristup",{},{"id":975,"data":976,"type":42,"tunes":978},"h-misconceptions",{"text":977,"level":247},"Uobičajene zablude",{},{"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],"Zabluda","Ispravka",[987,988],"„RBAC obezbeđuje izolaciju zakupaca.“","RBAC kontroliše dozvole; izolacija takođe zahteva opseg zakupca\u002Fresursa.",[990,991],"„Ako je korisnik administrator, provere zakupca nisu potrebne.“","Administratorski autoritet i dalje mora imati eksplicitan opseg.",[993,994],"„ID zakupca u JWT-u je dovoljan.“","Može biti pouzdan ulaz samo ako se validira i primenjuje dosledno na svaku zaštićenu putanju resursa.",[996,997],"„Odvojene baze podataka uklanjaju zahteve za autorizacijom.“","Korisnicima su i dalje potrebne dozvole na nivou operacija unutar njihovog zakupca.",[999,1000],"„Kolona tenant_id znači da je sistem izolovan.“","Polje pomaže samo ako putanje pristupa ga primenjuju.",[1002,1003],"„UUID-ovi sprečavaju pristup između zakupaca.“","Nepredvidivi identifikatori su odbrana u dubinu, a ne autorizacija.",[1005,1006],"„RLS znači da aplikacijski kod ne treba bezbednosne provere.“","Aplikacijska autorizacija, ispravne DB uloge i pokrivenost politikama su i dalje važni.",[1008,1009],"„Jedna deljena vektorska baza je nesigurna.“","Može biti sigurna ako je izolacija sprovodiva i verifikovana; fizičko razdvajanje je jedna opcija, ne jedina.",[1011,1012],"„Platformska podrška zahteva globalnog ADMIN-a.“","Podrška između zakupaca treba da bude poseban, ograničen i revizibilan autoritet.",[1014,1015],"„Interni servisi mogu preskočiti provere zakupca.“","Interne putanje i dalje mogu biti kompromitovane ili pogrešno konfigurisane i moraju sačuvati kontekst zakupca.",{},{"id":1018,"data":1019,"type":42,"tunes":1021},"h-design",{"text":1020,"level":247},"Praktičan redosled dizajna",{},{"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. Definišite vlasništvo zakupca","Klasifikujte koji entiteti i resursi su globalni, ograničeni na zakupca, ograničeni na korisnika ili namerno između zakupaca.",{"label":1030,"description":1031},"2. Definišite operacije","Kreirajte eksplicitne dozvole za čitanje, pisanje, objavljivanje, odobravanje, administraciju i druge poslovne akcije.",{"label":1033,"description":1034},"3. Definišite uloge","Grupirajte dozvole prema odgovornostima bez ugrađivanja slučajnog globalnog opsega.",{"label":1036,"description":1037},"4. Definišite opseg članstva","Vežite dodele uloga za kontekst zakupca\u002Fradnog prostora\u002Fprojekta u kojem se primenjuju.",{"label":1039,"description":1040},"5. Razrešite pouzdan kontekst zakupca","Izvedite identitet zakupca iz autentifikovanog, na serveru verifikovanog članstva ili autorizacije servisa.",{"label":1042,"description":1043},"6. Primenite vlasništvo resursa","Primenite opseg zakupca na svakoj granici podataka\u002Fusluga u vlasništvu zakupca.",{"label":1045,"description":1046},"7. Dodajte odbranu u dubinu","Koristite RLS, odvojene akreditive, šeme\u002Fbaze podataka, politike skladištenja ili mašine politika gde rizik to opravdava.",{"label":1048,"description":1049},"8. Prenesite opseg kroz izvedene sisteme","Sačuvajte metapodatke zakupca u kešu, pretrazi, vektorskim indeksima, redovima, fajlovima i analitici.",{"label":1051,"description":1052},"9. Modelujte operacije između zakupaca eksplicitno","Odvojite platformsku administraciju i identitete servisa od običnih uloga zakupca.",{"label":1054,"description":1055},"10. Testirajte obe ose","Pokrenite negativne testove za nedostajuću dozvolu i za pogrešnog zakupca nezavisno.",{"label":1057,"description":1058},"11. Revidirajte zakupca + dozvolu zajedno","Beležite ko je delovao, u kom zakupcu, na kom cilju i pod kojim autoritetom.",{"label":1060,"description":1061},"12. Ponovo testirajte nakon promena šeme\u002Fizvršavanja","Izolacija se može pokvariti kada se uvedu nove tabele, keševi, redovi ili putanje pronalaženja.","Dizajnirajte dozvole i izolaciju kao odvojene dimenzije",{},{"id":1065,"data":1066,"type":42,"tunes":1068},"h-checklist",{"text":1067,"level":247},"RBAC + kontrolna lista izolacije zakupaca",{},{"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],"Očekivani odgovor",[1076,1077],"Ko je principal?","Autentifikovani identitet korisnika\u002Fservisa\u002Fagenta",[1079,1080],"Koji kontekst zakupca se primenjuje?","Na serveru verifikovano članstvo ili opseg servisa",[1082,1083],"Koja operacija se zahteva?","Tipizirana dozvola ili akcija politike",[1085,1086],"Da li principal ima tu dozvolu?","Odluka o ulozi\u002Fpolitici",[1088,1089],"Ko je vlasnik ciljnog resursa?","Eksplicitna klasifikacija zakupca\u002Fglobalnog\u002Fkorisnika",[1091,1092],"Da li se opseg resursa poklapa sa autoritetom?","Pretraga\u002Fpolitika svesna zakupca",[1094,1095],"Može li skladište zaobići aplikacijske provere?","Odluka o odbrani u dubinu dokumentovana",[1097,1098],"Da li su keševi sigurni za zakupce?","Ključevi\u002Fimenski prostori i autorizacija čuvaju opseg zakupca",[1100,1101],"Da li su fajlovi\u002Fblobovi sigurni za zakupce?","Politika objekata i izdavanje potpisanih URL-ova primenjuju opseg",[1103,1104],"Da li su asinhroni poslovi sigurni za zakupce?","Verifikovani kontekst se propagira i ponovo validira",[1106,1107],"Da li su RAG\u002Fpretraga sigurni za zakupce?","Izolacija metapodataka\u002Fkolekcija se primenjuje pre konteksta modela",[1109,1110],"Da li su administratori između zakupaca eksplicitni?","Odvojen autoritet, kontrole i revizija",[1112,1113],"Mogu li obični akreditivi zaobići izolaciju?","Ne, ili strogo dokumentovana izuzetna putanja",[1115,1116],"Da li su negativni testovi između zakupaca automatizovani?","Da za svaki relevantni sloj pristupa",{},{"id":1119,"data":1120,"type":42,"tunes":1122},"h-edge",{"text":1121,"level":247},"Rubni slučajevi i ograničenja",{},{"id":1124,"data":1125,"type":218,"tunes":1127},"p-edge-1",{"text":1126},"Korisnik može pripadati većem broju tenanata. Trenutni tenant bi stoga trebalo da bude eksplicitni kontekst izvršavanja, a ne da se trajno izvodi iz korisničkog naloga.",{},{"id":1129,"data":1130,"type":218,"tunes":1132},"p-edge-2",{"text":1131},"Neki resursi se namerno dele između odabranih tenanata, kao što su prostori za saradnju ili podaci konzorcijuma. To zahteva eksplicitni model deljenja; pretvaranje da resurs pripada jednom tenantu i dodavanje izuzetaka kasnije obično stvara dvosmislenu autorizaciju.",{},{"id":1134,"data":1135,"type":218,"tunes":1137},"p-edge-3",{"text":1136},"Izolacija od bučnih suseda je povezana, ali različita od izolacije poverljivosti. Tenant možda nikada neće videti podatke drugog tenanta, ali i dalje može da iscrpi deljene CPU resurse, kapacitet reda čekanja ili veze sa bazom podataka. Ograničenja brzine i kvote resursa stoga mogu biti svesne tenanta kao granica dostupnosti.",{},{"id":1139,"data":1140,"type":218,"tunes":1142},"p-edge-4",{"text":1141},"Fizička izolacija nije automatski bezbedna ako akreditivi kontrolne ravni ili administrativne putanje mogu preći granice. Logička izolacija nije automatski slaba ako se politike centralno sprovode, uz najmanje privilegije i temeljno testiranje.",{},{"id":1144,"data":1145,"type":218,"tunes":1147},"p-edge-5",{"text":1146},"Zahtevi za izolaciju tenanata mogu se razlikovati po klasi podataka. Podaci javnog kataloga, evidencija naplate i privatni AI dokumenti mogu opravdati različite granice skladištenja i enkripcije unutar istog SaaS proizvoda.",{},{"id":1149,"data":1150,"type":42,"tunes":1152},"h-change",{"text":1151,"level":247},"Šta bi promenilo ovaj odgovor?",{},{"id":1154,"data":1155,"type":218,"tunes":1157},"p-change-1",{"text":1156},"Tačna implementacija se menja u zavisnosti od arhitekture: serverless API-ji, Kubernetes, PostgreSQL, skladištenje objekata, vektorske baze podataka i mehanizmi politika izlažu različite primitive izolacije.",{},{"id":1159,"data":1160,"type":218,"tunes":1162},"p-change-2",{"text":1161},"Potrebna snaga se takođe menja u zavisnosti od regulative, ugovora sa klijentima, osetljivosti podataka, modela pretnji i operativnog obima. Neki tenanti mogu opravdati izolovane baze podataka ili infrastrukturu, dok drugi dele zajedničke resurse.",{},{"id":1164,"data":1165,"type":218,"tunes":1167},"p-change-3",{"text":1166},"Konceptualna razlika se ne menja: dozvola za izvršavanje operacije nije isto što i dozvola za prelazak granice tenanta.",{},{"id":1169,"data":1170,"type":42,"tunes":1172},"h-related",{"text":1171,"level":247},"Povezano kanonsko znanje",{},{"id":1174,"data":1175,"type":218,"tunes":1177},"p-related-1",{"text":1176},"S01 je preduslov bezbednosne granice za Enterprise AI Architecture i AI Governance. Kada AI alati, RAG ili agenti rade nad podacima više tenanata, identitet tenanta mora da putuje kroz pretragu, izvršavanje alata, memoriju, keševe i revizorske tragove.",{},{"id":1179,"data":1180,"type":218,"tunes":1182},"p-related-2",{"text":1181},"Takođe se direktno povezuje sa Agentic AI: sposobnost alata i dozvola uloge i dalje moraju biti ograničene vlasništvom tenanta pre nego što agent može da čita ili menja poslovne resurse.",{},{"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: Objašnjen protokolni stek agenata","Interoperabilnost protokola ne zamenjuje autorizaciju ili izolaciju tenanata. Otkrivanje sposobnosti i poslovni autoritet ostaju odvojene arhitektonske brige.","Pročitajte članak o protokolarnom steku","referralArticle",{},{"id":1193,"data":1194,"type":218,"tunes":1196},"p-related-3",{"text":1195},"Za RAG, izolacija tenanata mora biti sprovedena pre nego što zaštićeni delovi dođu u kontekst modela.",{},{"id":1198,"data":1199,"type":1190,"tunes":1204},"ref-rag",{"url":1200,"title":1201,"excerpt":1202,"ctaLabel":1203},"https:\u002F\u002Fstajic.de\u002Fsr\u002Fblog\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works","Šta je RAG? Najjednostavnije objašnjenje kako funkcioniše","Osnova pretrage za razumevanje gde se mora sprovesti filtriranje izvora svesno tenanta i izolacija vektorskog skladišta.","Pročitajte osnove RAG-a",{},{"id":1206,"data":1207,"type":42,"tunes":1209},"h-faq",{"text":1208,"level":247},"Često postavljana pitanja",{},{"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 određuje koje operacije principal može da izvrši. Izolacija tenanata određuje kojim resursima tog tenanta te operacije mogu da pristupe. Bezbedne aplikacije sa više tenanata obično zahtevaju oboje.","Koja je razlika između RBAC-a i izolacije tenanata?",{"id":1219,"answer":1220,"question":1221},"faq2","Ne. ADMIN bi trebalo da ima eksplicitni obim. Administrator tenanta obično ima široke dozvole samo unutar tog tenanta, dok administraciju platforme između tenanata treba modelovati odvojeno.","Da li ADMIN uloga automatski dozvoljava pristup svim tenantima?",{"id":1223,"answer":1224,"question":1225},"faq3","Ne. Autentifikacija dokazuje identitet. Autorizacija kontroliše dozvoljene radnje. Izolacija tenanata dodatno sprečava da te radnje dosegnu resurse pogrešnog tenanta.","Da li je autentifikacija dovoljna za izolaciju tenanata?",{"id":1227,"answer":1228,"question":1229},"faq4","Može biti jedan od ulaza u kontekst tenanta, ali server mora da verifikuje trenutno članstvo\u002Fovlašćenje i sprovede obim na granicama zaštićenih resursa. Sam zahtev ne zamenjuje kontrolne mehanizme izolacije.","Da li tenantId treba čuvati u JWT-u?",{"id":1231,"answer":1232,"question":1233},"faq5","Ne nužno. Modeli izolacije sa deljenim tabelama, RLS-om, šemom, bazom podataka, infrastrukturom i hibridni modeli mogu svi biti validni u zavisnosti od rizika i operativnih zahteva.","Da li mi je potrebna odvojena baza podataka za svaki tenant?",{"id":1235,"answer":1236,"question":1237},"faq6","RLS može da pruži snažnu odbranu u dubinu, ali ispravne uloge baze podataka, kontekst zahteva, pokrivenost politikama i autorizacija na nivou aplikacije i dalje su važni.","Može li PostgreSQL RLS da zameni filtere tenanata u aplikativnom kodu?",{"id":1239,"answer":1240,"question":1241},"faq7","Obim tenanta\u002Fpristupa treba sprovesti tokom pretrage tako da neovlašćeni delovi nikada ne uđu u kontekst modela. Sačuvajte metapodatke pristupa kroz deljenje na delove i indeksiranje.","Kako RAG treba da sprovede izolaciju tenanata?",{"id":1243,"answer":1244,"question":1245},"faq8","Da. To je uobičajeno u B2B SaaS-u i snažan razlog da se dodele uloga ograniče članstvom u tenantu, umesto da se uloge tretiraju kao globalno vezane za korisnika.","Može li jedan korisnik imati različite uloge u različitim tenantima?",{"id":1247,"answer":1248,"question":1249},"faq9","Koristite negativne testove između tenanata: kreirajte najmanje dva tenanta, dajte korisniku validne dozvole u jednom tenantu, zatim dokažite da svaka zaštićena putanja odbija pristup resursima drugog tenanta.","Koji je najbolji test za izolaciju tenanata?","RBAC vs izolacija tenanata - često postavljana pitanja",{},{"id":1253,"data":1254,"type":42,"tunes":1256},"h-glossary",{"text":1255,"level":247},"Pojmovnik",{},{"id":1258,"data":1259,"type":1258,"tunes":1305},"glossary",{"title":1260,"entries":1261},"Ključni pojmovi bezbednosti više zakupaca",[1262,1264,1267,1270,1273,1277,1281,1285,1289,1293,1297,1301],{"term":395,"anchor":394,"definition":1263},"Kontrola pristupa zasnovana na ulogama: model autorizacije koji povezuje dozvole sa ulogama i dodeljuje korisnike ili subjekte tim ulogama.",{"term":1265,"anchor":397,"definition":1266},"Zakupac","Korisnik, organizacija, radni prostor ili drugi izolovani logički potrošač deljenog sistema sa više zakupaca.",{"term":398,"anchor":1268,"definition":1269},"tenant-isolation","Mehanizmi koji sprečavaju jednog zakupca da pristupa, menja ili prima resurse drugog zakupca u deljenom sistemu.",{"term":415,"anchor":1271,"definition":1272},"authentication","Provera identiteta korisnika, servisa ili drugog subjekta.",{"term":1274,"anchor":1275,"definition":1276},"Autorizacija","authorization","Proces odlučivanja koji utvrđuje da li subjekat može da izvrši traženu operaciju nad resursom.",{"term":1278,"anchor":1279,"definition":1280},"Dozvola","permission","Definisana dozvoljena operacija ili sposobnost, kao što su orders.read ili users.write.",{"term":1282,"anchor":1283,"definition":1284},"Uloga","role","Imenovana grupa dozvola povezana sa odgovornošću ili funkcijom.",{"term":1286,"anchor":1287,"definition":1288},"ABAC","abac","Kontrola pristupa zasnovana na atributima: autorizacija zasnovana na atributima subjekta, resursa, radnje ili okruženja.",{"term":1290,"anchor":1291,"definition":1292},"Bezbednost na nivou reda","row-level-security","Mehanizam politike baze podataka koji ograničava koje redove uloga ili sesija baze podataka može da čita ili menja.",{"term":1294,"anchor":1295,"definition":1296},"Pristup između zakupaca","cross-tenant-access","Svaki put pristupa u kojem subjekat koji deluje u kontekstu jednog zakupca dospeva do resursa koji pripadaju drugom zakupcu.",{"term":1298,"anchor":1299,"definition":1300},"Administrator platforme","platform-administrator","Privilegovani operativni identitet sa eksplicitno modelovanim ovlašćenjem koje može da obuhvata više zakupaca.",{"term":1302,"anchor":1303,"definition":1304},"Kontekst zakupca","tenant-context","Verifikovani obim zakupca pod kojim se izvršava trenutni zahtev, posao ili operacija agenta.",{},{"id":1307,"data":1308,"type":42,"tunes":1310},"h-conclusion",{"text":1309,"level":247},"Zaključak",{},{"id":1312,"data":1313,"type":218,"tunes":1315},"p-conclusion-1",{"text":1314},"RBAC i izolacija zakupaca su komplementarni, a ne konkurentski bezbednosni mehanizmi. RBAC strukturira operativne dozvole; izolacija zakupaca ograničava granicu resursa unutar koje te dozvole mogu da se primenjuju.",{},{"id":1317,"data":1318,"type":218,"tunes":1320},"p-conclusion-2",{"text":1319},"Robustan zahtev sa više zakupaca stoga zahteva više od „korisnik ima ulogu ADMIN“. Potreban je verifikovani subjekat, verifikovani kontekst zakupca, dozvoljena operacija, cilj u okviru zakupca i primena na svakom sloju resursa koji može da nosi podatke u vlasništvu zakupca.",{},{"id":1322,"data":1323,"type":218,"tunes":1325},"p-conclusion-3",{"text":1324},"Najkraće pouzdano pravilo je: autorizuj radnju, zatim izoluj obim — i nikada ne pretpostavljaj da jedno dokazuje drugo.",{},{"id":1327,"data":1328,"type":42,"tunes":1330},"h-sources",{"text":1329,"level":247},"Primarni izvori i aktuelne smernice",{},{"id":1332,"data":1333,"type":218,"tunes":1335},"p-sources-note",{"text":1334},"Izvori navedeni u nastavku podržavaju definiciju RBAC-a i aktuelne smernice za izolaciju zakupaca. Odsek Aaasaasa AI CMS predstavlja originalne dokaze o implementaciji i namerno je ograničen na obrasce koda koji su verifikovani.",{},{"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 — Kontrola pristupa zasnovana na ulogama","NIST pregled RBAC modela i INCITS RBAC standarda, uključujući korisnike, uloge, dozvole, operacije i objekte.","linkTool",{},{"id":1347,"data":1348,"type":1344,"tunes":1354},"src-nist-glossary",{"link":1349,"meta":1350},"https:\u002F\u002Fcsrc.nist.gov\u002Fglossary\u002Fterm\u002Frole_based_access_control",{"image":1351,"title":1352,"description":1353},{"url":369},"NIST CSRC — RBAC pojmovnik","Aktuelne NIST definicije kontrole pristupa zasnovane na ulogama kao dodele dozvola putem uloga.",{},{"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 — Način razmišljanja o izolaciji","AWS SaaS smernice koje eksplicitno razlikuju autentifikaciju\u002Fautorizaciju od izolacije zakupaca i preporučuju deljene mehanizme izolacije.",{},{"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 — Česta pitanja o autorizaciji sa više zakupaca","Aktuelne smernice koje objašnjavaju razliku između autorizacije i izolacije zakupaca u SaaS aplikacijama.",{},{"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 — Razmatranja dizajna sa više zakupaca","Aktuelne SaaS smernice koje razlikuju izolaciju zakupaca od autorizacije i razmatraju modele politike autorizacije sa udruženim\u002Fizolovanim resursima.",{},{"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 — Šalabahter za bezbednost aplikacija sa više zakupaca","Aktuelne praktične smernice za kontekst zakupca, izolaciju baze podataka, keševe, skladištenje, redove, testiranje i sprečavanje pristupa između zakupaca.",{},{"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 — Šalabahter za bezbednost RAG-a","Aktuelne smernice koje zahtevaju kontrolu pristupa u trenutku preuzimanja i izolaciju zakupaca za vektorske baze podataka sa više zakupaca.",{},{"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 — Regresiono testiranje autorizacije","Aktuelne smernice za testiranje, uključujući testove degradacije uloga i granica između zakupaca.",{},"2.31","RBAC kontroliše šta korisnik sme da radi; izolacija zakupaca kontroliše kojim resursima tog zakupca ta radnja može da pristupi. Saznajte zašto bezbednost višekorisničkog SaaS-a zahteva obe granice.","\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,"Politike i granice podataka","policy-and-data",{"id":1432,"name":1433,"slug":1434},57,"Granice podataka","data-boundaries",{"id":1436,"name":1437,"slug":1438},64,"Informaciona arhitektura","information-architecture",{"id":1440,"login":1441,"email":1442,"displayName":1443},"20","rooth8233","aleksandar@stajic.de","Aleksandar Stajić",[1445,2439],{"lang":1446,"title":1447,"content":1448,"contentJson":1449,"excerpt":2438},"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":2437},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,1903,1907,1912,1916,1920,1924,1928,1932,1957,1962,1966,1970,1974,1978,1982,2019,2023,2027,2073,2077,2114,2118,2159,2163,2211,2215,2219,2223,2227,2231,2235,2239,2243,2247,2251,2255,2259,2263,2269,2273,2280,2284,2316,2320,2357,2361,2365,2369,2373,2377,2381,2388,2395,2402,2409,2416,2423,2430],{"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":1902},{"content":1882,"stretched":43,"withHeadings":14},[1883,1887,1890,1893,1895,1896,1899],[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],[776,777,1897,1898],"Explicit support scope + audited target tenant","Potentially allow under platform policy",[781,782,1900,1901],"Trusted service scope for job tenant","Allow only for verified job tenant",{},{"id":787,"data":1904,"type":42,"tunes":1906},{"text":1905,"level":247},"Original implementation evidence: Aaasaasa AI CMS",{},{"id":792,"data":1908,"type":226,"tunes":1911},{"body":1909,"title":1910,"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":1913,"type":218,"tunes":1915},{"text":1914},"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":1917,"type":218,"tunes":1919},{"text":1918},"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":1921,"type":218,"tunes":1923},{"text":1922},"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":1925,"type":218,"tunes":1927},{"text":1926},"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":1929,"type":218,"tunes":1931},{"text":1930},"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":1933,"type":391,"tunes":1956},{"content":1934,"stretched":43,"withHeadings":14},[1935,1938,1941,1944,1947,1950,1953],[1936,1937],"Observed implementation pattern","Security meaning",[1939,1940],"Typed permission codes","RBAC operation vocabulary is explicit",[1942,1943],"System role → permission maps","Roles aggregate permissions rather than hard-coding users",[1945,1946],"tenantId_code role identity","Same logical role can exist separately per tenant",[1948,1949],"Role lookup uses id + tenantId","Role mutation is tenant-scoped",[1951,1952],"User-role relation stores tenantId","Membership is not globally inferred from role alone",[1954,1955],"Permission resolution uses tenantId + userId","Authorization is evaluated inside tenant context",{},{"id":849,"data":1958,"type":226,"tunes":1961},{"body":1959,"title":1960,"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":1963,"type":42,"tunes":1965},{"text":1964,"level":247},"Why this distinction matters even more for AI agents",{},{"id":860,"data":1967,"type":218,"tunes":1969},{"text":1968},"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":1971,"type":218,"tunes":1973},{"text":1972},"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":1975,"type":218,"tunes":1977},{"text":1976},"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":1979,"type":42,"tunes":1981},{"text":1980,"level":247},"Test RBAC and tenant isolation separately",{},{"id":880,"data":1983,"type":391,"tunes":2018},{"content":1984,"stretched":43,"withHeadings":14},[1985,1988,1991,1994,1997,2000,2003,2006,2009,2012,2015],[1986,1987],"Test family","What it should prove",[1989,1990],"Role demotion test","A user without a permission cannot perform the operation even inside their own tenant",[1992,1993],"Cross-tenant object test","A user with the correct role still cannot access the same resource type in another tenant",[1995,1996],"Identifier tampering","Changing object\u002Ftenant IDs does not cross scope",[1998,1999],"List\u002Fbulk endpoint test","Broad queries return only authorized tenant data",[2001,2002],"Cache reuse test","Two tenants using reused processes\u002Fconnections never receive each other's cached state",[2004,2005],"RLS request-role test","Production request role cannot bypass row policies",[2007,2008],"Async worker test","Tenant context survives queueing and is revalidated at consumption",[2010,2011],"Vector retrieval test","Tenant A query never retrieves Tenant B chunks",[2013,2014],"Platform-admin test","Cross-tenant capability is explicit, narrow and auditable",[2016,2017],"Offboarding test","Tenant data and derived indexes\u002Fcaches are removed according to policy",{},{"id":918,"data":2020,"type":218,"tunes":2022},{"text":2021},"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":2024,"type":42,"tunes":2026},{"text":2025,"level":247},"Common failure modes",{},{"id":928,"data":2028,"type":391,"tunes":2072},{"content":2029,"stretched":43,"withHeadings":14},[2030,2033,2036,2039,2042,2045,2048,2051,2054,2057,2060,2063,2066,2069],[2031,2032],"Failure mode","Why it fails",[2034,2035],"Check role but not tenant","Valid role becomes cross-tenant authority",[2037,2038],"Trust tenant ID from request","Client controls the isolation selector",[2040,2041],"Scope UI but not API","Hidden buttons do not protect backend resources",[2043,2044],"Tenant-aware detail endpoint, unscoped list endpoint","Bulk reads leak other tenants",[2046,2047],"Tenant filter in most queries","One forgotten path breaks the boundary",[2049,2050],"Global cache keys","Correct database isolation is bypassed by cached data",[2052,2053],"Shared vector index without enforced metadata filters","RAG retrieves another tenant's chunks",[2055,2056],"Queue message tenant ID treated as authorization","Forged or wrongly produced job can cross tenant boundary",[2058,2059],"Platform admin modeled as ordinary ADMIN","Cross-tenant power becomes implicit and difficult to audit",[2061,2062],"Role copied globally across tenant memberships","User receives permissions in tenants where they were never assigned",[2064,2065],"Separate databases but shared privileged credential","Application can still cross databases if its credential is too broad",[2067,2068],"RLS with BYPASSRLS request role","Database policy exists but does not protect the actual request path",[2070,2071],"Random UUIDs treated as isolation","Hard-to-guess identifiers reduce enumeration but do not authorize access",{},{"id":975,"data":2074,"type":42,"tunes":2076},{"text":2075,"level":247},"Common misconceptions",{},{"id":980,"data":2078,"type":391,"tunes":2113},{"content":2079,"stretched":43,"withHeadings":14},[2080,2083,2086,2089,2092,2095,2098,2101,2104,2107,2110],[2081,2082],"Misconception","Correction",[2084,2085],"“RBAC provides tenant isolation.”","RBAC controls permissions; isolation also requires tenant\u002Fresource scoping.",[2087,2088],"“If the user is an admin, tenant checks are unnecessary.”","Admin authority must still have an explicit scope.",[2090,2091],"“Tenant ID in JWT is enough.”","It can be a trusted input only if validated and applied consistently to every protected resource path.",[2093,2094],"“Separate databases remove authorization requirements.”","Users still need operation-level permissions inside their tenant.",[2096,2097],"“A tenant_id column means the system is isolated.”","The field only helps if access paths enforce it.",[2099,2100],"“UUIDs prevent cross-tenant access.”","Unpredictable identifiers are defense in depth, not authorization.",[2102,2103],"“RLS means application code needs no security checks.”","Application authorization, correct DB roles and policy coverage still matter.",[2105,2106],"“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.",[2108,2109],"“Platform support needs global ADMIN.”","Cross-tenant support should be a distinct, constrained and auditable authority.",[2111,2112],"“Internal services can skip tenant checks.”","Internal paths can still be compromised or misconfigured and must preserve tenant context.",{},{"id":1018,"data":2115,"type":42,"tunes":2117},{"text":2116,"level":247},"A practical design sequence",{},{"id":1023,"data":2119,"type":334,"tunes":2158},{"steps":2120,"title":2157,"orientation":333},[2121,2124,2127,2130,2133,2136,2139,2142,2145,2148,2151,2154],{"label":2122,"description":2123},"1. Define tenant ownership","Classify which entities and resources are global, tenant-scoped, user-scoped or intentionally cross-tenant.",{"label":2125,"description":2126},"2. Define operations","Create explicit permissions for reads, writes, publishing, approvals, administration and other business actions.",{"label":2128,"description":2129},"3. Define roles","Group permissions according to responsibilities without embedding accidental global scope.",{"label":2131,"description":2132},"4. Define membership scope","Bind role assignments to the tenant\u002Fworkspace\u002Fproject context in which they apply.",{"label":2134,"description":2135},"5. Resolve trusted tenant context","Derive tenant identity from authenticated, server-verified membership or service authorization.",{"label":2137,"description":2138},"6. Enforce resource ownership","Apply tenant scope at every tenant-owned data\u002Fservice boundary.",{"label":2140,"description":2141},"7. Add defense in depth","Use RLS, separate credentials, schemas\u002Fdatabases, storage policies or policy engines where risk justifies them.",{"label":2143,"description":2144},"8. Carry scope through derived systems","Preserve tenant metadata in cache, search, vector indexes, queues, files and analytics.",{"label":2146,"description":2147},"9. Model cross-tenant operations explicitly","Separate platform administration and service identities from ordinary tenant roles.",{"label":2149,"description":2150},"10. Test both axes","Run negative tests for missing permission and for wrong tenant independently.",{"label":2152,"description":2153},"11. Audit tenant + permission together","Log who acted, in which tenant, on what target and under which authority.",{"label":2155,"description":2156},"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":2160,"type":42,"tunes":2162},{"text":2161,"level":247},"RBAC + tenant isolation checklist",{},{"id":1070,"data":2164,"type":391,"tunes":2210},{"content":2165,"stretched":43,"withHeadings":14},[2166,2168,2171,2174,2177,2180,2183,2186,2189,2192,2195,2198,2201,2204,2207],[1602,2167],"Expected answer",[2169,2170],"Who is the principal?","Authenticated user\u002Fservice\u002Fagent identity",[2172,2173],"Which tenant context applies?","Server-verified membership or service scope",[2175,2176],"Which operation is requested?","Typed permission or policy action",[2178,2179],"Does the principal have that permission?","Role\u002Fpolicy decision",[2181,2182],"Who owns the target resource?","Explicit tenant\u002Fglobal\u002Fuser classification",[2184,2185],"Does resource scope match authority?","Tenant-aware lookup\u002Fpolicy",[2187,2188],"Can storage bypass application checks?","Defense-in-depth decision documented",[2190,2191],"Are caches tenant-safe?","Keys\u002Fnamespaces and authorization preserve tenant scope",[2193,2194],"Are files\u002Fblobs tenant-safe?","Object policy and signed URL issuance enforce scope",[2196,2197],"Are async jobs tenant-safe?","Verified context propagates and is revalidated",[2199,2200],"Is RAG\u002Fsearch tenant-safe?","Metadata\u002Fcollection isolation enforced before model context",[2202,2203],"Are cross-tenant admins explicit?","Separate authority, controls and audit",[2205,2206],"Can ordinary credentials bypass isolation?","No, or tightly documented exceptional path",[2208,2209],"Are negative cross-tenant tests automated?","Yes for every relevant access layer",{},{"id":1119,"data":2212,"type":42,"tunes":2214},{"text":2213,"level":247},"Edge cases and limitations",{},{"id":1124,"data":2216,"type":218,"tunes":2218},{"text":2217},"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":2220,"type":218,"tunes":2222},{"text":2221},"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":2224,"type":218,"tunes":2226},{"text":2225},"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":2228,"type":218,"tunes":2230},{"text":2229},"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":2232,"type":218,"tunes":2234},{"text":2233},"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":2236,"type":42,"tunes":2238},{"text":2237,"level":247},"What would change this answer?",{},{"id":1154,"data":2240,"type":218,"tunes":2242},{"text":2241},"The exact implementation changes with architecture: serverless APIs, Kubernetes, PostgreSQL, object storage, vector databases and policy engines expose different isolation primitives.",{},{"id":1159,"data":2244,"type":218,"tunes":2246},{"text":2245},"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":2248,"type":218,"tunes":2250},{"text":2249},"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":2252,"type":42,"tunes":2254},{"text":2253,"level":247},"Related canonical knowledge",{},{"id":1174,"data":2256,"type":218,"tunes":2258},{"text":2257},"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":2260,"type":218,"tunes":2262},{"text":2261},"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":2264,"type":1190,"tunes":2268},{"url":1186,"title":2265,"excerpt":2266,"ctaLabel":2267},"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":2270,"type":218,"tunes":2272},{"text":2271},"For RAG, tenant isolation must be enforced before protected chunks reach model context.",{},{"id":1198,"data":2274,"type":1190,"tunes":2279},{"url":2275,"title":2276,"excerpt":2277,"ctaLabel":2278},"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":2281,"type":42,"tunes":2283},{"text":2282,"level":247},"Frequently asked questions",{},{"id":1211,"data":2285,"type":1211,"tunes":2315},{"items":2286,"title":2314},[2287,2290,2293,2296,2299,2302,2305,2308,2311],{"id":1215,"answer":2288,"question":2289},"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":2291,"question":2292},"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":2294,"question":2295},"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":2297,"question":2298},"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":2300,"question":2301},"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":2303,"question":2304},"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":2306,"question":2307},"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":2309,"question":2310},"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":2312,"question":2313},"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":2317,"type":42,"tunes":2319},{"text":2318,"level":247},"Glossary",{},{"id":1258,"data":2321,"type":1258,"tunes":2356},{"title":2322,"entries":2323},"Key multi-tenant security terms",[2324,2326,2329,2331,2333,2336,2339,2342,2344,2347,2350,2353],{"term":395,"anchor":394,"definition":2325},"Role-Based Access Control: an authorization model that associates permissions with roles and assigns users or principals to those roles.",{"term":2327,"anchor":397,"definition":2328},"Tenant","A customer, organization, workspace or other isolated logical consumer of a shared multi-tenant system.",{"term":1591,"anchor":1268,"definition":2330},"Mechanisms that prevent one tenant from accessing, modifying or receiving another tenant's resources in a shared system.",{"term":1605,"anchor":1271,"definition":2332},"Verification of the identity of a user, service or other principal.",{"term":2334,"anchor":1275,"definition":2335},"Authorization","Decision process that determines whether a principal may perform a requested operation on a resource.",{"term":2337,"anchor":1279,"definition":2338},"Permission","A defined allowed operation or capability such as orders.read or users.write.",{"term":2340,"anchor":1283,"definition":2341},"Role","A named grouping of permissions associated with a responsibility or function.",{"term":1286,"anchor":1287,"definition":2343},"Attribute-Based Access Control: authorization based on attributes of the principal, resource, action or environment.",{"term":2345,"anchor":1291,"definition":2346},"Row-Level Security","Database policy mechanism that restricts which rows a database role or session may read or modify.",{"term":2348,"anchor":1295,"definition":2349},"Cross-tenant access","Any access path in which a principal operating under one tenant context reaches resources belonging to another tenant.",{"term":2351,"anchor":1299,"definition":2352},"Platform administrator","A privileged operational identity with explicitly modeled authority that may span multiple tenants.",{"term":2354,"anchor":1303,"definition":2355},"Tenant context","The verified tenant scope under which the current request, job or agent operation executes.",{},{"id":1307,"data":2358,"type":42,"tunes":2360},{"text":2359,"level":247},"Conclusion",{},{"id":1312,"data":2362,"type":218,"tunes":2364},{"text":2363},"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":2366,"type":218,"tunes":2368},{"text":2367},"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":2370,"type":218,"tunes":2372},{"text":2371},"The shortest reliable rule is: authorize the action, then isolate the scope — and never assume one proves the other.",{},{"id":1327,"data":2374,"type":42,"tunes":2376},{"text":2375,"level":247},"Primary sources and current guidance",{},{"id":1332,"data":2378,"type":218,"tunes":2380},{"text":2379},"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":2382,"type":1344,"tunes":2387},{"link":1339,"meta":2383},{"image":2384,"title":2385,"description":2386},{"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":2389,"type":1344,"tunes":2394},{"link":1349,"meta":2390},{"image":2391,"title":2392,"description":2393},{"url":369},"NIST CSRC — RBAC glossary","Current NIST glossary definitions of role-based access control as permission assignment through roles.",{},{"id":1356,"data":2396,"type":1344,"tunes":2401},{"link":1358,"meta":2397},{"image":2398,"title":2399,"description":2400},{"url":369},"AWS — The isolation mindset","AWS SaaS guidance explicitly distinguishing authentication\u002Fauthorization from tenant isolation and recommending shared isolation mechanisms.",{},{"id":1365,"data":2403,"type":1344,"tunes":2408},{"link":1367,"meta":2404},{"image":2405,"title":2406,"description":2407},{"url":369},"AWS — Multi-tenant authorization FAQ","Current guidance explaining the difference between authorization and tenant isolation in SaaS applications.",{},{"id":1374,"data":2410,"type":1344,"tunes":2415},{"link":1376,"meta":2411},{"image":2412,"title":2413,"description":2414},{"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":2417,"type":1344,"tunes":2422},{"link":1385,"meta":2418},{"image":2419,"title":2420,"description":2421},{"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":2424,"type":1344,"tunes":2429},{"link":1394,"meta":2425},{"image":2426,"title":2427,"description":2428},{"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":2431,"type":1344,"tunes":2436},{"link":1403,"meta":2432},{"image":2433,"title":2434,"description":2435},{"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":2440,"excerpt":1410},{"time":212,"blocks":2441,"version":1409},[2442,2445,2448,2451,2454,2457,2460,2463,2466,2469,2472,2475,2478,2481,2484,2487,2490,2493,2503,2506,2509,2512,2515,2518,2537,2540,2548,2551,2554,2557,2560,2563,2566,2569,2572,2575,2578,2581,2589,2592,2595,2598,2601,2604,2607,2618,2621,2624,2627,2630,2633,2636,2639,2642,2645,2648,2651,2654,2657,2660,2663,2666,2669,2672,2675,2678,2681,2684,2687,2690,2693,2696,2699,2702,2705,2708,2711,2714,2717,2720,2723,2726,2729,2732,2743,2746,2749,2752,2755,2758,2761,2764,2775,2778,2781,2784,2787,2790,2793,2808,2811,2814,2832,2835,2850,2853,2869,2872,2891,2894,2897,2900,2903,2906,2909,2912,2915,2918,2921,2924,2927,2930,2933,2936,2939,2942,2955,2958,2974,2977,2980,2983,2986,2989,2992,2997,3002,3007,3012,3017,3022,3027],{"id":215,"data":2443,"type":218,"tunes":2444},{"text":217},{},{"id":221,"data":2446,"type":226,"tunes":2447},{"body":223,"title":224,"variant":225},{},{"id":229,"data":2449,"type":226,"tunes":2450},{"body":231,"title":232,"variant":233},{},{"id":236,"data":2452,"type":226,"tunes":2453},{"body":238,"title":239,"variant":240},{},{"id":243,"data":2455,"type":248,"tunes":2456},{"title":245,"maxLevel":246,"minLevel":247},{},{"id":251,"data":2458,"type":42,"tunes":2459},{"text":253,"level":247},{},{"id":256,"data":2461,"type":218,"tunes":2462},{"text":258},{},{"id":261,"data":2464,"type":218,"tunes":2465},{"text":263},{},{"id":266,"data":2467,"type":218,"tunes":2468},{"text":268},{},{"id":271,"data":2470,"type":42,"tunes":2471},{"text":273,"level":247},{},{"id":276,"data":2473,"type":218,"tunes":2474},{"text":278},{},{"id":281,"data":2476,"type":218,"tunes":2477},{"text":283},{},{"id":286,"data":2479,"type":218,"tunes":2480},{"text":288},{},{"id":291,"data":2482,"type":42,"tunes":2483},{"text":293,"level":247},{},{"id":296,"data":2485,"type":218,"tunes":2486},{"text":298},{},{"id":301,"data":2488,"type":218,"tunes":2489},{"text":303},{},{"id":306,"data":2491,"type":218,"tunes":2492},{"text":308},{},{"id":311,"data":2494,"type":334,"tunes":2502},{"steps":2495,"title":332,"orientation":333},[2496,2497,2498,2499,2500,2501],{"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":2504,"type":42,"tunes":2505},{"text":339,"level":247},{},{"id":342,"data":2507,"type":218,"tunes":2508},{"text":344},{},{"id":347,"data":2510,"type":218,"tunes":2511},{"text":349},{},{"id":352,"data":2513,"type":218,"tunes":2514},{"text":354},{},{"id":357,"data":2516,"type":42,"tunes":2517},{"text":359,"level":247},{},{"id":362,"data":2519,"type":399,"tunes":2536},{"rows":2520,"title":390,"layout":391,"columns":2533},[2521,2523,2525,2527,2529,2531],{"id":366,"label":367,"values":2522},[369,369],{"id":371,"label":372,"values":2524},[369,369],{"id":375,"label":376,"values":2526},[369,369],{"id":379,"label":380,"values":2528},[369,369],{"id":383,"label":384,"values":2530},[369,369],{"id":387,"label":388,"values":2532},[369,369],[2534,2535],{"id":394,"label":395},{"id":397,"label":398},{},{"id":402,"data":2538,"type":42,"tunes":2539},{"text":404,"level":247},{},{"id":407,"data":2541,"type":391,"tunes":2547},{"content":2542,"stretched":43,"withHeadings":14},[2543,2544,2545,2546],[411,412,413],[415,416,417],[419,420,421],[398,423,424],{},{"id":427,"data":2549,"type":218,"tunes":2550},{"text":429},{},{"id":432,"data":2552,"type":42,"tunes":2553},{"text":434,"level":247},{},{"id":437,"data":2555,"type":218,"tunes":2556},{"text":439},{},{"id":442,"data":2558,"type":218,"tunes":2559},{"text":444},{},{"id":447,"data":2561,"type":218,"tunes":2562},{"text":449},{},{"id":452,"data":2564,"type":42,"tunes":2565},{"text":454,"level":247},{},{"id":457,"data":2567,"type":218,"tunes":2568},{"text":459},{},{"id":462,"data":2570,"type":218,"tunes":2571},{"text":464},{},{"id":467,"data":2573,"type":218,"tunes":2574},{"text":469},{},{"id":472,"data":2576,"type":42,"tunes":2577},{"text":474,"level":247},{},{"id":477,"data":2579,"type":218,"tunes":2580},{"text":479},{},{"id":482,"data":2582,"type":391,"tunes":2588},{"content":2583,"stretched":43,"withHeadings":14},[2584,2585,2586,2587],[486,487],[489,490],[492,493],[495,496],{},{"id":499,"data":2590,"type":218,"tunes":2591},{"text":501},{},{"id":504,"data":2593,"type":42,"tunes":2594},{"text":506,"level":247},{},{"id":509,"data":2596,"type":218,"tunes":2597},{"text":511},{},{"id":514,"data":2599,"type":218,"tunes":2600},{"text":516},{},{"id":519,"data":2602,"type":226,"tunes":2603},{"body":521,"title":522,"variant":523},{},{"id":526,"data":2605,"type":42,"tunes":2606},{"text":528,"level":247},{},{"id":531,"data":2608,"type":391,"tunes":2617},{"content":2609,"stretched":43,"withHeadings":14},[2610,2611,2612,2613,2614,2615,2616],[535,536,537],[539,540,541],[543,544,545],[547,548,549],[551,552,553],[555,556,557],[559,560,561],{},{"id":564,"data":2619,"type":218,"tunes":2620},{"text":566},{},{"id":569,"data":2622,"type":42,"tunes":2623},{"text":571,"level":247},{},{"id":574,"data":2625,"type":218,"tunes":2626},{"text":576},{},{"id":579,"data":2628,"type":218,"tunes":2629},{"text":581},{},{"id":584,"data":2631,"type":218,"tunes":2632},{"text":586},{},{"id":589,"data":2634,"type":42,"tunes":2635},{"text":591,"level":247},{},{"id":594,"data":2637,"type":218,"tunes":2638},{"text":596},{},{"id":599,"data":2640,"type":218,"tunes":2641},{"text":601},{},{"id":604,"data":2643,"type":218,"tunes":2644},{"text":606},{},{"id":609,"data":2646,"type":42,"tunes":2647},{"text":611,"level":247},{},{"id":614,"data":2649,"type":218,"tunes":2650},{"text":616},{},{"id":619,"data":2652,"type":218,"tunes":2653},{"text":621},{},{"id":624,"data":2655,"type":218,"tunes":2656},{"text":626},{},{"id":629,"data":2658,"type":42,"tunes":2659},{"text":631,"level":247},{},{"id":634,"data":2661,"type":218,"tunes":2662},{"text":636},{},{"id":639,"data":2664,"type":218,"tunes":2665},{"text":641},{},{"id":644,"data":2667,"type":218,"tunes":2668},{"text":646},{},{"id":649,"data":2670,"type":42,"tunes":2671},{"text":651,"level":247},{},{"id":654,"data":2673,"type":218,"tunes":2674},{"text":656},{},{"id":659,"data":2676,"type":218,"tunes":2677},{"text":661},{},{"id":664,"data":2679,"type":218,"tunes":2680},{"text":666},{},{"id":669,"data":2682,"type":226,"tunes":2683},{"body":671,"title":672,"variant":233},{},{"id":675,"data":2685,"type":42,"tunes":2686},{"text":677,"level":247},{},{"id":680,"data":2688,"type":218,"tunes":2689},{"text":682},{},{"id":685,"data":2691,"type":218,"tunes":2692},{"text":687},{},{"id":690,"data":2694,"type":42,"tunes":2695},{"text":692,"level":247},{},{"id":695,"data":2697,"type":218,"tunes":2698},{"text":697},{},{"id":700,"data":2700,"type":218,"tunes":2701},{"text":702},{},{"id":705,"data":2703,"type":218,"tunes":2704},{"text":707},{},{"id":710,"data":2706,"type":42,"tunes":2707},{"text":712,"level":247},{},{"id":715,"data":2709,"type":218,"tunes":2710},{"text":717},{},{"id":720,"data":2712,"type":218,"tunes":2713},{"text":722},{},{"id":725,"data":2715,"type":218,"tunes":2716},{"text":727},{},{"id":730,"data":2718,"type":42,"tunes":2719},{"text":732,"level":247},{},{"id":735,"data":2721,"type":218,"tunes":2722},{"text":737},{},{"id":740,"data":2724,"type":218,"tunes":2725},{"text":742},{},{"id":745,"data":2727,"type":218,"tunes":2728},{"text":747},{},{"id":750,"data":2730,"type":42,"tunes":2731},{"text":752,"level":247},{},{"id":755,"data":2733,"type":391,"tunes":2742},{"content":2734,"stretched":43,"withHeadings":14},[2735,2736,2737,2738,2739,2740,2741],[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":2744,"type":42,"tunes":2745},{"text":789,"level":247},{},{"id":792,"data":2747,"type":226,"tunes":2748},{"body":794,"title":795,"variant":240},{},{"id":798,"data":2750,"type":218,"tunes":2751},{"text":800},{},{"id":803,"data":2753,"type":218,"tunes":2754},{"text":805},{},{"id":808,"data":2756,"type":218,"tunes":2757},{"text":810},{},{"id":813,"data":2759,"type":218,"tunes":2760},{"text":815},{},{"id":818,"data":2762,"type":218,"tunes":2763},{"text":820},{},{"id":823,"data":2765,"type":391,"tunes":2774},{"content":2766,"stretched":43,"withHeadings":14},[2767,2768,2769,2770,2771,2772,2773],[827,828],[830,831],[833,834],[836,837],[839,840],[842,843],[845,846],{},{"id":849,"data":2776,"type":226,"tunes":2777},{"body":851,"title":852,"variant":233},{},{"id":855,"data":2779,"type":42,"tunes":2780},{"text":857,"level":247},{},{"id":860,"data":2782,"type":218,"tunes":2783},{"text":862},{},{"id":865,"data":2785,"type":218,"tunes":2786},{"text":867},{},{"id":870,"data":2788,"type":218,"tunes":2789},{"text":872},{},{"id":875,"data":2791,"type":42,"tunes":2792},{"text":877,"level":247},{},{"id":880,"data":2794,"type":391,"tunes":2807},{"content":2795,"stretched":43,"withHeadings":14},[2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806],[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":2809,"type":218,"tunes":2810},{"text":920},{},{"id":923,"data":2812,"type":42,"tunes":2813},{"text":925,"level":247},{},{"id":928,"data":2815,"type":391,"tunes":2831},{"content":2816,"stretched":43,"withHeadings":14},[2817,2818,2819,2820,2821,2822,2823,2824,2825,2826,2827,2828,2829,2830],[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":2833,"type":42,"tunes":2834},{"text":977,"level":247},{},{"id":980,"data":2836,"type":391,"tunes":2849},{"content":2837,"stretched":43,"withHeadings":14},[2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848],[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":2851,"type":42,"tunes":2852},{"text":1020,"level":247},{},{"id":1023,"data":2854,"type":334,"tunes":2868},{"steps":2855,"title":1062,"orientation":333},[2856,2857,2858,2859,2860,2861,2862,2863,2864,2865,2866,2867],{"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":2870,"type":42,"tunes":2871},{"text":1067,"level":247},{},{"id":1070,"data":2873,"type":391,"tunes":2890},{"content":2874,"stretched":43,"withHeadings":14},[2875,2876,2877,2878,2879,2880,2881,2882,2883,2884,2885,2886,2887,2888,2889],[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":2892,"type":42,"tunes":2893},{"text":1121,"level":247},{},{"id":1124,"data":2895,"type":218,"tunes":2896},{"text":1126},{},{"id":1129,"data":2898,"type":218,"tunes":2899},{"text":1131},{},{"id":1134,"data":2901,"type":218,"tunes":2902},{"text":1136},{},{"id":1139,"data":2904,"type":218,"tunes":2905},{"text":1141},{},{"id":1144,"data":2907,"type":218,"tunes":2908},{"text":1146},{},{"id":1149,"data":2910,"type":42,"tunes":2911},{"text":1151,"level":247},{},{"id":1154,"data":2913,"type":218,"tunes":2914},{"text":1156},{},{"id":1159,"data":2916,"type":218,"tunes":2917},{"text":1161},{},{"id":1164,"data":2919,"type":218,"tunes":2920},{"text":1166},{},{"id":1169,"data":2922,"type":42,"tunes":2923},{"text":1171,"level":247},{},{"id":1174,"data":2925,"type":218,"tunes":2926},{"text":1176},{},{"id":1179,"data":2928,"type":218,"tunes":2929},{"text":1181},{},{"id":1184,"data":2931,"type":1190,"tunes":2932},{"url":1186,"title":1187,"excerpt":1188,"ctaLabel":1189},{},{"id":1193,"data":2934,"type":218,"tunes":2935},{"text":1195},{},{"id":1198,"data":2937,"type":1190,"tunes":2938},{"url":1200,"title":1201,"excerpt":1202,"ctaLabel":1203},{},{"id":1206,"data":2940,"type":42,"tunes":2941},{"text":1208,"level":247},{},{"id":1211,"data":2943,"type":1211,"tunes":2954},{"items":2944,"title":1250},[2945,2946,2947,2948,2949,2950,2951,2952,2953],{"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":2956,"type":42,"tunes":2957},{"text":1255,"level":247},{},{"id":1258,"data":2959,"type":1258,"tunes":2973},{"title":1260,"entries":2960},[2961,2962,2963,2964,2965,2966,2967,2968,2969,2970,2971,2972],{"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":2975,"type":42,"tunes":2976},{"text":1309,"level":247},{},{"id":1312,"data":2978,"type":218,"tunes":2979},{"text":1314},{},{"id":1317,"data":2981,"type":218,"tunes":2982},{"text":1319},{},{"id":1322,"data":2984,"type":218,"tunes":2985},{"text":1324},{},{"id":1327,"data":2987,"type":42,"tunes":2988},{"text":1329,"level":247},{},{"id":1332,"data":2990,"type":218,"tunes":2991},{"text":1334},{},{"id":1337,"data":2993,"type":1344,"tunes":2996},{"link":1339,"meta":2994},{"image":2995,"title":1342,"description":1343},{"url":369},{},{"id":1347,"data":2998,"type":1344,"tunes":3001},{"link":1349,"meta":2999},{"image":3000,"title":1352,"description":1353},{"url":369},{},{"id":1356,"data":3003,"type":1344,"tunes":3006},{"link":1358,"meta":3004},{"image":3005,"title":1361,"description":1362},{"url":369},{},{"id":1365,"data":3008,"type":1344,"tunes":3011},{"link":1367,"meta":3009},{"image":3010,"title":1370,"description":1371},{"url":369},{},{"id":1374,"data":3013,"type":1344,"tunes":3016},{"link":1376,"meta":3014},{"image":3015,"title":1379,"description":1380},{"url":369},{},{"id":1383,"data":3018,"type":1344,"tunes":3021},{"link":1385,"meta":3019},{"image":3020,"title":1388,"description":1389},{"url":369},{},{"id":1392,"data":3023,"type":1344,"tunes":3026},{"link":1394,"meta":3024},{"image":3025,"title":1397,"description":1398},{"url":369},{},{"id":1401,"data":3028,"type":1344,"tunes":3031},{"link":1403,"meta":3029},{"image":3030,"title":1406,"description":1407},{"url":369},{},"Post erfolgreich abgerufen",{"items":3034,"source":3118,"manualIds":3119,"manualMatchedIds":3120},[3035,3042,3049,3056,3063,3070,3077,3084,3091,3097,3104,3111],{"id":3036,"slug":3037,"title":3038,"excerpt":3039,"featuredImage":3040,"publishedAt":3041},"467","the-answer-validity-boundary-the-missing-layer-between-relevance-and-reliable-ai-answers","Granica valjanosti odgovora: Nedostajući sloj između relevantnosti i pouzdanih AI odgovora","Izvor može biti relevantan, autoritativan i ipak pogrešan za pitanje koje se postavlja. Sloj koji nedostaje je primenljivost: uslovi pod kojima odgovor važi i promene koje ga primoravaju na preispitivanje. Ovaj članak predstavlja Granicu važenja odgovora kao obrazac za dizajn izvora za ljude, AI pretragu i RAG sisteme.","\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":3043,"slug":3044,"title":3045,"excerpt":3046,"featuredImage":3047,"publishedAt":3048},"476","mcp-vs-a2a-vs-ucp-vs-ap2-vs-a2ui-the-agent-protocol-stack-explained","MCP vs A2A vs UCP vs AP2 vs A2UI: Objašnjen stek agentskih protokola","MCP, A2A, UCP, AP2 i A2UI se često predstavljaju kao konkurentski standardi za agente. Oni uglavnom rešavaju različite probleme interoperabilnosti. Ovaj vodič mapira svaki protokol na granicu koju zapravo standardizuje—i pokazuje kako oni mogu da rade zajedno u jednom produkcionom sistemu.","\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":3050,"slug":3051,"title":3052,"excerpt":3053,"featuredImage":3054,"publishedAt":3055},"487","vector-databases-embeddings-and-reranking-three-different-parts-of-retrieval","Vektorske baze podataka, ugrađivanja i ponovno rangiranje: Tri različita dela pretraživanja","Embedinzi predstavljaju značenje, vektorske baze podataka pronalaze kandidate, a rerangirači prečišćavaju rezultate. Saznajte kako se ova tri sloja pronalaženja razlikuju i kako rade zajedno u RAG-u.","\u002Fuploads\u002F2026\u002F10\u002Fvector-databases-embeddings-and-reranking-three-different-parts-of-retrieval-1791480129884-9dtasz.webp","2026-10-08T11:21:00.000Z",{"id":3057,"slug":3058,"title":3059,"excerpt":3060,"featuredImage":3061,"publishedAt":3062},"488","what-is-context-engineering-what-the-model-receives-before-it-answers","Šta je kontekstualno inženjerstvo? Šta model prima pre nego što odgovori","Inženjering konteksta osmišljava koje informacije AI model prima pre inferencije, uključujući promptove, pretragu, memoriju, stanje aplikacije, rezultate alata i istoriju konverzacije.","\u002Fuploads\u002F2026\u002F10\u002Fwhat-is-context-engineering-what-the-model-receives-before-it-answers-1791480653258-018kcv.webp","2026-10-08T13:29:00.000Z",{"id":3064,"slug":3065,"title":3066,"excerpt":3067,"featuredImage":3068,"publishedAt":3069},"468","ai-agent-memory-is-not-rag-how-to-separate-memory-retrieval-state-and-context","Memorija AI agenta nije RAG: Kako razdvojiti memoriju, pronalaženje, stanje i kontekst","Memorija agenta, RAG, stanje i kontekst često se koriste kao da su međusobno zamenjivi. Oni to nisu. Ovaj praktični arhitektonski model razdvaja ova četiri sloja, pokazuje gde svaki pripada i objašnjava šta se kvari kada ih sistemi stope u jedno.","\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":3071,"slug":3072,"title":3073,"excerpt":3074,"featuredImage":3075,"publishedAt":3076},"472","why-more-context-can-make-ai-answers-worse","Zašto više konteksta može pogoršati AI odgovore","Veći kontekstni prozor ne garantuje bolji odgovor. Ovaj članak objašnjava kako razblaživanje signala, protivrečni dokazi, zastarelo stanje, osetljivost na poziciju i kompresija sa gubicima mogu smanjiti pouzdanost veštačke inteligencije—i uvodi praktičan test pritiska konteksta.","\u002Fuploads\u002F2026\u002F09\u002Fwhy-more-context-can-make-ai-answers-worse-1790351615793-2ntv2v.webp","2026-09-25T11:51:00.000Z",{"id":3078,"slug":3079,"title":3080,"excerpt":3081,"featuredImage":3082,"publishedAt":3083},"485","enterprise-ai-architecture-what-changes-when-ai-enters-a-company","Enterprise AI arhitektura: Šta se menja kada AI uđe u kompaniju","Enterprise AI arhitektura objašnjava kako AI menja korporativne sisteme kroz autoritet podataka, identitet, dozvole, provajdere, rizik, upravljanje, evaluaciju, usklađenost i operacije.","\u002Fuploads\u002F2026\u002F10\u002Fenterprise-ai-architecture-what-changes-when-ai-enters-a-company-1791478161363-czrwaq.webp","2026-10-08T10:48:00.000Z",{"id":3085,"slug":3086,"title":3087,"excerpt":3088,"featuredImage":3089,"publishedAt":3090},"489","agentic-ai-explained-when-an-ai-system-can-plan-use-tools-and-act","Agentna AI objašnjena: Kada AI sistem može da planira, koristi alate i deluje","Agentna AI koristi modele unutar višekoračnih izvršnih petlji gde mogu da biraju alate, posmatraju rezultate, ažuriraju stanje i prilagode svoju sledeću akciju unutar eksplicitnih granica izvršavanja i dozvola.","\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":3092,"slug":3093,"title":1201,"excerpt":3094,"featuredImage":3095,"publishedAt":3096},"478","what-is-rag-the-simplest-explanation-of-how-it-works","RAG zvuči komplikovano, ali ideja je jednostavna: pre nego što AI odgovori, prvo potraži korisne informacije iz izvora znanja i daje te informacije jezičkom modelu. Ovaj vodič objašnjava RAG, LLM-ove, stanje, memoriju i alate koristeći jedan jednostavan mentalni model.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-is-rag-the-simplest-explanation-of-how-it-works-1790377492124-khjagt.webp","2026-09-25T19:03:00.000Z",{"id":3098,"slug":3099,"title":3100,"excerpt":3101,"featuredImage":3102,"publishedAt":3103},"471","how-to-know-whether-an-ai-agent-actually-used-the-right-evidence","Kako znati da li je AI agent zaista koristio prave dokaze","AI agent može citirati izvore i ipak koristiti pogrešne dokaze. Ovaj članak predstavlja praktičnu metodu za proveru potkrepljenosti tvrdnji, autoriteta izvora, primenjivosti, porekla i toga da li su dokazi zaista uticali na odgovor.","\u002Fuploads\u002F2026\u002F09\u002Fhow-to-know-whether-an-ai-agent-actually-used-the-right-evidence-1790351317188-o5z9ve.webp","2026-09-25T11:47:00.000Z",{"id":3105,"slug":3106,"title":3107,"excerpt":3108,"featuredImage":3109,"publishedAt":3110},"486","source-of-truth-in-ai-systems-where-reliable-knowledge-actually-comes-from","Izvor istine u AI sistemima: Odakle pouzdano znanje zaista dolazi","Izvor istine definiše koji je izvor merodavan za određenu činjenicu ili stanje. Saznajte kako se razlikuje od RAG-a, porekla, memorije, konteksta, vektorskih baza podataka i sistema evidencije.","\u002Fuploads\u002F2026\u002F10\u002Fsource-of-truth-in-ai-systems-where-reliable-knowledge-actually-comes-from-1791479103235-6bq9em.webp","2026-10-08T13:02:00.000Z",{"id":3112,"slug":3113,"title":3114,"excerpt":3115,"featuredImage":3116,"publishedAt":3117},"470","what-should-an-ai-agent-remember-forget-recompute-or-retrieve-again","Šta bi AI agent trebalo da zapamti, zaboravi, ponovo izračuna ili ponovo preuzme?","Dugotrajni agenti ne bi trebalo da pamte sve. Ovaj članak pruža praktičan model životnog ciklusa za odlučivanje o tome šta pripada trajnoj memoriji, šta bi trebalo ponovo preuzeti, šta je bezbednije ponovo izračunati i šta bi trebalo da istekne ili bude zamenjeno.","\u002Fuploads\u002F2026\u002F09\u002Fwhat-should-an-ai-agent-remember-forget-recompute-or-retrieve-again-1790351131087-iehz28.webp","2026-09-25T09:43:00.000Z","fallback",[],[]]