CI/CDセキュリティ
CI/CDパイプラインのセキュリティチェックリスト
CI/CDパイプラインは認証情報を保持し、インターネットから取得したコードを実行し、顧客がインストールするものを生成します。そのため、それ自体が攻撃の標的になります。このチェックリストを使って、ワークフローファイルから出荷するアーティファクトまで、GitHub Actionsのパイプラインを見直してください。
更新日
ワークフロー
- サードパーティのアクションを完全なコミットSHAで固定する。GitHubはこれを「現時点でアクションをイミュータブルなリリースとして使う唯一の方法」としています。タグは別のコードを指すように変更できます。2025年3月、CISAはtj-actions/changed-filesのすべてのバージョンが3日間侵害されていたと報告しました。
GITHUB_TOKENに最小権限を与える。デフォルトではコンテンツを読み取り専用にし、ジョブ単位で追加の権限を付与します。pull_request_targetで信頼できないコードをチェックアウトしない。これらのワークフローはシークレットと昇格した権限で実行されます。- 信頼できない入力をスクリプトに入れない。タイトル、ブランチ名など、ユーザーが制御できる値は、シェルコマンド内で展開せずに環境変数を通して渡します。
- ワークフローファイルの変更をレビューする。
.github/workflowsにはコードオーナーのレビューを必須にします。
シークレット
- 短命な認証情報を優先する。OpenID Connectを使い、シークレットとして保存した長期間有効なキーではなく、クラウドプロバイダーから短命でスコープを限定したトークンをジョブが取得するようにします。
- シークレットのスコープを環境に限定する。本番環境の認証情報は、レビュー担当者を必須とする環境の背後に置きます。
- インシデント後はローテーションする。tj-actionsの侵害後のCISAの勧告は、漏えいしたシークレットを侵害されたものとして扱い、直ちにローテーションすることでした。
ランナー
- エフェメラルなランナーを使う。ジョブごとに新しいマシンを使えば、次のジョブに何も残りません。
- パブリックリポジトリでセルフホストランナーを使わない。誰でもリポジトリに対してプルリクエストを作成できるため、GitHubはパブリックリポジトリではほぼ使うべきでないとしています。
- ジョブを分離する。あるジョブが別のジョブのワークスペースや認証情報を読み取れないようにします。
ネットワーク
- エグレスを制御する。ジョブに必要なパッケージソースとサービスを許可し、それ以外をブロックすることで、侵害された依存関係がシークレットを外部に送信できないようにします。エグレスポリシーで情報流出を防ぐ方法
- 接続を記録する。各ジョブの接続先のトレースを残し、後から調査できるようにします。
依存関係
- ロックファイルをコミットする。ビルドが毎回同じバージョンを解決するようにします。
- 新しい依存関係をレビューする。プルリクエストが追加するものを、マージ前に確認します。
- 検出結果に応じてビルドをブロックする。既知の深刻度Criticalの脆弱性を持つパッケージを取り込んだビルドを、アーティファクトの出荷前にブロックします。
ビルドのエビデンス
- ビルドが取得したもののSBOMを記録する。後からファイルをスキャンしても、わかるのは宣言されたものであり、ビルドが使ったものではありません。
- 来歴に署名する。各アーティファクトをそれを生成したビルドに結び付け、実行されているものがビルドされたものと同じかを後から確認できるようにします。
- 出荷したものを監視する。新しい脆弱性が公開されたら、リリース済みのビルドを再確認します。
どのツールがどの項目をカバーするか
依存関係の項目はスキャナーが、ワークフローの項目はパイプラインのハードニングツールが、ネットワークとエビデンスの項目はランナー上のエージェントまたはセキュアなランナーがカバーします。CRACIはランナーです。フェイルクローズで動作するエグレスポリシーを適用し、各ジョブが取得したもののSBOMを記録し、ポリシーゲートで検出結果に基づいてビルドをブロックでき、APIでSBOM、ネットワークトレース、来歴を返します。コードやワークフローのスキャンは行いません。どのツールが何をカバーするかはCI/CDセキュリティツールの比較をご覧ください。
CI/CDパイプラインのセキュリティ:よくあるご質問
CI/CDパイプラインのセキュリティとは何ですか?
ソフトウェアをビルドして出荷するシステムを守ることです。対象は、ワークフローの定義、それが使うシークレット、それを実行するランナー、ダウンロードする依存関係、生成するアーティファクトです。侵害されたパイプラインは、ソースコードに手を触れることなく、自社の名前で悪意あるコードを出荷し得ます。
GitHub ActionsをコミットSHAで固定するのはなぜですか?
タグは別のコードを指すように変更できるからです。GitHubは、アクションを完全な長さのコミットSHAで固定することが、現時点でアクションをイミュータブルなリリースとして使う唯一の方法だとしています。2025年3月、CISAはtj-actions/changed-filesのすべてのバージョンが3日間侵害されていたと報告しました。
GITHUB_TOKENにはどの権限を与えるべきですか?
各ジョブが必要とする最小限の権限です。デフォルトではリポジトリのコンテンツを読み取り専用にし、必要なジョブにだけ、ジョブ単位で追加の権限を付与してください。
CIでネットワークのエグレスを制御する必要はありますか?
ジョブがシークレットを保持し、サードパーティのコードを実行するなら、必要です。多くのジョブが到達する必要があるのは、既知のパッケージレジストリとサービスだけです。エグレスポリシーはそれ以外をすべてブロックするため、侵害された依存関係がシークレットを攻撃者のサーバーに送信することはできません。