יישום אבטחת שרשרת אספקה: SLSA, Sigstore, in-toto

פגיעה בשרשרת האספקה אינה מתרחשת דרך הקוד שלכם, אלא דרך כלי הבנייה והתלויות—וללא הגנה, אתם נשארים עיוורים. אנו מיישמים אבטחת שרשרת אספקה המבוססת על SLSA, Sigstore ו-in-toto: הגדרת חתימת תמונות, provenance ומדיניות אימות. הצוות שלנו מספק את הפרויקט במפתח מלא—מביקורת ועד תמיכה, תוך הבטחת הגנה אמינה על ה-pipeline שלכם.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

אבטחת שרשרת אספקה: 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:

  1. צינור ה-CI/CD מבקש אסימון OIDC מהספק (GitHub Actions, GitLab, GCP).
  2. Fulcio (CA מ-Sigstore) מאמת את האסימון ומנפיק תעודה קצרת מועד (10 דקות).
  3. 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 והכלים האופטימליים.

SLSA Cosign