terraform-complianceを利用することで、terraformで作成するリソースが社内のセキュリティポリシーに準拠しているかどうかを確認することができます。「リージョンは東日本のみ」、「NSGのインバウンドは社内LANのみに制限する」などの条件を予めterraform-complianceを用いて作成し、デプロイ前にterraformコードをチェックします。
terraform-complianceでは順守させたいポリシーをBBD形式で記述します。そのためテストケース(ここでは順守させたいポリシーのこと)を自然言語で記述します。
自然言語で書けるとは言え、もちろんルールがあります。私はBBDの経験がなかったっため、ちょっとしたテストケースを書くにも苦労しました。そのため備忘録もかねて、実際に作成したテストケースをまとめていきます。
ちなみにチェックする対象のterraformコードはAzureリソースを作成するものになります。
terraform-complianceサンプル
複数のリソースで共通のプロパティ値の評価
デプロイ先が東日本であるかのテストケースです。
locationは様々なAzureリソースで必要なプロパティですがすべてのリソースで必要ではありません。そのためGivenでlocationがサポートされているものだけに対してチェックをかけています。
resource "azurerm_cosmosdb_account" "this" {
location = "japaneast"
name = "cosmos-test"
(略)
}
Feature: Test location
Scenario: Location is japaneast
Given I have resource that supports location defined
Then it must contain "location"
And its value must be "japaneast"
特定のリソースのプロパティ値を評価
以下は、Azure Functionsの設定でHTTPS Onlyになっているかを確認するテストケースです。
Azure Functionsの設定値を確認するテストなので、Givenで対象をAzure Functiosnに絞っています。
resource "azurerm_windows_function_app" "this" {
name = "func-test"
https_only = true
(略)
}
Feature: App Service and Functions general settings
Scenario: All HTTP traffic must be secured
Given I have azurerm_windows_function_app defined
Then its enable_https_traffic_only must be true
ネストしたプロパティ値の評価
先ほどは検査対象のプロパティがリソース直下にありましたが、今回は階層が1つ深くなった時のパターンです。そのため、「azurerm_windows_function_app>site_config>minimum_tls_version」の順番でたどっていくことで、最終的に「minimum_tls_version」の値を評価します。
resource "azurerm_windows_function_app" "this" {
name = "func-test"
site_config {
minimum_tls_version = 1.2
}
(略)
}
Feature: App Service and Functions general settings
Scenario: TLS must be 1.2
Given I have azurerm_windows_function_app defined
When it has site_config
Then it must have minimum_tls_version
And its value must be 1.2
表形式で複数のプロパティ値を評価
表形式でkeyとvalueを記載することで、1つのテストケースで複数の値を同時にチェックできます。下記の例だと3つの値を同時に評価します。1つでも違う場合は失敗となります。
表形式の場合は、「Senario」ではなく「Senario Outline」になります。ThenディレクティブやAndの<key>、<value>と表のヘッダーのkey、valueの文字列は一致していれば任意の文字列で大丈夫です。
resource "azurerm_storage_account" "this" {
name = "sttest"
enable_https_traffic_only = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
(略)
}
Feature: Azure Storage Account
Scenario Outline: Storage Account security settings
Given I have azurerm_storage_account defined
Then it must have <key>
And its value must be <value>
Examples:
| key | value |
| enable_https_traffic_only | true |
| min_tls_version | TLS1_2 |
| allow_nested_items_to_be_public | false |
ネストしたプロパティの複数同時評価
2階層深い複数のプロパティ値を1つのテストケースで評価するパターンです。Whenディレクティブを2回使用して2階層目まで進み(application_stack)、そこでkey-value形式で複数のプロパティ値を評価します。
resource "azurerm_windows_function_app" "this" {
name = "func-test"
site_config {
application_stack {
dotnet_version = "v6.0"
use_dotnet_isolated_runtime = true
}
}
(略)
}
Feature: App Service and Functions general settings
Scenario Outline: dotnet version is 6.0 and isolated mode
Given I have azurerm_windows_function_app defined
When it has site_config
When it has application_stack
Then it must have <key>
And its value must be <value>
Examples:
| key | value |
| dotnet_version | v6.0 |
| use_dotnet_isolated_runtime | true |
最後に
私自身の備忘録として記載しましたが、皆さんもterraform-complianceでテストケースを書く際に、少しでも参考になれば幸いです。
ケースは随時更新していきます。
コメント