変更要約: GH-200 第5章を新規作成(セキュリティのベストプラクティス=スクリプトインジェクション緩和・GITHUB_TOKEN 最小権限/PAT対比・OIDC クラウド連携・SHA ピン留め/信頼できるアクション/利用ポリシー・アテステーション/provenance(SLSA)・環境承認ゲート、パフォーマンス/コスト最適化=actions/cache・retention(REST API)・matrix サイズ/max-parallel・concurrency+cancel-in-progress・paths/branches フィルター・if 条件・ランナーサイズ)
5.1セキュリティのベストプラクティス
スクリプトインジェクションの緩和、GITHUB_TOKEN のライフサイクルと最小権限・PAT との対比、クラウド連携の OIDC(長期シークレットの排除)、サードパーティアクションの SHA ピン留めと信頼できるアクションの選定・利用ポリシー、アーティファクトのアテステーション/来歴(provenance)、環境の承認ゲートを理解します。
CI/CD はソースコード・シークレット・本番環境に触れるため、攻撃者の標的になりやすい領域です。GH-200 の最終ドメインは、ワークフローを 安全に設計 する実践を問います。中心となる原則は 最小権限・信頼できるコードだけを実行・長期シークレットを持たない の 3 つです。
5.1.1スクリプトインジェクションの緩和
スクリプトインジェクション は、PR タイトルや Issue 本文・ブランチ名などの 信頼できない入力 を run: のシェルコマンドに直接埋め込むと起きます——攻撃者が ${{ github.event.issue.title }} に悪意あるコマンドを仕込むと、ランナー上で実行されてしまいます。緩和策は、信頼できない値を run: に直接展開しない(中間の 環境変数 に入れて "$VAR" のように 引用 して使う)、入力の検証/サニタイズ、最小権限 の付与、そして可能なら インラインスクリプトより検証済みアクション を使うことです。
5.1.2GITHUB_TOKEN の最小権限と PAT との対比
各実行に発行される GITHUB_TOKEN は 一時的(ephemeral) で、ジョブ終了とともに失効する スコープ付き の資格情報です。permissions: キーで contents: read のように 最小権限 に絞り、書き込みが要るジョブだけ昇格させます。一方、個人の PAT(Personal Access Token) は長期間有効で広い権限を持ちがちなため、ワークフローでの常用は避け、必要な場合もシークレットに保存して最小スコープにします。原則として「まず GITHUB_TOKEN、足りない時だけ最小スコープの別資格情報」です。
5.1.3OIDC によるクラウド連携
AWS・Azure・GCP などへデプロイする際、長期のクラウド資格情報をシークレットに保存する のは漏洩リスクが高い方法です。代わりに OIDC(OpenID Connect) を使うと、ワークフローが実行ごとに 短命のトークン(id-token 権限) を取得し、クラウド側がそれを信頼して 一時的な資格情報 を発行します。これにより 長期シークレットを排除 でき、リポジトリ/ブランチ/環境などの条件で きめ細かく信頼 を絞れます。permissions: id-token: write を付与し、クラウド側に信頼ポリシーを設定するのが定石です。
5.1.4信頼できるアクションと来歴(provenance)
サードパーティアクションは サプライチェーンの一部 です。信頼できる(検証済み)アクション を選び、コミット SHA でピン留め し、組織の 利用ポリシー(許可/拒否リスト) で統制します(第4章)。さらに、ビルド成果物には アーティファクトのアテステーション/来歴(provenance) を生成・検証して「どのワークフロー/コミットから作られたか」を証明でき、SLSA などの枠組みでサプライチェーンの完全性を高めます。デプロイ時にアテステーションを検証することで、改ざんされた成果物の混入を防げます。
5.1.5環境の承認ゲート
本番への変更は 環境(environment)の保護ルール で守ります——必須レビュアー による承認、待機タイマー、デプロイ可能な ブランチの制限、環境スコープのシークレットです(第1章で既出)。これにより「本番デプロイは人手の承認後にのみ実行」を強制でき、誤デプロイや不正な変更を防ぎます。承認ゲートは、最小権限・OIDC・SHA ピン留めと組み合わせて 多層防御 を構成します。
頻出:
①スクリプトインジェクション=信頼できない入力を run: に直書きしない→環境変数に入れて引用・検証・最小権限・検証済みアクション。
②GITHUB_TOKENは一時的・スコープ付き→permissions で最小権限、PAT は長期で避ける。
③クラウド連携はOIDC(id-token: write)で長期シークレット排除。
④サードパーティはSHA ピン留め+利用ポリシー、成果物はアテステーション/provenance(SLSA)。
⑤本番は環境の承認ゲート(必須レビュアー)。
混同・注意:
①${{ github.event.* }} の値を run: に直接展開するのは危険——環境変数経由+引用で。
②permissions を省略すると広い既定権限になり得る——明示的に絞る。
③OIDC は「長期シークレットを置かない」ための仕組み——PAT/アクセスキーをシークレットに入れる旧来法と取り違えない。
④pull_request_target はベースのコンテキストで動き権限が強い——フォークの信頼できないコードと組み合わせると危険。
⑤SHA ピン留めをしてもアクション自体が悪質なら無意味——信頼できる発行元を選ぶ。
5.1.6この節のまとめ
- スクリプトインジェクション対策=信頼できない入力を環境変数に入れ引用、検証、最小権限、検証済みアクション
- GITHUB_TOKEN は permissions で最小権限(一時的・スコープ付き)、長期 PAT は避ける
- クラウド連携は OIDC(id-token: write)で長期シークレットを排除、信頼を細かく絞る
- サードパーティは SHA ピン留め+利用ポリシー、成果物はアテステーション/provenance、本番は承認ゲート
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. ワークフローで PR タイトルを run: のシェルコマンドに直接埋め込んでいます。セキュリティ上の主なリスクと対策はどれですか?
Q2. ワークフローから AWS にデプロイするのに、長期のアクセスキーをシークレットに保存したくありません。推奨される方法はどれですか?
Q3. ワークフローの GITHUB_TOKEN の権限設計として最も安全なのはどれですか?
Q4. ビルドした成果物が「正規のワークフローとコミットから作られた」ことをデプロイ時に検証したいです。何を使いますか?
Q5. 本番(production)環境へのデプロイを、特定レビュアーの承認後にのみ実行するよう強制する仕組みはどれですか?
Q6. サードパーティアクションを安全に使うための実践として正しい組み合わせはどれですか?

