أمان الحاويات و Kubernetes
أمان سلسلة التوريد
4 دقيقة للقراءة
هجمات سلسلة توريد البرمجيات زادت 742% من 2019-2022. تأمين خط بناء الحاويات—من الكود المصدري إلى الإنتاج—حرج لمنع اختراق التطبيقات السحابية الأصلية.
متجهات هجوم سلسلة التوريد
سطح الهجوم
┌─────────────────────────────────────────────────────┐
│ سلسلة توريد البرمجيات │
├─────────────────────────────────────────────────────┤
│ الكود المصدر → البناء → التعبئة → النشر → التشغيل │
│ │ │ │ │ │ │
│ commits CI/CD صور صور غير الانحراف│
│ خبيثة مخترق أساسية موقعة │
└─────────────────────────────────────────────────────┘
| المرحلة | متجه الهجوم | مثال |
|---|---|---|
| المصدر | تبعية خبيثة | typosquatting في PyPI |
| البناء | CI/CD مخترق | SolarWinds (2020) |
| التعبئة | صورة أساسية ضعيفة | Log4Shell في الحاويات |
| النشر | صور غير موقعة | حقن man-in-the-middle |
| التشغيل | انحراف التكوين | خطأ تكوين Kubernetes |
فاتورة مواد البرمجيات (SBOM)
لماذا SBOM مهم
- الأمر التنفيذي الأمريكي 14028 يلزم SBOM لموردي الحكومة
- يمكّن الاستجابة السريعة للثغرات (استجابة Log4Shell)
- مطلوب للامتثال (FedRAMP، SOC2)
توليد SBOM
Syft - مولد SBOM:
# توليد SBOM من صورة حاوية
syft myapp:latest -o spdx-json > sbom.spdx.json
# توليد بتنسيق CycloneDX
syft myapp:latest -o cyclonedx-json > sbom.cdx.json
# فحص نظام الملفات
syft dir:/path/to/project -o spdx-json > sbom.spdx.json
Trivy - فحص مدمج + SBOM:
# توليد SBOM
trivy image --format spdx-json -o sbom.json myapp:latest
# فحص SBOM موجود للثغرات
trivy sbom sbom.json
مثال SBOM (CycloneDX)
{
"bomFormat": "CycloneDX",
"specVersion": "1.4",
"components": [
{
"type": "library",
"name": "express",
"version": "4.18.2",
"purl": "pkg:npm/express@4.18.2"
},
{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21"
}
],
"dependencies": [
{
"ref": "pkg:npm/express@4.18.2",
"dependsOn": ["pkg:npm/body-parser@1.20.0"]
}
]
}
توقيع الصور والتحقق
سير عمل Cosign
# توليد مفاتيح التوقيع
cosign generate-key-pair
# توقيع الصورة بعد البناء
cosign sign --key cosign.key gcr.io/project/myapp:v1.0.0
# التحقق قبل النشر
cosign verify --key cosign.pub gcr.io/project/myapp:v1.0.0
التوقيع بدون مفتاح مع Sigstore
# التوقيع بهوية OIDC (بدون إدارة مفاتيح)
cosign sign gcr.io/project/myapp:v1.0.0
# التحقق بهوية الشهادة
cosign verify \
--certificate-identity developer@company.com \
--certificate-oidc-issuer https://accounts.google.com \
gcr.io/project/myapp:v1.0.0
فرض الصور الموقعة في Kubernetes
سياسة Kyverno:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: verify-image-signatures
spec:
validationFailureAction: Enforce
background: false
rules:
- name: verify-signature
match:
any:
- resources:
kinds:
- Pod
verifyImages:
- imageReferences:
- "gcr.io/project/*"
attestors:
- entries:
- keyless:
subject: "*@company.com"
issuer: https://accounts.google.com
خط CI/CD آمن
أفضل ممارسات أمان الخط
# خط GitHub Actions آمن
name: Secure Build
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # للتوقيع بدون مفتاح
packages: write
steps:
- uses: actions/checkout@v4
# فحص التبعيات
- name: Scan dependencies
uses: snyk/actions/node@master
with:
args: --severity-threshold=high
# البناء بقاعدة بسيطة
- name: Build image
run: |
docker build -t myapp:${{ github.sha }} \
--build-arg VERSION=${{ github.sha }} .
# فحص الثغرات
- name: Scan image
uses: aquasecurity/trivy-action@master
with:
image-ref: myapp:${{ github.sha }}
exit-code: 1
severity: CRITICAL,HIGH
# توليد SBOM
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:${{ github.sha }}
output-file: sbom.spdx.json
# توقيع الصورة
- name: Sign image
uses: sigstore/cosign-installer@main
- run: |
cosign sign --yes gcr.io/project/myapp:${{ github.sha }}
# دفع للسجل
- name: Push image
run: |
docker push gcr.io/project/myapp:${{ github.sha }}
أمان بيئة البناء
| الضابط | التنفيذ |
|---|---|
| runners مؤقتة | بيئة جديدة لكل بناء |
| صلاحيات بسيطة | رموز OIDC، وليس أسرار طويلة العمر |
| تثبيت التبعيات | ملفات القفل، التحقق من الهاش |
| شهادة البناء | مصدر SLSA |
| توقيع القطع | Cosign/Sigstore |
إطار SLSA
مستويات SLSA
| المستوى | المتطلبات | الحماية |
|---|---|---|
| SLSA 1 | التوثيق | لا شيء (خط أساس) |
| SLSA 2 | بناء مستضاف، مصدر موقع | التلاعب البسيط |
| SLSA 3 | بناء مقوى، غير قابل للتزوير | اختراق البناء |
| SLSA 4 | بناء محكم، مراجعة شخصين | التهديدات الداخلية |
توليد مصدر SLSA
# مولد SLSA لـ GitHub Actions
- uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0
with:
image: gcr.io/project/myapp
digest: ${{ needs.build.outputs.digest }}
secrets:
registry-username: ${{ secrets.REGISTRY_USERNAME }}
registry-password: ${{ secrets.REGISTRY_PASSWORD }}
إدارة الثغرات
استراتيجية الفحص المستمر
┌────────────────────────────────────────────────────┐
│ الفحص المستمر للثغرات │
├────────────────────────────────────────────────────┤
│ المطور │ CI/CD │ السجل │ التشغيل │
│ فحص IDE │ بوابة │ فحص │ فحص │
│ Pre-commit│ البناء │ التخزين │ التشغيل │
│ │ │ │ │
│ Shift-left│ البوابة │ الاكتشاف │ الكشف │
└────────────────────────────────────────────────────┘
فحص سجل السحابة
# AWS ECR - تفعيل الفحص
aws ecr put-image-scanning-configuration \
--repository-name myapp \
--image-scanning-configuration scanOnPush=true
# الحصول على نتائج الفحص
aws ecr describe-image-scan-findings \
--repository-name myapp \
--image-id imageTag=latest
# GCP - تحليل Artifact
gcloud artifacts docker images scan \
us-central1-docker.pkg.dev/project/repo/myapp:latest \
--format=json
# Azure ACR
az acr repository show-manifests \
--name myregistry \
--repository myapp \
--detail
قائمة تحقق أمان سلسلة التوريد
| الضابط | الأداة | المرحلة |
|---|---|---|
| فحص التبعيات | Snyk، Dependabot | المصدر |
| SAST | Semgrep، SonarQube | البناء |
| فحص الحاويات | Trivy، Grype | البناء/السجل |
| توليد SBOM | Syft، Trivy | البناء |
| توقيع الصور | Cosign | البناء |
| التحقق من التوقيع | Kyverno، Gatekeeper | النشر |
| فحص التشغيل | Falco، سحابي أصلي | التشغيل |
الوحدة التالية: تقنيات اختبار اختراق السحابة ومنهجيات تقييم الأمان. :::