CI/CDパイプラインにおけめE0の最重要セキュリチE��リスクとそ�E対策方法、E/p>
OWASP Top 10 CI/CDセキュリチE��リスクは、継続的インチE��レーション�E�EI�E�と継続的チE��バリー�E�ED�E�パイプラインにおける最も重大なセキュリチE��リスクを特定してぁE��す、EI/CDパイプラインは、ソースコード、シークレチE��、本番環墁E��の直接アクセスを持つため、E��価値のターゲチE��です。このガイドでは、フロー制御、ID管琁E��依存関係攻撁E��パイプラインポイズニングなどを取り上げます、E/p>
不十刁E��フロー制御メカニズムにより、攻撁E��E�E適刁E��レビューめE��認ゲートなしに悪意�EあるコードをCI/CDパイプラインにプッシュできます。これには、ブランチ保護ルールのバイパス、忁E��な承認�E欠如、本番環墁E��のチE�Eロイをトリガーできるユーザーの制限不足が含まれます、E/p>
適刁E��フロー制御がなぁE��、侵害されぁEつの開発老E��カウントや悪意�Eあるインサイダーが、コードレビュー、セキュリチE��スキャン、承認�Eロセスをバイパスして、コードを直接本番環墁E��プッシュできます。これにより、バチE��ドア、データ流�Eコード、また�E破壊的なペイロード�EチE�Eロイにつながる可能性があります、E/p>
# No branch protection Eanyone can push directly to main name: Deploy on: push: branches: [main] # Triggers on any push to main jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: | # Deploys immediately Eno approval gate! kubectl apply -f deploy.yaml kubectl rollout status deployment/myapp
name: Deploy on: push: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm test deploy: needs: test runs-on: ubuntu-latest environment: production # Requires manual approval steps: - uses: actions/checkout@v4 - run: | kubectl apply -f deploy.yaml kubectl rollout status deployment/myapp
CI/CDシスチE��には、人間�Eユーザー、サービスアカウント、�EチE��ト�Eクン、�EシンIDなど、褁E��のIDが関与してぁE��す。不十刁E��IAMにより、リポジトリ、パイプライン、デプロイターゲチE��への過度に許可皁E��アクセスが許されます。�E有賁E��惁E��、古ぁE��カウント、MFAの欠如がリスクを増大させます、E/p>
過剰な権限を持つ侵害されたCI/CD IDは、パイプラインの変更、シークレチE��へのアクセス、ビルドアーチE��ファクト�E改ざん、本番環墁E��のチE�Eロイが可能です。�E有サービスアカウント�E、誰がアクションを実行したかの監査を不可能にします、E/p>
# Over-permissive workflow with admin token name: CI on: push permissions: write-all # Full permissions to everything! jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: | # Using org-wide PAT with admin access curl -H "Authorization: token ${{ secrets.ADMIN_PAT }}" \ https://api.github.com/repos/org/other-repo/contents/
name: CI on: push permissions: contents: read # Minimum required permissions packages: write # Only what's needed jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/create-github-app-token@v1 # Scoped app token id: app-token with: app-id: ${{ vars.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} repositories: other-repo # Scoped to specific repo
CI/CDパイプラインは外部パッケージレジストリ�E�Epm、PyPI、Maven、Docker Hub�E�から依存関係を取得します。攻撁E��E�E、依存関係�E混乱、タイポスクワチE��ィング、侵害されたメンチE��ーアカウント、悪意�Eあるパッケージを通じてこれを悪用します。単一の汚染された依存関係がビルド中に任意�Eコードを実行できます、E/p>
悪意�Eある依存関係�Eインスト�Eル時にコードを実行し�E�Eostinstallスクリプト、setup.py�E�、シークレチE��の突E��、ビルドアーチE��ファクトへのバックドア注入、また�E永続化を確立します。SolarWindsやCodecovのようなサプライチェーン攻撁E�E、その壊滁E��な影響を実証してぁE��す、E/p>
pipeline { agent any stages { stage('Build') { steps { // No lockfile verification, no integrity checks sh 'npm install' // Fetches latest Ecould be compromised! sh 'pip install -r requirements.txt' // No hash verification } } } }
pipeline { agent any stages { stage('Build') { steps { // Use lockfile with integrity verification sh 'npm ci' // Uses package-lock.json sh 'npm audit --audit-level=high' // Python: verify hashes from lockfile sh 'pip install --require-hashes -r requirements.lock' } } stage('SCA Scan') { steps { // Software Composition Analysis sh 'trivy fs --scanners vuln,secret .' } } } }
パイプライン実行�Eポイズニング�E�EPE�E��E、攻撁E��E��CI/CDパイプライン定義を変更したり、パイプラインコンチE��スト�Eで実行される悪意�Eあるコードを注入できる場合に発生します。これ�E、ブランチ�Eのパイプライン設定ファイルの操作、フォークからのプルリクエスト、また�E共有パイプラインチE��プレート�E変更を通じて起こり得ます、E/p>
パイプライン設定を変更できる攻撁E��E�E、パイプラインが利用可能なすべてのシークレチE��、賁E��惁E��、権限にアクセスできます。信頼された実行コンチE��スト�Eで、シークレチE��の流�E、ビルド�E力�E改ざん、また�E悪意�Eあるコード�EチE�Eロイが可能になります、E/p>
# Runs pipeline from fork PRs with access to secrets name: CI on: pull_request_target: # Runs in base repo context with secrets! branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.sha }} # Checks out fork code! - run: make build # Fork's Makefile executes with secrets access env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
# Separate workflows: untrusted build + trusted deploy name: CI on: pull_request: # No secret access for PR builds branches: [main] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Checks out merge commit (safe) - run: npm ci && npm test # No secrets needed for build/test - uses: actions/upload-artifact@v4 with: name: build-output path: dist/
パイプラインベ�Eスのアクセス制御�E�EBAC�E��E、パイプラインがアクセスできるリソースを管琁E��ます:クラウドアカウント、Kubernetesクラスタ、データベ�Eス、�E部サービスなど。不十刁E��PBACは、パイプラインが忁E��以上に庁E��アクセス権を持つことを意味し、最小権限�E原則に違反します、E/p>
過度に権限を持つパイプラインは、意図した篁E��を�Eるかに趁E��たリソースにアクセスするために悪用される可能性があります。軽微なサービスの侵害されたビルドパイプラインが、本番チE�Eタベ�Eスへのアクセス、インフラストラクチャの変更、また�E他�E環墁E��のピ�EチE��に使用される恐れがあります、E/p>
# Pipeline with admin-level cloud credentials deploy: stage: deploy script: - aws configure set aws_access_key_id $AWS_ACCESS_KEY - aws configure set aws_secret_access_key $AWS_SECRET_KEY # This key has AdministratorAccess policy! - aws s3 sync dist/ s3://my-bucket/ - aws ecs update-service --cluster prod --service myapp # Same credentials could access ANY AWS resource
name: Deploy on: push: branches: [main] permissions: id-token: write # For OIDC contents: read jobs: deploy: runs-on: ubuntu-latest steps: - uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456:role/deploy-s3-only # Scoped role: only s3:PutObject on specific bucket aws-region: us-east-1 - run: aws s3 sync dist/ s3://my-bucket/
CI/CDパイプラインは多数の賁E��惁E��を扱ぁE��す:APIキー、クラウドトークン、レジストリパスワード、SSHキー、署名証明書など。賁E��惁E��の衛生管琁E��不十刁E��場合、パイプラインファイルへのシークレチE��のハ�Eドコード、ログへのシークレチE��の出力、暗号化されてぁE��ぁE��ークレチE��ストレージの使用、賁E��惁E��のローチE�Eション未実施が含まれます、E/p>
漏洩したCI/CD賁E��惁E��は、最も一般皁E��初期アクセスベクターの一つです。ビルドログに露出した、リポジトリにコミットされた、また�E暗号化なしで保存されたシークレチE��は、攻撁E��E��本番シスチE��、クラウドアカウント、アーチE��ファクトレジストリへの直接アクセスを提供します、E/p>
#!/bin/bash # Secrets hardcoded and leaked in logs export DOCKER_PASSWORD="MyS3cret!" # Hardcoded! echo "Logging in with $DOCKER_PASSWORD" # Printed to logs! docker login -u admin -p "$DOCKER_PASSWORD" registry.example.com docker push registry.example.com/myapp:latest # AWS credentials in environment Evisible in process listing export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCY" aws s3 cp artifact.zip s3://releases/
name: Publish on: push: tags: ['v*'] jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: docker/login-action@v3 # Handles credentials securely with: registry: registry.example.com username: ${{ secrets.DOCKER_USER }} # Masked in logs password: ${{ secrets.DOCKER_TOKEN }} # Short-lived token - run: | docker build -t registry.example.com/myapp:${{ github.ref_name }} . docker push registry.example.com/myapp:${{ github.ref_name }}
CI/CDシスチE���E�Eenkins、GitLab、GitHub Actionsランナ�E�E��E、安�EでなぁE��フォルト設定で実行されてぁE��ことが多くあります。これには、古ぁE��フトウェアバ�Eジョン、E��出した管琁E��ンターフェース、無効化されたセキュリチE��機�E、E��度に許可皁E��ネットワークアクセス、�Eロジェクト間で共有されるセルフ�Eストランナ�Eが含まれます、E/p>
誤設定されたCI/CDインフラストラクチャは、ビルド環墁E��の不正アクセス、シークレチE��の傍受、�E部ネットワークへのピ�EチE��に悪用される可能性があります。�E有�Eセルフ�Eストランナ�Eでは、侵害されぁEつのワークフローが他�Eプロジェクトにも影響を与えるクロスプロジェクト攻撁E��可能になります、E/p>
// Jenkins with insecure configuration // - Script console enabled without auth // - Agent-to-controller access unrestricted // - Outdated plugins with known CVEs pipeline { agent any // Runs on any available agent Eno isolation stages { stage('Build') { steps { // Running as root on shared agent sh 'whoami' // root sh 'docker build -t myapp .' } } } }
pipeline { agent { kubernetes { // Ephemeral, isolated pod per build yaml """ apiVersion: v1 kind: Pod spec: securityContext: runAsNonRoot: true runAsUser: 1000 containers: - name: builder image: builder:1.2.3 securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true """ } } stages { stage('Build') { steps { container('builder') { sh 'make build' } } } } }
CI/CDパイプラインは、コード品質チE�Eル、セキュリチE��スキャナ�E、E��知シスチE��、デプロイメント�EラチE��フォームなどのサードパーチE��サービスと統合されることが多くあります。これらの統合にはアクセスト�Eクンと権限が付与され、信頼チェーンが形成されます。管琁E��れてぁE��ぁE��用とは、サードパーチE��サービスが何にアクセスし何ができるか�E可視性がなぁE��とを意味します、E/p>
侵害されたサードパーチE��サービス�E�Eodecov侵害のような�E��E、ソースコード、シークレチE��、ビルドアーチE��ファクトにアクセスできます。ガバナンスがなぁE��、チームは未知のサービスに過剰な権限を付与し、サプライチェーンに不可視�E攻撁E�Eクターを作り出す可能性があります、E/p>
name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm test # Unknown third-party action with full repo access - uses: random-org/code-analysis@main # Unpinned, unvetted! with: token: ${{ secrets.GITHUB_TOKEN }} # Full token access! # Uploading coverage to external service with repo token - run: | bash <(curl -s https://example.com/uploader.sh) # Remote script!
name: CI on: push permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: npm test # Vetted action pinned to SHA - uses: github/codeql-action/analyze@8a470fddafa5cbc14 # Pinned SHA # Upload via official CLI tool, not remote scripts - uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 with: token: ${{ secrets.CODECOV_TOKEN }} # Scoped token fail_ci_if_error: true
ビルドアーチE��ファクト(コンチE��イメージ、バイナリ、パチE��ージ�E��ECI/CDパイプラインを通じて本番環墁E��配信されます。整合性検証がなぁE��、アーチE��ファクト�Eビルド中、転送中、アーチE��ファクトレジストリ冁E��デプロイ時�EぁE��れ�Eポイントでも改ざんされる可能性があります。これにより、コードから本番までの信頼チェーンが破壊されます、E/p>
改ざんされたアーチE��ファクトには、バチE��ドア、�Eルウェア、また�E変更されたロジチE��が含まれる可能性があります。署名と検証がなぁE��、ビルド後にアーチE��ファクトが変更されたかどぁE��を検�Eする方法がありません。攻撁E��E�Eレジストリ冁E�E正規イメージを置き換えたり、転送中のアーチE��ファクトを傍受できます、E/p>
#!/bin/bash # Build and deploy without any integrity checks docker build -t myregistry.com/app:latest . docker push myregistry.com/app:latest # On deployment side Eno verification docker pull myregistry.com/app:latest # Could be tampered! docker run myregistry.com/app:latest # Tag is mutable!
name: Build and Sign on: push: tags: ['v*'] permissions: id-token: write packages: write jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: | # Build with immutable tag (SHA) docker build -t myregistry.com/app:${{ github.sha }} . docker push myregistry.com/app:${{ github.sha }} - uses: sigstore/cosign-installer@v3 - run: | # Sign image with keyless signing (Sigstore) cosign sign myregistry.com/app:${{ github.sha }} # Generate and attach SBOM syft myregistry.com/app:${{ github.sha }} -o spdx-json > sbom.json cosign attest --predicate sbom.json myregistry.com/app:${{ github.sha }}
CI/CD環墁E�E重要なセキュリチE��イベントを生�Eします:パイプラインの実行、設定変更、シークレチE��アクセス、デプロイメント活動など。包括皁E��ログ記録と監視がなぁE��、パイプライン冁E�E悪意�Eある活動�E検�Eされず、インシチE��ト対応が著しく妨げられます、E/p>
CI/CD活動�E可視性がなぁE��、攻撁E��E�Eアラートをトリガーすることなく、パイプラインの変更、シークレチE��の流�E、アーチE��ファクト�E改ざんが可能です。監査証跡の欠如により、侵害の篁E��と影響を特定することが不可能になります、E/p>
#!/bin/bash # Pipeline with no logging or audit trail echo "Starting deployment..." kubectl apply -f deploy.yaml echo "Done." # No record of: who triggered this, what changed, # which image was deployed, what secrets were accessed # Build logs expire after 30 days with no archival
name: Audited Deploy on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Log deployment metadata run: | echo "=== Deployment Audit Log ===" echo "Triggered by: ${{ github.actor }}" echo "Commit: ${{ github.sha }}" echo "Ref: ${{ github.ref }}" echo "Workflow: ${{ github.workflow }}" echo "Run ID: ${{ github.run_id }}" - name: Deploy with audit run: | kubectl apply -f deploy.yaml 2>&1 | tee deploy.log # Send audit event to SIEM curl -X POST "${{ secrets.SIEM_WEBHOOK }}" \ -d '{"event":"deploy","actor":"${{ github.actor }}","sha":"${{ github.sha }}"}'
| ID | 脁E��性 | 深刻度 | 主な対筁E/th> |
|---|---|---|---|
| CICD-SEC-1 | 不十刁E��フロー制御メカニズム | Critical | ブランチ保護、忁E��承認、環墁E��ーチE/td> |
| CICD-SEC-2 | 不十刁E��IDおよびアクセス管琁E/td> | Critical | 最小権限トークン、OIDC、MFA、賁E��惁E��ローチE�Eション |
| CICD-SEC-3 | 依存関係チェーンの悪用 | Critical | ロチE��ファイル、ハチE��ュ検証、�Eライベ�Eトレジストリ、SCA |
| CICD-SEC-4 | パイプライン実行�Eポイズニング�E�EPE�E�E/td> | Critical | ビルチEチE�Eロイ刁E��、不変パイプライン定義、フォーク制御 |
| CICD-SEC-5 | 不十刁E��PBAC | High | OIDCフェチE��ーション、スコープ付きIAMロール、環墁E�E離 |
| CICD-SEC-6 | 不十刁E��賁E��惁E��の衛生管琁E/td> | Critical | シークレチE��管琁E��ログマスキング、ローチE�Eション、シークレチE��スキャン |
| CICD-SEC-7 | 安�EでなぁE��スチE��設宁E/td> | High | エフェメラルランナ�E、E��root、�Eラグイン更新、ネチE��ワーク刁E�� |
| CICD-SEC-8 | サードパーチE��サービスの管琁E��れてぁE��ぁE��用 | High | サービスインベントリ、SHAピン留め、リモートスクリプト禁止 |
| CICD-SEC-9 | 不適刁E��アーチE��ファクト整合性検証 | High | Cosign署名、アドミチE��ョン制御、SLSAプロベナンス |
| CICD-SEC-10 | 不十刁E��ログ記録と可視性 | Medium | 監査ログ、SIEM統合、アラート、ログ保持 |