دسکتاپ، Worker و محاسبات محلی · فصل ۳ — Identity، Health، Lease و SQLite Spool · 182
Worker Enrollment و Short-lived Identity
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Worker Enrollment و Short-lived Identity». میتواند «Worker Enrollment و Short-lived Identity» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خلاصهٔ درس
اپ یا worker محلی را اجرا میکند اما device identity، privilege، offline state و fleet behavior را طراحی نکرده است. موضوع جاری: «Worker Enrollment و Short-lived Identity».
میتواند «Worker Enrollment و Short-lived Identity» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
خروجی این درس
میتواند «Worker Enrollment و Short-lived Identity» را برای یک node محلی با identity، state، privilege و recovery boundary مناسب طراحی کند.
پیشنیازها
1. مسئله واقعی: bootstrap possession با worker identity یکی نیست
داشتن یک bootstrap token، hostname یا secret اولیه فقط نشان میدهد یک فرایند به آن ماده دسترسی پیدا کرده است؛ ثابت نمیکند همان worker مجاز روی همان node است و هنوز باید همان authority را داشته باشد. خروجی این درس Worker Enrollment Credential & Rotation Ledger v1 است: رکوردی که bootstrap evidence را به یک enrollment یکباره، attestation قابلردیابی، worker identity مستقل، generation مشخص و credential کوتاهعمر تبدیل میکند. هیچ موفقیت قبلی اجازه نمیدهد bootstrap authority برای همیشه ادامه پیدا کند.
2. مرز مالکیت LOC-009
این درس enrollment، bootstrap replay، node/workload attestation، selector evidence، worker ID، credential generation، not_before/not_after، trust bundle، rotation و re-enrollment را مالک است. Heartbeat و health متعلق به LOC-010 است؛ lease و work authority متعلق به LOC-011. یک credential معتبر ممکن است worker را authenticate کند، اما بهتنهایی سالمبودن node یا مالکیت یک lease را ثابت نمیکند.
3. enrollment یک transition است، نه کپیکردن secret
مسیر درست این است: bootstrap evidence محدود → enrollment gate → node/workload attestation → identity assignment → credential کوتاهعمر → rotation یا expiry. bootstrap token نباید به credential دائمی worker تبدیل شود. Ledger باید نشان دهد کدام bootstrap ID در کدام attempt مصرف شده، آیا replay شده، و credential نهایی به کدام worker ID و generation تعلق دارد.
4. Workload API چه چیزی بهعنوان مرجع میدهد
SPIFFE Workload API یک الگوی رسمی برای تحویل workload identity است: X.509-SVID و trust bundle را به workload میدهد و با تغییر identity information میتواند updateهای بعدی را stream کند. این رفتار نشان میدهد identity material میتواند runtime-delivered و قابلبهروزرسانی باشد؛ اما policy enrollment و TTL دقیق MAKNOW را تعریف نمیکند.
5. Registration entry و selector evidence
در SPIRE، registration entry شامل SPIFFE ID، یک یا چند selector و parent ID است. Agent هنگام workload attestation selectorهای مشاهدهشده را با entryهای مجاز مقایسه میکند. برای MAKNOW، نکته کلیدی این است که identity assignment باید به evidence قابلمشاهده و provenance آن bind شود؛ hostname یا display name بهتنهایی selector کافی نیست مگر policy صریح آن را قبول کرده باشد.
6. node binding باید صریح باشد
Enrollment attempt باید node identity ادعاشده، node identity مورد انتظار و attestation source را نگه دارد. اگر bootstrap evidence برای node A صادر شده ولی از node B replay شود، نتیجه نباید «موفق چون secret درست بود» باشد. آن تلاش باید DENIED شود و audit record نشان دهد replay یا wrong-node binding رخ داده است.
7. worker identity از human identity جداست
توکن login کاربر، session cookie یا refresh token انسان نباید credential worker شود. چرخه عمر، privilege و revocation انسان با workload متفاوت است. Enrollment باید worker ID مستقل و credential generation مستقل بسازد تا تغییر مالک، reinstall، compromise یا re-enrollment بدون وابستگی به session انسانی قابل مدیریت باشد.
8. credential کوتاهعمر یعنی زمان معتبر صریح
حداقل issued_at، not_before و not_after را نگه دارید. قبل از not_before credential هنوز معتبر نیست؛ بعد از not_after نیز باید EXPIRED بماند. clock policy و skew allowance باید در deployment مشخص باشد؛ این درس عدد جهانی اختراع نمیکند. تمدید محلی تاریخ expiry بدون issuance/rotation معتبر، evidence را جعل میکند.
9. rotation باید generation را جلو ببرد
هر rotation موفق باید credential generation جدیدی ایجاد کند. اتصال قدیمی که generation قبلی را ارائه میدهد فقط وقتی قابلقبول است که overlap policy صریح، محدود و هنوز معتبر وجود داشته باشد. در نبود چنین policy، generation قدیمی STALE_GENERATION است. Ledger باید نشان دهد کدام generation درخواست را authorize کرده است.
10. selector mismatch نیاز به re-enrollment دارد
اگر selector decisive تغییر کند—مثلاً process identity، executable digest، container namespace/service account یا evidence معادل—نباید claimed worker ID را صرفاً حفظ کرد و mismatch را نادیده گرفت. نتیجه باید RE_ENROLL یا DENIED باشد تا policy دوباره binding را بسازد. تغییر selector یک health issue نیست؛ یک identity-binding issue است.
11. replay detection بخشی از contract است
Bootstrap one-time evidence باید مصرفشدن و replay را قابلتشخیص کند. اگر همان bootstrap ID دوباره استفاده شود، حتی روی همان node، سیستم نباید silent success بدهد. تصمیم باید typed باشد و trigger مناسب برای صدور bootstrap جدید یا بررسی incident ثبت شود. replay-resistant بودن از «secret طولانی و تصادفی» قویتر است، چون lifecycle را هم کنترل میکند.
12. trust bundle و source provenance باید ثبت شوند
Ledger باید مشخص کند credential با کدام trust bundle/version یا trust-domain context ارزیابی شده و selector evidence از چه attestation source آمده است. Trust bundle هم میتواند rotate شود. صرف داشتن certificate بدون provenance کافی نیست؛ reviewer باید بتواند بفهمد identity تحت کدام material و policy معتبر دانسته شده است.
13. تصمیم باید fail-closed و evidence-proportional باشد
ENROLLED یا ACCEPT_BOUNDED فقط وقتی مجاز است که bootstrap قابلقبول باشد، node/selector binding match کند، credential داخل window معتبر باشد و generation طبق policy جاری پذیرفته شود. replay، wrong-node، expiry، not-yet-valid، selector mismatch یا stale generation باید state خودش را حفظ کند. هیچ score یا «قبلاً کار میکرد» نباید این شکستها را میانگین بگیرد.
14. Failure Probeهای تعیینکننده
چهار shortcut را بشکنید: (1) همان bootstrap token روی node دیگر replay شود؛ (2) زمان از not_after عبور کند بدون rotation موفق؛ (3) selector attested تغییر کند ولی worker ID ثابت بماند؛ (4) generation جدید صادر شود اما connection قدیمی generation قبلی را ارائه کند. هر probe باید Decision، Reason و Re-enrollment Trigger قابلبازتولید تولید کند؛ learner lab label نهایی را از قبل نشان نمیدهد.
15. Transfer از Unix selector به container attestation
در Transfer، topology evidence واقعاً عوض میشود: بهجای Unix process selector، containerized worker با selectorهای namespace/service-account یا image evidence ارزیابی میشود. ثابتها worker identity، generation، validity window، rotation، replay rule و fail-closed decision هستند. چون evidence mechanism عوض شده، تصمیم باید از نو محاسبه شود؛ نتیجه baseline قابل کپیکردن نیست.
ارزیابی
پاسخنامهی این درس در بستهی آموزش وجود ندارد؛ خودت جواب بده و صادقانه علامت بزن. «نیاز به مرور» درس را به صف تکرار میفرستد.
Q1 application
Build the Worker Enrollment Credential & Rotation Ledger from the supplied synthetic enrollment evidence without turning bootstrap possession into permanent identity.
Q2 diagnosis
Explain why a replayed bootstrap token from a different node must not issue the same worker identity.
Q3 decision
Issue a typed decision for an expired credential and name the re-enrollment trigger.
Q4 transfer
Recompute enrollment after moving from Unix process selectors to container attestation evidence while preserving identity-generation and replay rules.
ملاکهای ارزیابی (rubric)
- Bootstrap boundary — critical: bootstrap evidence is one-time/bounded and is not treated as permanent worker identity.
- Node and selector binding — critical: assigned identity is bound to explicit attestation evidence and provenance.
- Validity and generation — critical:
not_before/not_after, current generation, overlap policy, and rotation state are evaluated explicitly. - Typed non-success — critical: replay, wrong-node, mismatch, expired, not-yet-valid, and stale-generation evidence is not coerced into success.
- Bounded decision — critical: the decision is no stronger than visible evidence and names a re-enrollment/recheck trigger.
- Transfer — critical: container attestation changes the evidence mechanism and causes recomputation instead of copying the Unix result.
منابع و تازگی
مطالعهٔ موارد (case studies)
تصاویر درس
فایلهای آزمایشگاه
Implement evaluate_enrollment(case) in starter.py. Keep bootstrap consumption, node/selector binding, validity window, credential generation, overlap policy, decision reason, and re-enrollment trigger as separate evidence dimensions.
The fixtures are synthetic and offline. They intentionally do not contain final decisions. case_08 is the changed-context transfer: it uses container attestation evidence rather than the Unix selector topology used by the earlier cases. Run python run_checks.py to verify only learner-visible structure.