DevOps and Infrastructure

تقویت خط لوله: اجرای عملیات زنجیره تأمین امن در GitHub Actions

چرخه حیات توسعه نرم‌افزار مدرن به‌طور فزاینده‌ای پیچیده شده و به شبکه‌ای گسترده از وابستگی‌های شخص ثالث، تصاویر کانتینری و جریان‌های کاری خودکار متکی است. با افزایش حملات پیچیده زنجیره تأمین، مانند آسیب‌پذیری Log4j و ابزارهای ساخت مورد حمله اخیر، اطمینان از یکپارچگی آرتیفکت‌های شما دیگر یک انتخاب نیست—بلکه حیاتی است. GitHub Actions اصول قدرتمندی را برای کمک به شما در ساخت یک خط لوله «CI/CD قابل اعتماد» فراهم می‌کند. در این راهنما، بررسی خواهیم کرد که چگونه می‌توانید تولید فهرست مواد نرم‌افزاری (SBOM) و امضای آرتیفکت‌ها را در جریان‌های کاری GitHub Actions خود برای تأیید اصالت و یکپارچگی پیاده‌سازی کنید.

اهمیت SBOMها در DevOps

فهرست مواد نرم‌افزاری (SBOM) اساساً موجودی تمام اجزا، کتابخانه‌ها و وابستگی‌های موجود در نرم‌افزار شما است. آن را به عنوان یک برچسب تغذیه‌ای برای برنامه خود در نظر بگیرید. وقتی آسیب‌پذیری جدیدی در یک کتابخانه رایج ظاهر می‌شود، SBOM به شما امکان می‌دهد بلافاصله تشخیص دهید که آیا تحت تأثیر قرار گرفته‌اید یا خیر و از کدام نسخه‌های خاص استفاده می‌شود. بدون این شفافیت، رفع آسیب‌پذیری‌ها به یک بازی حدس‌وگمان تبدیل می‌شود که می‌تواند زیرساخت شما را در معرض خطر قرار دهد.

تولید خودکار SBOM به عنوان بخشی از فرآیند ساخت تضمین می‌کند که همیشه یک رکورد به‌روز و دقیق از وابستگی‌های خود داشته باشید. این کار فقط برای تیم‌های امنیتی نیست؛ بلکه برای چارچوب‌های انطباق مانند NIST SSDF (چارچوب توسعه نرم‌افزار امن) و دستورالعمل‌های اجرایی که شفافیت نرم‌افزار را الزام می‌کنند، ضروری است.

تولید SBOMها با GitHub Actions

GitHub یک ابزار بومی برای تولید SBOMها ارائه می‌دهد: anchore/sbom-action. این اکشن از Grype، یک اسکنر آسیب‌پذیری قدرتمند، برای ایجاد SBOM با فرمت CycloneDX یا SPDX استفاده می‌کند. یکپارچه‌سازی آن در جریان کاری شما ساده است. شما فقط باید مسیر دایرکتوری حاوی کد منبع خود را مشخص کنید و فرمت خروجی مورد نظر خود را انتخاب نمایید.

در زیر یک مثال عملی از نحوه یکپارچه‌سازی تولید SBOM در یک جریان کاری ساخت استاندارد آورده شده است:

name: Build and Generate SBOM

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Build Application
        run: echo "Building application..."
      
      - name: Generate SBOM
        uses: anchore/sbom-action@v0
        with:
          path: ./my-app-directory
          format: cyclonedx-json
          artifact-name: my-app-sbom.cdx.json
          output-file: sbom-output.json

در این قطعه کد، پارامتر artifact-name تضمین می‌کند که SBOM به عنوان یک آرتیفکت ساخت آپلود شود، که به شما امکان می‌دهد آن را از رابط کاربری GitHub Actions دانلود کنید یا در مراحل بعدی به آن ارجاع دهید.

امضای آرتیفکت‌ها برای تأیید یکپارچگی

در حالی که SBOM به شما می‌گوید چه چیزی در داخل آرتیفکت شما وجود دارد، امضای آن به شما می‌گوید که از زمان تکمیل ساخت، دستکاری نشده است. با امضای آرتیفکت‌های خود، یک تضمین رمزنگاری شده برای یکپارچگی ایجاد می‌کنید. اگر مهاجمی خط لوله ساخت شما را قطع کند و یک باینری را با یکی مخرب جایگزین کند، تأییدیه امضا شکست می‌خورد و سیستم استقرار شما را از رد کد مورد حمله آگاه می‌کند.

برای تصاویر کانتینری و فایل‌های عمومی، sigstore به استاندارد صنعتی برای امضا تبدیل می‌شود. Sigstore یک زیرساخت شفاف، عمومی و باز برای امضای زنجیره‌های تأمین نرم‌افزار فراهم می‌کند. GitHub Actions از امضای آرتیفکت‌ها با استفاده از Sigstore پشتیبانی بومی دارد که نیاز به مدیریت زیرساخت‌های پیچیده ذخیره‌سازی کلید را از بین می‌برد.

در اینجا نحوه امضای یک آرتیفکت تولید شده در مرحله قبلی آورده شده است:

- name: Sign Artifact
  uses: sigstore/gh-action-sigstore-python@v2.1.1
  with:
    inputs: |
      ./my-app-binary

این مرحله ورود‌های امضا و لاگ شفافیت گواهی (CT) را تولید می‌کند و یک رکورد غیرقابل تغییر ایجاد می‌کند که هش کامیت خاص را به خروجی باینری متصل می‌کند. این یک الزام اساسی برای دستیابی به سطوح بالاتر چارچوب SLSA (سطوح زنجیره تأمین برای آرتیفکت‌های نرم‌افزاری) است.

نتیجه‌گیری

پیاده‌سازی تولید SBOM و امضای آرتیفکت‌ها در GitHub Actions، خط لوله CI/CD شما را از یک ابزار اتوماسیون ساده به یک مرز امنیتی قوی تبدیل می‌کند. این عملیات نیاز به بازنگری کامل جریان‌های کاری موجود شما ندارند؛ بلکه می‌توانند به تدریج برای بهبود وضعیت امنیتی شما در طول زمان پذیرفته شوند. با قرار دادن شفافیت و یکپارچگی به عنوان شهروندان درجه یک در فرآیند توسعه خود، نه تنها از زیرساخت خود بلکه از یکپارچگی اکوسیستر گسترده‌تری که به نرم‌افزار شما متکی است محافظت می‌کنید. از امروز این کنترل‌ها را یکپارچه کنید تا در برابر تهدیدات نوظهور پیشرو باشید.

Share: