حمله به زنجیره تأمین فقط «هک سرور production» نیست: تزریق در CI، وابستگی مخرب، build غیررسمی، یا artifact عوضشده بین build و نصب. امضای یک باینری بهتنهایی نمیگوید مسیر ساخت قابل اعتماد بوده است.
in-toto پاسخ استاندارد این لایه است:
A framework to secure the integrity of software supply chains — از شروع تا نصب نزد کاربر نهایی شفاف میکند چه گامهایی، توسط چه کسانی، و به چه ترتیبی انجام شدهاند.
CNCF Graduated. لایسنس ابزارها عمدتاً Apache. مشخصات باز و قابل گسترش برای metadata زنجیره تأمین.
in-toto چه مشکلی را حل میکند؟
| تهدید | بدون in-toto | با in-toto |
|---|---|---|
| مرحلهای جا افتاده / اضافه | نامرئی | Layout ترتیب و گامها را قفل میکند |
| فرد/سیستم غیرمجاز | نامشخص | فقط functionaryهای مجاز با کلید معتبر |
| تعویض artifact میانی | سخت کشف | hash مواد و محصولات در Link/Attestation |
| «کی build کرد؟» | لاگ شکننده | شواهد امضاشده قابل verify |
طبق سایت رسمی: استاندارد metadata باز + اکوسیستم یکپارچهسازی + tooling گسترده.
نکته حیاتی: in-toto جایگزین امنسازی خود گامها نیست. اگر سیاست بگوید «از اینترنت curl کن و build کن» و همان را امضا کنید، verify موفق میشود — فقط ثابت میکند همان کار ناامن طبق Layout انجام شده. پروژههایی مثل SLSA روی in-toto مینشینند تا بگویند کدام شواهد و سطوح اعتماد لازم است.
مفاهیم کلیدی
| مفهوم | نقش |
|---|---|
| Project owner | مالک زنجیره؛ Layout را مینویسد و با کلید(های) خود امضا میکند |
| Layout | سیاست: گامها، کلید functionaryها، قوانین materials/products، inspections، انقضا |
| Functionary | عامل مجاز هر گام (انسان، CI job، builder) با کلید خصوصی |
| Link metadata | شواهد امضاشدهٔ اجرای یک گام (دستور، فایلها قبل/بعد، خروجی) |
| Inspection | دستوراتی که هنگام verify سمت کلاینت اجرا میشوند |
| Attestation | مدل مدرنتر (ITE-6): Statement + Predicate امضاشده درباره artifactها |
Project owner → root.layout (امضا)
│
▼
Functionaries → stepN.<keyid>.link یا attestations
│
▼
Verifier (کاربر / admission / CD)
in-toto-verify + کلید عمومی owner
→ قبول یا رد نصب/استقرارمدل کلاسیک: Layout و Link
طبق Getting started و مشخصات:
Layout شامل چیست؟
- expiration — تاریخ انقضا سیاست
- readme — توضیح اختیاری
- functionary keys — کلیدهای عمومی برای verify لینکها
- signatures — امضای Layout با کلید(های) owner
- steps — هر گام: نام یکتا، functionaryهای مجاز، قوانین materials/products
- inspections — چکهای سمت verify
Link چگونه ساخته میشود؟
ابزارهایی مثل in-toto-run فرمان را wrap میکنند و ثبت میکنند:
- materials — مسیر و hash فایلها قبل از اجرا
- products — مسیر و hash بعد از اجرا
- فرمان، کد برگشت، stdout/stderr (طبق پیادهسازی)
- امضا با کلید functionary → فایل
.<step>.<keyid>.link
# مفهومی — نام ابزار بسته به پیادهسازی Python/Go
in-toto-run -n build -k alice.key -m src/ -p out/ -- go build -o out/app ./...گام بدون فرمان (مثلاً review دستی) هم میتواند فقط materials را attest کند.
Verification (in-toto-verify)
Verifier نیاز دارد به: Layout، فایلهای link، کلید عمومی owner.
بررسیها:
- Layout با کلید owner امضا شده و منقضی نشده
- برای هر step، آستانهٔ لازم از linkهای معتبر وجود دارد
- لینکها توسط functionary مجاز امضا شدهاند
- materials/products با artifact rules جورند
- inspections اجرا و قوانینشان چک میشوند
موفق = زنجیره مطابق سیاست اعلامشده؛ سپس نصب/deploy عادی.
Artifact rules — چسب زنجیره
قوانین روی materials و products تعیین میکنند فایلها چطور بین گامها جریان یابند، مثلاً:
- محصول گام
checkoutباید مادهٔ گامbuildباشد - فایلهای غیرمجاز ظاهر نشوند
- MATCH / CREATE / DELETE / MODIFY (طبق schema مشخصات)
این همان «لینک رمزنگاریشده» بین مراحل است که SBOM امضاشدهٔ تکی معمولاً ندارد.
Attestation Framework (ITE-6)
علاوه بر مدل Layout/Link کلاسیک، جامعه in-toto Attestation Framework را معرفی کرد:
Attestation = metadata احرازهویتشده درباره artifactها و فرایندهایی که آنها را میسازند.
ساختار مفهومی:
Envelope (امضا)
└── Statement
├── subject: artifactها (digest)
└── predicateType + predicate: ادعای خاصPredicateهای رایج اکوسیستم:
| Predicate | کاربرد |
|---|---|
| SLSA Provenance | منشأ build، builder، وابستگیها |
| SPDX / CycloneDX | SBOM داخل attestation |
| Link | سازگار با مدل link کلاسیک |
| VSA (Verification Summary) | خلاصه نتیجه verify |
| SCAI / runtime trace | ویژگیها و رد اجرا |
ITEهای دیگر (مثل ITE-4) اجازه میدهند artifact با URI عمومی (نه فقط path محلی) شناسایی شود — مناسب registry و منابع remote؛ hash روی محتوا است نه روی خود رشته URI.
in-toto در برابر SLSA، Sigstore، SBOM
| لایه | نقش |
|---|---|
| in-toto | چارچوب عمومی: چه چیزی را چطور attest و با چه سیاستی verify کنیم |
| SLSA | لایه opinionated: برای هر سطح چه Provenance و تضمینی لازم است؛ توصیه به attestations از نوع in-toto |
| Sigstore (cosign, Rekor, Fulcio) | زیرساخت امضا، هویت کوتاهعمر، transparency log — اغلب حامل attestationهای in-toto/SLSA |
| SBOM امضاشده | «محتوای بسته چیست»؛ بدون لزوماً اثبات ترتیب و عامل هر گام |
طبق FAQ رسمی SLSA: in-toto لایه بدوننظر برای بیان اطلاعات زنجیره است؛ SLSA مشخص میکند برای رسیدن به سطح معین چه اطلاعاتی باید در آن metadata باشد.
پیادهسازیهای Go/Java/Rust و ابزارهایی مثل cosign، SLSA GitHub Generator، و پلاگین Jenkins از APIهای provenance مرتبط استفاده میکنند.
ابزارها و زبانها
| جزء | توضیح |
|---|---|
Python reference (in-toto) | CLI کلاسیک: run / record / verify / sign-layout |
| Go / Java / Rust libs | تولید و مصرف attestation و provenance |
| in-toto attestation repo | schema Predicateها |
| ITE process | پیشنهاد تغییر مشخصات |
| Demo رسمی | مسیر یادگیری عملی از docs |
شروع پیشنهادی: Docs → Getting started → Basic Demo → سپس Attestation برای CI مدرن.
جریان عملی در CI/CD امروزی
Developer PR
→ code review (attestation اختیاری)
→ CI build (SLSA Provenance / in-toto link)
→ SBOM predicate
→ push image به [Harbor](/blog/harbor-cloud-native-registry-guide/)
→ امضا Cosign + ذخیره attestation
→ [Flux](/blog/flux-cd-gitops-kubernetes-guide/) / [Argo](/blog/argo-project-kubernetes-gitops-cicd/) / admission
verify layout یا policy (Kyverno/OPA/Binary Auth)
→ deploy فقط اگر verify OKAdmission روی Kubernetes میتواند بدون نصب کامل Layout کلاسیک، حداقل provenance SLSA را از registry بخواند — باز هم ریشه در مدل attestation in-toto است.
Adopters و اکوسیستم
سایت رسمی بخش Adoptions and Integrations دارد. در عمل با موارد زیر همنشینی رایج است:
- Sigstore / cosign
- SLSA generators روی GitHub Actions
- Jenkins in-toto plugin
- سیاستهای Binary Authorization / admission
- CNAB و ابزارهای بسته (با URIهای ITE-4)
امنیت و محدودیتها
| موضوع | واقعیت |
|---|---|
| کلید owner و functionary | اگر لو بروند، مهاجم Layout/link جعلی میسازد — HSM/KMS و تفکیک نقش |
| گام ناامن در Layout | verify آن را «درست» اعلام میکند |
| کامل بودن materials | وابستگیهای resolveنشده ممکن است در provenance ناقص باشند (محدودیت شناختهشده در بحث SLSA) |
| انقضای Layout | Layout منقضی → verify شکست؛ چرخش سیاست را برنامهریزی کنید |
| Threshold چند امضا | برای گامهای حساس بیش از یک functionary الزامی کنید |
گزارش باگ: بخش Security در docs.
مقایسه با رویکردهای نزدیک
| رویکرد | تمرکز | نسبت به in-toto |
|---|---|---|
| فقط image digest pin | یکپارچگی artifact نهایی | مسیر build را ثابت نمیکند |
| فقط SBOM | موجودی اجزا | ترتیب/عامل گامها را enforce نمیکند |
| فقط SLSA level در CI | سطح build | روی attestation in-toto سوار است |
| TUF / Update framework | بهروزرسانی امن کلاینت | مکمل؛ لایه متفاوت |
| Runtime (Falco) | رفتار در حال اجرا | بعد از استقرار؛ in-toto قبل از اعتماد به artifact |
چه زمانی in-toto؟
✅ استفاده کنید
- میخواهید سیاست چندگامی (checkout → test → build → package) قابل verify باشد
- چند تیم/سیستم روی زنجیره با کلیدهای جدا
- پایه برای SLSA و attestation در registry
- ممیزی: «ثابت کن این باینری از این مسیر آمده»
⚠️ انتظارات غلط
| انتظار | اصلاح |
|---|---|
| «CI را جادویی امن میکند» | فقط آنچه را امضا و سیاست کردهاید ثابت میکند |
| جایگزین اسکن آسیبپذیری | جدا: SCA/SAST کنار attestation |
| بدون مدیریت کلید | بدون owner/functionary key، مدل فرومیریزد |
Best practices
- Layout را در Git نگه دارید؛ امضا و توزیع کلید owner را جدا و محدود کنید
- برای build از attestation SLSA Provenance + ذخیره در registry/Harbor استفاده کنید
- گامهای حساس را با threshold چند امضا تعریف کنید
- inspections را برای چکهای سمت مصرفکننده (مثلاً unpack + hash) جدی بگیرید
- انقضای Layout و چرخش کلید را در runbook بیاورید
- CI را functionary کنید نه لپتاپ توسعهدهنده برای گام release
- Predicateهای استاندارد (Provenance، SPDX) را به schemaهای سفارشی خام ترجیح دهید مگر نیاز خاص
- Verify را در CD/admission gate بگذارید نه فقط «مستند روی کاغذ»
- با Sigstore transparency log، انکارناپذیری عمومی را تقویت کنید
- Demo رسمی را یکبار end-to-end روی lab ببرید قبل از طراحی Layout سازمانی
جمعبندی
| مفهوم | توضیح |
|---|---|
| in-toto | چارچوب یکپارچگی و شفافیت زنجیره تأمین — CNCF Graduated |
| Layout | سیاست امضاشده مالک |
| Link / Attestation | شواهد امضاشده هر گام یا ادعای predicate |
| Verify | تطبیق محصول نهایی با سیاست |
| SLSA | لایه opinionated روی همین attestations |
| جایگاه | قبل از اعتماد به نصب/deploy — مکمل SBOM و runtime security |
in-toto به کاربر نهایی (یا دروازه استقرار) اجازه میدهد نپرسد «آیا فایلی امضا شده؟» بلکه بپرسد: آیا کل مسیر اعلامشده، با عاملهای مجاز، بدون شکستن زنجیره hash، طی شده است؟
قدم بعدی
- in-toto.io → Learn More / Get started / Demo
- Demo پایتون را روی یک repo نمونه اجرا کنید (layout → run → verify)
- یک build CI با SLSA Provenance و cosign attest روی ایمیج
- Policy پذیرش در cluster: فقط ایمیج با provenance معتبر
- Layout سازمانی برای مسیر
source → build → sign → deployبا Flux یا Helm chartهای امضاشده
منابع
- in-toto — in-toto.io
- Documentation
- Getting started
- GitHub — in-toto/in-toto
- Attestation Framework
- ITE (enhancements)
- SLSA and in-toto
- SLSA FAQ — relation to in-toto
- Harbor (مقاله P30Light)
- Flux (مقاله P30Light)
منتشر شده در P30Light — بخش امنیت شبکه.