コンテンツにスキップ

Terraform policy for さくらのクラウド


概要

Terraform policy for さくらのクラウド は、Terraform for さくらのクラウドを用いて記述されたTerraformコードを、セキュリティおよびガバナンスの観点から静的にチェックするためのポリシーです。

本ポリシーはRegoで記述されており、OPA(Open Policy Agent)Conftestに依存しています。

利用例

実行環境にOPAとConftestがインストールされていることが前提となります。

ローカル環境での利用

Terraformコードの実装者がローカル環境で実行する方法です。 前述のとおり、ローカル環境にOPAとConftestがインストールされていることが前提となります。

# Run within the Terraform repository that uses the Terraform SakuraCloud provider
$ cd terraform

# Download the policy
$ conftest pull 'git::https://github.com/sacloud/terraform-provider-sakuracloud-policy.git//policy?ref=v1.1.0'

# Run the tests
$ conftest test . --ignore=".git/|.github/|.terraform/"

GitHub Actionsでの利用

GitHub Actions を用いて、CI(継続的インテグレーション)を行う方法です。

name: conftest terraform policy check
on:
  pull_request:
env:
  CONFTEST_VERSION: 0.55.0
jobs:
  test:
    name: policy check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Conftest
        run: |
          mkdir -p $HOME/.local/bin
          echo "$HOME/.local/bin" >> $GITHUB_PATH
          wget -O - 'https://github.com/open-policy-agent/conftest/releases/download/v${{ env.CONFTEST_VERSION }}/conftest_${{ env.CONFTEST_VERSION }}_Linux_x86_64.tar.gz' | tar zxvf - -C $HOME/.local/bin

      - name: Conftest version
        run: conftest -v

      - name: download policy
        run: conftest pull 'git::https://github.com/sacloud/terraform-provider-sakuracloud-policy.git//policy?ref=v1.1.0'

      - name: run test
        run: conftest test . --ignore=".git/|.github/|.terraform/" --data="exception.json"

Exception

ConftestのException機能を利用することで、特定のルールを例外扱いにできます。

Conftestの実行環境には、以下のようなYAML形式のファイルを追加します。このファイルには、例外扱いにしたいルールの名前を列挙します。

exception:
  rule:
    - sakuracloud_disk_not_encrypted

そして、conftest test コマンドで --data オプションを利用し、上記のファイルを読み込みます。

これにより、列挙されたルールが例外となり、failures ではなく exception としてカウントされます。

$ conftest test disk.tf --ignore=".git/|.github/|.terraform/" --data="exception.yml"
EXCP - disk.tf - main - data.main.exception[_][_] == "sakuracloud_disk_not_encrypted"

8 tests, 7 passed, 0 warnings, 0 failures, 1 exception

カスタムポリシー

デフォルトで提供されるポリシーに加えて、ユーザーは独自のポリシーを追加できます。

例えば組織固有のルールを組み込むことで、組織独自のポリシーやガイドラインに準拠しているかチェックできます。

1. カスタムポリシーの作成

カスタムポリシーを記述した .rego ファイルを用意します。ファイルはTerraformコードと同じリポジトリ内で管理することを想定しています。

以下は /custom-policy/sakuracloud_disk_too_small.rego というファイルを作成した例です。

この例では、ディスクサイズが40GB未満の場合にエラーを返すカスタムポリシーを定義しています。

package main

import data.helpers.has_field
import rego.v1

deny_sakuracloud_disk_too_small contains msg if {
    resource := "sakuracloud_disk"
    rule := "sakuracloud_disk_too_small"

    some name
    disk := input.resource[resource][name]
    disk.size < 40

    msg := sprintf(
        "%s\nDisk is too small %s.%s\n",
        [rule, resource, name],
    )
}

2. conftestコマンドでカスタムポリシーを実行

以下のように conftest test コマンドの --policy オプションを利用して、デフォルトのポリシーに加えてカスタムポリシーも適用します。

このコマンドでは、policy/ ディレクトリに配置されたデフォルトポリシーと、custom-policy/ ディレクトリに配置されたカスタムポリシーの両方が適用されます。

$ conftest test disk.tf --ignore=".git/|.github/|.terraform/" --policy="policy/" --policy="custom-policy/"
FAIL - disk.tf - main - sakuracloud_disk_too_small
Disk is too small sakuracloud_disk.fail_disk_1

FAIL - disk.tf - main - sakuracloud_disk_not_encrypted
Disk encryption is not enabled in sakuracloud_disk.fail_disk_1
More Info: https://docs.usacloud.jp/terraform-policy/rules/sakuracloud_disk/not_encrypted/


9 tests, 7 passed, 0 warnings, 2 failures, 0 exceptions