[HCP Terraform]pre-written Sentinel policies for AWS(FSBP)を使ってPolicy Setを作成してみた(sentinel.hclファイル作成パターン)

[HCP Terraform]pre-written Sentinel policies for AWS(FSBP)を使ってPolicy Setを作成してみた(sentinel.hclファイル作成パターン)

Clock Icon2025.06.10

FSBPに対応したPre-written Sentinelポリシーが公開されました。

https://dev.classmethod.jp/articles/terraform-pre-wiritten-sentinel-policy-set-aws-fsbp/

以前のブログではポリシーの利用方法として、直接ポリシーライブラリのGitHubリポジトリに接続する方法を紹介しました。(Using the Public GitHub Repository)

この方法は、簡単な設定ですべてのポリシーを有効化できます。

一方実運用では、ポリシーによっては無効化したりすることがあると思います。

今回はポリシー毎に有効・無効をコントロールできる方法をご紹介します。(Terraform Registry Method)

ポリシー設定ファイルの作成(sentinel.hcl)

[Terraformレジストリ](Terraform Registry)に
アクセスします。

Policiesに移動し必要なポリシーを選択します。

hashicorp_FSBP-Policy-Set-for-AWS-Terraform___Terraform_Registry.png

今回は、以下のポリシーを選択しました。

  • EC2 VPC Flow Logging Enabled(EC2.6)
  • Amazon EC2 instances should not have a public IPv4 address (EC2.9)

ちなみに、どのSecurityHubコントロールと対応しているかは、Terraform Registry上からはPolicy Results(Fail)のメッセージから確認できました。

Cursor_と_hashicorp_FSBP-Policy-Set-for-AWS-Terraform___Terraform_Registry.png

Code Snippetが表示されるため、Copy Code Snippetを選択してコピーします。

ポリシー用に新規作成したリポジトリまたは、既存のリポジトリにsentinel.hclという名前で保存します。

sentinel.hcl
policy "ec2-instance-should-not-have-public-ip" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy/ec2-instance-should-not-have-public-ip.sentinel?checksum=sha256:14261273828ea26ed043bf97bd7fa4617770d181b0890812014f719f065aeab8"
  enforcement_level = "advisory"
}

policy "ec2-vpc-flow-logging-enabled" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy/ec2-vpc-flow-logging-enabled.sentinel?checksum=sha256:42f2c8ae190e793a0b9fef9ed027faab91e31ac3288cfdb103ec34dffcb22c24"
  enforcement_level = "advisory"
}

module "report" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy-module/report.sentinel?checksum=sha256:1f414f31c2d6f7e4c3f61b2bc7c25079ea9d5dd985d865c01ce9470152fa696d"
}

module "tfresources" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy-module/tfresources.sentinel?checksum=sha256:ae40fe0173a1d6203c5c062045432d46beb6397a769d65189d1ec80228ef2161"
}

module "tfplan-functions" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy-module/tfplan-functions.sentinel?checksum=sha256:e7f04948ec53d7c01ff26829c1ef7079fb072ed5074483f94dd3d00ae5bb67b3"
}

module "tfconfig-functions" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy-module/tfconfig-functions.sentinel?checksum=sha256:ee1c5baf3c2f6b032ea348ce38f0a93d54b6e5337bade1386fffb185e2599b5b"
}

4つのmodule の部分は、ポリシーチェックに必要な定型文という認識で一旦大丈夫です。

policy部分についてです。

source部分のURLにアクセスすると、Policyの内容が確認できます。

enforcement_levelは、以下3つのいずれかを設定できます。

  • advisory: 警告のみ。ポリシーが失敗してもApply可能。
  • soft-mandatory: ポリシーが失敗時にApplyできない。結果を上書きして、Apply可能。
  • hard-mandatory: ポリシー失敗時にApplyできない。(上書き不可)

Enforcement Levels | Sentinel | HashiCorp Developer

デフォルトは、advisoryが設定されます。

これはポリシー毎に設定可能です。

例えば、重要度 Highのものはhard-mandatory Mediumはsoft-mandatoryのように重要度毎にレベルを分けることが可能です。

今回は、ec2-instance-should-not-have-public-ipsoft-mandatoryに変更してみました。

sentinel.hcl
policy "ec2-instance-should-not-have-public-ip" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy/ec2-instance-should-not-have-public-ip.sentinel?checksum=sha256:14261273828ea26ed043bf97bd7fa4617770d181b0890812014f719f065aeab8"
+  enforcement_level = "soft-mandatory"
-  enforcement_level = "advisory"
}

policy "ec2-vpc-flow-logging-enabled" {
  source = "https://registry.terraform.io/v2/policies/hashicorp/FSBP-Policy-Set-for-AWS-Terraform/1.0.2/policy/ec2-vpc-flow-logging-enabled.sentinel?checksum=sha256:42f2c8ae190e793a0b9fef9ed027faab91e31ac3288cfdb103ec34dffcb22c24"
  enforcement_level = "advisory"
}

Policy Setの作成

HCP TerraformでPolicy Setを作成します。

Settings -> Policy Sets -> Connect a new policy setの順に選択します。

Policy_Sets___classmethod-sandbox___HCP_Terraform.png

Version control provider(VCS)を選択します。

Policy Setの名前や適用範囲・実行方法を指定できます。

適用範囲はOrganizations全体 or Project・Workspaceを選択する形で設定できます。

特定のWorkspaceを適用から除外することも可能です。(Project単位の除外は、2025/6時点では不可)

Connect_a_policy_set___Policy_set___classmethod-sandbox___HCP_Terraform.png

接続先のVCSレポジトリを設定します。このリポジトリには、sentinel.hclが含まれている必要があります。

Connect_a_policy_set___Policy_set___classmethod-sandbox___HCP_Terraform.png

sentinel.hclがリポジトリのルート以外にある場合は、パスを指定します。(私の環境では、sentinel-pre-written-fsbp/sentinel.hclとなっています。)

Connect_a_policy_set___Policy_set___classmethod-sandbox___HCP_Terraform.png

Parametersは今回は使わないため、設定なしでConnect policy setを選択します。

Connect_a_policy_set___Policy_set___classmethod-sandbox___HCP_Terraform.png

これでPolicy Setの作成は完了です。

動作確認

ポリシーを適用したProject内のWorkspaceでRunを行いました。

soft-mandatoryにしたec2-instance-should-not-have-public-ipでポリシーチェックが失敗していますね。

run-VycNf3nqPpsBkkmD___Runs___classmethod-sandbox___HCP_Terraform.png

advisoryec2-vpc-flow-logging-enabledがでていることも確認できました。

run-VycNf3nqPpsBkkmD___Runs___classmethod-sandbox___HCP_Terraform.png

soft-mandatoryを設定しているため、下の方にPolicy Overrideが表示されています。

Override & continueを選べば、Applyが可能です。

ポリシーチェック失敗時にApply不可にするには、ポリシーの適用レベルでhard-mandatoryを設定します。

おわりに

Pre-written Sentinelポリシーを使って、自分でsentinel.hcl ファイルを書いてポリシーを適用してみました。

以下の流れでポリシーを適用できます。

  1. Terraform Registryからポリシーを選択(コピペでOK)
  2. sentinel.hclを作成してVCSに保存(必要に応じて、ポリシーの適用レベルを変更)
  3. HCP TerraformでPolicy Setを作成して、Workspaceに適用

Pre-writtenのようにPolicyライブラリで公開されているポリシーを使う分には設定ファイルはコピペで作れれます。利用するのに、Sentinelの知識はほぼ不要です。

「ポリシーの利用って意外と簡単そう」と思っていただけたら幸いです。

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.