サイト内の現在位置

OWASP Top 10 CI/CD Security Risksから考えるCI/CDパイプラインのセキュリティ

NECセキュリティブログ

2024年6月21日

NECサイバーセキュリティ戦略統括部セキュリティ技術センターの浦川です。
今回のブログでは、CI/CDパイプラインのセキュリティについて考えるためにOWASP Top 10 CI/CD Security Risksを紹介します。

目次

CI/CDパイプラインとは

最初にCI/CDパイプラインについて簡単な説明をします。
CI/CDパイプラインはDevOpsやDevSecOpsを実現するための1つの要素で、利用することで迅速なアプリケーションのリリースの実現や高い品質保証などの様々な利点があります。
CI/CDパイプラインの流れを図1に示します。

図 1 CI/CDパイプラインの流れ

CI/CDパイプラインは継続的インテグレーション(CI:Continuous Integration)と継続的デリバリー(CD:Continuous Delivery)の2つの部分で構成されています。継続的インテグレーションでは、開発フェーズでコードに変更があるたびもしくは定期的にビルドとテストを行います。継続的デリバリーでは、継続的インテグレーションでビルドされた成果物を保存し、本番環境へデプロイ可能な状態にします。また、継続的デリバリー内で検証環境へのデプロイまでを実施する場合もあります。

CI/CDパイプラインのセキュリティの必要性

ひと昔前までは、パイプラインの大部分を外部からアクセスができないオンプレミスで構築していることにより、パイプラインの外部からの脅威に対するセキュリティについて考える必要は少なかったかもしれません。しかし、昨今は開発やCI/CDの高速化、パイプラインの構築、運用コストの削減を目的にコードリポジトリにGitHubnew window[1]、パイプラインにAWS CodePipelinenew window[2]やAzure Pipelinesnew window[3]などのパブリックサービスを使用することが一般的になってきています。パブリックサービスでは、適切な設定や管理が不足している場合に外部から簡単にアクセスされてしまうため、パイプラインのセキュリティの必要性が高まっています。
加えて、CI/CDパイプラインは本番環境のインフラストラクチャやアプリケーションのデプロイ、シークレットへのアクセスなどの広範囲かつ高い権限を持つことが多いです。そのため、侵害された際の影響が非常に大きくなるといった点もパイプラインのセキュリティが必要であるという理由の1つに挙げられます。非常に大きな影響を与えたCI/CDパイプラインへの攻撃として2020年に発覚したSolarWindsのサプライチェーン攻撃new window[4]があります。この攻撃の結果、18,000以上の顧客へ悪意のあるコードを含んだアップデートが拡散されるという大きな被害をもたらしました。

また、CI/CDパイプラインのセキュリティに関するガイドラインが国内外で発行されています。
2023年6月には米国のCISA(Cybersecurity and Infrastructure Security Agency)とNSA(National Security Agency)から「Defending Continuous Integration/Continuous Delivery (CI/CD) Environments」PDF[5]が発行されました。本ガイドラインでは、CI/CDセキュリティの脅威や認証とアクセス、開発環境、開発プロセスにおける軽減策や保護するためのベストプラクティスについて説明されています。
2024年3月には日本のデジタル庁から「CI/CD パイプラインにおけるセキュリティの留意点に関する技術レポート」PDF[6]が発行されました。本ガイドラインでは、CI/CDパイプラインにおけるフェーズごとの対策について説明されています。
国内外でガイドラインが発行されていることからも、CI/CDパイプラインのセキュリティの必要性が高まっていることが分かります。

OWASP Top 10 CI/CD Security Risks

本章では実際のCI/CDパイプラインの脅威と対策を考えるためにOWASP Top 10 CI/CD Security Risksnew window[7]を紹介します。
本プロジェクトでは、CI/CDパイプラインのリスクのトップ10がまとめられており、それぞれのリスクに対する影響と対策のための推奨事項が説明されています。
OWASP Top 10 CI/CD Security Risksのリスクの一覧と概要について表1に示します。

表1 OWASP Top 10 CI/CD Security Risksのリスク一覧
項番 タイトル 概要
CICD-SEC-1 不十分なフロー制御メカニズム
(Insufficient Flow Control Mechanisms)
CI/CDプロセス内のシステム(SCM、CI、成果物リポジトリなど)へのアクセス権を取得した攻撃者が、追加の承認やレビューなしで悪意のあるコードや成果物をパイプラインに流し込めるリスク。
CICD-SEC-2 不十分なアイデンティティおよびアクセス管理
(Inadequate Identity and Access Management)
エンジニアリングエコシステム全体に散在する膨大な数の IDを適切に管理することの困難さから生じるリスク。
CICD-SEC-3 依存関係チェーンの悪用
(Dependency Chain Abuse)
開発環境やビルド環境がコード依存関係を取得する際の脆弱性を悪用し、攻撃者が悪意のあるパッケージを不注意に取得・実行させるリスク。
CICD-SEC-4 ポイズニングされたパイプライン実行(PPE)
(Poisoned Pipeline Execution (PPE))
コードリポジトリにアクセスできる攻撃者が、ビルド環境へのアクセスなしで、パイプライン設定ファイルに悪意のあるコード・コマンドを挿入することで、悪意のあるコードをパイプライン内で実行できるリスク。
CICD-SEC-5 不十分なPBAC
(パイプラインベースのアクセス制御)
(Insufficient PBAC (Pipeline-Based Access Controls))
パイプライン内で悪意のあるコードが実行された場合、不十分なPBACにより、そのパイプラインに付与された権限を悪用して、CI/CD環境の内外へ水平展開が可能になるリスク。
CICD-SEC-6 不十分な資格情報の衛生管理
(Insufficient Credential Hygiene)
CI/CD環境では多くのシステム間で通信や認証が行われるため、アクセス制御の欠陥、安全でないシークレット管理、過剰な権限付与などにより、攻撃者が様々なシークレットやトークンを入手し悪用するリスク。
CICD-SEC-7 安全でないシステム構成
(Insecure System Configuration)
パイプライン全体に渡る各システム(SCM、CI、成果物リポジトリなど)のセキュリティ設定、構成、ハードニングの欠陥から生じるリスク。
CICD-SEC-8 サードパーティサービスの管理されていない使用
(Ungoverned Usage of 3rd Party Services)
組織の内部リソースに加え、CI/CD環境にアクセスを許可された第三者サービスも攻撃対象となるリスク。
CICD-SEC-9 不適切な成果物の整合性検証
(Improper Artifact Integrity Validation)
CI/CDプロセスのいずれかのシステムにアクセスできる攻撃者が、適切な検証メカニズムの欠如を悪用して、見かけ上は正常だが実際は悪意のあるコード/成果物をパイプラインに流し込むリスク。
CICD-SEC-10 不十分なログ記録と可視性
(Insufficient Logging and Visibility)
CI/CD環境におけるログ記録と可視性が不十分な場合、攻撃者の活動を検知できず、インシデント対応時の調査や攻撃手口の特定も困難になるリスク。

CI/CDのパイプラインの特有の脅威は当然ありますが、対策の考え方や推奨事項については特別なものは多くありません。対策の推奨事項としては、一般的なセキュリティ対策をCI/CDパイプライン全体もしくは各構成要素に適用することになります。
トップ10の内、以下5つのリスクについては影響対象がCI/CDパイプライン全体もしくはその構成要素ですが、対策はアプリケーションやユーザ管理の一般的なセキュリティ対策と類似したものと考えることができます。

  • CICD-SEC-2:不十分なアイデンティティおよびアクセス管理
  • CICD-SEC-5:不十分なPBAC(パイプラインベースのアクセス制御)
  • CICD-SEC-7:安全でないシステム構成
  • CICD-SEC-8:サードパーティ サービスの管理されていない使用
  • CICD-SEC-10:不十分なログ記録と可視性

他のリスクと比べて対策は一般的なセキュリティ対策と類似すると考える5つのリスクとその対策を表2に示します。

表2 リスクと対策の一覧
項番 対策
CICD-SEC-2
  • 最小権限の原則の適用
  • 定期的なアカウント・権限の棚卸
  • ローカルユーザの使用禁止
  • アカウントの自己登録の禁止
  • 共有アカウントの利用禁止
CICD-SEC-5
  • 機密度の異なるセグメントの分離
  • 最小権限の原則の適用
  • 適切なパッチ適用
CICD-SEC-7
  • 最小権限の原則の適用
  • 適切な構成管理とパッチ適用
  • 適切なシステム設定
CICD-SEC-8
  • 最小権限の原則の適用
  • 定期的な権限の棚卸
CICD-SEC-10
  • 適切な構成管理
  • ログの取得と集中管理
  • アラートの設定

本ブログでは、CI/CDパイプラインのリスクのトップ10の中でパイプラインのリスクとして他と比べて特に特徴的であると考える以下5つのリスクについて詳しく見ていこうと思います。

  • CICD-SEC-1:不十分なフロー制御メカニズム
  • CICD-SEC-3:依存関係チェーンの悪用
  • CICD-SEC-4:ポイズニングされたパイプライン実行 (PPE)
  • CICD-SEC-6:不十分な資格情報の衛生管理
  • CICD-SEC-9:不適切な成果物の整合性検証

CICD-SEC-1:不十分なフロー制御メカニズム

本リスクの概要を図2に示します。

図 2 CICD-SEC-1のリスクの概要

本リスクは、コードや成果物を追加する際に承認やレビューを強制するメカニズムがないことにより、何らかの方法でシステムのアクセス許可を得た攻撃者が悪意のあるコードや成果物をリポジトリやパイプライン内に挿入できてしまうといったリスクです。本リスクを悪用されると、悪意のあるコードや成果物が本番環境にデプロイされてしまいます。
本リスクの特徴的な点として、以下のような開発フェーズでの対策が挙げられています。

  • 本番環境やその他の機密システムで使用するコードにはブランチ保護ルールを設定して、ブランチ保護ルールには例外を設けないこと
  • 未レビューのコードをプッシュできる権限を持つユーザがデプロイメントパイプラインをトリガーできないこと

1点目の対策については、適切なワークフローで承認を得たうえでリポジトリにコードをマージするというものになります。例として、GitHubのブランチ保護ルールで設定できる本リスクの対策に有効な項目の一部を以下に示します。具体的な設定方法やその他の設定項目の詳細についてはnew window[8]を参照してください。

  • マージ時のPull Requestの必須化
  • 承認の必須化と必要な承認数の設定
  • コードオーナーの設定
  • 特定ユーザのPull Requestをバイパスしてのマージの禁止

2点目の対策については、レビュー(承認)なしのプッシュでは自動でパイプラインを実行しないように設定すべきというものになります。基本的にはブランチ保護ルールで他者の承認がない場合はプッシュできないようにすべきですが、何らかの理由で例外を設ける場合は本番環境に承認されていない変更が反映されないように適切なトリガーを設定することが重要です。

CICD-SEC-3:依存関係チェーンの悪用

本リスクの概要を図3に示します。

図 3 CICD-SEC-3のリスクの概要

本リスクは、コードの依存関係の欠陥を悪用して悪意のあるパッケージを取得、利用してしまうといったリスクです。本リスクを悪用されると、悪意のあるパッケージを利用した環境のシークレットの盗難や本番環境への悪意のあるパッケージの挿入につながります。
実際にPythonのPyPIやNode.jsのnpmといったリポジトリ内に悪意のあるパッケージを配置するといった本リスクを悪用した攻撃が実施されています。new window[9]new window[10]
本リスクについては、開発フェーズやビルドフェーズでの依存する外部パッケージの取得方法や外部パッケージそのものに対して注意をしなければならないといったこと自体が特徴的であると考えます。
挙げられている対策の一部を以下に示します。

  • インターネットや信頼できないソースから直接パッケージを取得できないようにする
  • 取得したパッケージのチェックサム検証と署名検証を有効にする
  • 取得するパッケージの最新バージョンを常に取得することを避ける
  • 内部プロジェクトの名前をパブリックリポジトリに公開しないようにする

また、本リスクに関連するガイドラインとして、2024年2月にNIST(National Institute of Standards and Technology)からCI/CDパイプラインのソフトウェアサプライチェーン(SSC)セキュリティに関するガイドラインの最終版である「SP 800-204D Strategies for the Integration of Software Supply Chain Security in DevSecOps CI/CD Pipelines」PDF[11]が発行されました。本ガイドライン内でSSCセキュリティの一部として依存する悪意のある外部パッケージの脅威と緩和策について説明されています。

CICD-SEC-4:ポイズニングされたパイプライン実行 (PPE)

本リスクは、パイプラインにはアクセスできないがコードリポジトリにはアクセスできる攻撃者が、任意のコードやコマンドをコードリポジトリに挿入してパイプライン内で悪意のあるコードを実行できるといったリスクです。本リスクの概要は、図2と同様になります。本リスクを悪用されると、パイプライン内のシークレットの盗難やパイプライン内の様々な構成要素への水平展開につながります。
本リスクの特徴的な点は、「CICD-SEC-1:不十分なフロー制御メカニズム」と同様で開発フェーズでの対策が挙げられていることになります。開発フェーズの対策としては同様で、パイプラインをトリガーするブランチに適切なブランチ保護ルールを設定して、承認されていない変更がプッシュされないようにすることが挙げられています。
その他の対策は比較的一般的でパイプラインやユーザへの最小権限の原則の適用や機密度の異なる環境の分離などがあります。

CICD-SEC-6:不十分な資格情報の衛生管理

本リスクの概要を図4に示します。

図 4 CICD-SEC-6のリスクの概要

本リスクは、資格情報のアクセス制御や管理の欠如により、パイプライン内で使用する様々なシークレットやトークンなどを攻撃者が取得できるといったリスクです。CI/CDパイプライン内では様々な処理で複数の資格情報を使用しています。そのため、適切に資格情報を扱わないと意図しない場所に資格情報が含まれてしまうといったことが生じてしまいます。
挙げられている推奨事項の内、特徴的な対策を以下に示します。

  • コードリポジトリ内および過去のコミットを定期的にスキャンしてシークレットが存在しないか確認する
  • 設定やサードパーティーツールでコンソール出力にシークレットが出力されないようにする
  • コンテナイメージのレイヤーやバイナリなどの成果物内にシークレットが含まれないようにする

1点目については、開発フェーズでシークレットがコードリポジトリにプッシュされてしまった場合の対応です。プッシュされないようにGitフックのpre-commitフックでシークレットをコミットできないようにするという事前対策を取れば定期的なスキャンは不要なのではないかと思われるかもしれません。しかし、-nまたは--no-verifyオプションを付けてコミットすればpre-commitフックを無視してコミットすることが簡単にできてしまうことと、悪意を持ってシークレットをコミットされる場合もあるため、定期的なスキャンも合わせて実施することが効果的です。また、スキャンでシークレットが存在していることが分かった場合は、すぐに当該資格情報をローテーションして悪用の履歴がないか確認することが重要です。
2点目については、パイプライン実行時のコンソール出力にシークレットが出力されてしまうことに対する対策です。コンソール出力にシークレットが出力されてしまうと、ビルド結果にアクセス可能なユーザが全員シークレットを閲覧できてしまい、シークレットの悪用や責任追跡性の喪失につながります。適切な設定をしてコンソール出力やログ内にシークレットが含まれないようにすることが重要です。
3点目は、ビルド後の成果物からシークレットが漏洩することに対する対策です。シークレットが含まれた成果物を本番環境にデプロイしてしまうことやシークレットを含んだレイヤーを持つイメージをDocker Hubの公開リポジトリにアップロードしてしまうことなどで生じる漏洩を防ぐために重要な対策です。
その他の対策は比較的一般的でパイプラインへの最小権限の原則の適用や資格情報の共有の禁止、一時的な資格情報の使用、定期的な資格情報のローテーションなどがあります。

CICD-SEC-9:不適切な成果物の整合性検証

本リスクの概要を図5に示します。

図 5 CICD-SEC-9のリスクの概要

本リスクは、コードと成果物の検証の欠如により、CI/CDパイプライン内のいずれかのシステムにアクセスできる攻撃者が悪意のあるコードや成果物をパイプラインに挿入できるといったリスクになります。本リスクを悪用されると、悪意のある成果物をビルドしてしまい、パイプライン内や本番環境上での悪意のあるコード実行につながります。
コードや生成された成果物に対して適切な署名や検証を行うことにより、確実に整合性検証を行い、正しいものであることであることを確認することが対策として重要になります。加えて、パイプライン内で取得されるサードパーティのコードやパッケージなどについても同様に検証を行うことが重要です。

まとめ

今回は、CI/CDパイプラインのセキュリティについて考えるために、OWASP Top 10 CI/CD Security Risksを紹介しました。また、その中でもCI/CDパイプラインのリスクとして特に特徴的であると考える5つのリスクについて詳しく見てきました。また、5つのリスクの対策の内、以下の重要性について詳細に見てきました。

  • コードや成果物がリポジトリにマージされる際には承認を行い、悪意のあるものがマージされないようにすること
  • コードや成果物への署名および依存するパッケージやコード、成果物の検証を適切に行い、意図したものであることを確認すること
  • コードや成果物から資格情報を確実に削除すること

本番環境のアプリケーションのセキュリティは十分に考慮しているが、CI/CDパイプラインについてはあまり考慮できていない場合は、ぜひ一度自身の環境を見直してチェックしていただければと思います。

参考文献

執筆者プロフィール

浦川 侑之介(うらかわ ゆうのすけ)
セキュリティ技術センター セキュア技術開発グループ

NECグループ社内向けのセキュリティ関連サービスの開発に従事。
CISSP、GIAC GCSA、情報処理安全確保支援士(RISS)を保持。

執筆者の他の記事を読む

アクセスランキング