インフラの設定ファイル(Terraform 等)の変更差分を、社内のセキュリティ基準に照らしてマージの前に判定し、公開範囲・暗号化・権限の指摘を返す
インフラの設定ファイル(Terraform 等)の変更のプルリクエストごとに、変更の計画を社内のセキュリティ基準の条項に照らして判定します。公開範囲・暗号化・権限・ログの指摘と直し方の案を、マージの前にレビューのコメントとして返します。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- EC/IT・SaaS/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック
- 主な課題
- 人手が足りない/属人化している/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 品質標準化/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 開発のチームがプルリクエストを出し、GitHub Actions が変更の計画を作ってコメントに貼る
- セキュリティの担当が、レビューの依頼を受けてプルリクエストを開く
- 設定ファイルの差分と変更の計画を読み、どのリソースの何が変わるかを把握する
- 公開範囲、暗号化、権限、ログについて、基準の条項に照らして確かめる
- 基準に合わない設定があれば、例外の承認の一覧に該当するものがあるかを探す
- 指摘と直し方をコメントに書く。問題が無ければ承認する
- 自動プルリクエストが開かれるか更新されると、GitHub Actions が動き、変更の計画をJSONで書き出す
- 自動レビューのプログラムが、変更のあるリソースだけを取り出し、機密の値を伏せる
- 自動規則で言い切れる条項(暗号化の無効、すべての送信元への開放など)をプログラムで判定する
- 自動規則で言い切れない変更について、Claude API が基準の条項と例外の承認の一覧に照らして判定し、指摘と直し方の案を書く
- 自動判定をまとめ、プルリクエストにレビューのコメントとして返す。重い指摘があればチェックを失敗にする
- 人セキュリティの担当が、指摘のあるプルリクエストを優先して読み、承認するか差し戻すかを決める
- 人指摘の無いプルリクエストは、要点だけを確かめて承認する
各工程の詳しい説明を読む
- 開発のチームがプルリクエストを出し、GitHub Actions が変更の計画を作ってコメントに貼る
- セキュリティの担当が、レビューの依頼を受けてプルリクエストを開く
- 設定ファイルの差分と変更の計画を読み、どのリソースの何が変わるかを把握する
- 公開範囲、暗号化、権限、ログについて、基準の条項に照らして確かめる
- 基準に合わない設定があれば、例外の承認の一覧に該当するものがあるかを探す
- 指摘と直し方をコメントに書く。問題が無ければ承認する
(a)件数にレビューが追いつかない。 1件15分でも月160件で40時間です。3名のうち誰かが休むと、プルリクエストが1日以上止まり、開発のチームから催促が来ます。
(b)何を指摘するかが担当によって違う。 権限の広さをどこまで許すかは、担当の経験で判断が分かれます。同じ書き方の権限が、ある担当では通り、別の担当では差し戻されます。
(c)変更の計画が長いと、見落とす。 モジュールの更新で数十のリソースが同時に変わると、その中の1つのネットワークの許可の変更が、他の変更に埋もれます。
(d)例外の承認を探すのに時間がかかる。 基準に合わない設定のうち、多くは例外として承認済みです。承認済みかを一覧から探す時間が、指摘を書く時間より長くなることがあります。
- 【自動】 プルリクエストが開かれるか更新されると、GitHub Actions が動き、変更の計画をJSONで書き出す
- 【自動】 レビューのプログラムが、変更のあるリソースだけを取り出し、機密の値を伏せる
- 【自動】 規則で言い切れる条項(暗号化の無効、すべての送信元への開放など)をプログラムで判定する
- 【自動】 規則で言い切れない変更について、Claude API が基準の条項と例外の承認の一覧に照らして判定し、指摘と直し方の案を書く
- 【自動】 判定をまとめ、プルリクエストにレビューのコメントとして返す。重い指摘があればチェックを失敗にする
- 【人】 セキュリティの担当が、指摘のあるプルリクエストを優先して読み、承認するか差し戻すかを決める
- 【人】 指摘の無いプルリクエストは、要点だけを確かめて承認する
3番目が、この設計の分かれ目です。 規則で言える条項をプログラムで判定すると、その指摘の根拠は「規則に当たった」で、誰が見ても同じ結論になります。 AIに見せるのは、規則で言えない残りだけです。
6番目と7番目で、承認するのは常に人です。 AIの判定が「問題なし」でも、承認のボタンを押すのはセキュリティの担当です。
02今回想定するシステム構成
開発のチームがプルリクエストを出す(設定ファイルの変更) ▼【トリガー】pull_request(opened/synchronize/reopened) GitHub Actions ├──▶ terraform plan → terraform show -json で変更の計画をJSONに ▼ レビューのプログラム(Python) ├──▶ resource_changes から変更のあるリソースを取り出す ├──▶ before_sensitive/after_sensitive で機密の値を伏せる ├──▶ 規則の判定(暗号化・開放・ログの有無) ▼ Claude API ── 規則で言えない変更の判定 │ ① 権限の広さ ② 公開の範囲と承認 ③ 例外の承認の範囲 │ ④ 条項番号と指摘 ⑤ 直し方の案 ▼ レビューのプログラム ── まとめて1つのレビューとして返す(COMMENT) ▼ 【人】セキュリティの担当が承認/差し戻し
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 処理 | Claude API(規則で言えない変更の判定、指摘と直し方の案) | OpenAI API、Gemini API |
| 連携 | Python(計画の取り出し、機密の値の伏せ、規則の判定、レビューの投稿) | Google Apps Script |
| CI | GitHub Actions | GitLab CI/CD |
| 設定ファイル | Terraform | OpenTofu、AWS CloudFormation |
リポジトリと GitHub Actions は、新しく足すものではありません。 新しく作るのは、レビューのプログラムと、機械が読める形にした基準の条項の一覧、例外の承認の一覧の3つです。
入力にするのは、Terraform の変更の計画のJSONです。 terraform show -json に計画のファイルを渡すと、計画をJSONで書き出せます。resource_changes の配列に、リソースごとの address と change が並びます。 change の actions は create、update、delete、置き換え(delete と create の組)などで、before と after に変更の前と後の値が入ります。
気をつけるのは、機密の値です。 JSONの出力の中では機密の値は伏せられておらず、どの値が機密かを before_sensitive と after_sensitive が示すとされています。この2つを before と after と組み合わせて、誤って表示しないようにする必要があります。AIに渡す前に、機密と示された値をすべて伏せます。
判定の受け取り方は、Claude API の構造化出力です。 リクエストの output_config.format に type: "json_schema" とスキーマを渡すと、返答がスキーマに沿ったJSONになります。判定の値を enum で固定できるので、チェックを失敗にするかをプログラムの規則で決められます。 enum の文字列は大文字・小文字が保証されないとされているため、比べるときは大文字・小文字を区別しません。
03どうやって実装するのか
処理の起点を決める
プルリクエストが開かれたとき、更新されたとき、開き直されたときに動かします。 GitHub Actions の pull_request のイベントは、既定でこの3つ(opened、synchronize、reopened)で動きます。paths の指定で、設定ファイルのディレクトリが変わったときだけに絞ります。 アプリのコードだけの変更で動かすと、毎回空の判定が返ります。
更新のたびに、レビューを作り直します。 指摘を受けて開発のチームが直すと、新しい変更の計画でもう一度判定します。前のレビューの指摘が直ったかを、新しいレビューの冒頭に並べます。
フォークからのプルリクエストでは動きません。 フォークから動いたワークフローには、GITHUB_TOKEN 以外のシークレットが渡されず、GITHUB_TOKEN も読み取りだけになるとされています。Claude API の鍵はシークレットに置くため、この構成は社内のリポジトリのプルリクエストだけを対象にします。 外部からの貢献を受けるリポジトリでは、人がレビューします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 変更の計画 | リソースごとの address、actions、before、after、after_unknown、機密の印 | terraform show -json |
| 設定ファイルの差分 | 変更された行と、その周り | プルリクエスト |
| プルリクエストの説明 | 変更の目的、関係するチケット | プルリクエスト |
| 基準の条項の一覧 | 条項番号、対象(ストレージ・ネットワーク・権限・ログなど)、要件、規則で判定できるか | 社内の文書から作る |
| 例外の承認の一覧 | 承認番号、対象のリソース、例外の内容、期限、承認者 | 社内の記録 |
質を決めるのは、下の2つです。 基準の条項の一覧には、条項ごとに「規則で判定できるか」の列を持たせます。 規則で判定できる条項はプログラムが受け持ち、そうでない条項だけがAIへの指示に入ります。
例外の承認の一覧には、対象のリソースの address を入れておきます。 名前やリソースの種類だけで承認を書くと、同じ種類の別のリソースにまで例外が広がって見えます。 期限も必ず入れ、期限切れの例外は無いものとして扱います。
プルリクエストの説明を入れるのは、権限の広さを判断するためです。 「バッチが毎晩このストレージに書き込むため」と書かれていれば、書き込みの権限が要る理由が分かります。説明が空のプルリクエストでは、権限の判定が needs_info になりやすくなります。
データの取得方法を決める
変更の計画は、GitHub Actions の中で作ります。 terraform plan で計画のファイルを書き出し、terraform show -json でJSONにします。この計画のファイルとJSONは、ワークフローの成果物として外に残さない設定にします。 機密の値が含まれるためです。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 変更のあるリソース | resource_changes のうち actions が no-op でないもの | 判定の対象 |
| 変更の前と後の値 | change.before、change.after | 何が変わったか |
| 適用するまで分からない値 | change.after_unknown | 判定を保留する印 |
| 機密の印 | before_sensitive、after_sensitive | 伏せる値の特定 |
| 基準の条項と例外 | リポジトリの中の一覧のファイル | 照らす相手 |
after_unknown を見落とさないでください。 適用するまで値が決まらない項目は、after に値が入らず、after_unknown に印が付きます。その項目を「設定されていない」と読むと、暗号化の鍵が後で決まるだけのリソースを「暗号化が無い」と指摘します。 印の付いた項目は、判定を unknown_until_apply にして、人に回します。
置き換えになるリソースも、ここで拾います。 actions が delete と create の組になっているリソースは、一度消えてから作り直されます。データを持つリソースが置き換えになると、中身が失われることがあります。 セキュリティの条項とは別に、レビューの冒頭に必ず示します。
基準の条項と例外の一覧は、レビューのプログラムと同じリポジトリに置きます。 一覧の変更もプルリクエストで受けるので、誰がいつ基準や例外を変えたかが、変更の履歴として残ります。
AIへ渡す前に整形する
- 変更のあるリソースの取り出し …
actionsがno-opのリソースは除きます - 機密の値の伏せ …
before_sensitiveとafter_sensitiveで印の付いた値を、"***"に置き換えます - 値の伏せの二重確認 … 鍵や証明書に見える文字列が残っていないかを、パターンで探して伏せます
- 規則の判定 … 規則で判定できる条項を、プログラムで当てます
- 例外の当て … 規則に当たったリソースが、例外の承認の一覧にあり期限内なら「例外承認済み」とします
- AIに渡す範囲の決定 … 規則で判定できない条項に関係するリソースの種類(権限、公開の設定など)だけを残します
- 大きさの確認 … 残ったリソースが多いときは、リソースごとに分けてAIに渡します
2番目と3番目を、両方とも行います。 機密の印は、設定ファイルで機密と宣言されていない値には付きません。印だけに頼ると、宣言を忘れた値がそのままAIに渡ります。
5番目で例外を当てるのは、プログラムの側です。 例外の承認の範囲に入っているかを、address と期限で機械的に判定します。AIには、承認の文言の範囲を超えていないかという、文脈の要る判断だけを残します。
AIに処理させる
させるのは、規則で判定できない条項について、変更のあるリソースごとに判定し、指摘と直し方の案を書くことです。
| 判定すること | 根拠にするもの | 判断できないとき |
|---|---|---|
| 権限が用途に見合うか | 権限の after、プルリクエストの説明、基準の条項 | needs_info |
| 公開の範囲が承認と合うか | 公開の設定の after、例外の承認の文言 | needs_info |
| 例外の承認の範囲を超えていないか | 例外の承認の文言と、変更の後の値 | needs_info |
| 変更による影響の広がり | 置き換え(delete と create)の有無、関係するリソース | 書かない |
| させないこと | 理由 |
|---|---|
| 承認・マージの判断 | セキュリティの担当が決める |
| 規則で判定した条項の再判定 | 規則の結論と食い違うと、どちらが正しいか分からなくなる |
| 例外を認めるかの判断 | 例外の承認は決められた承認者が行う |
| 伏せた値の推測 | 伏せた値を推測して書かない |
| 基準に無い観点での指摘 | 指摘には必ず条項番号を付ける。番号の無い指摘は返さない |
最後の行が、指摘の質を揃える要です。 AIは、基準に書かれていない一般的なよい慣行まで指摘します。条項番号の無い指摘をプログラムで落とすと、指摘はすべて社内の基準に基づくものになります。 担当によって指摘が違う、という課題はここで解きます。
指示内容を固定する
あなたはクラウドのインフラのセキュリティのレビュー担当です。
Terraform の変更の計画のうち、規則で判定できなかったリソースを、
社内のセキュリティ基準の条項に照らして判定してください。
【判定すること】リソースごとに、関係する条項それぞれについて
- verdict:
- compliant ..... 条項の要件を満たしている
- violation ..... 条項の要件を満たしていない
- exception_ok .. 例外の承認の文言の範囲に収まっている
- needs_info .... 説明や値が足りず判断できない
- finding: 何が問題かを1〜2文で
- suggestion: 直し方の案を、設定の項目名を挙げて1〜2文で
【厳守事項】
- 判定には、必ず【基準の条項】の条項番号を付けてください。
条項に無い観点での指摘はしないでください。
- "***" は伏せた値です。中身を推測しないでください。
- after_unknown が true の項目は、値が無いと扱わず needs_info にしてください。
- 例外の承認は、文言に書かれた範囲だけを認めてください。
対象や操作が文言より広ければ violation です。
- 迷ったときは compliant を選ばず、needs_info にしてください。
- 承認やマージについて書かないでください。
【基準の条項】{policy_clauses}
【例外の承認】{exceptions}
【プルリクエストの説明】{pr_description}
【変更のあるリソース】{resource_changes_masked}
「after_unknown を値が無いと扱わない」を明記しないと、誤った指摘が最も多く出ます。 適用するまで決まらない値は、JSONでは空に見えます。AIはそれを「設定されていない」と読みます。
「例外の承認は、文言に書かれた範囲だけ」は、例外の広がりを止めるための指示です。 「読み取りの権限を例外として許可」という承認に対して、書き込みの権限を足す変更を exception_ok にさせないためです。
出力形式を固定する
次の形のJSONで受け取ります。
{
"address": "",
"action": "create | update | delete | replace",
"findings": [
{
"clause_id": "",
"verdict": "compliant | violation | exception_ok | needs_info",
"finding": "",
"suggestion": "",
"exception_id": ""
}
]
}
1つ目の理由は、規則の判定とAIの判定を同じ形にそろえられることです。 プログラムの規則の結果も、clause_id と verdict を持つ同じ形の行にします。レビューのコメントには、どちらの判定かを「規則」「AI」の印で示します。
2つ目は、チェックの成否を規則で決められることです。
| チェックの結果 | 条件 |
|---|---|
| 失敗 | 規則の判定で violation が1つでもある |
| 注意(成功のまま) | AIの判定で violation か needs_info がある |
| 成功 | すべて compliant か exception_ok |
AIの violation だけではチェックを失敗にしません。 AIの判定は誤ることがあり、誤った失敗でマージが止まると、開発のチームはこの仕組みを信用しなくなります。 AIの指摘は注意として示し、担当が読んで差し戻すかを決めます。
3つ目は、clause_id の無い指摘をプログラムで落とせることです。 条項の一覧に無い番号が返ってきたときも、同じく落とします。
プルリクエストに返すレビューの本文は、次のような形にします。
【セキュリティ基準のチェック】結果:注意(規則の違反なし)
基準の一覧:policy/clauses.yaml @ 3f2a1c9 例外の一覧:@ 3f2a1c9
【規則】
- storage.logs_bucket SEC-07 暗号化 …… compliant
- network.app_sg SEC-12 管理用ポートの開放 …… exception_ok(EX-2026-031、期限 2026-12-31)
【AI】
- iam.batch_writer SEC-21 権限は必要な操作とリソースに限る …… violation
指摘:書き込みの対象がすべてのストレージになっている
直し方の案:対象のリソースを、説明にある1つのストレージに限る
【適用するまで決まらない値】 1件(kms_key の参照)
【置き換えになるリソース】 なし
冒頭に、判定に使った一覧の版を必ず載せます。 一覧が後から変わっても、このレビューがどの基準で出されたかを、プルリクエストの上で確かめられます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| GitHub Actions | pull_request のイベント | プルリクエストごとにワークフローを動かす |
| Terraform | terraform plan、terraform show -json | 変更の計画をJSONで書き出す |
| Claude API | API呼び出し(構造化出力) | 規則で言えない変更の判定 |
| GitHub のREST API | Create a review for a pull request | 判定をまとめて1つのレビューとして返す |
レビューは、event を COMMENT にして返します。 このAPIの event には APPROVE、REQUEST_CHANGES、COMMENT があり、APPROVE は使いません。 承認は人が行うためです。指摘はリソースごとに comments の配列に入れ、path と line で設定ファイルの該当行に付けます。
指摘は1回のレビューにまとめて返します。 このAPIで短い間に多くの投稿をすると、二次的な利用の制限にかかることがあるとされています。指摘ごとに別々に投稿せず、1回の実行で1つのレビューにします。
クラウドの環境には、この仕組みからは何も適用しません。 terraform apply は、従来どおりマージの後の手順で人が承認して行います。
人が確認する
承認するか差し戻すかは、すべてセキュリティの担当が決めます。
- チェックが失敗のものを先に見る … 規則に当たった変更です。多くは直してもらえば済みます
- 注意のあるものを見る … AIの
violationとneeds_infoです。指摘が条項に合っているかを、変更の計画を開いて確かめます unknown_until_applyの項目を見る … 適用するまで値が決まらない項目で、適用の後に確かめる必要があるかを決めます- 成功のものは要点だけを見る … 変わるリソースの一覧と、置き換えの有無だけを確かめて承認します
- AIの判定を覆したら記録する … どの条項の判定を、なぜ覆したかを残します
2番目を省かないでください。 AIの指摘は、条項番号が付いていても、条項の読み方を誤っていることがあります。 誤った指摘のまま差し戻すと、開発のチームに無駄な修正をさせます。
目標は、160件をならして1件6分です。 成功のものは1〜2分で、注意のあるものは指摘の確認で10分前後かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
terraform plan が失敗した | 判定をせず、計画が作れなかったことをコメントで返す |
| 変更のあるリソースが非常に多い | リソースごとに分けてAIに渡す。それでも多ければ規則の判定だけを返し、人に回す |
| 例外の承認が期限切れ | 例外が無いものとして規則の結果を返し、期限切れをコメントに書く |
| 条項の一覧に無い番号が返った | その指摘を落とす |
| Claude API が応答しない | 規則の判定だけを返し、「AIの判定なし」と明記する |
| フォークからのプルリクエスト | 動かない。人がレビューする |
| 設定ファイル以外の変更だけ | paths の指定で動かない |
| リソースの削除だけの変更 | 判定の対象を削除の影響(ログの保管先が消えるなど)の条項に絞る |
| プルリクエストの説明が空 | 権限の判定が needs_info になる。説明を書くよう促すコメントを添える |
上から5行目のとき、規則の判定は必ず返します。 AIが止まっても、言い切れる条項の見落としは起きないようにします。
記録を残す
- プルリクエストの番号と、判定した時点のコミット
- 判定に使った基準の条項の一覧と例外の一覧の版(同じリポジトリのコミット)
- 規則の判定とAIの判定の全体(伏せた後の入力と、返ったJSON)
- 返したレビュー
- 担当が判定を覆した記録
- 伏せる前の変更の計画は残さない
最後の行は、意図して残さないものです。 機密の値を含む計画をログに残すと、ログそのものが漏えいの経路になります。
担当が覆した記録は、規則とAIへの指示の両方を直す材料になります。 同じ条項でAIの violation が覆され続けるなら、その条項は規則で書けるか、条項の書き方が曖昧かのどちらかです。
04実装レベルの3段階
本記事の想定は本格構成です。 月160件では、判定を担当に送るだけでは、担当がそれをプルリクエストに書き写す手間が残ります。 半自動化の段階で、規則で判定できる条項を増やすのが近道です。 AIの判定を覆した記録を見て、言い切れると分かった条項から規則に移すと、AIに渡す量も、担当が確かめる量も減ります。
05工数削減シミュレーション
導入後 160件 × 6分 ÷ 60 = 16 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- クラウドのインフラを Terraform などの設定ファイルで管理し、変更をプルリクエストで受けている会社。インフラの変更が月に百件以上あり、セキュリティの担当がマージの前に全件を読んでいるが、担当が少なくレビューが滞っている場合。社内のセキュリティ基準が条項として文書になっており、例外の承認の記録が残っている場合。
- インフラの変更が月に数件で、担当が全件を丁寧に読める場合。インフラを管理画面から手で変更しており、設定ファイルで管理していない場合。社内のセキュリティ基準が文書になっておらず、何を指摘するかが担当の判断だけで決まっている場合。なお、マージしてよいかの承認と、基準の例外を認めるかの判断は、この構成では代替できません。
07最小構成で試す方法
- 過去3か月のプルリクエストから20件を選ぶ(担当が差し戻したもの、例外で通したもの、問題が無かったものを混ぜる)
- それぞれの変更の計画のJSONを書き出し、機密の値を伏せる
- 手元のAIサービスの画面に、伏せた計画と、基準の条項と、関係する例外の承認を貼り付ける
- 「変更のあるリソースを、基準の条項ごとに判定してください。判定には必ず条項番号を付け、条項に無い観点での指摘はしないでください。適用するまで決まらない値は、無いものとして扱わないでください」と指示する
- 結果を、当時の担当のレビューと並べる
20件は必ずやってください。 プログラムを組む前に、「条項番号の付いた指摘だけを返せるか」と「after_unknown を誤って読まないか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の差し戻しと同じ指摘が、条項番号付きで出た | プログラムの組み立てに進む |
| 条項に無い一般的な指摘が多い | 指示と、番号の無い指摘を落とす仕掛けで直る。構成は有効 |
| 条項の読み方がばらばら | 基準の条項の書き方を先に見直す。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 機密の値がAIに渡る | 機密の印とパターンの両方で伏せる |
| 適用するまで決まらない値を「無い」と指摘する | after_unknown を見て needs_info にする |
| 条項に無い一般的な指摘が多い | 条項番号の無い指摘をプログラムで落とす |
| 規則とAIで結論が食い違う | 規則で判定した条項をAIに見せない |
| 例外の承認が別のリソースに広がる | 例外を address と期限で持つ |
| AIの誤った指摘でマージが止まる | AIの判定ではチェックを失敗にしない |
| 指摘ごとに投稿して利用の制限にかかる | 1回の実行で1つのレビューにまとめる |
| フォークのプルリクエストで鍵が無く失敗する | 社内のリポジトリだけを対象にする |
| 計画のファイルが成果物として残る | ワークフローの成果物として外に残さない |
| 置き換えの変更を見落とす | actions が delete と create の組なら、レビューの冒頭に示す |
| 基準の一覧と例外の一覧の変更が追えない | 同じリポジトリに置き、変更もプルリクエストで受ける |
上の2行が、この構成の失敗のほとんどです。 どちらも変更の計画のJSONの読み方の問題で、AIの性能ではなく、渡す前の処理で決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: インフラの設定の変更の計画です。ネットワークの構成、権限の設計、保存の場所が、攻撃者にとっての地図になる情報です。
- 機密の値を外へ出さない … 機密の印とパターンの両方で伏せた後の計画だけをAIに渡します
- AIの仕組みに承認の権限を持たせない … レビューは
COMMENTだけで返し、承認もterraform applyもこの仕組みからは行いません - APIの鍵をシークレットで扱う … 鍵はリポジトリのシークレットに置き、フォークからのプルリクエストでは動かない前提で設計します
- 利用するサービスのデータの扱いを確かめる … 生成AIのAPIに送った内容がどう扱われるかを、利用規約とデータの取り扱いの条件で確かめておきます
- この構成はセキュリティの担当の判断を代替しない … マージしてよいか、例外を認めるかは、担当と決められた承認者が判断します
- ログに伏せる前の計画を残さない … 判定のログは、伏せた後の入力と出力だけにします
誤りが起きた場合のリスクは、基準に合わない変更を見落としてマージすることと、機密の値を外へ出すことの2つです。 前者は言い切れる条項を規則で必ず判定し、AIの迷いを needs_info に倒すことで防ぎ、後者は二重の伏せとログの扱いで防ぎます。
10まず何から始めるか
1週目:基準の条項を一覧にする
社内のセキュリティ基準の約40の条項を、条項番号、対象、要件、規則で判定できるかの列を持つ一覧にします。規則で判定できる条項から、規則の書き方を決めます。
2週目:20件で試す
過去のプルリクエストから20件を選び、伏せた計画を手元のAIサービスに貼り付けて判定させます。条項番号の無い指摘が出ないか、after_unknown を誤って読まないかを最優先で見ます。
3週目:計画の書き出しと伏せ、規則の判定を作る
GitHub Actions のワークフローに、計画のJSONの書き出し、機密の値の伏せ、規則の判定を足します。この時点では、判定を担当に送るだけにします。
4週目:例外の一覧を作る
例外の承認を、address と期限の付いた一覧にします。期限切れのものを洗い出し、更新するか廃止するかを決めます。
2か月目: Claude API の判定を足し、担当が判定を覆した割合を条項ごとに数えます。3か月目以降: レビューとして返す形にし、覆された条項を規則に移すか、条項の書き方を直します。AIに渡す条項が減り始め、担当が判定の確認だけで承認できるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
terraform show -json で計画をJSONに書き出せること。resource_changes にリソースごとの address と change が並ぶこと。actions の値(no-op、create、read、update、delete、置き換えの組)。before/after/after_unknown/before_sensitive/after_sensitive の意味。JSONの中で機密の値は伏せられておらず、機密の印と組み合わせて誤って表示しないようにすべきこと | Terraform: JSON Output Format | 2026-10-07 |
pull_request のイベントが既定で opened・synchronize・reopened で動くこと。paths で対象のファイルを絞れること。フォークから動いたワークフローには GITHUB_TOKEN 以外のシークレットが渡されず、GITHUB_TOKEN が読み取りだけになること | GitHub Docs: Events that trigger workflows | 2026-10-07 |
Create a review for a pull request(POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews)の event に APPROVE・REQUEST_CHANGES・COMMENT があること。comments に path・line・body を指定できること。短い間に多く投稿すると二次的な利用の制限にかかることがあること | GitHub Docs: REST API endpoints for pull request reviews | 2026-10-07 |
output_config.format に type: "json_schema" を指定すると返答がスキーマに沿ったJSONになること。enum が使えること。enum の大文字・小文字が保証されず、大文字・小文字を区別せずに比べるよう推奨されていること | Claude Docs: Structured outputs | 2026-10-07 |
マージしてよいかの判断と、基準の例外を認めるかの判断は、社内の決められた担当が行ってください。 本記事は HashiCorp・GitHub・Anthropic の公開している情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0829)についてのご相談はこちらから。
