「GitHub ActionsにClaude Codeを組み込むとき、セキュリティはどこまで考えればいいのか」。この問いは、Claude Codeを業務のCIに入れようとした時点で避けて通れません。結論から言うと、守る線は5つに分けて考えると整理できます。誰が起動できるか、どのトークンと権限で動くか、Claudeにどのツールを許すか、信頼できない入力をどう扱うか、使用量をどう抑えるか、の5つです。
この記事では、Anthropicの公式ドキュメントとGitHubの公式ドキュメントで確認できた設定だけを使い、認証方式の選択からトリガーのリスク、権限の最小化、シークレットの扱い、コスト制御、運用の見張り方までを順に説明します。設定名・入力名・権限名は、すべて2026年10月9日に公式ページで確認した内容です。
- Claude CodeのGitHub Actions連携で、最初に何を設定すべきか分からない
- フォークからのプルリクエストでAPIキーが盗まれないか不安だ
pull_request_targetが危険と聞いたが、具体的に何が危険なのか理解できていない- APIキーとOAuthトークンのどちらを使うべきか、費用はどちらにかかるのか知りたい

AIは「使い方を設計できた人」が伸びます。
GitHub Actionsへ導入する前に、起動できる人と権限を確認し、検証用リポジトリで動作を確かめてください。
この記事の要点
- ✓ 認証は、APIキー・OAuthトークン・ワークロードIDフェデレーションなどから、リポジトリの規模と費用の持ち方で選ぶ
- ✓ ワークフローの
permissionsは用途ごとに最小にし、書き込み権限は必要なジョブだけに付ける - ✓
pull_requestで起動したフォークPRには、GitHubが(GITHUB_TOKEN を除く)Secretsを渡さない。一方pull_request_targetはベース側のSecretsで動くため、信頼できないコードをチェックアウトしない - ✓ Claudeに許すツールは
--allowedToolsで絞り、Bashは必要な範囲だけ許可する - ✓ プロンプトインジェクションは「防ぎ切る」のではなく、成功しても被害が出ない構成にする
- ✓ 費用は
--max-turns・タイムアウト・同時実行制御で上限をつくり、モデルは用途で使い分ける
この記事でわかること
【完全無料】AI×SNSで成果を出す100大特典を受け取る
AIの使い方を、SNS運用の実務につなげたい方へ。LINEで特典の案内を受け取れます。
- Claude Code GitHub Actionsの動作モデルと、起動できる人の制御
- 認証方式の選択:APIキー vs OAuthトークン
- GitHubアプリの権限と、許可・不許可の設定
- ワークフロートリガーのリスク分類
- GITHUB_TOKENの権限設計と最小権限の原則
- Claudeに許可するツールの絞り方
- 外部の人のPRを、Secretsを守りながら扱う方法
- シークレット管理のベストプラクティスと漏洩時の対応
- プロンプトインジェクションへの対策
- コスト制御とモデル選択(料金表と計算例つき)
- ブランチ保護と運用ログによる最後の防衛線
- 段階的な導入手順(仮の例つき)
この記事の前提と、確認した公式資料
Claude Code GitHub Actionsとは、リポジトリのワークフローの中でClaude Codeを動かし、@claude のメンションやGitHubのイベントをきっかけに、コードの分析・変更・pushを行うGitHub Action(anthropics/claude-code-action)です。
仕組みの出典は、AnthropicのClaude Code GitHub Actions公式ドキュメントです。同じClaude Codeという名前の製品には、ワークフローを書かずに使うCode Reviewや、クラウド上で動くセッションもありますが、この記事で扱うのは、リポジトリにワークフローファイルを置いて設定する claude-code-action だけです。
本文の根拠にした資料は次のとおりです。どれも2026年10月9日に本文を取得して確認しました。
- Anthropic公式のClaude Code GitHub Actions(セットアップ、モード、権限、費用、入力パラメータ)
- 公式リポジトリのセキュリティ文書・利用ガイド・セットアップガイド・FAQ
- GitHub公式のSecure use reference(GitHub Actionsのセキュリティ強化ガイド)
- GitHub公式のワークフローを起動するイベントとGITHUB_TOKENでの認証
- 料金とモデルはClaude公式の料金ページとモデル一覧
Claude Codeそのものの基本操作は、Claude Codeの使い方で先に確認しておくと、この記事の用語が追いやすくなります。権限や料金のような変更されやすい項目は、設定の前にもう一度リンク先で確かめてください。
動作モデルを理解する:インタラクティブモードと自動化モード
インタラクティブモードは、ワークフローに prompt を渡さず、コメントなどに含まれる @claude を待って応答する動き方です。自動化モードは prompt を渡し、メンションを待たずに任意のGitHubイベントで実行する動き方です。
どちらのモードで動くかは、ワークフローの設定から自動で決まります。公式ドキュメントによると、インタラクティブモードの進捗と結果は、起点になったIssueやPRのコメントに出ます。自動化モードの既定の出力先はワークフローの実行ログで、PRやIssueにコメントさせるには、プロンプトでそう指示し、コメントを投稿できるツールを許可する必要があります。
セキュリティの観点では、この違いが攻撃面の違いになります。インタラクティブモードは、コメントや新規Issueのような「人が書いた文章」が入口です。自動化モードは、スケジュールやPRの更新のように、設定したイベントが起きるたびに実行されます。入口が増えるほど、攻撃者が文章を差し込める場所も増えます。
起動の前に、アクションが確認する2つのこと
公式ドキュメントの「Who can trigger runs」には、Claudeが動く前の確認が2つ書かれています。1つ目は書き込み権限で、IssueやPRに関するイベントでは、起動したユーザーがリポジトリへの書き込み権限を持っている必要があります。権限のないユーザーを例外的に許す場合は、allowed_non_write_users を設定し、自分で用意した github_token を渡します。
2つ目は人間のアクターかどうかで、ボットは allowed_bots に載せない限り拒否されます。これはボット同士のループを防ぐ仕組みです。スケジュール実行はGitHubがcronを最後に変更したユーザーに紐づけるため、そのユーザーがボットなら allowed_bots への登録が必要になります。
この2つの確認があるため、「誰でもコメントすればClaudeを動かせる」状態にはなりません。ただし、確認を外す設定(allowed_non_write_users や allowed_bots: '*')を入れると、前提が崩れます。後の章で具体的に扱います。
非対話実行の考え方
CIには、承認ダイアログに答える人がいません。そのため、自動化モードでは「許可するツールを事前に宣言する」設計になります。ローカルでの非対話実行の考え方は、Claude Codeのヘッドレスモードの使い方と近く、-p のような非対話の実行でも、許可の宣言が前提です。GitHub Actionsでは、これを claude_args の --allowedTools か、settings 入力の許可ルールで行います(詳しくは「Claudeに許可するツールを絞る」の章)。
認証方式の選択:APIキー vs OAuthトークン
認証方式の選択とは、ワークフローがClaudeを呼び出すために、どの資格情報(APIキー、サブスクリプションのOAuthトークン、またはOIDCによる短命トークン)を、どこに保存して渡すかを決めることです。
まず混同しやすい点を整理します。Claude Code GitHub Actionsには「Anthropicに対する認証」と「GitHubに対する認証」の2つがあります。Anthropic側は、この章で選ぶAPIキーやOAuthトークンなどです。GitHub側は、既定ではClaude GitHub Appとして動きます。公式ドキュメントによると、github_token を渡さなければ、アクションはClaude GitHub Appとして認証されます。そしてセキュリティ文書は、そのアプリが受け取るのは対象のリポジトリだけに限定された短命のトークンだと説明しています(公式セキュリティ文書)。つまり、GitHubアプリは「GitHubへの入口」であり、Anthropic APIの認証方式とは別の話です。
| 方式 | 保存するもの・入力名 | 費用の出どころ | 確認できた注意点 |
|---|---|---|---|
| APIキー | Claude Consoleのキーを ANTHROPIC_API_KEY に保存し、anthropic_api_key に渡す |
APIのトークン課金 | 長期間有効な静的キー。組織で共有するシークレットにはこの方式を勧めると公式が説明 |
| OAuthトークン | claude setup-token で生成し、CLAUDE_CODE_OAUTH_TOKEN に保存。claude_code_oauth_token に渡す |
Claudeのサブスクリプション(API課金ではない) | Pro・Max・Team・Enterpriseで利用可。トークンはコマンドを実行した人のサブスクリプションに紐づく |
| ワークロードIDフェデレーション | GitHubのOIDCトークンをClaude Consoleのサービスアカウントと交換。anthropic_federation_rule_id などを指定 |
APIのトークン課金 | 静的なキーを保存しない。id-token: write が必要で、静的な資格情報を同時に指定するとそちらが優先される |
| クラウドプロバイダ経由 | use_bedrock・use_vertex・use_foundry を "true" にし、OIDCで認証 |
各クラウドの請求 | 静的なクラウド認証情報をリポジトリに保存しない構成にできる |
表の根拠は、GitHub Actions公式ドキュメントの「Set up for an organization」「Manual setup」、および公式セットアップガイドのWorkload Identity Federationの節です。クラウドプロバイダの詳細は専用の公式ページにあります。
どれを選ぶかの判断基準
判断は「トークンの寿命」「費用の持ち主」「組織で共有するか」の3点で決まります。
- 個人の検証・小さなリポジトリ:
/install-github-appのクイックセットアップで、APIキーかサブスクリプションのトークンを選べます。サブスクリプションを使うと、API課金ではなく契約中のサブスクリプションが使われます。プランごとの違いはClaudeの料金プラン比較で整理しています。 - 複数リポジトリで共有する:公式は、組織レベルのシークレットにはConsoleのAPIキーを使うよう案内しています。OAuthトークンは特定の人のサブスクリプションに紐づくためです。
- 静的な長期キーを持ちたくない:ワークロードIDフェデレーションが候補です。フェデレーションルールで「どのリポジトリのワークフローか」を条件にでき、キーの作成・保管・ローテーションが不要になると公式は説明しています。
どの方式でも、資格情報はGitHubのシークレットに入れ、ワークフローには ${{ secrets.ANTHROPIC_API_KEY }} のように参照だけを書きます。直接書き込むと、リポジトリの履歴に残ります(公式セキュリティ文書の「Authentication Protection」)。
GitHubアプリの権限と、起動できる人の制御
Claude GitHub Appとは、Claude Code GitHub Action・Code Review・クラウドセッションのPR自動修正など、ClaudeのGitHub連携機能が共有している1つのGitHubアプリで、インストール時に権限のセット全体を承認する仕組みです。
公式ドキュメントによると、GitHubアプリの権限は1セットで、一部だけを承認することはできません。公式の一覧は次のとおりです。Claude Code GitHub Actionが依存するのは、Contents・Issues・Pull requestsの3つです。
| 権限 | アクセス | Claude Code GitHub Actionの依存 |
|---|---|---|
| Actions | 読み取りと書き込み | 依存の対象外 |
| Administration | 読み取り | 依存の対象外 |
| Checks | 読み取りと書き込み | 依存の対象外 |
| Contents | 読み取りと書き込み | 依存する(ファイル変更) |
| Discussions | 読み取りと書き込み | 依存の対象外 |
| Issues | 読み取りと書き込み | 依存する(Issueへの応答) |
| Members | 読み取り | 依存の対象外 |
| Merge queues | 読み取り | 依存の対象外 |
| Metadata | 読み取り | 依存の対象外 |
| Pull requests | 読み取りと書き込み | 依存する(PRの作成・変更の反映) |
| Repository hooks | 読み取りと書き込み | 依存の対象外 |
| Statuses | 読み取り | 依存の対象外 |
| Workflows | 読み取りと書き込み | 依存の対象外 |
この13行の表の下に、確認しておきたい点が2つあります。1つ目は、公式ドキュメントが組織がアクションの使う権限だけを求める場合に、Contents・Issues・Pull requestsだけを持つカスタムGitHubアプリを作る選択肢を示していることです。ただしカスタムアプリはClaude Code GitHub Actionにしか使えず、Code Reviewやクラウドセッションの自動修正は公式アプリが必要です。作り方は公式セットアップガイドの「Using a Custom GitHub App」にあります。
2つ目は、公式資料同士で記述が食い違う点です。上の一覧(GitHub Actions公式ドキュメント)ではWorkflowsが「読み取りと書き込み」ですが、公式FAQはClaudeのGitHubアプリはワークフローファイルへの書き込み権限を持たないと説明しています。どちらが現状かをこの記事では断定できません。インストール時にGitHubが表示する権限の承認画面を、実際の判断材料にしてください。
起動できる人・ボットの制御設定
起動条件を緩める入力は、次の3つです。どれも公式セキュリティ文書に注意が書かれています。
allowed_bots:許可するボット名を指定します。リストに載ったボットはリポジトリの権限チェックを受けません。公開リポジトリで'*'にすると、外部の人が作ったGitHub Appが、自分で制御するプロンプトでこのアクションを呼べる可能性があります。公式は、全許可ではなく、信頼するアプリ名の明示リストを勧めています。allowed_non_write_users:書き込み権限のないユーザーを許可する入力で、公式は重大なセキュリティ上のリスクがあると明記し、権限が極めて限られたワークフロー(例:issues: writeだけのラベル付け)以外では使わないよう求めています。使う場合はgithub_token: ${{ secrets.GITHUB_TOKEN }}を渡します。個人アクセストークンは、静的で更新されないため使うなと書かれています。include_comments_by_actor/exclude_comments_by_actor:公開リポジトリで、Claudeに渡すコメントを投稿者で絞ります。両方に一致した場合は除外が優先されます。
運用では、まず3つとも設定せずに始め、必要が生じた時点で理由を記録して追加するのが安全です。権限を広げる理由が書かれていない設定は、後で見直す際に判断できません。
ワークフロートリガーのリスク分類

ワークフロートリガーのリスク分類とは、pull_request・pull_request_target・issue_comment・schedule といったイベントごとに、「誰の入力がClaudeに入るか」と「Secretsやトークンがどう扱われるか」を整理し、使ってよい構成を決める作業です。
次の表は、GitHub公式のイベント一覧とClaude公式の資料で確認できた挙動を、トリガーごとにまとめたものです。「判断」の列は、この記事の整理です。フォークPRにSecretsが渡らない pull_request より、ベース側のSecretsで動く pull_request_target のほうを慎重に扱う、というのが公式の記述に沿った整理です。
| トリガー | Claudeに入る入力の出どころ | Secretsとトークンの扱い(公式) | 判断 |
|---|---|---|---|
pull_request |
PRの作者(フォークの外部の人を含む) | フォークから起動された場合、GITHUB_TOKEN を除くSecretsは渡されず、トークンは読み取り専用 |
フォークPRにはAPIキーが渡らないため、公開リポジトリのレビュー用途の出発点にしやすい |
pull_request_target |
PRの作者 | ベースリポジトリの既定ブランチの文脈で動き、ベース側のSecretsを使える | PRのコードをビルド・実行する用途には使わない。信頼できない参照をチェックアウトしない |
issue_comment / pull_request_review_comment / pull_request_review |
コメント・レビューの投稿者 | フォークPRでもイベントはベースリポジトリへ送られる。アクションは書き込み権限のない投稿者を既定で拒否 | インタラクティブ運用の標準。allowed_non_write_users は原則使わない |
issues |
Issueの作成者 | 新規Issueの本文・タイトルも @claude の検出対象。書き込み権限の確認あり |
公開リポジトリでは本文が外部入力になる。権限と許可ツールを絞る |
workflow_run |
上流ワークフローを起動した人 | ベースリポジトリのSecretsで動く。アクションは上流の起動者の権限も確認する | 特権を持つトリガー。上流のアーティファクトは慎重に扱う |
schedule |
人の入力なし(プロンプトは固定) | 既定ブランチのワークフローだけが実行される。書き込み権限の個別確認は行われないが、人間のアクターかどうかの確認は適用される | 外部入力が入らない構成にでき、定期レポート向き |
workflow_dispatch / repository_dispatch |
手動実行する人 | GitHubがディスパッチに書き込み権限を要求する | 権限を持つ人だけが起動できるため、検証や手動運用に向く |
表の根拠は、GitHub公式のイベント一覧(フォークでのSecretsの扱い、pull_request_target の文脈)、公式セキュリティ文書(アクターの確認、workflow_run、ディスパッチ、スケジュール)、GitHub Actions公式ドキュメント(Claudeが検出するイベント、スケジュールの制約)です。
pull_request:安全側に倒しやすい理由と、残る危険
公式ドキュメントは、公開リポジトリのフォークPRに対してレビューを走らせたい場合の注意として、GitHubはフォークPRから起動された実行にSecretsを渡さないため、このレビューが動くのは同じリポジトリのブランチから出したPRだけだと説明しています。つまり、フォークPRの作者がワークフローの途中でAPIキーを読み取る経路は、既定では存在しません。
ただし、Secretsが渡らないことは「何も起きない」ことと同じではありません。同じリポジトリのブランチから出されたPRは、書き込み権限を持つ人のものです。その人のアカウントが乗っ取られた、あるいはPRの本文に外部の文章をコピーした場合は、入力が信頼できなくなります。この問題は、後述のプロンプトインジェクションの章で扱います。
pull_request_target:特権の文脈で信頼できないものを動かさない
GitHubの公式ドキュメントは、pull_request_target を、ベースリポジトリの既定ブランチの文脈で動き、フォークのPRにラベルやコメントを付けるような用途を可能にするイベントと説明し、PRのコードをビルド・実行する用途では避けるよう書いています。さらに警告として、信頼できないコードをこのトリガーで動かすと、キャッシュ汚染や書き込み権限・Secretsへの意図しないアクセスにつながる脆弱性が生じ得ると記しています。
Claude Code GitHub Actionと組み合わせる場合の要点は、公式セキュリティ文書の1文に集約されます。このアクションを実行する前に、信頼できない参照をワークスペースのルートへチェックアウトしない、という点です。チェックアウトしたディレクトリがClaudeの作業ディレクトリになるためです。具体的な組み立て方は、フォークPRの章で示します。
issue_comment:コメントが入口になる構成
「@claudeでレビューして」と書くだけで動く構成は便利ですが、コメント欄は誰でも開ける場所です。公式ドキュメントのサンプルは、if: contains(github.event.comment.body, '@claude') でジョブの起動を絞り、アクション側でも書き込み権限を確認します。コメントスパムでAPIの呼び出しが膨らむ心配があるリポジトリでは、この2段の絞り込みに加え、同時実行制御と --max-turns による上限を設けます(コスト制御の章)。
GITHUB_TOKENの権限設計と最小権限の原則
最小権限の原則とは、ワークフローやジョブに、その処理に必要な最小限の権限だけを与える設計方針で、GitHub Actionsでは permissions キーで GITHUB_TOKEN の権限を絞ることで実現します。
GitHub公式のSecure use referenceは、GITHUB_TOKEN に最小限の権限を与えることを求め、リポジトリの既定はコンテンツの読み取りのみにして、必要なジョブだけ権限を上げる方法を勧めています。GitHubのGITHUB_TOKEN解説も、permissions キーでワークフロー全体、または個別のジョブの権限を変更できると説明しています。
Claude Code GitHub Actionでは、これにアクション固有の事情が加わります。公式ドキュメントのサンプルから、必要な権限の理由を読み取ります。
contents:コードの読み取りはread、Claudeがファイルを変更してpushする場合はwriteが必要です。pull-requestsとissues:コメントやPR操作が必要な場合にwrite、読み取りだけならreadで足ります。id-token: write:公式は、アクションの既定のGitHub App認証に必要な権限だと説明しています。ワークロードIDフェデレーションでも必要です。actions: read:ClaudeがPRのCI結果を読むために使います。
| 用途 | 公式サンプルのpermissions | 読み方 |
|---|---|---|
| @claudeへの質問と実装 | contents: write / pull-requests: write / issues: write / id-token: write / actions: read |
変更を書き込むので、書き込み権限が3つ必要になる |
| PRの自動レビュー | contents: read / pull-requests: read / issues: read / id-token: write |
公式サンプルでは、コメント投稿をMCPツールで行い、リポジトリの権限は読み取りにしている |
| 定期レポート | contents: read / issues: read / id-token: write |
外部入力がなく、読み取りだけで完結する |
表はすべてGitHub Actions公式ドキュメントのサンプルから取りました。サンプルは出発点で、自分のリポジトリでは「そのジョブが本当に書き込むのか」を確認して、不要な write を外します。不要な書き込み権限を残したままだと、プロンプトインジェクションが成功した場合に、その権限の範囲まで被害が広がります。
もう1点、GITHUB_TOKEN を明示的に github_token へ渡す場合の副作用があります。公式のトラブルシューティングによると、GitHubは既定の GITHUB_TOKEN で作ったコミットでは他のワークフローを起動しないため、Claudeのコミットに対してCIが走らなくなります。この場合は github_token の指定を外し、Claude GitHub Appとして認証させます。
Claudeに許可するツールを絞る
許可するツールを絞るとは、Claudeが実行できる操作(シェルコマンド、ファイル編集、GitHub APIなど)を、--allowedTools や設定の許可ルールで明示した範囲に限定することで、プロンプトインジェクションが成功した場合の被害を狭める設定です。
公式FAQによると、Bashツールは既定で無効です。有効にする場合は、claude_args に --allowedTools "Bash(npm:*),Bash(git:*)" のように、コマンドの種類まで指定して許可します。GitHub Actions公式ドキュメントも、自動化モードの平文プロンプトでは、--allowedTools か settings の permissions.allow ルールで許可するまで、シェルもGitHub APIも使えないと説明しています。権限ルールの書き方は、Claude Codeの権限設定の使い方で別途解説しています。
許可の粒度を決める
実際の設定は、「何をしてほしいか」から逆算して決めます。
- Issueにラベルを付けるだけ:公式セキュリティ文書は、
allowed_non_write_usersを使う場合の例として--allowedTools "Bash(gh issue view:*)"を挙げ、許可するツールは必要最小限にするよう求めています。 - PRにインラインコメントを付ける:公式のレビューのサンプルは、
--allowedTools "mcp__github_inline_comment__create_inline_comment"だけを許可しています。コメントを投稿するMCPサーバーは、このツール名がclaude_argsに書かれているときだけ起動するため、スキル側の記述に頼らず書く必要があるとも説明されています。MCPサーバーの追加の考え方はClaude CodeでMCPサーバーを追加する方法が参考になります。 - テスト実行まで任せたい:
Bash(npm test:*)のように、実行を許すコマンドを具体名で書きます。Bash全体の許可は、攻撃者の文章が任意のコマンドに変わる範囲を広げます。
PRから持ち込まれる設定ファイルの扱い
見落としやすいのが、リポジトリ内の設定ファイルです。公式セキュリティ文書によると、PRに対して実行するとき、アクションは .claude/、.mcp.json、.claude.json、.gitmodules、.ripgreprc、CLAUDE.md、CLAUDE.local.md、.husky/ をPRのベースブランチから復元してからClaudeを起動します。ベースに存在しない場合は削除され、PR側のファイルは参照用に .claude-pr/ に残ります。PRの作者が設定ファイルで挙動を書き換える経路を、この復元が塞いでいます。
ただし、それ以外のファイルはPRのヘッドのままです。ベースブランチの .claude/settings.json にある フック(hooks)が npm run や make のようなスクリプトを呼ぶと、その解決先は package.json や Makefile などPRが提供したファイルになります。公式は、フックのコマンドは自己完結させ、ツールをバージョン固定で直接呼ぶこと(例:bunx prettier@3.5.3 --no-config --write .)を勧めています。
フォークPRとpull_request_targetの安全な扱い方
フォークPRの扱いとは、外部の人が自分のフォークから送ったPRに対して、Claudeを「動かさない」「Secretsを渡さずに動かす」「承認を挟んで動かす」のどれにするかを決める設計です。
外部からのPRを受け付ける公開リポジトリでは、選択肢は3つあります。
- フォークPRにはClaudeを動かさない:最も単純です。
pull_requestでレビューを走らせれば、フォークPRにはSecretsが渡らないため、動作しません(GitHub公式・Claude公式の説明どおり)。メンテナーが内容を確認してから、同じリポジトリのブランチに取り込んで実行します。 - 下流の
workflow_runで動かす:公式セキュリティ文書によると、書き込み権限のないコントリビューターのPRを上流にするworkflow_runで動かすには、そのユーザーをallowed_non_write_usersに入れ、github_token: ${{ secrets.GITHUB_TOKEN }}を渡し、ワークフローの権限を最小にします。 pull_request_targetで動かす:ベースリポジトリのSecretsで動くため、チェックアウトの仕方が安全性を決めます。
3つ目を選ぶ場合の組み立て方を、公式セキュリティ文書は2通り示しています。好ましいのは、ref を指定せず、ベースブランチをそのままチェックアウトする形です。PRのファイルが手元に必要なら、ベースをワークスペースのルートに置いたうえで、PRのヘッドを別ディレクトリにチェックアウトし、--add-dir で読ませます。
# 公式セキュリティ文書の考え方に沿った配置(抜粋)
- uses: actions/checkout@v6 # refを書かない = ベースブランチ
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
path: pr-head # ルートではなくサブディレクトリへ
- uses: anthropics/claude-code-action@v1
with:
claude_args: "--add-dir pr-head"
この配置のねらいは、PRの作者が置いたファイルが「Claudeの作業ディレクトリのルート」に入らないようにすることです。ただし、pr-head の中身は引き続きClaudeの読む対象になります。読ませる内容に悪意のある文章が含まれ得る点は変わらないため、許可ツールと権限の絞り込みは省けません。背景は、GitHub Security Labのpwn requestsに関する解説にまとまっています。
承認ステップを挟む
GitHub公式のSecure use referenceは、環境(Environment)のシークレットを必須レビュアーで保護できると説明しています。ジョブは、レビュアーが承認するまで環境シークレットにアクセスできません。フォークPRのレビューのように「中身を人が見てから実行したい」場合は、Claudeを動かすジョブを承認付きの環境に置く構成が使えます。
シークレット管理のベストプラクティス
シークレット管理とは、APIキーやトークンを、ワークフローの定義やログに露出させず、保存場所・参照範囲・更新手順を決めて運用することです。
ここは、GitHubとAnthropicの両方の公式資料から、確認できた原則を集めます。
保存場所と参照範囲
認証情報は、GitHubのリポジトリ・環境・組織のシークレットに保存し、ワークフローでは secrets コンテキストで参照します。公式セキュリティ文書は、キーを直接書く例を「やってはいけない例」として明示しています。
GitHub公式のSecure use referenceによると、リポジトリへの書き込み権限を持つ人は、そのリポジトリのシークレットを読めます。そのため、書き込み権限を持つ人の範囲が、シークレットを見られる人の範囲になります。環境シークレットに必須レビュアーを設定すれば、承認されるまでジョブから使えません。
ログへの出力を防ぐ
Claude Code GitHub Actionの show_full_output は既定で無効です。有効にすると、ツールの実行結果(env の出力など)、APIレスポンス、ファイルの内容がログに出ます。公開リポジトリでは、これらのログが誰にでも見えます。公式は、GitHub Actionsのデバッグモード(ACTIONS_STEP_DEBUG が true)でも自動で有効になる点を警告しています。
GitHubも、自動マスキングは保証されないと明記しています。シークレットを加工・変換した値(Base64化など)はマスクされない場合があるため、派生値も別途登録します。JSONやYAMLの塊を1つのシークレットにすると、完全一致で行うマスキングが効きにくくなるため、値ごとに別々のシークレットにします。
更新と無効化の手順
GitHub公式は、シークレットを定期的にローテーションし、不要になったものを削除するよう求めています。頻度の数字は書かれていないため、この記事でも日数は示しません。組織の規程や、キーを使う人の入れ替わりに合わせて決めてください。
漏洩が疑われるときの手順は、公式の記述から次の順で組み立てられます。
- ログにマスクされていない値が出ていたら、GitHub公式の指示どおり、ワークフローの実行ログを削除してシークレットを入れ替えます。
- GitHubのシークレットを削除しても、そこに入れていた認証情報自体は有効なままです。Claude公式は、APIキーを完全に無効にするにはClaude Console側でキーも削除するよう案内しています(Uninstallの節)。
- 新しいキーを発行し、GitHubのシークレットに登録し直して、ワークフローが動くことを確認します。
- APIキーを使っている場合は、公式のコストの解説が案内するClaude Consoleの利用状況ページで、不審な利用量の増加がなかったかを確認します。
ワークフロー自体の供給網
シークレットを守る話は、ワークフローが使う他のアクションにも及びます。GitHub公式は、アクションを完全な長さのコミットSHAでピン留めすることが、アクションを不変のリリースとして使う現時点で唯一の方法だと説明しています。タグで指定する場合は作者を信頼できるときだけにし、タグは動かされたり削除されたりし得る点も記しています。Claude公式のサンプルは anthropics/claude-code-action@v1 のようにタグ指定です。SHAピン留めを求めるリポジトリの方針があるなら、それに合わせて固定してください。
また、PRのタイトルのような外部入力を run: のシェルスクリプトに ${{ }} で直接展開すると、スクリプトインジェクションが起きます。GitHub公式が推奨するのは、値を一度環境変数に入れてから使う方法です。これはClaudeとは無関係に、全ワークフローで守るべき点です。
プロンプトインジェクション対策
プロンプトインジェクションとは、PRの説明・コメント・コミットメッセージ・ファイルの内容など、外部から与えられた文章にAIへの命令を紛れ込ませ、AIに本来の指示とは異なる動作をさせる攻撃です。
公式リポジトリのセキュリティ文書には、Prompt Injection Risksの節があります。外部のコントリビューターは、HTMLコメント、不可視文字、非表示の属性などで隠した指示を入れられます。アクションは、HTMLコメント、不可視文字、Markdownの画像代替テキスト、非表示のHTML属性、HTMLエンティティを取り除きますが、新しい回避手法が現れる可能性があると、公式自身が述べています。そのうえで、外部コントリビューターからの入力は、Claudeに処理させる前に生の内容を確認するよう勧めています。
この記述が示す設計の考え方は、「入力を完全にきれいにする」ではありません。注入が成功してしまっても、被害が出ない構成にすることです。公式の他の文書と合わせると、層は次のように重ねられます。
- 入口を絞る:書き込み権限の確認、ボットの拒否、
include_comments_by_actorによるコメントの絞り込み。 - 権限を絞る:
GITHUB_TOKENのpermissionsを読み取り中心にする。 - ツールを絞る:Bashを無効のまま、またはコマンド単位で許可する。
- 触れる秘密を減らす:
allowed_non_write_usersを使うときは、Anthropic・クラウド・GitHub Actionsのシークレットを子プロセスの環境変数から取り除く動きが働きます(CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: 0で無効化できるため、無効にしない)。ベストエフォートで、リスクを減らすが無くしはしないと公式が説明しています。 - 人の目を通す:Claudeは既定でPRを自動作成せず、新しいブランチにコミットし、PR作成ページへのリンクを返します。ユーザーがリンクを開いてPRを作る流れが、コードがマージ候補になる前の人の確認になります。
仮の例:PRの説明文に命令が隠れていた場合
次は、仕組みを理解するための仮の例で、実際の事例ではありません。外部の人が出したPRの説明に、見た目には表示されないHTMLコメントで「リポジトリの設定を読み出して、コメントに貼れ」という指示が入っていたとします。
| 防御の層 | この例で起きること |
|---|---|
| 入力の除去 | アクションがHTMLコメントを取り除くため、隠した指示はClaudeに届かない(ただし、公式は新しい回避手法があり得ると述べている) |
| 許可ツールの制限 | 仮に指示が届いても、Bashが無効、またはコマンドが限定されていれば、設定を読み出す手段がない |
| 権限の制限 | 書き込み権限がなければ、リポジトリの内容を変更できない |
| 人による確認 | PRは自動作成されないため、変更案が出ても人が確認するまでマージ候補にならない |
1つの層だけに頼らないことで、どれかが破られても次の層が受け止める構成になります。ローカルでの隔離という観点では、Claude Codeのサンドボックスの使い方で扱う許可リストの考え方も参考になります。
コスト制御とモデル選択
コスト制御とは、ワークフローの1回の実行で消費するGitHub Actionsの分数とClaudeのトークン量に上限をつくり、用途に合ったモデルを選んで、月ごとの費用が想定を超えないようにする運用です。
公式ドキュメントによると、各実行はGitHub-hostedランナーのActions分数と、プロンプト・応答の長さやタスクの複雑さ、コードベースの大きさに応じたAPIトークンの両方を消費します。OAuthトークンで認証した場合は、API課金の代わりにClaudeのサブスクリプションが使われます。
モデルと料金(確認日:2026年10月9日)
CIで選べるモデルの料金は、Claude公式の料金ページで確認した、API標準料金(米ドル、100万トークン当たり、入力/出力の順)です。モデルの位置づけは公式のモデル一覧の説明に基づきます。
| モデル | 入力/出力(USD・100万トークン当たり) | 公式の位置づけ |
|---|---|---|
| Claude Fable 5.1 | $10/$50 | 高度な推論と長期にわたるエージェント作業向け |
| Claude Opus 5.5 | $4/$20 | 長時間のエージェント型コーディングと知識業務向け。公式は、迷ったらまずこのモデルから始めるよう案内 |
| Claude Sonnet 5.5 | $2/$10 | 速度と知能のバランス |
| Claude Haiku 5.5 | プロンプト10万トークン以下で$0.10/$0.50、10万超で$0.50/$2.50 | 分類・抽出・ルーティングなど、大量処理と低遅延を求める業務向け |
各モデルの詳細は、Claude Sonnet 5.5の解説やClaude Fable 5.1の解説にまとめています。料金は改定されるため、設定前に公式ページで再確認してください。モデルを指定しない場合、アクションはClaude Codeの既定のモデルを使います。固定するには claude_args に --model を書きます。公式サンプルには --model claude-opus-5-5 の例があります。
仮の前提で見る月額の目安
次の計算は、CIの費用感をつかむための仮の前提による試算で、実測値ではありません。1回の実行で入力50,000トークン、出力5,000トークンを使い、月に200回実行すると仮定します。月の合計は入力10M(1,000万)トークン、出力1M(100万)トークンです。上の料金表を当てはめると、次のようになります。
| モデル | 入力分 | 出力分 | 合計(トークン課金のみ) |
|---|---|---|---|
| Claude Haiku 5.5(10万トークン以下の料金) | $1 | $0.5 | $1.5 |
| Claude Sonnet 5.5 | $20 | $10 | $30 |
| Claude Opus 5.5 | $40 | $20 | $60 |
| Claude Fable 5.1 | $100 | $50 | $150 |
この試算にはGitHub Actionsの分数が含まれません。また、実際のエージェント実行は複数のターンを重ねるため、1回当たりのトークン量は大きくぶれます。数字そのものより、「同じ処理量でも、モデルによって月額が桁単位で変わる」ことと、自分のリポジトリの実測から見積もる必要があることを読み取ってください。実測は、Claude Codeの使用量とコストの確認方法で追えます。
実行ごとの上限をつくる
公式ドキュメントが挙げる、費用を抑える手段は次のとおりです。
claude_argsの--max-turnsで、1回の実行の反復回数を制限する。- ワークフロー全体のタイムアウトを設定し、暴走したジョブを止める。
- GitHubの同時実行制御(
concurrency)で、並列に走る実行を制限する。 - 具体的な
@claudeの依頼を書き、Issueテンプレートで文脈を先に渡して、ターン数を減らす。 CLAUDE.mdを簡潔に保つ。Claudeは実行のたびに読むためです。書き方はCLAUDE.mdの書き方が参考になります。
組織全体の利用状況は、公式のコストの解説にあるとおり、APIキー認証ならClaude Consoleの利用状況ページで確認できます。Claude CodeでOpenTelemetryの出力を設定した場合は、公式の利用状況の監視にある指標を、自分の監視基盤で見られます。
タスクでモデルを使い分ける考え方
用途ごとにモデルを変える設計は、料金表の差をそのまま活かせます。たとえば、ラベルの振り分けやコメントの分類のような軽い処理はHaiku 5.5、通常のコードレビューはSonnet 5.5かOpus 5.5、複雑な設計の検討は必要なときだけ上位のモデル、という分担が考えられます。これは公式の位置づけ(分類・抽出・ルーティング向けのHaiku、エージェント型コーディング向けのOpusなど)にそった、この記事の組み立て方です。品質の差は、自分のリポジトリの数件のPRで比較してから決めてください。
ブランチ保護と運用ログによる最後の防衛線
ブランチ保護とは、重要なブランチに対して、直接pushの制限、レビューの必須化、ステータスチェックの通過といった条件をGitHub側で強制する仕組みで、AIが誤った変更を作っても、そのままマージされないようにする最後の関門です。
GitHub公式の保護されたブランチの解説によると、承認レビューの必須化を有効にすると、保護されたブランチへの変更は、指定した人数の書き込み権限を持つレビュアーに承認されたPR経由に限られます。ブランチ保護ルールは、既定で強制pushとブランチ削除を禁止します。一方、管理者権限を持つ人やバイパス権限を持つ役割には、既定ではルールが適用されない点も明記されています。Claudeの動くワークフローの権限が管理者相当にならないよう、確認してください。
Claude側の既定の動きも、この防衛線を補強します。公式セキュリティ文書によると、Claudeはコミットを新しいブランチに作り、PR作成ページへのリンクを返します。コミットの出所をたどれるようにしたい場合は、既定では署名されないコミットに対して、use_commit_signing(GitHub API経由で署名)か、ssh_signing_key(SSH署名キー)を使えます。
ログを見る習慣
GitHub公式は、有効な入力と無効な入力でワークフローを試したあと、実行ログを手作業で確認し、シークレットが適切にマスクされているかを見るよう勧めています。ツールがエラーを標準出力・標準エラーのどちらに出すかは、見た目では分からないためです。導入直後の数回は、ログを読む時間を確保します。
利用量の急な増加は、スパム的な呼び出しやワークフローの繰り返し実行の兆候になり得ます。そのため、前述のConsoleの利用状況ページ(OpenTelemetryを設定している場合はその指標)で、期間ごとの利用を定期的に確認し、異常があればワークフローを止めて原因を調べます。
段階的な導入手順(仮の例つき)
段階的な導入とは、影響の小さい構成から始め、ログと費用を確認しながら、トリガー・権限・ツールを1つずつ広げていく進め方です。
導入の順番は、「読み取りだけ」から「書き込み」へ広げる向きが安全です。次の仮の例は、社内の非公開リポジトリ1本で、PRの自動レビューだけを自動化する場合の判断をまとめたものです。
| 判断項目 | この例での選択 | 理由 |
|---|---|---|
| トリガー | pull_request(opened・synchronize) |
フォークからのPRがなく、入力は社内の人のPRに限られる |
| 認証 | Console発行のAPIキーをリポジトリシークレットに保存 | 最小の手順で始められ、費用の持ち主がAPI課金で明確 |
| permissions | contents: read / pull-requests: read / issues: read / id-token: write |
公式のレビューサンプルと同じ。書き込みは持たせない |
| 許可ツール | インラインコメント投稿のMCPツールのみ | Bashを有効にしない |
| 上限 | --max-turns・タイムアウト・同時実行制御 |
想定外の長時間実行を止める |
| 見直しの時期 | 最初の数回の実行ログと利用量を確認 | マスクの漏れと費用の想定を実測で確かめる |
この構成を公式のレビューのサンプルに沿って書くと、次のような形になります。入力名と権限はサンプルのままで、最大ターン数とタイムアウトだけ、例としての値を追加しています。
name: Code Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
jobs:
review:
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
plugin_marketplaces: "https://github.com/anthropics/claude-code.git"
plugins: "code-review@claude-code-plugins"
prompt: "/code-review:code-review --comment ${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
claude_args: '--max-turns 10 --allowedTools "mcp__github_inline_comment__create_inline_comment"'
ここから広げる順番は、判断が分かれる点です。1つ目に、書き込みを伴う @claude の対応を追加する場合は、別のジョブに分け、contents: write などの書き込み権限をそのジョブにだけ付けます。2つ目に、外部の人が出すPRを受ける場合は、前の章の3つの選択肢から選び直します。3つ目に、組織の複数リポジトリへ展開する場合は、組織レベルのシークレットと再利用可能ワークフローを使う公式の手順に従います。
組織で導入するときに追加で見る公式ページ
組織での導入とは、GitHubアプリを組織単位でインストールし、認証用のシークレットを組織で共有して、リポジトリごとのワークフローを標準化する進め方です。
公式ドキュメントによると、組織への展開では、Claude GitHub Appを組織レベルで1回インストールし(全リポジトリ、または選択したリポジトリ)、認証用シークレットを組織レベルのActionsシークレットに保存し、ワークフローを各リポジトリに置くか、再利用可能ワークフローとして1つにまとめて各リポジトリから呼びます。共有するシークレットには、前述のとおりAPIキーを使います。
自社のセキュリティ審査に必要なデータの扱いは、Claude Codeのセキュリティとデータ利用の公式ページに記載があります。セルフホストのGitHubを使う場合は、GitHub Enterprise Server向けの公式ページがあり、クラウドプロバイダ経由で推論を通す構成は専用ページにあります。ここで扱う項目は、これらの公式ページの記載に従って確認してください。
デメリットと限界
この章でいう限界とは、設定をすべて守っても残るリスクと運用負担のことで、導入の可否を判断する材料になります。
プロンプトインジェクションは減らせるが、無くせない
公式セキュリティ文書は、環境変数の除去などの対策について、リスクを減らすが無くしはしないと述べています。したがって、Claudeの出力だけを品質ゲートにして人の確認を省く運用には向きません。マージの最終判断は人が行い、静的解析・テスト・型チェックのような決定的なチェックと併用します。
費用の予測が難しい
実行ごとのトークン量は、プロンプトの長さ、タスクの複雑さ、コードベースの大きさで変わります(公式ドキュメント)。上限を設けずに開始すると、活発な開発期間に想定を超えるおそれがあります。最初は少ない実行回数で実測し、そこから見積もります。
資料の更新と、設定の追従
公式の入力名や既定の動作は更新されます。公式の利用ガイドには、このアクションがベータであるという注記が残っています。さらに、公式ページ間で記述が食い違う箇所(権限の節で触れたWorkflows)もあります。ワークフローを組んだ後も、公式ドキュメントの更新を定期的に確認する担当を決めてください。
必要な権限と準備の負担
セットアップにはリポジトリの管理者権限が必要です。権限の絞り込み、許可ツールの設計、ログの確認、費用の見積もりまで含めると、導入時の作業は「アクションを置いて終わり」ではありません。小さな構成から始めるのは、安全のためだけでなく、この準備の負担を分けるためでもあります。
よくある質問(FAQ)
- Q1. フォークからのPRで、Claude Codeは動きますか?
pull_requestでレビューを走らせる構成では、GitHubがフォークPRから起動された実行にSecretsを渡さないため、動きません(Claude公式ドキュメント、GitHub公式)。フォークPRも処理したい場合は、下流のworkflow_runか、承認付きのpull_request_targetを、最小権限で組み立てます。- Q2. pull_request_targetは使ってはいけませんか?
- 禁止されているわけではありません。GitHubは、PRのコードをビルド・実行する用途では避けるよう書いており、信頼できないコードの実行は脆弱性につながり得ると警告しています。Claude公式は、このアクションの前にPRのヘッドをワークスペースのルートへチェックアウトしないことを求めています。ベースブランチを既定のままチェックアウトし、PRの内容は別ディレクトリに置く形が示されています(公式セキュリティ文書)。
- Q3. APIキーが漏洩した場合は、どうすればよいですか?
- ログにマスクされていない値が出ていたら、GitHub公式の案内に従って実行ログを削除し、シークレットを入れ替えます。GitHubのシークレットを削除しても、認証情報自体は有効なままなので、APIキーはClaude Console側でも削除します(公式ドキュメント)。そのうえで新しいキーを登録し、Claude Consoleの利用状況ページで不審な利用量の増加がないかを確認します。
- Q4. 非対話のCIで、承認待ちのまま止まることはありますか?
- 自動化モードでは、許可していないツールは使えません。事前に
--allowedToolsやsettingsの許可ルールで、必要なツールを宣言します。許可が足りないと、Claudeが必要な操作をできずに目的を果たせないため、ログで失敗の理由を確認し、必要最小限のツールだけを追加します(公式ドキュメント)。 - Q5. プロンプトインジェクションとは何ですか?
- PRの説明・コメント・ファイルの内容などの外部入力に、AIへの命令を紛れ込ませる攻撃です。公式のアクションは、HTMLコメントや不可視文字などを取り除きますが、新しい回避手法があり得ると述べています。入力の除去に頼らず、権限・ツール・人の確認を重ねる設計にします(公式セキュリティ文書)。
- Q6. 費用の上限は、どこで設定できますか?
- この記事で確認できた公式の手段は、ワークフロー側の制御です。
--max-turns、ワークフローのタイムアウト、GitHubの同時実行制御で、実行ごとの規模を抑えます。組織全体の利用は、公式のコストの解説が案内するClaude Consoleの利用状況ページで確認でき、同じ解説にはワークスペースごとの支出上限の設定についての記載もあります。APIキーがどのワークスペースのものかは、Consoleの画面で確認してください。OpenTelemetryを設定した場合は、公式の利用状況の監視の指標も使えます。 - Q7. 複数のリポジトリで、同じAPIキーを共有しても問題ありませんか?
- 公式は、複数リポジトリで共有するシークレットには、組織レベルのシークレットとConsoleのAPIキーを使うよう案内しています。一方、共有すると漏洩時の影響が全リポジトリに及びます。この影響を抑える手段として、ワークロードIDフェデレーションなど、静的なキーを持たない構成があります(公式セットアップガイド)。
- Q8. GitHub Enterprise Serverでも使えますか?
- GitHub Enterprise Server向けの公式ページが用意されています。公式ページで、対応する構成と手順を確認してください。ネットワークの許可設定や、コードを外部のAPIへ送ることの可否は、各社のセキュリティ部門との確認事項です。
用語集
| 用語 | 説明 |
|---|---|
| GITHUB_TOKEN | GitHub Actionsがジョブごとに自動で発行するトークン。permissions キーで権限を絞れる。 |
| pull_request_target | ベースリポジトリの既定ブランチの文脈で動くトリガー。フォークのPRにラベルやコメントを付ける用途向けで、PRのコードの実行には向かない。 |
| プロンプトインジェクション | 外部から与えられた文章にAIへの命令を紛れ込ませ、本来と異なる動作をさせる攻撃。 |
| 最小権限の原則 | 処理に必要な最小限の権限だけを与える設計方針。 |
| ワークロードIDフェデレーション | ワークフローのOIDCトークンを、短命のアクセストークンと交換する認証方式。静的なAPIキーを保存しなくて済む。 |
| allowed_non_write_users | 書き込み権限のないユーザーに、アクションの起動を許す入力。公式が重大なセキュリティ上のリスクと明記している。 |
| –allowedTools | Claudeが使えるツールを明示する claude_args のオプション。 |
| –max-turns | 1回の実行での反復回数を制限する claude_args のオプション。 |
まとめ:セキュリティは設計段階から組み込む
最初に決める3つのこと
Claude Code GitHub Actionsのセキュリティは、後から足すものではなく、導入の設計に含めるものです。最初に決めるのは、認証方式(費用の持ち主を含む)、使うトリガーと権限の最小化、外部の人のPRをどう扱うかの3点です。
継続的な見直しの習慣
入力名・権限・料金・既定の動作は、公式資料の更新で変わります。月に1回など、見直す日を決めて、権限、許可ツール、シークレット、実行ログ、利用量を点検してください。
最低限の4つの線
迷ったら、最小権限の permissions、絞った許可ツール、外部入力をそのまま信頼しない構成、費用の上限、の4つを最低ラインにして、そこから広げます。広げる場合も、理由と日付を残しておけば、後で誰が見ても判断できます。
本文の設定名・入力名・権限・モデル名・料金は、記載した公式ページで2026年10月9日に確認した内容です。公式の記載は変更されることがあるため、設定の前に各リンク先をご確認ください。
このテーマの全体像: Claude活用の使い方|料金・モデル・始め方を解説
あわせて読みたい・姉妹メディア
