terraform-complianceの記法サンプル

Azure

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でテストケースを書く際に、少しでも参考になれば幸いです。

ケースは随時更新していきます。

コメント