概要

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等)サプライチェーン攻撃
コンテナレジストリ改ざんされたイメージの配布
デプロイ権限過剰な権限による本番環境の侵害
CI/CDパイプラインの構成要素とリスク
ソースリポジトリ
シークレット混入
CIサーバ
コード実行・情報取得
依存パッケージ
サプライチェーン攻撃
コンテナレジストリ
改ざんイメージ配布
デプロイ権限
過剰権限による侵害
CI/CD
パイプライン

シークレット管理

シークレット漏洩の典型

# コードに直書き(最悪のパターン)
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パイプラインの流れ
1
開発者
コードプッシュ
ブランチ保護ルール
2
CI
ビルド・テスト
SAST・シークレットスキャン
3
レジストリ
イメージ登録
コンテナイメージスキャン
4
CD
デプロイ
最小権限・DAST

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はコードを実行するため、悪意あるコードや依存パッケージによる侵害リスクがあります。

関連用語

重要キーワード

用語説明
DevSecOps開発・セキュリティ・運用を統合したアプローチ
シフトレフトセキュリティテストを開発の早い段階に移行する考え方
SASTソースコードの静的解析。実行せずにコードの問題を発見
DAST動作中のアプリへの動的テスト。実際の攻撃を模擬
SCAソフトウェア部品分析。OSS依存ライブラリの脆弱性チェック
シークレットスキャンAPIキー・パスワードのコードへの混入を自動検出