CI/CD セキュリティ: ビルドとデプロイのプロセスを保護する
パイプライン CI/CD ソフトウェア配信プロセスの中心です。攻撃者なら パイプラインを侵害し、後続のビルドとデプロイメントに悪意のあるコードを挿入する可能性があります。の パイプラインのセキュリティは、パイプラインが何をテストするかだけではなく、パイプライン自体がどのようにテストされるかにも関係します。 改ざんから保護されています。
この記事では、CI/CD パイプラインを保護するためのプラクティスをブランチから探っていきます。 署名付きコミットに対する保護、OIDC から最小権限、監査ログに至るまで 運用展開の承認ワークフローに適用されます。
何を学ぶか
- CI/CD パイプライン脅威モデル
- ブランチ保護とコードレビューの実施
- 静的シークレットを使用しない認証のための OIDC
- ランナーとワークフローに対する最小限の権限
- 署名付きコミットとコードの検証可能性
- 導入承認ワークフロー
CI/CD パイプラインの脅威モデル
パイプラインを保護するには、攻撃対象領域がどこにあるのかを理解する必要があります。
- ソースコード: 悪意のある投稿者が PR にコードを挿入します
- 依存症: ビルド中に侵害された依存関係がインストールされます
- パイプライン構成: 秘密を漏洩するためのファイル ワークフローの変更
- ランナー: インフラストラクチャ永続性ビルド エージェントの侵害
- アーティファクト: アーティファクト ビルドを悪意のあるビルドに置き換える
- 認証情報の展開: インフラストラクチャに直接アクセスするための展開認証情報の盗難
ブランチ保護ルール
Le ブランチ保護ルール 彼らは防衛の最前線です。彼らはそれを保証します レビューと自動チェックがなければコードはメインブランチに到達しません。
推奨される構成
| ルール | 設定 | モチベーション |
|---|---|---|
| PRレビューを要求する | 最低 2 つの承認 | 四つ目の原理 |
| 古いレビューを無視する | 有効 | プッシュ後の承認を無効にする |
| ステータスチェックが必要 | SAST、SCA、テスト、lint | 自動化ゲートの義務化 |
| 署名付きコミットを要求する | 有効 | 貢献者の検証可能性 |
| プッシュアクセスを制限する | CI/CD ボットのみ | メインへの直接プッシュはありません |
| 線形履歴が必要 | 有効 | クリーンで検証可能な履歴 |
OIDC: 静的シークレットを使用しない認証
OpenID Connect (OIDC) CI/CD ワークフローがクラウドで認証できるようにします 静的シークレット (API キー、サービス アカウント キー) を使用せずにプロバイダーを作成します。ワークフローは次のようになります リポジトリとブランチの ID に基づく一時トークン。
# .github/workflows/deploy-oidc.yml
name: Deploy with OIDC
on:
push:
branches: [main]
permissions:
id-token: write # Necessario per OIDC
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS Credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/github-deploy
aws-region: eu-west-1
# Nessun secret! Il token OIDC viene usato automaticamente
- name: Deploy to AWS
run: |
aws s3 sync dist/ s3://my-bucket/
aws cloudfront create-invalidation --distribution-id E123 --paths "/*"
ワークフローの最小権限
各 GitHub Actions ワークフローにはデフォルトの権限があり、範囲が広すぎる可能性があります。 の原理 最低限の特権 権限を最小限に制限する必要がある それぞれの仕事に必要なもの:
# Permessi globali restrittivi
permissions:
contents: read # Solo lettura del repository
jobs:
test:
runs-on: ubuntu-latest
# Nessun permesso aggiuntivo per i test
steps:
- uses: actions/checkout@v4
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
permissions:
id-token: write # Solo per OIDC
contents: read
packages: write # Solo per push immagini
environment: production # Richiede approvazione manuale
steps:
- uses: actions/checkout@v4
- name: Deploy
run: ./deploy.sh
署名済みのコミット
I 署名付きコミット 署名を通じて投稿者の身元を保証します GPG または SSH 暗号化。署名がなければ、誰でも名前とメールアドレスを使用してコミットを作成できます 恣意的で、他の開発者になりすます。
# Configurare GPG per signed commits
gpg --full-generate-key
gpg --list-secret-keys --keyid-format=long
# Configurare Git per firmare automaticamente
git config --global user.signingkey YOUR_KEY_ID
git config --global commit.gpgsign true
git config --global tag.gpgsign true
# Alternativa: firmare con SSH key
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
導入承認ワークフロー
運用環境の展開には人間による明示的な承認が必要です 認可された。 GitHub 環境では、必須の手動承認を構成できます。
# Deploy con approvazione manuale
jobs:
deploy-staging:
runs-on: ubuntu-latest
environment: staging
steps:
- name: Deploy to staging
run: ./deploy.sh staging
deploy-production:
needs: deploy-staging
runs-on: ubuntu-latest
environment:
name: production
url: https://myapp.com
# Richiede approvazione da un reviewer designato
steps:
- name: Deploy to production
run: ./deploy.sh production
- name: Notify team
run: |
curl -X POST "${{ secrets.SLACK_WEBHOOK }}" \
-H "Content-Type: application/json" \
-d '{"text": "Production deploy completed successfully"}'
パイプラインのセキュリティ強化チェックリスト
パイプラインセキュリティチェックリスト
- 必須のレビューとステータスチェックによるブランチ保護
- クラウド認証用の静的シークレットの代わりに OIDC
- 最小限のワークフロー権限 (最小権限)
- メインブランチでは署名付きコミットが必要
- タグの代わりに SHA を使用してアクションを固定する
- 手動承認のある実稼働環境
- すべての CI/CD 操作のアクティブな監査ログ
- 隔離されたネットワーク内の自己ホスト型ランナー (該当する場合)
- パイプライン構成でのシークレット スキャン
- ビルドごとに SBOM が生成され署名される
GitHub アクションの固定
# INSICURO: usa un tag mutabile
- uses: actions/checkout@v4
# SICURO: usa il commit SHA (immutabile)
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
CI/CD セキュリティのベスト プラクティス
- どこでも OIDC: クラウドプロバイダーへの認証のためのすべての静的シークレットを削除します
- 最小限の権限: 各ジョブには必要な権限のみがあり、それ以上の権限はありません
- SHA によるアクションをピン留めする: サードパーティのアクションには可変タグを使用しないでください
- 別々の環境: さまざまな構成と承認によるステージングと本番
- すべてを監査する: すべてのビルド、デプロイメント、承認、パイプライン変更のログ
- 一時的なランナー: 永続化を避けるために、ジョブごとにランナーを再作成する必要があります
結論
CI/CD パイプラインのセキュリティは見落とされがちですが、重要な攻撃ベクトルです。 パイプラインが侵害されると、後続のすべてのビルドに悪意のあるコードが挿入される可能性があります。枝あり 保護、OIDC、最小権限と展開の承認、パイプラインの構築 回復力があり、検証可能です。
次の記事では、詳しく見ていきます IaCスキャン、検証方法を分析する Terraform、CloudFormation、および ARM の構成により、セキュリティの構成ミスを防止します。







