概要
CI/CD(Continuous Integration / Continuous Delivery・Deployment)パイプラインはコードのビルド・テスト・デプロイを自動化します。開発速度を向上させる一方、パイプライン自体がサプライチェーン攻撃の標的になるリスクがあります。DevSecOps(Development × Security × Operations)はセキュリティをCI/CDに組み込む実践です。
CI/CDパイプラインの構成要素とリスク
典型的なパイプライン
コードプッシュ → SCM(GitHub等)→ CI(ビルド・テスト)→ イメージレジストリ → CD(デプロイ)
↑ ↑ ↑ ↑
ブランチ保護 シークレット管理 イメージスキャン デプロイ権限
各コンポーネントのリスク
| コンポーネント | リスク |
|---|---|
| ソースコードリポジトリ | シークレットのコミット・悪意あるPR |
| CIサーバ(Jenkins・GitHub Actions等) | ビルド環境へのコード実行・シークレット取得 |
| 依存パッケージ(npm・pip等) | サプライチェーン攻撃 |
| コンテナレジストリ | 改ざんされたイメージの配布 |
| デプロイ権限 | 過剰な権限による本番環境の侵害 |
シークレット管理
シークレット漏洩の典型
# コードに直書き(最悪のパターン)
export DB_PASSWORD="mySecret123"
aws_access_key = "AKIAIOSFODNN7EXAMPLE"
Gitリポジトリにシークレットを含むコードをコミットすると、履歴に残り削除が困難です。
対策のベストプラクティス
| 対策 | 説明 |
|---|---|
| シークレットスキャン | コミット前に自動スキャン(pre-commit hook・git-secrets・truffleHog) |
| 環境変数の外部注入 | CI/CDの設定画面でシークレットを設定し、コードには含めない |
| シークレットマネージャ | AWS Secrets Manager・HashiCorp Vault から実行時に取得 |
| 有効期限付き認証情報 | 長期アクセスキーでなく一時的な認証情報を使用 |
| ログのマスキング | CI/CDのログにシークレットが出力されないようにマスク |
DevSecOps:セキュリティのシフトレフト
DevSecOpsとは
従来のSecurity(リリース直前に実施)を、開発サイクルの各フェーズに統合するアプローチです。
従来の開発フロー:
計画 → 開発 → テスト → リリース → [セキュリティテスト]
↑ 問題発見が遅く修正コストが高い
DevSecOps:
計画 → 開発 → テスト → リリース → 運用
↑ ↑ ↑ ↑ ↑
脅威モデル SAST DAST 脆弱性 RASP
SCA ペネスト スキャン 監視
CI/CDに統合するセキュリティツール
| フェーズ | ツール | 内容 |
|---|---|---|
| コードコミット | SAST(SonarQube・CodeQL) | ソースコードの静的解析 |
| ビルド | SCA(Snyk・OWASP Dependency-Check) | 依存ライブラリの脆弱性チェック |
| イメージビルド | コンテナスキャン(Trivy・Grype) | コンテナイメージの脆弱性 |
| ステージング | DAST(OWASP ZAP・Burp Suite) | 動的Webアプリスキャン |
| デプロイ | IaC スキャン(Checkov・tfsec) | Terraform等の設定ミス検出 |
パイプラインの権限管理
最小権限の原則
悪い例:
CIサーバに AdministratorAccess を付与
→ CIサーバが侵害されると本番環境が制御される
良い例:
デプロイに必要な最小限の権限のみ付与
例:特定のS3バケットへのアップロード権限のみ
GitHubActionsのセキュリティ
| 設定 | 内容 |
|---|---|
| ブランチ保護ルール | mainブランチへの直接プッシュを禁止・PRレビュー必須 |
| アクションのピン止め | サードパーティActionをコミットSHAで固定(タグは変更される可能性) |
| シークレットのスコープ制限 | リポジトリ・環境ごとにシークレットのアクセスを制限 |
| OIDC連携 | 長期アクセスキーでなくOIDCトークンでクラウドに認証 |
SC試験での頻出ポイント
- シフトレフトとは:セキュリティを開発の早い段階(左側)に組み込む考え方
- SASTとDASTの違い:SASTはソースコードの静的解析(実行不要)、DASTは動作中のアプリへの動的テスト
- シークレットがGitリポジトリに混入した場合の問題:Gitの履歴から完全削除は困難。即座に認証情報を失効・ローテーションする必要がある
- SCAとは:Software Composition Analysis。使用しているOSSライブラリの脆弱性を検出
- CIサーバの権限を最小化する理由:CIサーバはインターネットに接触する機会が多く侵害リスクが高い
よくある誤問・ひっかけパターン
誤り① 「Gitリポジトリがプライベートならシークレットを含んでもよい」→ 誤。リポジトリへのアクセス権者はシークレットを見られます。また将来の設定変更でパブリックになるリスクもあります。
誤り② 「DASTはコードをコンパイルせずに実行できる」→ 誤。DASTは動作中のアプリケーションに対して実行します(コンパイル・デプロイが必要)。コンパイル不要なのはSASTです。
誤り③ 「CIサーバは信頼された内部環境なので強力な権限を与えてよい」→ 誤。CIはコードを実行するため、悪意あるコードや依存パッケージによる侵害リスクがあります。
関連用語
- セキュリティバイデザインとSDLC — DevSecOpsの基盤となる考え方
- コンテナとKubernetesセキュリティ — CI/CDでのコンテナイメージスキャン
- サプライチェーン攻撃 — CI/CDを標的にした攻撃の詳細
重要キーワード
| 用語 | 説明 |
|---|---|
| DevSecOps | 開発・セキュリティ・運用を統合したアプローチ |
| シフトレフト | セキュリティテストを開発の早い段階に移行する考え方 |
| SAST | ソースコードの静的解析。実行せずにコードの問題を発見 |
| DAST | 動作中のアプリへの動的テスト。実際の攻撃を模擬 |
| SCA | ソフトウェア部品分析。OSS依存ライブラリの脆弱性チェック |
| シークレットスキャン | APIキー・パスワードのコードへの混入を自動検出 |