معماری چندکسبوکاری، تجاری و تجارت الکترونیک · فصل ۱ — Venture Separation، Shared Interface، Resource و Tenant · 225
Tenant Isolation
معماری یا تصمیم تجاری را با preference و الگوهای آماده میگیرد و constraint/cost/serviceability را مدل نمیکند. موضوع جاری: «Tenant Isolation». میتواند برای «Tenant Isolation» یک تصمیم bounded با constraints، cost/risk و stop/pivot condition طراحی کند.
خلاصهٔ درس
معماری یا تصمیم تجاری را با preference و الگوهای آماده میگیرد و constraint/cost/serviceability را مدل نمیکند. موضوع جاری: «Tenant Isolation».
میتواند برای «Tenant Isolation» یک تصمیم bounded با constraints، cost/risk و stop/pivot condition طراحی کند.
خروجی این درس
میتواند برای «Tenant Isolation» یک تصمیم bounded با constraints، cost/risk و stop/pivot condition طراحی کند.
۱) ورود موفق کاربر، اثبات Isolation نیست
در یک SaaS چندمستاجری ممکن است JWT معتبر باشد، Role درست باشد و Authorization هم allow بدهد؛ با این حال کاربر هنوز بتواند Resource مستاجر دیگری را بخواند. Tenant Isolation Boundary & Cross-Tenant Access Test Matrix v1 سؤال متفاوتی میپرسد: «آیا هر مسیر دسترسی، Resource را به Tenant همین Request محدود میکند؟»
۲) SaaS Identity را از همان ورودی Bind کن
user_id و tenant_id باید از یک Context کنترلشده بیایند. اگر API به کاربر اجازه دهد tenant_id دلخواه در Query/Header بفرستد و همان مقدار بهعنوان Authority مصرف شود، مرز Isolation قابل اعتماد نیست. Tenant Context باید همراه Identity وارد سیستم شود و در لایههای بعدی قابل دریافت باشد.
۳) Resource Planeها را جداگانه فهرست کن
Isolation فقط Database نیست. Data Store، Object Storage، Cache، Queue/Topic، Search Index، Compute Job، Log/Metric، Admin Tool، Export و Control Plane میتوانند مرز Tenant را بشکنند. هر Plane باید isolation_model و policy_enforcement_point خودش را داشته باشد.
۴) Enforcement Point را دقیق نام ببر
«ما Tenant-aware هستیم» Evidence نیست. مشخص کن Policy کجا enforce میشود: API Gateway، Service Handler، Repository Layer، Database Policy، IAM/ABAC، Cache Namespace، Queue Consumer یا Admin Proxy. اگر Enforcement فقط در UI باشد، Backend هنوز میتواند Cross-Tenant شود.
۵) Partition Key را با Tenant Scope همراستا کن
در Pooling، یک resource_id بهتنهایی ممکن است globally unique نباشد یا از مسیر دیگری قابل حدس باشد. Data Partition، Index Key و Cache Key باید Tenant Scope را صریح یا از طریق Policy معتبر حمل کنند. Cache Key بدون tenant_id میتواند داده درست را برای Tenant اشتباه برگرداند حتی وقتی Auth کاملاً معتبر است.
۶) Async Pathها را هم Tenant-aware نگه دار
Queue Producer ممکن است Tenant Metadata بنویسد، اما Consumer باید آن Context را verify و enforce کند. Shared Queue بدون Tenant-scoped consumer check یعنی Trust به Producer جایگزین Isolation شده است. Retry، DLQ و Batch Worker هم بخشی از همان Boundary هستند.
۷) Operational Tooling بخشی از Boundary است
Export، Support Console، Backfill Script و Admin Tool معمولاً قدرت بیشتری از مسیر عادی دارند. اگر Operations Query بتواند tenant_id دلخواه بگیرد، یک Bypass Path واقعی داری. Exception باید Owner، Scope، Audit Event و Authority مشخص داشته باشد؛ «فقط ادمینها استفاده میکنند» کنترل کافی نیست.
۸) Positive Test و Negative Test هر دو لازماند
Same-Tenant Positive Test نشان میدهد مسیر مجاز خراب نشده است. Cross-Tenant Negative Test نشان میدهد مرز واقعاً جلوی دسترسی Tenant دیگر را میگیرد. فقط Positive Test نمیتواند Isolation را ثابت کند؛ نتیجه در آن حالت HOLD میماند.
۹) State را از Evidence قویتر نکن
VERIFIED فقط وقتی مجاز است که Context، Enforcement، Partition و Test Evidence کامل باشد. شکست واقعی = FAILED. Evidence گمشده = UNKNOWN یا HOLD. Evidence قدیمی = STALE. تغییر مادی که Recompute نشده = PARTIAL. تناقض Authority = DISPUTED. Policy Block = BLOCKED.
۱۰) FACT را از MAKNOW DESIGN جدا نگه دار
راهنمای AWS میگوید Tenant Isolation از Authentication/Authorization جداست، Tenant Context باید همراه SaaS Identity در معماری جریان یابد و دسترسی به Resource باید Tenant-scoped شود. اما State Vocabulary، Matrix Fields و شرط «برای VERIFIED حتماً Negative Test داشته باش» تصمیم طراحی MAKNOW است، نه استاندارد عمومی AWS.
۱۱) Matrix را به Evidence وصل کن
جدول کاری، Tenant/User Context، Resource Plane، Enforcement Point، Partition Key، Positive/Negative Test، Bypass و Audit Event را کنار هم میگذارد تا Reviewer بتواند Verdict را بدون Hidden Reasoning بازتولید کند.
| مسیر | Tenant | Plane | Context | Isolation | Enforcement | Partition | Positive | Negative | Bypass | Audit | State | Evidence |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| baseline-data | TENANT-A | data | JWT tenant=A | pooled + tenant predicate | repository + DB policy | tenant_id+record_id | PASS | PASS | none | tenant_access_denied logged | VERIFIED | SYN-BASE |
| cache-key-gap | TENANT-A | cache | JWT tenant=A | pooled cache | cache client | product_id only | PASS | FAIL | cross-tenant cache collision | cache hit lacks tenant dimension | FAILED | SYN-CACHE |
| ops-override | TENANT-A | operations/export | operator parameter | admin path | export service | arbitrary tenant_id | PASS | FAIL | operator override | export event exists | FAILED | SYN-OPS |
| transfer-dedicated-storage | TENANT-A | data dedicated; compute/cache/queue pooled | JWT tenant=A | bridge | service + dedicated DB + tenant-scoped pooled planes | tenant scope preserved | PASS | PASS | none | all decisive planes logged | VERIFIED | SYN-TRANSFER |
۱۲) Negative Case: Cache Key بدون tenant_id
فرض کن API و Database کاملاً Tenant-scoped هستند ولی Cache Key فقط product_id است. Tenant B میتواند پاسخ Cache مربوط به Tenant A را دریافت کند. Auth هنوز معتبر است، اما Cache Plane شکست خورده؛ State کل Boundary نمیتواند VERIFIED بماند.
۱۳) Negative Case: Operations Export با tenant_id دلخواه
یک Export Tool که Tenant را از Parameter اپراتور میگیرد، Bypass Path ایجاد میکند. حتی اگر استفاده محدود باشد، باید Context از Authority کنترلشده بیاید یا Exception Path مستقل، Auditشده و محدود داشته باشد. Arbitrary Override بدون این کنترل = FAILED.
۱۴) Transfer: Storage اختصاصی، Compute هنوز Pooled
برای یک Tenant پرریسک Storage را Dedicated میکنی. این فقط Data Plane را تغییر میدهد. Compute، Cache، Queue، Logs و Operations هنوز Tenant Context و Negative Test میخواهند. نتیجه baseline را کپی نکن؛ Matrix را Plane-by-Plane دوباره بساز.
۱۵) Completion Test
کار وقتی تمام است که Reviewer دیگر بتواند از روی Evidence آشکار همان Verdict را بازتولید کند: Tenant/User Binding، Context Source، Resource Planes، Isolation Model، Enforcement Point، Authorization Context، Partition Key، Same-Tenant Test، Cross-Tenant Test، Bypass Path، Failure Domain، Audit Event، State و Evidence Ref. هیچ Plane مهمی را با «احتمالاً امن است» سبز نکن.
ارزیابی
پاسخنامهی این درس در بستهی آموزش وجود ندارد؛ خودت جواب بده و صادقانه علامت بزن. «نیاز به مرور» درس را به صف تکرار میفرستد.
ARC-006-S1 retrieval
Explain why authentication and role authorization do not by themselves prove tenant isolation, and name one adjacent non-goal.
ARC-006-S2 application
Build Tenant Isolation Boundary & Cross-Tenant Access Test Matrix v1 for the baseline synthetic fixture.
ARC-006-S3 diagnosis
Remove tenant_id from a cache key while authentication remains valid. Which plane and state fail, and what is the minimal repair?
ARC-006-S4 transfer
Move one high-risk tenant to dedicated storage while compute remains pooled. Recompute which planes still require tenant context and cross-tenant negative tests.
ملاکهای ارزیابی (rubric)
- Boundary: Tenant Isolation remains distinct from Chargeback and Dedicated Instance Pattern.
- Evidence: tenant context, enforcement point, partition scope, positive/negative tests and evidence refs are visible.
- Negative evidence: cache/queue/operations bypasses cannot be converted to VERIFIED.
- Transfer: dedicated storage does not erase tenant-context requirements in pooled planes.
- Reproducibility: another reviewer can reproduce the state without hidden reasoning.
منابع و تازگی
مطالعهٔ موارد (case studies)
تصاویر درس
Authenticated user and tenant context flow through a policy enforcement point to a tenant-scoped resource; same-tenant positive and cross-tenant negative tests determine VERIFIED, FAILED or HOLD/UNKNOWN.
فایلهای آزمایشگاه
دستور python run_checks.py را Offline اجرا کنید. در هشت Fixture مشخص کنید کدام شرط Tenant Context، Resource Plane، Partition، Bypass یا Test Evidence State را کنترل میکند. Authentication بهتنهایی هیچوقت اثبات Tenant Isolation نیست.