مختبر عملي: إنشاء والتحقق من شهادات SLSA Provenance لصور الحاويات

نظرة عامة

SLSA (Supply-chain Levels for Software Artifacts) provenance هو سجل قابل للتحقق يصف كيفية بناء artifact: مستودع المصدر، ومنصة البناء، ونقطة الدخول، والمواد المدخلة. عند إرفاقه بصورة حاوية، يتيح provenance للمستهلكين الإجابة على سؤال بالغ الأهمية قبل النشر: “هل تم بناء هذه الصورة فعلاً من المصدر الذي أتوقعه، على منصة أثق بها؟”

في هذا المختبر العملي ستقوم بـ:

  • بناء ودفع صورة حاوية إلى GitHub Container Registry (GHCR).
  • إنشاء SLSA Level 3 provenance باستخدام workflow القابل لإعادة الاستخدام الرسمي slsa-github-generator.
  • إنشاء provenance باستخدام artifact attestations الأصلية من GitHub (actions/attest-build-provenance).
  • التحقق من provenance باستخدام slsa-verifier و cosign و gh attestation verify.
  • فرض provenance عند وقت النشر باستخدام سياسة قبول Kubernetes.

بنهاية هذا المختبر ستمتلك pipeline كاملاً وقابلاً للتكرار يثبت سلامة كل صورة حاوية تقوم بشحنها.

المتطلبات الأساسية

قبل البدء، تأكد من توفر ما يلي:

  • حساب GitHub مع مستودع اختباري (عام أو خاص مع GitHub Pro/Team/Enterprise).
  • صلاحية الوصول إلى GHCR — يمكن لحسابك على GitHub الدفع إلى ghcr.io بشكل افتراضي؛ تأكد من ذلك بالانتقال إلى Settings → Packages.
  • Cosign CLI مثبّت محلياً:
    # macOS
    brew install cosign
    
    # Linux / other
    go install github.com/sigstore/cosign/v2/cmd/cosign@latest
  • slsa-verifier CLI مثبّت:
    go install github.com/slsa-framework/slsa-verifier/v2/cli/slsa-verifier@latest
  • GitHub CLI (gh) الإصدار 2.49 أو أحدث (لأوامر gh attestation).
  • Docker مثبّت وقيد التشغيل.
  • kubectl مع صلاحية الوصول إلى cluster اختباري لـ Kubernetes (لتمرين الفرض).

إعداد البيئة

الخطوة 1 — إنشاء مستودع الاختبار

أنشئ مستودع GitHub جديداً باسم slsa-provenance-lab. استنسخه محلياً وأضف الملفات التالية.

main.go

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello from SLSA provenance lab!")
	})
	fmt.Println("Server starting on :8080")
	http.ListenAndServe(":8080", nil)
}

go.mod

module github.com/YOUR_USER/slsa-provenance-lab

go 1.22

Dockerfile

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY main.go ./
RUN go build -o server .

FROM alpine:3.19
RUN apk --no-cache add ca-certificates
COPY --from=builder /app/server /server
ENTRYPOINT ["/server"]

الخطوة 2 — التحقق من صلاحية الوصول إلى GHCR

قم بمصادقة Docker مع GHCR حتى تتمكن من دفع الصور:

echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USER --password-stdin

استبدل YOUR_USER باسم مستخدم GitHub الخاص بك و GITHUB_TOKEN بـ personal access token يمتلك صلاحية write:packages.

الخطوة 3 — workflow البناء والدفع الأساسي (بدون Provenance)

أنشئ .github/workflows/build.yml للتحقق من أن الصورة تُبنى وتُدفع بشكل صحيح قبل إضافة provenance:

name: Build and Push (baseline)

on:
  push:
    tags:
      - "v*"

env:
  IMAGE: ghcr.io/${{ github.repository_owner }}/slsa-provenance-lab

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4

      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            ${{ env.IMAGE }}:${{ github.ref_name }}
            ${{ env.IMAGE }}:latest

ادفع tag اختباري للتحقق:

git add -A
git commit -m "baseline build workflow"
git tag v0.1.0
git push origin main --tags

تأكد من ظهور الصورة في ghcr.io/YOUR_USER/slsa-provenance-lab:v0.1.0 قبل المتابعة.

التمرين 1: إنشاء SLSA Provenance باستخدام slsa-github-generator

لماذا يحقق slsa-github-generator مستوى SLSA Level 3

الخاصية الرئيسية لـ SLSA Build Level 3 هي أن provenance يتم إنشاؤه بواسطة منصة بناء لا يستطيع المطور التأثير عليها. يحقق slsa-github-generator ذلك من خلال العمل كـ reusable workflow مستضاف في مستودع منفصل. نظراً لأن GitHub Actions تعزل تشغيل reusable workflow عن workflow المُستدعي، فإن خطوة إنشاء provenance محمية ضد التلاعب — حتى لو تم اختراق وظيفة البناء، لا يمكن تغيير مخرجات provenance.

الـ Workflow

أنشئ .github/workflows/slsa-provenance.yml:

name: Build + SLSA Provenance (slsa-github-generator)

on:
  push:
    tags:
      - "v*"

env:
  IMAGE: ghcr.io/${{ github.repository_owner }}/slsa-provenance-lab

jobs:
  # --- Job 1: Build and push the container image ---
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    outputs:
      image: ${{ env.IMAGE }}
      digest: ${{ steps.push.outputs.digest }}
    steps:
      - uses: actions/checkout@v4

      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - id: push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            ${{ env.IMAGE }}:${{ github.ref_name }}
            ${{ env.IMAGE }}:latest

  # --- Job 2: Generate SLSA Level 3 provenance ---
  provenance:
    needs: build
    permissions:
      actions: read
      id-token: write
      packages: write
    uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v2.1.0
    with:
      image: ${{ needs.build.outputs.image }}
      digest: ${{ needs.build.outputs.digest }}
    secrets:
      registry-username: ${{ github.actor }}
      registry-password: ${{ secrets.GITHUB_TOKEN }}

فهم الـ Workflow

  • وظيفة build تبني الصورة، وتدفعها إلى GHCR، وتُخرج مرجع الصورة و digest.
  • وظيفة provenance تستدعي reusable workflow من مستودع slsa-framework/slsa-github-generator عند tag مثبّت (@v2.1.0). نظراً لأن هذا الـ workflow يعمل في بيئة معزولة يتحكم بها مشرفو إطار عمل SLSA، فإنه يستوفي متطلبات SLSA Level 3 لمنصة بناء محصّنة وغير قابلة للتزوير.
  • يتم توقيع provenance باستخدام التوقيع بدون مفتاح من Sigstore (شهادة Fulcio + سجل شفافية Rekor) ويُرفق بالصورة في GHCR كـ cosign attestation.

تشغيل الـ Workflow

git add .github/workflows/slsa-provenance.yml
git commit -m "add SLSA provenance workflow"
git tag v1.0.0
git push origin main --tags

في تبويب Actions سترى وظيفتين: build و provenance. تقوم وظيفة provenance بإنشاء attestation بصيغة in-toto، وتوقيعها عبر Sigstore، ودفع الـ attestation إلى GHCR بجانب الصورة. عند نجاح كلتا الوظيفتين، ستحمل صورتك في ghcr.io/YOUR_USER/slsa-provenance-lab@sha256:<digest> attestation موقّعة لـ SLSA Level 3 provenance.

التمرين 2: إنشاء Provenance باستخدام GitHub Artifact Attestations

نهج GitHub الأصلي

يوفر GitHub آلية مدمجة لإنشاء build provenance من خلال action actions/attest-build-provenance. هذا النهج أبسط في الإعداد ويخزن attestations في نظام تخزين attestations الخاص بـ GitHub، مما يجعلها قابلة للتحقق باستخدام أداة gh CLI. المقايضة هي أن هذه الـ attestations تتبع مسار التحقق الخاص بـ GitHub بدلاً من أدوات إطار عمل SLSA.

الـ Workflow

أنشئ .github/workflows/github-attestation.yml:

name: Build + GitHub Artifact Attestation

on:
  push:
    tags:
      - "v*"

env:
  IMAGE: ghcr.io/${{ github.repository_owner }}/slsa-provenance-lab

jobs:
  build-and-attest:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write
    steps:
      - uses: actions/checkout@v4

      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - id: push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: |
            ${{ env.IMAGE }}:${{ github.ref_name }}
            ${{ env.IMAGE }}:latest

      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v2
        with:
          subject-name: ${{ env.IMAGE }}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

مقارنة النهجين

الجانب slsa-github-generator GitHub Artifact Attestations
مستوى SLSA Level 3 (reusable workflow معزول) Level 2–3 (مُدار من GitHub، workflow واحد)
أداة التحقق slsa-verifier، cosign gh attestation verify، cosign
تخزين Attestation OCI registry (بجانب الصورة) GitHub attestation API + دفع اختياري إلى OCI
تعقيد الإعداد workflow من وظيفتين مع استدعاء reusable workflow workflow من وظيفة واحدة مع خطوة إضافية واحدة
التوقيع Sigstore (Fulcio + Rekor) Sigstore (Fulcio + Rekor عبر GitHub)

كلا النهجين صالح. استخدم slsa-github-generator عندما تحتاج إلى توافق صارم مع SLSA Level 3 مع تحقق عبر المنصات. استخدم GitHub artifact attestations عندما تريد إعداداً أبسط ويستخدم المستهلكون لديك نظام GitHub البيئي بالفعل.

التمرين 3: التحقق من Provenance باستخدام slsa-verifier

أداة slsa-verifier CLI هي الأداة الرسمية للتحقق من SLSA provenance المُنشأ بواسطة slsa-github-generator. تتحقق من التوقيع المشفر، وهوية الباني، ومستودع المصدر، و digest الـ artifact في أمر واحد.

الخطوة 1 — الحصول على Image Digest

استرجع digest الصورة التي دفعتها:

IMAGE=ghcr.io/YOUR_USER/slsa-provenance-lab
DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE:v1.0.0" | cut -d@ -f2)
echo "$DIGEST"

يمكنك أيضاً العثور على digest في مخرجات workflow الخاص بـ Actions أو في صفحة حزمة GHCR.

الخطوة 2 — التحقق بنجاح

slsa-verifier verify-image "ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST" \
  --source-uri github.com/YOUR_USER/slsa-provenance-lab \
  --source-tag v1.0.0

المخرجات المتوقعة:

Verified build using builder "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@refs/tags/v2.1.0" at commit abc123def456
VERIFIED: SLSA verification passed

الخطوة 3 — فشل التحقق: عنوان URI للمصدر خاطئ

حاول التحقق مقابل مستودع مصدر غير صحيح:

slsa-verifier verify-image "ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST" \
  --source-uri github.com/YOUR_USER/wrong-repo \
  --source-tag v1.0.0

المخرجات المتوقعة:

FAILED: SLSA verification failed: source used to generate the binary does not match provenance

الخطوة 4 — فشل التحقق: Tag خاطئ

slsa-verifier verify-image "ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST" \
  --source-uri github.com/YOUR_USER/slsa-provenance-lab \
  --source-tag v9.9.9

المخرجات المتوقعة:

FAILED: SLSA verification failed: tag "v9.9.9" does not match provenance

ما الذي يتحقق منه slsa-verifier

  • هوية الباني — يؤكد أن provenance تم إنشاؤه بواسطة reusable workflow الرسمي slsa-github-generator عند المرجع المتوقع.
  • مستودع المصدر — يجب أن يشير provenance إلى عنوان URI للمصدر الذي تحدده.
  • tag/فرع المصدر — يتحقق اختيارياً من مرجع Git الذي أطلق البناء.
  • Artifact digest — يجب أن يتطابق SHA-256 digest المسجل في provenance مع الصورة التي تتحقق منها.
  • التوقيع وسجل الشفافية — يتم التحقق من توقيع Sigstore مقابل سجل شفافية Rekor.

التمرين 4: التحقق باستخدام cosign verify-attestation

يوفر Cosign طريقة أدنى مستوى ولكن أكثر مرونة للتحقق من attestations المرفقة بصور الحاويات. هذا مفيد عندما تحتاج إلى فحص حمولة provenance الخام أو عند الدمج في pipelines تحقق مخصصة.

التحقق من الـ Attestation

cosign verify-attestation \
  --type slsaprovenance \
  --certificate-identity-regexp "https://github.com/slsa-framework/slsa-github-generator/" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST

عند النجاح، يطبع cosign حمولة attestation بصيغة JSON. مثال مختصر:

Verification for ghcr.io/YOUR_USER/slsa-provenance-lab@sha256:abc123... --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The code-signing certificate was verified using trusted certificate authority

{
  "payloadType": "application/vnd.in-toto+json",
  "payload": "eyJfdHlwZSI6Imh0dHBz...",
  "signatures": [{ "sig": "MEUCIQD..." }]
}

فحص حمولة Provenance

فك تشفير حمولة base64 لفحص حقول provenance:

cosign verify-attestation \
  --type slsaprovenance \
  --certificate-identity-regexp "https://github.com/slsa-framework/slsa-github-generator/" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST \
  | jq -r '.payload' | base64 -d | jq .

الحقول الرئيسية في المخرجات:

  • buildDefinition.buildType — يحدد نظام البناء (مثل https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1).
  • buildDefinition.externalParameters.workflow — ملف workflow والمرجع الذي نفّذ البناء.
  • buildDefinition.resolvedDependencies — commit الـ Git والمستودع والمدخلات الأخرى.
  • runDetails.builder.id — عنوان URI للباني الموثوق الذي أنشأ provenance.

التمرين 5: التحقق باستخدام gh attestation verify

للصور المُشهد عليها باستخدام GitHub artifact attestations الأصلية (التمرين 2)، توفر أداة gh CLI أبسط مسار للتحقق.

التحقق من الـ Attestation

gh attestation verify oci://ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST \
  --owner YOUR_USER

المخرجات المتوقعة:

Loaded digest sha256:abc123def456... for oci://ghcr.io/YOUR_USER/slsa-provenance-lab@sha256:abc123...
Loaded 1 attestation from GitHub API

✓ Verification succeeded!

PredicateType: https://slsa.dev/provenance/v1
SubjectName:   ghcr.io/YOUR_USER/slsa-provenance-lab
SubjectDigest: sha256:abc123def456...
SignerRepo:    YOUR_USER/slsa-provenance-lab
SignerWorkflow: .github/workflows/github-attestation.yml
RunnerEnv:     github-hosted

تنزيل وفحص الـ Attestation

لتنزيل حزمة attestation الخام للفحص بدون اتصال:

gh attestation download oci://ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST \
  --owner YOUR_USER \
  --output attestation-bundle.json

# Inspect the provenance predicate
cat attestation-bundle.json | jq '.dsseEnvelope.payload' -r | base64 -d | jq .

يمنحك هذا predicate الكامل لـ SLSA provenance، والذي يمكنك تخزينه بجانب سجلات النشر الخاصة بك لأغراض التدقيق.

التمرين 6: فرض Provenance عند النشر

إنشاء والتحقق من provenance يدوياً أمر قيّم، لكن الفائدة الأمنية الحقيقية تأتي من الفرض الآلي عند وقت النشر. في هذا التمرين، ستقوم بتكوين سياسة قبول Kubernetes ترفض أي صورة حاوية تفتقر إلى SLSA provenance صالح.

الخيار أ: Sigstore Policy Controller

Sigstore policy-controller هو Kubernetes admission webhook يتحقق من توقيعات الصور و attestations قبل قبول pods.

تثبيت Policy Controller

helm repo add sigstore https://sigstore.github.io/helm-charts
helm repo update
helm install policy-controller sigstore/policy-controller \
  --namespace cosign-system \
  --create-namespace

إنشاء ClusterImagePolicy

أنشئ slsa-policy.yml:

apiVersion: policy.sigstore.dev/v1beta1
kind: ClusterImagePolicy
metadata:
  name: require-slsa-provenance
spec:
  images:
    - glob: "ghcr.io/YOUR_USER/**"
  authorities:
    - keyless:
        url: https://fulcio.sigstore.dev
        identities:
          - issuer: https://token.actions.githubusercontent.com
            subjectRegExp: "https://github.com/slsa-framework/slsa-github-generator/.*"
      attestations:
        - name: must-have-slsa-provenance
          predicateType: https://slsa.dev/provenance/v1
          policy:
            type: cue
            data: |
              predicateType: "https://slsa.dev/provenance/v1"

طبّقه:

kubectl apply -f slsa-policy.yml

وسم مساحة الاسم للفرض

kubectl label namespace default policy.sigstore.dev/include=true

الخيار ب: سياسة Kyverno

إذا كنت تستخدم Kyverno كمحرك سياسات، أنشئ kyverno-slsa-policy.yml:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-slsa-provenance
spec:
  validationFailureAction: Enforce
  webhookTimeoutSeconds: 30
  rules:
    - name: check-slsa-provenance
      match:
        any:
          - resources:
              kinds:
                - Pod
      verifyImages:
        - imageReferences:
            - "ghcr.io/YOUR_USER/*"
          attestations:
            - type: https://slsa.dev/provenance/v1
              attestors:
                - entries:
                    - keyless:
                        issuer: https://token.actions.githubusercontent.com
                        subjectRegExp: "https://github.com/slsa-framework/slsa-github-generator/.*"
                        rekor:
                          url: https://rekor.sigstore.dev

طبّقه:

kubectl apply -f kyverno-slsa-policy.yml

اختبار: صورة مع Provenance (مقبولة)

kubectl run test-allowed \
  --image=ghcr.io/YOUR_USER/slsa-provenance-lab@$DIGEST \
  --restart=Never

النتيجة المتوقعة: يتم إنشاء pod بنجاح.

اختبار: صورة بدون Provenance (مرفوضة)

ادفع صورة سريعة بدون provenance:

docker build -t ghcr.io/YOUR_USER/slsa-provenance-lab:no-provenance .
docker push ghcr.io/YOUR_USER/slsa-provenance-lab:no-provenance

NO_PROV_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' \
  ghcr.io/YOUR_USER/slsa-provenance-lab:no-provenance | cut -d@ -f2)

kubectl run test-rejected \
  --image=ghcr.io/YOUR_USER/slsa-provenance-lab@$NO_PROV_DIGEST \
  --restart=Never

النتيجة المتوقعة:

Error from server: admission webhook denied the request:
image ghcr.io/YOUR_USER/slsa-provenance-lab@sha256:... 
failed to verify: no matching attestations found

هذا يؤكد أن سياسة القبول تحظر بشكل صحيح الصور التي تفتقر إلى SLSA provenance.

فحص مستند Provenance

فهم مستند provenance أمر ضروري للتدقيق وبناء الأتمتة فوقه. فيما يلي مستند provenance تمثيلي أنشأه slsa-github-generator، متبوعاً بشرح حقل بحقل.

{
  "_type": "https://in-toto.io/Statement/v1",
  "subject": [
    {
      "name": "ghcr.io/YOUR_USER/slsa-provenance-lab",
      "digest": {
        "sha256": "abc123def456789..."
      }
    }
  ],
  "predicateType": "https://slsa.dev/provenance/v1",
  "predicate": {
    "buildDefinition": {
      "buildType": "https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1",
      "externalParameters": {
        "workflow": {
          "ref": "refs/tags/v1.0.0",
          "repository": "https://github.com/YOUR_USER/slsa-provenance-lab",
          "path": ".github/workflows/slsa-provenance.yml"
        }
      },
      "resolvedDependencies": [
        {
          "uri": "git+https://github.com/YOUR_USER/slsa-provenance-lab@refs/tags/v1.0.0",
          "digest": {
            "gitCommit": "a1b2c3d4e5f6..."
          }
        }
      ]
    },
    "runDetails": {
      "builder": {
        "id": "https://github.com/slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@refs/tags/v2.1.0"
      },
      "metadata": {
        "invocationId": "https://github.com/YOUR_USER/slsa-provenance-lab/actions/runs/1234567890/attempts/1",
        "startedOn": "2026-03-23T10:15:30Z",
        "finishedOn": "2026-03-23T10:17:45Z"
      }
    }
  }
}

تفصيل الحقول

  • _type — يحدد هذا كبيان in-toto الإصدار 1، وهو تنسيق الغلاف المستخدم من قبل SLSA.
  • subject — الـ artifact الذي يصفه هذا الـ provenance. يحتوي على اسم الصورة و SHA-256 digest الخاص بها. هذا ما تطابقه مع الصورة التي تتحقق منها.
  • predicateType — يعلن أن هذا الـ attestation هو SLSA provenance الإصدار 1. تستخدم أدوات التحقق هذا لتحديد كيفية تفسير الـ predicate.
  • buildDefinition.buildType — يحدد نظام البناء. بالنسبة لـ GitHub Actions، يخبر هذا المُحققين بتوقع حقول خاصة بـ GitHub.
  • buildDefinition.externalParameters.workflow — ملف workflow والمستودع ومرجع Git الذي أطلق البناء. يجب التحقق من تطابق هذا مع المصدر المتوقع.
  • buildDefinition.resolvedDependencies — يسرد المدخلات المحلولة بما في ذلك commit الـ Git الدقيق. هذه قائمة “المواد” — توفر سجلاً كاملاً لما دخل في البناء.
  • runDetails.builder.id — عنوان URI للباني الذي أنشأ provenance. بالنسبة لـ SLSA Level 3، يجب أن يكون هذا بانياً موثوقاً ومعزولاً مثل reusable workflow الخاص بـ slsa-github-generator عند tag مثبّت.
  • runDetails.metadata — الطوابع الزمنية ورابط لتشغيل GitHub Actions المحدد، مما يتيح التتبع الكامل من artifact إلى البناء.

عند بناء التحقق الآلي، تحقق دائماً من: (1) تطابق subject digest، (2) أن builder ID على قائمة السماح الخاصة بك، (3) تطابق مستودع المصدر والمرجع مع توقعاتك، و (4) صحة التوقيع.

التنظيف

أزل الموارد التي تم إنشاؤها خلال هذا المختبر:

# Delete Kubernetes test pods
kubectl delete pod test-allowed test-rejected --ignore-not-found

# Remove the admission policy (Sigstore)
kubectl delete clusterimagepolicy require-slsa-provenance --ignore-not-found

# Or remove the Kyverno policy
kubectl delete clusterpolicy require-slsa-provenance --ignore-not-found

# Remove the namespace label
kubectl label namespace default policy.sigstore.dev/include-

# Delete GHCR images (via GitHub UI or CLI)
gh api -X DELETE /user/packages/container/slsa-provenance-lab/versions/PACKAGE_VERSION_ID

# Delete the test repository if desired
# gh repo delete YOUR_USER/slsa-provenance-lab --yes

النقاط الرئيسية

  • SLSA provenance هو سجل موقّع ومقاوم للتلاعب لكيفية بناء صورة حاوية. يلتقط المصدر والباني ومعلمات البناء.
  • SLSA Level 3 يتطلب عزل البناء — يحقق slsa-github-generator ذلك من خلال تشغيل إنشاء provenance في reusable workflow منفصل لا يستطيع المطور تعديله أثناء التشغيل.
  • GitHub artifact attestations توفر بديلاً أبسط يتكامل بإحكام مع نظام GitHub البيئي، مع مقايضات في قابلية النقل عبر المنصات.
  • يجب أتمتة التحقق — استخدم slsa-verifier في بوابات CI، و cosign verify-attestation في السكربتات، أو Kubernetes admission controllers لفرض provenance قبل النشر.
  • التحقق من provenance يفحص ادعاءات متعددة: هوية الباني، ومستودع المصدر، ومرجع المصدر، و artifact digest، وصحة التوقيع المشفر.
  • افحص مستندات provenance لفهم ما تم بناؤه بالضبط، ومن أي commit، وبواسطة أي باني. هذا هو سجل التدقيق الخاص بك لحوادث سلسلة التوريد.

الخطوات التالية

واصل تعزيز أمان سلسلة توريد البرمجيات الخاصة بك: