نظرة عامة
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، وبواسطة أي باني. هذا هو سجل التدقيق الخاص بك لحوادث سلسلة التوريد.
الخطوات التالية
واصل تعزيز أمان سلسلة توريد البرمجيات الخاصة بك:
- Artifact Provenance and Attestations: From SLSA to in-toto — تعمق أكثر في إطار عمل SLSA وتنسيقات attestation الخاصة بـ in-toto وكيفية بناء استراتيجية provenance شاملة عبر pipeline البناء بالكامل.
- Signing and Verifying Container Images with Sigstore and Cosign — تعلم كيفية توقيع صور الحاويات باستخدام التوقيع بدون مفتاح من Sigstore، والتحقق من التوقيعات في CI/CD، وفرض سياسات التوقيع في Kubernetes.