امنیت زنجیرهٔ تأمین یعنی بدانی وابستگیها، توکنها و تگ انتشار قابل جعل یا تعویض نباشند. Dependabot، CodeQL و Secret Scanning همین لایهاند.
🎯 اهداف یادگیری
- Dependabot را برای آپدیت و هشدار CVE راه بیندازی
- CodeQL و secret scanning را بفهمی
- Immutable Releases را در مدل عرضه قرار دهی
- attestations را در یک جمله توضیح دهی
📦 Dependabot
version: 2 updates: - package-ecosystem: pip directory: /src schedule: interval: weekly - package-ecosystem: github-actions directory: / schedule: interval: weekly
دو چهره:
- Security updates — CVE؛ PR فوری
- Version updates — تازگی؛ زمانبندی
PRهای Dependabot را مثل کد انسان ریویو کن. گاهی breaking است.
🔎 CodeQL و secret scanning
- CodeQL: تحلیل معنایی؛ query برای injection، XSS، path traversal. در Copilot code review ۲۰۲۵ با لینترها ترکیب شد.
- Secret scanning: توکن AWS، GitHub, Stripe... را در push میبیند. Push protection جلوی ورود را میگیرد.
- Private vulnerability reporting: پژوهشگر بیرونی بدون Issue عمومی.
on: [push, pull_request] jobs: analyze: runs-on: ubuntu-latest permissions: security-events: write steps: - uses: actions/checkout@v4 - uses: github/codeql-action/init@v3 with: languages: python, javascript - uses: github/codeql-action/analyze@v3
🧊 Immutable Releases (GA ۲۰۲۵)
تگ و دارایی release قفل میشوند؛ بازنویسی v1.2.0 ممکن نیست. همراه attestations (SLSA-مانند) میتوانی ثابت کنی این باینری از کدام workflow و کدام commit آمده.
gh attestation verify dist/app.tar.gz --owner rezaian-dev
برای محصول جدی، در workflow SBOM (CycloneDX/SPDX) بساز و به release بچسبان. مشتری سازمانی میپرسد.
🚫 اشتباههای زنجیره
- اکشن
uses: some-user/action@main— شاخه متحرک = کد متحرک curl | bashدر CI- npm package typosquatting
- خود-hosted runner روی ریپوی عمومی (fork میتواند کد اجرا کند)
Mid — push protection چیست؟ سرور push را رد میکند اگر secret شناختهشده در diff باشد.
Senior — attestation چه تضمینی است؟ امضای GitHub روی metadata ساخت: workflow، SHA، هویت. Tamper بعد از ساخت را نشان میدهد؛ باگ منطقی داخل کد را نه.
✅ چکلیست فهم
- Dependabot برای زبان و Actions روشن است
- Push protection فعال است
- تگ نسخه Immutable است
- اکشن روی SHA یا تگ قفل است نه
@main
فصل بعد: داخلی Git — packfile، gc، reftable.