אבטחת שרשרת אספקה: SLSA, Sigstore, in-toto
תארו לעצמכם: ה-CI שלכם בנה תמונה, אבל מישהו החליף את תמונת הבסיס בתמונה זדונית — איך הייתם יודעים? ללא הגנה על שרשרת האספקה, אתם עיוורים. התקפות על SolarWinds Orion, XZ Utils ו-event-stream ב-npm הראו שפגיעה מתרחשת לא דרך הקוד שלכם אלא דרך כלי בנייה או תלויות. יישמנו מערכות אבטחת שרשרת אספקה עבור 15+ פרויקטים, הפחתנו את זמן הגילוי הממוצע של תקלות (MTTR) ב-40% וחסכנו ללקוחות מיליונים בזמן השבתה.
מקרה אחד: לקוח פינטק גדול גילה שסוכן ה-CI שלהם נפרץ דרך תלות פגיעה בתמונת הבנייה. תוך שבועיים יישמנו חתימה על כל התמונות באמצעות Cosign + Sigstore keyless, הקמנו SLSA provenance ו-webhook קבלה של Kyverno. כעת כל תמונה מאומתת בזמן הפריסה, ושינויים לא מורשים נחסמים.
למה SLSA הוא התקן דה-פקטו לשרשראות אספקה מאובטחות?
SLSA (Supply-chain Levels for Software Artifacts) מגדיר ארבע רמות בגרות לתהליך הבנייה. בפרויקטים אמיתיים, היעד הוא SLSA Level 3, שבו סביבת הבנייה מבודדת וה-provenance חתום ומקושר לקוד המקור.
| רמה | דרישות |
|---|---|
| SLSA 1 | Provenance מתועד וזמין |
| SLSA 2 | Provenance חתום, שירות הבנייה מאומת |
| SLSA 3 | סביבת בנייה מבודדת, היסטוריה רציפה ממקור לארטיפקט |
| SLSA 4 | סקירת קוד של שני אנשים, בניות הרמטיות |
Provenance הוא מסמך JSON המכיל את ה-commit SHA, יוזם הבנייה, פרמטרי הבנייה ו-digest של הארטיפקט. בלעדיו, אימות המקור בלתי אפשרי.
איך Sigstore מבטל את ניהול המפתחות?
Sigstore פותר את הבעיה המרכזית של חתימה קלאסית — אחסון וסיבוב מפתחות פרטיים. במקום זאת, הוא משתמש בחתימה ללא מפתחות (keyless signing) דרך OIDC:
- צינור ה-CI/CD מבקש אסימון OIDC מהספק (GitHub Actions, GitLab, GCP).
- Fulcio (CA מ-Sigstore) מאמת את האסימון ומנפיק תעודה קצרת מועד (10 דקות).
- Cosign חותם על התמונה; התעודה נרשמת ב-Rekor — יומן append-only.
גישה זו מהירה פי 3 להקמה מאשר PGP ואינה דורשת סיבוב מפתחות.
---
# GitHub Actions: подпись контейнера через Cosign + Sigstore keyless
- name: Install Cosign
uses: sigstore/cosign-installer@v3
- name: Sign container image
run: |
cosign sign --yes \
${{ env.REGISTRY }}/${{ env.IMAGE }}@${{ steps.build.outputs.digest }}
env:
COSIGN_EXPERIMENTAL: "true"
אימות בזמן פריסה:
cosign verify \
--certificate-identity-regexp="https://github.com/myorg/myrepo/.github/workflows/.*" \
--certificate-oidc-issuer="https://token.actions.githubusercontent.com" \
ghcr.io/myorg/myapp:v1.2.3אם החתימה חסרה או שהתעודה אינה תואמת, הפקודה מחזירה שגיאה. OPA Gatekeeper או Kyverno יכולים להשתמש בבדיקה זו כ-webhook קבלה ב-Kubernetes.
יצירת SLSA Provenance ב-GitHub Actions
---
jobs:
build:
outputs:
image: ${{ steps.image.outputs.image }}
digest: ${{ steps.build.outputs.digest }}
steps:
- name: Build and push
id: build
uses: docker/build-push-action@v5
with:
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE }}:${{ github.sha }}
provenance:
needs: build
uses: slsa-framework/slsa-github-generator/.github/workflows/[email protected]
with:
image: ${{ needs.build.outputs.image }}
digest: ${{ needs.build.outputs.digest }}
secrets:
registry-username: ${{ secrets.REGISTRY_USER }}
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
# GitHub Actions: подпись контейнера через Cosign + Sigstore keyless - name: Install Cosign uses: sigstore/cosign-installer@v3 - name: Sign container image run: | cosign sign --yes \ ${{ env.REGISTRY }}/${{ env.IMAGE }}@${{ steps.build.outputs.digest }} env: COSIGN_EXPERIMENTAL: "true" מ-SLSA GitHub Generator רץ ב-workflow מבודד לשימוש חוזר, ומבטיח SLSA Build Level 3 — רץ הצינור אינו יכול לשנות את ה-provenance.
איך in-toto משלים את SLSA?
In-toto מאפשר לכם להגדיר layout של שרשרת אספקה: שלבים ספציפיים (clone, build, test, package, sign) ומי מורשה לבצע אותם. כל שלב יוצר link metadata — קובץ חתום עם הקלט/פלט של השלב.
# Шаг сборки с записью link
in-toto-run \
--step-name build \
--key developer.pem \
--products dist/ \
-- make build
# Финальная верификация всей цепочки
in-toto-verify \
--layout root.layout \
--layout-keys root.pub \
--link-dir ./links/In-toto נמצא בשימוש פעיל ב-TUF לאבטחת מאגרי חבילות — כך מוגנים חבילות PyPI ו-Debian.
תהליך היישום לאבטחת שרשרת אספקה
| שלב | משך | כלים מרכזיים |
|---|---|---|
| חתימה ואימות תמונות | שבוע אחד | Cosign, Kyverno |
| SLSA Provenance | שבוע אחד | slsa-github-generator, OCI attestation |
| אימות תלויות | 1-2 שבועות | Dependency Review, npm audit |
| in-toto layout (אופציונלי) | 1-2 שבועות | in-toto, TUF |
שלב 1 — חתימה ואימות תמונות (שבוע אחד)
- הקמת Cosign בצינורות CI/CD
- הגדרת מדיניות Kyverno/OPA לבדיקת חתימות בזמן פריסה
- רישום תמונות חתומות, דחיית תמונות לא חתומות ב-namespace הייצור
שלב 2 — SLSA Provenance (שבוע אחד)
- שילוב slsa-github-generator בצינורות בנייה
- אחסון provenance לצד התמונה ברישום (כ-OCI attestation)
- הקמת אימות provenance אוטומטי בזמן פריסה
שלב 3 — אימות תלויות וארטיפקטים (1-2 שבועות)
- אימות תלויות צד שלישי דרך Dependency Review Action
- הגדרת
cosign verify \ --certificate-identity-regexp="https://github.com/myorg/myrepo/.github/workflows/.*" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ ghcr.io/myorg/myapp:v1.2.3לבדיקת חתימות חבילות npm - שילוב עם Sigstore Policy Controller
שלב 4 — in-toto layout (אופציונלי, 1-2 שבועות)
- רק אם נדרש אימות מלא של השרשרת: נחוץ למסגרות ציות כמו DISA STIG או כאשר ארטיפקטים מופצים דרך צדדים שלישיים
מה כלול בעבודה
- ביקורת של מחסן ה-CI/CD הנוכחי וקביעת רמת SLSA היעד
- הגדרת Cosign וחתימה ללא מפתחות לכל התמונות
- שילוב יצירת SLSA Provenance בצינורות
- יישום מדיניות אימות חתימות דרך Kyverno/OPA
- תיעוד runbook והדרכת צוות
- תמיכה במהלך הפעלת פיילוט בייצור (שבועיים)
טעויות נפוצות במהלך היישום
-
חתימה על tag במקום digest.
jobs: build: outputs: image: ${{ steps.image.outputs.image }} digest: ${{ steps.build.outputs.digest }} steps: - name: Build and push id: build uses: docker/build-push-action@v5 with: push: true tags: ${{ env.REGISTRY }}/${{ env.IMAGE }}:${{ github.sha }} provenance: needs: build uses: slsa-framework/slsa-github-generator/.github/workflows/[email protected] with: image: ${{ needs.build.outputs.image }} digest: ${{ needs.build.outputs.digest }} secrets: registry-username: ${{ secrets.REGISTRY_USER }} registry-password: ${{ secrets.REGISTRY_PASSWORD }}— זה שגוי; tags הם בני שינוי. תמיד חתמו באמצעות digest שלgenerator_container_slsa3.yml. -
Rekor אינו נגיש מ-CI מקומי (on-premise). אם הצינור נמצא מאחורי חומת אש ללא גישה לאינטרנט, יש צורך במופע Rekor מתארח עצמי. בלעדיו, חתימה ללא מפתחות אינה עובדת.
-
SLSA provenance ללא אימות. ה-Provenance נוצר ומועלה לרישום, אבל שם זה נעצר. המטרה מתממשת רק כאשר צינור הפריסה או ה-webhook הקבלה בודקים בפועל את נוכחותו ותקפותו.
הזמינו ביקורת של מחסן ה-CI/CD שלכם — המהנדסים שלנו יכינו תוכנית יישום תוך התחשבות בלוחות הזמנים ודרישות התקציב שלכם. קבלו ייעוץ: נעזור לכם לבחור את רמת SLSA והכלים האופטימליים.







