أتمتة مسح صور الحاوية

مكتمل

تحزم صور الحاوية التطبيقات جنبا إلى جنب مع جميع تبعياتها ، مما يجعلها عناصر نشر مريحة. ومع ذلك، تقدم هذه الراحة تحديات أمنية كبيرة - يمكن أن تؤدي الثغرات الأمنية في الصور الأساسية أو حزم النظام أو تبعيات التطبيقات إلى تعريض الحاويات المنشورة للخطر. يضمن التشغيل الآلي لمسح صور الحاوية خلال دورة حياة التطوير والنشر وصول بيئات الإنتاج فقط إلى الصور الآمنة والمتوافقة.

فهم مخاطر أمان الحاويات

تقدم صور الحاوية فئات متعددة من المخاطر الأمنية:

الثغرات الأمنية في الصورة الأساسية

باقات نظام التشغيل:

  • مكتبات النظام: تتضمن الصور الأساسية مكتبات نظام التشغيل (glibc و OpenSSL و zlib) التي قد تحتوي على ثغرات أمنية.
  • مديرو الحزم: غالبا ما يواجه مديرو حزم النظام (apt و yum و apk) وحزمهم مشكلات أمنية.
  • أدوات شل المساعدة: يمكن أن تحتوي الأدوات المساعدة الشائعة (bash و curl و wget) في الصور الأساسية على ثغرات أمنية.
  • تأخر التحديث: قد تتضمن الصور الأساسية الرسمية حزما قديمة بين الإصدارات.

تأثير تحديد الصورة الأساسية:

  • جبال الألب vs دبيان: صور Alpine Linux الأساسية أصغر ولكنها تستخدم مكتبات مختلفة (musl بدلا من glibc) ، مما يؤثر على ملفات تعريف الثغرات الأمنية.
  • صور Distroless: تحتوي صور Google غير القابلة للتوزيع على تبعيات وقت تشغيل التطبيق فقط ، مما يقلل بشكل كبير من سطح الهجوم.
  • المتغيرات النحيفة: تستبعد متغيرات الصور الرفيعة الأدوات المساعدة الشائعة ، مما يقلل من الحجم والتعرض للثغرات الأمنية.
  • عملة الإصدار: يمكن أن يؤدي استخدام latest العلامات إلى تغييرات غير متوقعة ؛ توفر علامات إصدار معينة الاستقرار ولكنها تتطلب تحديثات يدوية.

الثغرات الأمنية في تبعية التطبيق

الحزم الخاصة باللغة:

  • حزم NPM: تجلب التطبيقات Node.js المئات من تبعيات NPM التي قد تحتوي على ثغرات أمنية.
  • حزم بايثون: تتضمن تطبيقات Python حزم PyPI مع مشكلات أمنية محتملة.
  • تبعيات Java: تتضمن تبعيات Maven و Gradle بشكل عابر العديد من ملفات JAR.
  • حزم .NET: يمكن أن تحتوي حزم NuGet في تطبيقات .NET على ثغرات أمنية.

التبعيات المتعدية:

  • أشجار التبعية العميقة: تبعيات التطبيق لها تبعياتها الخاصة، مما يؤدي إلى إنشاء أشجار تبعية عميقة.
  • الثغرات الأمنية المخفية: من السهل التغاضي عن الثغرات الأمنية في التبعيات الانتقالية دون الفحص الآلي.
  • تحديث التعقيد: يتطلب تحديث التبعيات الانتقالية فهم التوافق عبر سلسلة التبعية بأكملها.

تراكم طبقة الصورة

نظام الملفات متعدد الطبقات:

  • وراثة الطبقة: تنشئ كل تعليمات Dockerfile طبقة جديدة ، وتؤثر الثغرات الأمنية في أي طبقة على الصورة النهائية.
  • تستمر الملفات المحذوفة: لا تزال الملفات المحذوفة في الطبقات اللاحقة موجودة في الطبقات السابقة وتساهم في حجم الصورة وملف تعريف الأمان.
  • أسرار في التاريخ: تظل الأسرار التي تم الالتزام بها عن طريق الخطأ في الطبقات المبكرة في تاريخ الصورة حتى لو تمت إزالتها في طبقات لاحقة.
  • تبعيات وقت الإنشاء: يجب ألا تظهر التبعيات المطلوبة فقط أثناء الإنشاء (المترجمات وأدوات الإنشاء) في صور وقت التشغيل النهائية.

الثغرات الأمنية في التكوين

تكوينات Dockerfile الخاطئة:

  • تشغيل كجذر: تتمتع الحاويات التي تعمل كمستخدم جذر بامتيازات غير ضرورية.
  • المنافذ المكشوفة: تعمل المنافذ المكشوفة دون داع على توسيع سطح الهجوم.
  • ثنائيات SUID: تتيح ثنائيات SUID/SGID هجمات تصعيد الامتيازات.
  • الإعدادات الافتراضية غير الآمنة: قد لا تتبع عمليات الضبط الافتراضية أفضل ممارسات الأمان.

نهج مسح الحاويات

يتطلب أمان الحاوية الفعال المسح الضوئي في نقاط متعددة في دورة الحياة:

فحص السجل

المراقبة المستمرة للتسجيل: توفر سجلات الحاويات مواقع مركزية للمسح الضوئي وفرض السياسات.

فحص Azure Container Registry باستخدام Microsoft Defender:

  • المسح التلقائي: يقوم Microsoft Defender for Containers تلقائيا بمسح الصور التي تم دفعها إلى Azure Container Registry.
  • الفحص المستند إلى الزناد: يتم تشغيل عمليات الفحص عند عمليات الدفع والاستيراد والسحب.
  • إعادة المسح المستمر يتم إعادة فحص الصور بشكل دوري بحثا عن الثغرات الأمنية التي تم الكشف عنها حديثا.
  • التوصيات: يوفر مركز الأمان توصيات معالجة للثغرات الأمنية المكتشفة.

مشغلات فحص السجل:

  • دفع المشغلات: يتم مسح الصور الجديدة تلقائيا عند دفعها إلى السجل.
  • مشغلات الاستيراد: يتم مسح الصور المستوردة من السجلات الخارجية ضوئيا.
  • سحب الزناد: يتم مسح الصور ضوئيا في غضون 24 ساعة بعد سحبها.
  • إعادة المسح الدوري: يتم إعادة فحص الصور الممسوحة ضوئيا مسبقا يوميا (آخر 90 يوما للصور التي تم دفعها ، وآخر 30 يوما للصور المسحوبة).

مسح وقت الإنشاء

تكامل خط أنابيب CI / CD: يلتقط المسح أثناء إنشاء الصور الثغرات الأمنية قبل وصول الصور إلى السجلات.

فحص حاوية Azure Pipelines:

trigger:
  branches:
    include:
      - main

pool:
  vmImage: "ubuntu-latest"

variables:
  imageName: "myapp"
  dockerfilePath: "$(Build.SourcesDirectory)/Dockerfile"

steps:
  - task: Docker@2
    displayName: "Build container image"
    inputs:
      command: "build"
      repository: "$(imageName)"
      dockerfile: "$(dockerfilePath)"
      tags: "$(Build.BuildNumber)"

  - task: AquaScannerCLI@4
    displayName: "Scan image with Aqua Security"
    inputs:
      image: "$(imageName):$(Build.BuildNumber)"
      scanType: "local"
      register: false
      hideBase: false
      showNegligible: false

  - script: |
      docker run --rm \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v $(Build.SourcesDirectory):/src \
        aquasec/trivy image \
        --severity HIGH,CRITICAL \
        --exit-code 1 \
        $(imageName):$(Build.BuildNumber)
    displayName: "Scan with Trivy (fail on high/critical)"

  - task: Docker@2
    displayName: "Push image to registry"
    condition: succeeded()
    inputs:
      command: "push"
      repository: "$(imageName)"
      tags: "$(Build.BuildNumber)"

فحص حاوية GitHub Actions:

name: Container Build and Scan

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  IMAGE_NAME: myapp
  REGISTRY: ghcr.io

jobs:
  build-and-scan:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      security-events: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Build container image
        uses: docker/build-push-action@v4
        with:
          context: .
          load: true
          tags: ${{ env.IMAGE_NAME }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

      - name: Scan image with Trivy
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: "${{ env.IMAGE_NAME }}:${{ github.sha }}"
          format: "sarif"
          output: "trivy-results.sarif"
          severity: "CRITICAL,HIGH"

      - name: Upload Trivy results to GitHub Security
        uses: github/codeql-action/upload-sarif@v2
        if: always()
        with:
          sarif_file: "trivy-results.sarif"

      - name: Scan with Snyk
        uses: snyk/actions/docker@master
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        with:
          image: ${{ env.IMAGE_NAME }}:${{ github.sha }}
          args: --severity-threshold=high --file=Dockerfile

      - name: Log in to GitHub Container Registry
        if: github.event_name == 'push'
        uses: docker/login-action@v2
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Push image to registry
        if: github.event_name == 'push'
        run: |
          docker tag ${{ env.IMAGE_NAME }}:${{ github.sha }} \
            ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
          docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}

فحص حاوية GitHub Advanced Security: يوفر GitHub Advanced Security إمكانات أمان حاوية إضافية من خلال CodeQL وفحص التبعية.

name: Container Security with GitHub Advanced Security

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:
    - cron: "0 0 * * 0" # Weekly scheduled scan

env:
  IMAGE_NAME: myapp
  REGISTRY: ghcr.io

jobs:
  build-and-scan:
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write
      packages: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v2
        with:
          languages: "javascript" # Adjust based on your language

      - name: Build container image
        run: |
          docker build -t ${{ env.IMAGE_NAME }}:${{ github.sha }} .

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v2
        with:
          category: "/language:javascript"

      - name: Run CodeQL container scanning
        uses: github/codeql-action/analyze@v2
        with:
          category: "/language:dockerfile"

      - name: Scan container dependencies
        uses: anchore/scan-action@v3
        with:
          image: ${{ env.IMAGE_NAME }}:${{ github.sha }}
          fail-build: true
          severity-cutoff: high

      - name: Upload Anchore scan SARIF report
        uses: github/codeql-action/upload-sarif@v2
        if: always()
        with:
          sarif_file: results.sarif

      - name: Push image to registry
        if: github.event_name == 'push'
        run: |
          echo ${{ secrets.GITHUB_TOKEN }} | docker login ${{ env.REGISTRY }} -u ${{ github.actor }} --password-stdin
          docker tag ${{ env.IMAGE_NAME }}:${{ github.sha }} ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}
          docker push ${{ env.REGISTRY }}/${{ github.repository }}:${{ github.sha }}

مزايا المسح الضوئي لوقت البناء:

  • فشل سريع: منع إنشاء الصور المعرضة للخطر ودفعها إلى السجلات.
  • ملاحظات المطورين: تقديم ملاحظات فورية للمطورين أثناء عملية الإنشاء.
  • إنفاذ السياسات: فرض سياسات الأمان قبل وصول الصور إلى السجلات أو الإنتاج.
  • إنشاء التحقق من صحة القطع الأثرية: تأكد من تقدم الصور المتوافقة فقط من خلال مسار النشر.

مسح وقت التشغيل

مراقبة الحاويات المنشورة: يكتشف فحص وقت التشغيل الثغرات الأمنية في الحاويات المنشورة بالفعل.

مراقبو القبول Kubernetes: تفرض وحدات التحكم في القبول السياسات قبل نشر الحاويات في مجموعات Kubernetes.

مثال على نهج حماية بوابة OPA:

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredscanstatus
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredScanStatus
      validation:
        openAPIV3Schema:
          type: object
          properties:
            maxSeverity:
              type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredscanstatus

        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          not scan_clean(container.image)
          msg := sprintf("Image %v has not been scanned or has vulnerabilities", [container.image])
        }

        scan_clean(image) {
          # Query registry for scan status
          # This is simplified; actual implementation queries scan results
          scan_result := data.scans[image]
          scan_result.status == "passed"
        }

حماية وقت تشغيل خدمة Azure Kubernetes: يوفر Microsoft Defender for Containers الكشف عن تهديدات وقت التشغيل:

  • التحليلات السلوكية: يراقب سلوك الحاوية للكشف عن الأنشطة الشاذة.
  • ذكاء التهديدات: يقارن السلوكيات المرصودة بأنماط الهجوم المعروفة.
  • رسم خرائط MITRE ATT & CK: تم اكتشاف الخرائط للتهديدات لإطار عمل MITRE ATT&CK.
  • إنشاء التنبيه: ينشئ تنبيهات أمنية لأنشطة الحاويات المشبوهة.

أدوات مسح الحاويات

Trivy (أكوا سيكيوريتي)

Trivy هو ماسح ضوئي شامل للثغرات الأمنية في الحاويات مفتوح المصدر.

دلائل الميزات:

  • المسح الشامل: يفحص حزم نظام التشغيل وتبعيات التطبيقات وتكوينات IaC والأسرار.
  • دعم متعدد التنسيقات: يفحص صور الحاوية وأنظمة الملفات ومستودعات git ومجموعات Kubernetes.
  • المسح الضوئي دون اتصال: يمكن أن تعمل في بيئات ذات فجوة هوائية مع قواعد بيانات الثغرات الأمنية دون اتصال.
  • أداء سريع: ماسح ضوئي خفيف الوزن مع أوقات مسح سريعة.
  • جيل SBOM: يقوم بإنشاء فاتورة مواد برنامج CycloneDX و SPDX.

تكامل Azure Pipelines Trivy:

- script: |
    wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
    echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/trivy.list
    sudo apt-get update
    sudo apt-get install trivy

    trivy image \
      --severity HIGH,CRITICAL \
      --exit-code 1 \
      --no-progress \
      --format json \
      --output trivy-results.json \
      $(imageName):$(Build.BuildNumber)
  displayName: "Scan image with Trivy"

حاوية سنيك

توفر Snyk Container مسحا ضوئيا لصور الحاوية مدمجا مع منصة Snyk التي تركز على المطورين.

دلائل الميزات:

  • توصيات الصورة الأساسية: يقترح صورا أساسية بديلة مع عدد أقل من الثغرات الأمنية.
  • تحديد الأولويات: إعطاء الأولوية للثغرات الأمنية بناء على قابلية الاستغلال وتأثير الأعمال.
  • إرشادات الإصلاح: يوفر خطوات معالجة محددة للثغرات الأمنية المكتشفة.
  • تكامل Kubernetes: يفحص الصور المنشورة في مجموعات Kubernetes.

أكوا سيكيوريتي

يوفر Aqua Security أمان حاويات على مستوى المؤسسات عبر دورة الحياة الكاملة.

دلائل الميزات:

  • ضمان الصورة: مسح ضوئي شامل للصور مع سياسات قابلة للتخصيص.
  • حماية وقت التشغيل: يراقب الحاويات قيد التشغيل بحثا عن سلوك مشبوه.
  • التحقق من الامتثال: التحقق من صحة الصور مقابل معيار CIS Docker والنهج المخصصة.
  • أمن سلسلة التوريد: يتحقق من مصدر الصورة ويكتشف هجمات سلسلة التوريد.

محرك Anchore

Anchore Engine عبارة عن ماسح ضوئي لصور الحاوية مفتوح المصدر مع تحليل قائم على السياسة.

دلائل الميزات:

  • المستندة إلى السياسة: محرك سياسة مرن لتحديد قواعد الأمان والامتثال.
  • الفحص العميق: يحلل طبقات الصور والحزم والتكوين.
  • السياسات المخصصة: تحديد نهج الأمان والتوافق الخاصة بالمؤسسة.
  • تعتمد على واجهة برمجة التطبيقات: واجهة برمجة تطبيقات REST للتكامل مع الأدوات المخصصة.

GitHub Advanced Security

يوفر GitHub Advanced Security ميزات أمان على مستوى المؤسسات للمستودعات بما في ذلك إمكانات فحص الحاويات.

ميزات أمان الحاويات:

  • فحص التبعية: يكتشف تلقائيا التبعيات الضعيفة في صور الحاوية.
  • المسح السري: يحدد الأسرار المكشوفة (مفاتيح واجهة برمجة التطبيقات والرموز المميزة وبيانات الاعتماد) في طبقات الحاوية وملفات Dockerfiles.
  • مسح الكود: تحليل CodeQL لملفات Dockerfiles ورمز التطبيق داخل الحاويات.
  • التحذيرات الأمنية: التكامل مع قاعدة بيانات GitHub الاستشارية للذكاء عن الثغرات الأمنية.
  • أمن سلسلة التوريد: الرسم البياني للتبعية وتكامل Dependabot لتبعيات الحاوية.

تشغيل CodeQL في الحاويات: يدعم GitHub Advanced Security تشغيل مسح كود CodeQL داخل بيئات الحاويات لإجراء تحليل شامل:

سير عمل مسح حاوية CodeQL:

name: CodeQL Container Analysis

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  analyze-container:
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: ["javascript", "python"]

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v2
        with:
          languages: ${{ matrix.language }}
          queries: security-extended,security-and-quality

      - name: Build application in container
        run: |
          docker build -t app:latest .
          docker create --name temp-container app:latest
          docker cp temp-container:/app/built-artifacts ./artifacts
          docker rm temp-container

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v2
        with:
          category: "/language:${{ matrix.language }}"

      - name: Scan Dockerfile
        uses: github/codeql-action/analyze@v2
        with:
          category: "/language:dockerfile"

المسح السري للحاويات:

name: Container Secret Scanning

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  scan-secrets:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Build container image
        run: docker build -t myapp:${{ github.sha }} .

      - name: Scan image for secrets
        uses: trufflesecurity/trufflehog@main
        with:
          path: ./
          base: ${{ github.event.repository.default_branch }}
          head: HEAD

      - name: Scan container layers for secrets
        run: |
          docker save myapp:${{ github.sha }} -o image.tar
          docker run --rm -v $(pwd):/scan \
            trufflesecurity/trufflehog:latest \
            filesystem /scan/image.tar \
            --json > secrets-report.json

      - name: Upload secret scan results
        uses: github/codeql-action/upload-sarif@v2
        if: always()
        with:
          sarif_file: secrets-report.sarif

مزايا GitHub Advanced Security:

  • التكامل الأصلي: متكامل بشكل عميق مع مهام سير عمل GitHub وميزات الأمان.
  • لوحة معلومات موحدة: نظرة عامة على الأمان المركزي في علامة التبويب GitHub Security.
  • إنفاذ السياسات: يمكن أن تتطلب قواعد حماية الفرع اجتياز الفحوصات الأمنية.
  • تقارير الامتثال: تقارير امتثال مضمنة ل SOC 2 و ISO 27001 وأطر عمل أخرى.
  • تعاون الفريق: نتائج الأمان المدمجة في مراجعات طلبات السحب وتتبع المشكلات.

تمكين الأمان المتقدم ل GitHub:

للمؤسسات:

  1. انتقل إلى إعدادات المؤسسة → أمان التعليمات البرمجية وتحليلها.
  2. قم بتمكين الأمان المتقدم ل GitHub لجميع المستودعات أو المستودعات المحددة.
  3. تكوين تنبيهات Dependabotوالفحص السريوفحص التعليمات البرمجية.
  4. إعداد سياسات الأمانونصائح الأمان.

للمستودعات:

  1. انتقل إلى إعدادات المستودع → أمان التعليمات البرمجية وتحليلها.
  2. تمكين الرسم البياني للتبعية (مجاني للمستودعات العامة).
  3. قم بتمكين تنبيهات Dependabotوتحديثات أمان Dependabot.
  4. تمكين الفحص السري (يتطلب ترخيص GitHub Advanced Security للمستوعات الخاصة).
  5. قم بتمكين مسح التعليمات البرمجية باستخدام CodeQL أو أدوات الجهات الخارجية.

الأمان المتقدم لسجلات الحاويات:

name: Registry Security Monitoring

on:
  schedule:
    - cron: "0 */6 * * *" # Every 6 hours
  workflow_dispatch:

jobs:
  scan-registry:
    runs-on: ubuntu-latest
    permissions:
      packages: read
      security-events: write

    steps:
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Pull images from registry
        run: |
          docker pull ghcr.io/${{ github.repository }}/app:latest
          docker pull ghcr.io/${{ github.repository }}/app:staging

      - name: Scan registry images
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: "ghcr.io/${{ github.repository }}/app:latest"
          format: "sarif"
          output: "trivy-registry.sarif"

      - name: Upload scan results
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: trivy-registry.sarif
          category: "registry-scan"

      - name: Check for critical vulnerabilities
        run: |
          CRITICAL_COUNT=$(docker run --rm \
            -v /var/run/docker.sock:/var/run/docker.sock \
            aquasec/trivy image \
            --severity CRITICAL \
            --format json \
            ghcr.io/${{ github.repository }}/app:latest | \
            jq '.Results[].Vulnerabilities | length')

          if [ "$CRITICAL_COUNT" -gt 0 ]; then
            echo "::error::Found $CRITICAL_COUNT critical vulnerabilities"
            exit 1
          fi

التكامل مع ميزات أمان GitHub:

  • نظرة عامة على الأمان: لوحة معلومات أمان على مستوى المؤسسة تعرض الثغرات الأمنية في الحاوية.
  • تنبيهات الأمان: تنبيهات آلية لتبعيات الحاوية الضعيفة.
  • تحديثات Dependabot: طلبات السحب التلقائية لتحديث الصور والتبعيات الأساسية الضعيفة.
  • تكامل مالكي الكود: قم بتوجيه نتائج الأمان إلى الفرق المناسبة عبر ملف CODEOWNERS.
  • سجلات التدقيق: مسار تدقيق كامل لأحداث الأمان وإجراءات المعالجة.

أفضل الممارسات لفحص الحاويات

تنفيذ الإصدارات متعددة المراحل

تبعيات منفصلة للإنشاء ووقت التشغيل:

# Build stage
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Runtime stage
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
USER node
EXPOSE 3000
CMD ["node", "dist/server.js"]

Benefits:

  • صور أصغر: لا تتضمن صور وقت التشغيل أدوات الإنشاء والبيانات الاصطناعية الوسيطة.
  • ثغرات أمنية أقل: لا تظهر تبعيات الإنشاء (المترجمات ومجموعات SDK) في الصور النهائية.
  • أداء أفضل: الصور الأصغر تدفع وتسحب وتبدأ بشكل أسرع.

استخدام الحد الأدنى من الصور الأساسية

اختر الصور الأساسية المناسبة:

  • جبال الالب: صورة أساسية صغيرة (~5 ميجابايت) مع الحد الأدنى من سطح الهجوم.
  • ديستروليس: يحتوي فقط على تبعيات التطبيق ووقت التشغيل، ولا يوجد غلاف أو مدير حزم.
  • المتغيرات النحيفة: تستبعد المتغيرات الرسمية *-slim المرافق غير الضرورية.
  • إصدارات محددة: استخدم علامات إصدار محددة بدلا من latest قابلية التكرار.

مثال على صورة distroless:

FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .

FROM gcr.io/distroless/static-debian11
COPY --from=builder /app/myapp /
USER nonroot:nonroot
CMD ["/myapp"]

المسح المبكر وفي كثير من الأحيان

تردد المسح:

  • محطة عمل المطور: امسح الصور ضوئيا محليا قبل الالتزام.
  • التحقق من صحة طلب السحب: المسح الضوئي في مسارات CI في كل طلب سحب.
  • يبني الفرع الرئيسي: عمليات مسح شاملة على عمليات دمج الفرع الرئيسية.
  • القبول في السجل: امسح الصور ضوئيا قبل قبولها في السجلات.
  • إعادة الفحص المجدولة: إعادة فحص الصور المخزنة بشكل دوري بحثا عن الثغرات الأمنية التي تم الكشف عنها حديثا.
  • ما قبل النشر: التحقق النهائي قبل النشر في الإنتاج.

تنفيذ البوابات الأمنية

نقاط إنفاذ السياسات:

- task: Trivy@1
  inputs:
    image: "$(imageName):$(Build.BuildNumber)"
    severityThreshold: "HIGH"
    exitCode: 1
  displayName: "Security gate: block high/critical vulnerabilities"

أمثلة على البوابة:

  • شدة الثغرات الأمنية: عمليات الفشل التي تحتوي على ثغرات أمنية حرجة أو عالية الخطورة.
  • الامتثال للترخيص: حظر الصور ذات التراخيص المحظورة.
  • مشكلات التكوين: منع نشر الصور التي تعمل كجذر.
  • الكشف السري: تفشل إذا تم اكتشاف أسرار في طبقات الصور.

أتمتة المعالجة

التحديثات التلقائية:

  • Dependabot ل Dockerfiles: قم بتمكين Dependabot لتحديث إصدارات الصور الأساسية والتبعيات في Dockerfiles.
  • عمليات إعادة الإنشاء التلقائية: تكوين المسارات لإعادة إنشاء الصور تلقائيا عند تحديث الصور الأساسية.
  • أتمتة التصحيح: استخدم الأدوات لتصحيح الصور الأساسية أو التبعيات تلقائيا.
  • اختبار خطوط الأنابيب: تأكد من أن التحديثات التلقائية تؤدي إلى إجراء اختبار شامل.

تكوين GitHub Dependabot ل Docker:

version: 2
updates:
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 5

الحفاظ على سجل نتائج الفحص

التتبع والترج:

  • التقارير المركزية: ينتج عن الفحص التجميعي لوحات معلومات مركزية.
  • تحليل الاتجاه: تتبع عدد الثغرات الأمنية بمرور الوقت لقياس الوضع الأمني.
  • عمليات تدقيق الامتثال: الاحتفاظ بسجل نتائج المسح الضوئي للحصول على أدلة الامتثال.
  • أرشفة SBOM: أرشفة فاتورة المواد لبرامج الأرشيف للصور المنشورة.

تنفيذ توقيع الصور

تحقق من مصدر الصورة:

- task: Docker@2
  inputs:
    command: "sign"
    arguments: "--key $(signingKey) $(imageName):$(Build.BuildNumber)"
  displayName: "Sign container image"

- script: |
    docker trust inspect --pretty $(imageName):$(Build.BuildNumber)
  displayName: "Verify image signature"

مزايا توقيع الصور:

  • التحقق من المصدر: تأكد من أن الصور التي تم إنشاؤها من مصادر موثوقة.
  • كشف العبث: اكتشف ما إذا كان قد تم تعديل الصور بعد التوقيع.
  • إنفاذ السياسات: انشر الصور الموقعة فقط في بيئات الإنتاج.

يضمن التشغيل الآلي لمسح صور الحاوية عبر دورة حياة التطوير والنشر الكشف الشامل عن الثغرات الأمنية وفرض السياسات. من خلال المسح المبكر والمسح الضوئي بشكل متكرر وتنفيذ المعالجة الآلية ، يمكن للمؤسسات الحفاظ على عمليات نشر آمنة للحاويات دون التضحية بسرعة التطوير. تدرس الوحدة التالية كيفية تفسير التنبيهات من أدوات الماسح الضوئي للأمان وتحديد أولوياتها.