命名規則やタグ、暗号化、公開防止といった組織ルールは、レビューコメントで守らせるには限界があります。Policy as Codeでルールをコード化し、CIで機械的に止める設計を、代表的な3系統のツールに沿って整理します。

01なぜ「レビューで守らせる」が限界なのか

大手SIerやエンタープライズの現場では、命名規則、タグの必須付与、S3バケットの暗号化、セキュリティグループの全開放禁止といった「組織のお作法」が設計標準として定められています。問題は、その遵守をどう担保するかです。多くの現場ではプルリクエストのレビューコメントに頼っていますが、レビュアーの負荷が高く、見落としが起き、担当者が変わると運用が形骸化します。人間の注意力に依存した統制は、規模が大きくなるほど破綻します。

Policy as Code(PaC)は、この「お作法」を実行可能なコードとして記述し、CIパイプラインで機械的に検査する考え方です。ルールがコードになることで、レビューは「ポリシーそのものの妥当性」に集中でき、個別のプルリクは自動で判定されます。人が判断する領域と機械が判定する領域を分ける——これがPaCの本質です。本記事では、IaC(Infrastructure as Code)にガードレールを敷く代表的な3系統、OPA/ConftestHashiCorp SentinelCheckov/tfsecを、実務での使い分けとともに整理します。

現場のコツ:PaCの導入は「全ルールを一気にhard-mandatoryにする」と必ず炎上します。まずは警告のみで既存資産の違反件数を可視化し、棚卸ししてから段階的に強制する。この順序を守るだけで、開発チームの抵抗は大きく減ります。

022つの検査ポイント — planを見るか、コードを見るか

IaCのポリシー検査には、大きく2つのアプローチがあります。1つはTerraformのplan結果(実行計画)を検査する方式。もう1つはソースコード(.tfやYAML)そのものを静的解析する方式です。この違いを理解しておくと、ツール選定で迷いません。

両者は排他ではなく、組み合わせるのが実務の定石です。静的解析でセキュリティのベースラインを広く浅く押さえ、plan検査で組織固有のルール(このアカウントではこのタグ必須、この命名でなければ拒否)を精密に効かせる。以降、それぞれを見ていきます。

CIパイプラインにおける2つの検査ポイント 開発者が .tf を push 静的解析 Checkov / tfsec .tf を直接パース 既知ミス設定を検出 terraform plan → JSON 化 plan 検査 OPA / Sentinel 未来の姿を評価 組織固有ルール 合格なら apply 違反ならCIを停止
図:静的解析でベースラインを、plan検査で組織固有ルールを効かせる二段構え。どちらも合格して初めてapplyに進む。

03OPA / Conftest — Regoで組織ルールを書く

Open Policy Agent(OPA)はCNCF卒業プロジェクトの汎用ポリシーエンジンで、Regoという専用言語でルールを記述します。特定ベンダーに縛られず、Kubernetesのマニフェスト、Terraformのplan、Dockerfileなど構造化データなら何でも評価できるのが最大の強みです。マルチクラウド・マルチツールの統制を1つのエンジンで貫きたいエンタープライズに向いています。

Terraformとの連携は、公式ドキュメントで示された手順が定石です。terraform plan -out=tfplan.binaryで計画を出し、terraform show -json tfplan.binary > tfplan.jsonでJSON化します。このJSONの.resource_changes配列に、各リソースのaddresstypechange.actions(create/update/delete)・change.after(適用後の姿)が入っており、ここをRegoで評価します。評価はopa exec --decision terraform/analysis/authz --bundle policy/ tfplan.jsonのように実行します。

実務では、OPAを直接叩くよりConftestを使うのが手軽です。ConftestはOPAをラップしたCLIで、conftest test tfplan.jsonの一行で、policy/ディレクトリ配下のRegoポリシー(denyviolationwarnルール)に対してファイルを検査します。JSON・YAML・HCL・Dockerfileなど幅広いフォーマットを直接パースできるため、「タグが付いていないリソースをdenyする」「暗号化されていないS3をdenyする」といった組織ルールを、宣言的に積み上げられます。

現場のコツ:Regoは慣れが要る言語です。最初から複雑な集合演算を書こうとせず、「特定typeのリソースをループし、特定フィールドが存在しなければdeny」という単純パターンをテンプレ化して横展開するのが立ち上げの近道です。ポリシー自体にもテスト(opa test)を書いておくと、ルール改修時のデグレを防げます。

04HashiCorp Sentinel — 3段階の強制レベルという発明

HashiCorp Sentinelは、HCP Terraform(旧Terraform Cloud)およびTerraform Enterpriseに統合されたポリシーエンジンです。OSSのOPAと違い商用製品側の機能ですが、Terraformワークフローとの密結合、そして強制レベル(enforcement levels)という設計思想が実務で効きます。Sentinelはplanとapplyの間でポリシーを評価し、公式ドキュメントで定義された3段階の強制レベルを持ちます。

この3段階が優れているのは、同じポリシーコードを、配置時の設定だけで強制強度を変えられる点です。強制レベルはポリシー本体ではなくsentinel.hclで指定するため、「まずadvisoryで様子を見て、棚卸しが済んだらsoft-mandatoryへ、定着したらhard-mandatoryへ」という段階的な締め上げを、コードを書き換えずに運用で回せます。前述の「一気に強制すると炎上する」問題への、製品としての回答がここにあります。

05Checkov / tfsec — 数百ルールで即座にベースラインを敷く

CheckovはBridgecrew(現Palo Alto Networks)開発のOSS静的解析ツールです。Terraform・Terraform plan・CloudFormation・Kubernetes・Helm・ARMテンプレート・OpenTofuなどを対象に、CIS・PCI DSS・HIPAA・SOC2といったコンプライアンス基準に沿った数百のビルトインポリシーが最初から入っています。checkov -d .とディレクトリを指定するだけで、その場でミス設定が一覧化される即効性が魅力です。

Checkovの技術的な強みはグラフベース解析です。リソースを単体で見るのではなく、リソース間の関係をグラフとして構築するため、「S3バケット自体はprivate設定だが、アカウントレベルのパブリックアクセスブロックが欠けている」といった、単純なパターンマッチでは見逃す複合的な問題を検出できます。カスタムポリシーはPythonまたはYAMLで記述でき(Regoには非対応)、YAMLはリソース間の接続状態やAND/OR条件、Pythonは属性の状態チェックに向くという分担で、組織固有ルールの追加にも対応します。

tfsecはAqua Security製のTerraform特化スキャナで、HCLをネイティブに理解し変数参照やモジュール構造を追える点が評価されてきました。ただし重要な注意点として、Aqua Securityは2023年(公式アナウンスは2023年2月18日)にtfsecのチェックライブラリをTrivyファミリーに統合し、以降tfsec単体は新規チェックが追加されない保守モードに移行しています。新規採用ならTrivyのIaCスキャン機能を選ぶのが妥当です。ツールの現行サポート状況やライセンスは移り変わるため、採用前に公式で要確認としてください。

現場のコツ:Checkovを既存の大規模リポジトリに初投入すると、違反が数百件出て「全部は直せない」と手が止まりがちです。--soft-failで最初はCIを落とさず件数だけ計測し、重大度の高いものから潰す。そして.checkov.yamlで正当な例外はスキップIDを明記して抑制し、抑制理由をコメントで残す運用にすると、ノイズと本当の違反を切り分けられます。

06CIへの組み込み — 「止める」を仕組みにする

PaCは、CIパイプラインに組み込んで初めて価値を出します。ローカルで気が向いたときに走らせるだけでは、結局レビュー依存と変わりません。GitHub Actions・GitLab CI・Jenkins・Azure DevOpsいずれでも、プルリク時にポリシー検査ジョブを走らせ、違反があれば非ゼロの終了コードでCIを失敗させるのが基本形です。Checkov・Conftest・tfsecはいずれも違反時に非ゼロを返すため、ブランチ保護ルールと組み合わせればマージそのものを物理的にブロックできます。

組み込みの順序にはコツがあります。いきなりCIを赤くすると開発が止まるため、まずはPR上にコメントとして違反を可視化する非ブロッキング運用から始め、チームがルールに慣れた段階でマージブロックへ昇格させます。これはSentinelのadvisory→mandatoryと同じ発想で、ツールを問わず通用する導入プロトコルです。IaC向けCI/CDパイプラインの設計の中に、このポリシー検査ステージを組み込む形が実務では自然です。

DORA(State of DevOps)の継続的な調査でも、変更を小さく頻繁に、かつ自動化されたチェックを通して進めるチームほど、デプロイの安定性とスピードを両立できることが繰り返し示されています。ポリシー検査を人手のゲートではなくパイプラインの自動チェックに埋め込むことは、この知見に沿った投資です。

07SCPとの役割分担 — 予防ガードレールの二層構造

AWSを使う現場では、「Policy as Codeとマルチアカウント統制のSCP(Service Control Policy)は何が違うのか」という問いが必ず出ます。結論から言えば、両者は競合せず異なる層で働く予防ガードレールです。役割を混同すると、片方に穴が空きます。

実務では両方を敷きます。PaCで開発者体験を損なわず早期に矯正し、SCPで「万一すり抜けても組織としては絶対に許さない一線」を守る。例えば「特定リージョン以外でのリソース作成禁止」はSCPで最終防壁を張りつつ、PaCで開発段階から警告して手戻りを減らす、といった二層構造が堅牢です。SCPの具体的な組み方はOrganizations SCPによるガードレール設計で扱っています。

08ツールの使い分け — 現場への落とし込み

3系統を並べると迷いますが、選定軸はシンプルです。まずCheckov(またはTrivy)で無償・即時にセキュリティのベースラインを敷く——これはどの現場でも損がありません。次に、組織固有の複雑なルール(このアカウント/この命名/このタグ組み合わせでなければ拒否、といった文脈依存の判定)が必要になったら、plan検査型を足します。ここでHCP Terraform/Enterpriseを既に使っているならSentinelの強制レベルが噛み合い、マルチクラウドやKubernetesまで含めて1つのエンジンで統制したいならOPA/Conftestが適します。

どのツールを選ぶにせよ、成否を分けるのは技術選定より導入プロトコルです。警告から始め、違反を可視化し、棚卸しし、段階的に強制へ昇格する——この順序を守れば、開発チームを敵に回さずにガードレールを定着させられます。私たちは導入事例でも、この「手が動かせる」粒度での設計・実装支援を重ねてきました。設計標準そのものの考え方はクラウド設計ガイドラインとあわせてご覧ください。

まとめ

Policy as Codeは、レビュー依存で形骸化しがちな組織の「お作法」を、CIで機械的に止める仕組みに変えます。Checkov/tfsec(Trivy)で静的解析のベースラインを広く敷き、OPA/ConftestやSentinelでplanを検査して組織固有ルールを精密に効かせ、AWSではSCPを実行時の最終防壁として二層で併用する。技術以上に効くのは、advisoryから始めて段階的に強制へ昇格する導入プロトコルです。海外で確立したこの考え方を、日本のエンタープライズの承認フローと運用文化に馴染む形で落とし込むことが、定着の鍵になります。

参考(一次情報)

Policy as Codeの導入設計やCIパイプラインへの組み込みでお困りの際は、お問い合わせください。現場の運用に落ちる粒度で伴走します。

相談する
← ブログ一覧へ戻る