CI/CD Security(CI/CD セキュリティ)
SCA・シークレット管理・OIDC 短命トークン・Runner 分離・IaC スキャン・SLSA Provenance を軸に、 CI/CD パイプラインの攻撃面を体系的に防御する実践を俯瞰する地図記事。
article technology ja SCA・シークレット管理・OIDC 短命トークン・Runner 分離・IaC スキャン・SLSA Provenance を軸に、 CI/CD パイプラインの攻撃面を体系的に防御する実践を俯瞰する地図記事。CI/CD セキュリティ
CI/CD(Continuous Integration / Continuous Delivery)パイプラインは、コードリポジトリ・ビルド環境・テスト環境・本番環境を自動的につなぐ「信頼の連鎖」であり、サプライチェーン攻撃の格好の標的となる。パイプラインが侵害されると、ソースコード自体は無害でも本番環境に悪意あるコードが到達する。tj-actions/changed-files( CVE-2025-30066、2025-03、23,000+ リポジトリ影響)は CI/CD 侵害の規模と速度を具体的に示した事例。情報カットオフ ~2025-08 のため、各ツールの最新情報は 2026-05 時点で要確認。
CI/CD パイプラインの攻撃面
CI/CD パイプラインが晒されている主要な攻撃ベクター:
| 攻撃ベクター | 具体例 |
|---|---|
| サードパーティアクション・プラグインの侵害 | tj-actions ハイジャック、CircleCI Orb の悪性バージョン |
| シークレットのログ漏えい | 環境変数をデバッグ出力・エラーメッセージに含める |
| Runner への不正アクセス | 共有 Runner 上でのコンテナブレイクアウト |
| 過剰権限トークン | write-all 権限の GITHUB_TOKEN で全リポジトリを書き換え |
| IaC 設定ミス | Terraform / Kubernetes の誤った権限・露出 |
| アーティファクト改ざん | ビルドアーティファクトのキャッシュ汚染・レジストリへの不正プッシュ |
依存関係スキャン(SCA)
**Software Composition Analysis(SCA)**は、CI/CD パイプライン内で依存ライブラリの既知脆弱性を自動的に検出する仕組みで、セキュアパイプラインの最初の防衛ラインとなる。
主要な統合方法:
- Dependabot(GitHub ネイティブ): 依存関係の自動更新 PR を生成。Security Alerts で GHSA / CVE を通知。
- Snyk: CI/CD に統合してビルド時に脆弱性スキャン。修正 PR の自動生成。
- OWASP Dependency-Check: OSS の SCA ツール。Maven / npm / Python など多言語対応。NVD との突合で CVE を検出。
- Trivy: コンテナイメージ・ファイルシステム・Kubernetes マニフェストをスキャン。SBOM 出力( SPDX / CycloneDX 形式)も可能。
重要なのは 「スキャンだけでなくポリシーの強制」。CVSS 8.0 以上の未修正 CVE があればビルドを失敗させる閾値ポリシーを CI に組み込む。
シークレット管理
CI/CD でのシークレット漏えいは、ログ出力・環境変数のスコープミス・不要なデバッグステップが主因。
ベストプラクティス:
- シークレットスキャン:
gitleaks・truffleHog・GitHub Secret Scanning でコードとログにシークレットが混入していないかを自動検出する。 - プラットフォームネイティブのシークレットストア: GitHub Actions Secrets / GitLab CI Variables / AWS Secrets Manager をビルド環境に注入する。環境変数としての注入は許容されるが、ログへの出力を防ぐために
::add-mask::などのメカニズムを使用する。 - 外部シークレットマネージャー: HashiCorp Vault・AWS Secrets Manager・GCP Secret Manager をパイプラインから動的に取得する。短命トークン( OIDC)との組み合わせで効果が高い。
- ハードコード禁止の強制: pre-commit フックと CI での検出を二重に実装する。
重大なアンチパターン: シークレットをワークフローの run: ステップで echo $SECRET などで出力するデバッグコードを本番パイプラインに残すこと。公開リポジトリのログは誰でも閲覧でき、tj-actions 型攻撃ではこれが悪用される。
OIDC 短命トークン(最小権限トークン)
従来の「長期 Personal Access Token(PAT)」を CI/CD に埋め込む手法は、PAT 漏えい時の被害範囲が広く、更新忘れによる期限切れも問題となる。OIDC(OpenID Connect)を使った短命トークンがこれを解決する。
GitHub Actions と AWS / GCP / Azure の OIDC 統合では:
- ワークフロー実行時に GitHub が OIDC トークン( JWT)を発行
- クラウドプロバイダが JWT を検証し、IAM ロールを一時的に引き受け
- 10〜60 分で自動失効する一時的な認証情報を取得
これにより、長期シークレットをリポジトリに保存する必要がなくなる。permissions: id-token: write を最小スコープで付与することが重要で、permissions: write-all の使用は原則禁止。
Runner / Agent 分離
Runner の分離は CI/CD セキュリティの物理的な防衛ラインであり、異なるプロジェクト・機密レベル間でのランタイム汚染を防ぐ。
| 手法 | 内容 |
|---|---|
| エフェメラル Runner | ジョブ実行後に Runner 環境を破棄する。GitHub Actions のホステッド Runner は各ジョブで新しい VM を使用。セルフホスト Runner は使用後に再プロビジョニングする。 |
| Harden-Runner | StepSecurity が提供する GitHub Actions 向けオープンソースツール。ワークフロー実行中のネットワーク egress を監視・制限し、不審な外部通信を検出・ブロックする。tj-actions 侵害のような実行時ペイロードの検出に有効。 |
| Egress 制御 | Runner から許可されたエンドポイント(パッケージレジストリ・クラウド API)以外への通信をファイアウォールでブロックする。攻撃者のコマンド&コントロール(C2)サーバーへの通信を防ぐ。 |
| 最小権限のサービスアカウント | Runner が使用する IAM ロール・サービスアカウントを「このジョブに必要な権限のみ」に絞る。 |
成果物の完全性(署名と SLSA Provenance)
ビルドした成果物の完全性を保証するため、署名と Provenance の生成をパイプラインに組み込む(tech-138 参照)。
- Cosign / Sigstore 署名: コンテナイメージ・バイナリを keyless 署名し、OCI レジストリに保存。
- SLSA Provenance の生成:
actions/attest-build-provenanceで SLSA L2 相当の Provenance を自動生成。gh attestation verifyでダウンストリームが検証可能。 - アーティファクトのダイジェスト固定: Dockerfile の
FROMイメージや依存アーティファクトを SHA ダイジストで固定し、予期しない更新を防ぐ。
IaC セキュリティスキャン
Infrastructure as Code(IaC)( Terraform / AWS CloudFormation / Kubernetes マニフェスト / Helm Chart)の設定ミスは、本番インフラの重大な脆弱性に直結する。CI/CD に IaC スキャナーを統合する。
| ツール | 対象 |
|---|---|
| Checkov | Terraform / CloudFormation / Kubernetes / Dockerfile / ARM |
| tfsec | Terraform( Aqua Security 製) |
| kube-bench | Kubernetes の CIS Benchmark 適合検証 |
| Trivy | Kubernetes マニフェスト・ Helm Chart の設定スキャン |
| KICS | 多形式対応の IaC セキュリティスキャナー |
IaC スキャンは「コードとしてのインフラ」の PR 時点で実行し、本番デプロイ前に問題を検出する。
サードパーティアクションの安全な使用(tj-actions の教訓)
tj-actions/changed-files( CVE-2025-30066、2025-03)は、可変タグ(@v46)を使用していた 23,000+ リポジトリが瞬時に影響を受けた事例。
必須プラクティス:
- コミット SHA でピン留め:
tj-actions/changed-files@abc1234def5678...( 40 文字 SHA)形式で参照する。可変タグ(@v46・@main)は使用しない。 - 自動更新ツール:
ratchet(Go 製 CLI)や Renovate の Digest Pinning 機能で SHA を自動更新する。手動管理は現実的でない。 - 使用アクションの審査: 使用前にリポジトリのスター数・メンテナンス状況・最新コミット・オーナーの信頼性を確認する。OSSF Scorecard がセキュリティスコアを提供。
- 権限の最小化: アクションに必要な最小限の
permissionsスコープのみを付与する。
アンチパターン
| アンチパターン | 問題 |
|---|---|
サードパーティアクションを可変タグ(@v3・@main)で参照する | タグ書き換えで即座に侵害される。SHA ピン留めが必須 |
| 長期 PAT を CI シークレットとして保存する | 漏えい時の影響が大きく、失効管理が困難。OIDC 短命トークンに移行する |
permissions: write-all を全ジョブに付与する | 最小権限原則違反。各ジョブで必要な権限のみ明示する |
| 共有 Runner を異なる機密レベルのジョブで使い回す | ランタイム汚染・シークレット漏えいのリスク。エフェメラル分離が必要 |
シークレットを echo やエラーメッセージに出力するデバッグコードを残す | 公開ログに露出する。::add-mask:: の使用と pre-merge レビューで防ぐ |
Backlinks
6 backlinks
- related OWASP and Application Security(OWASP とアプリケーションセキュリティ)
- related Software Supply Chain Provenance(ソフトウェアサプライチェーン来歴)
- related Secure Development Lifecycle(セキュア開発ライフサイクル)
- related SBOM and VEX(SBOM と VEX)
- related Software Supply Chain Attacks(ソフトウェアサプライチェーン攻撃)
- related Container and Kubernetes Security(コンテナ・Kubernetes セキュリティ)