conftestを使った権限変更のブロックについて
この記事は、LUUPのTVCM放映に合わせた一足早い「Luup Developers Advent Calendar 2024」の14日目の記事です。
こんにちは、SREチームの髙橋です。
今回は、RegoとConftestで実現するTerraformのポリシーチェック自動化についてご紹介します。
はじめに
インフラコードの管理において、適切な権限管理とポリシーの徹底はセキュリティーを守る上で非常に重要です。そこで、柔軟なポリシー定義ができるRegoと、自動テストを行うConftestを用いることで、コードに対する一貫したポリシーチェックを実現できます。
今回の記事では、RegoとConftestを使って、コード変更時に不適切な設定が含まれていないかを検出する仕組みを紹介します。例として、BigQueryリソースの権限管理をbigquery.tf
ファイルに集約するルールを設定し、このルールを確実に守るためのポリシーをRegoで定義し、GitHub ActionsでConftestを使って自動チェックする流れを解説します。
RegoとConftestについて
Regoは、Open Policy Agent(OPA)で利用されるポリシー定義言語です。インフラやアクセス管理のルールを柔軟に記述できます。これにより、さまざまなリソースに対して統一されたポリシーを適用しやすくなります。
Conftestは、このRegoポリシーを使ってコードや構成ファイルに対するテストを行うためのCLIツールです。GitHub Actionsと組み合わせて実行することで、コードがプッシュされるたびに自動でポリシーチェックが可能になり、設定ミスや権限の誤付与を早期に検出できます。
bigquery.tf
に集約する例
BigQueryリソースの権限管理をここでは、例としてTerraformでBigQueryリソースの権限管理をbigquery.tf
ファイルに集約するルールを設定します。このルールにより、権限設定を一元管理することで、予期せぬ変更や誤った権限付与を防ぐことができます。
たとえば、google_bigquery_dataset_iam_memberは特定のBigQueryデータセットにアクセス権限を付与するリソースですが、他にもBigQueryに関連する設定があり、bigquery.tf
に集約することで権限管理を効率化できます。
対応の概要
今回の対応は以下の手順で行います。
-
Regoでポリシーを定義
BigQueryリソースの設定がbigquery.tf
以外に記載されていないことを検証するポリシーを作成します。 -
ConftestでポリシーをGitHub Actionsに組み込む
Conftestを使ってポリシーチェックをCIパイプラインの一部として実行し、条件を満たしていない場合にエラーを返すようにします。
Regoポリシーの作成
まず、BigQueryの設定がbigquery.tf
ファイル以外に記述されたらエラーを返すRegoポリシーを、policies/terraform/google_cloud/bigquery/dataset.rego
に定義します。このポリシーは、後述するGitHub Actions内のConftestで参照されます。
次のコードは、policies/terraform/google_cloud/bigquery/dataset.rego
に記述するポリシーの例です。
package policies
import rego.v1
# Deny if google_bigquery_dataset_iam_member exists outside of bigquery.tf
deny contains msg if {
some _ in input.resource.google_bigquery_dataset_iam_member
msg := "The google_bigquery_dataset_iam_member resource is not allowed. It should only be defined in bigquery.tf."
}
このポリシーは、google_bigquery_dataset_iam_member
リソースが見つかるとエラーメッセージを返します。bigquery.tf
以外のファイルで設定された場合には、このポリシーがトリガーされ、GitHub Actionsでエラーとして検出される仕組みです。
ConftestをGitHub Actionsに組み込む
次に、GitHub Actions内でRegoポリシーを実行するために、Conftestを組み込みます。policies/terraform/google_cloud/bigquery/dataset.rego
に定義したポリシーを読み込み、bigquery.tf
を除外して他のファイルでのgoogle_bigquery_dataset_iam_member
をチェックします。
name: Conftest
on:
pull_request:
branches: [main]
env:
CONFTEST_VERSION: 0.55.0
jobs:
conftest:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install conftest
run: |
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 -
./conftest --version
- name: Check google_bigquery_dataset_iam_member
run: |
./conftest test terraform/gcp/ --policy policies/terraform/google_cloud/bigquery/dataset.rego --ignore=".*bigquery.tf" || exit 1
上記の設定により、bigquery.tf
ファイル以外でgoogle_bigquery_dataset_iam_member
リソースが見つかった場合、Conftestがエラーメッセージを出力し、GitHub Actionsが失敗するようになります。
ルールを満たしていない場合、下記のようなエラーがGitHub Actionsで出力されます。
FAIL - terraform/gcp/user_account/iam_user.tf - policies - The google_bigquery_dataset_iam_member resource is not allowed. It should only be defined in bigquery.tf.
まとめ
RegoとConftestを使うことで、Terraformコードに対して柔軟なポリシーチェックを実装し、BigQueryリソースの誤設定を自動的に検出・防止する運用を実現しました。GitHub Actionsと連携させることで、プルリクエストの段階で設定の誤りを防ぐことができ、セキュリティー管理の一貫性が保たれます。
インフラ構成の自動テストやセキュリティーポリシーの徹底において、RegoとConftestは非常に有用なツールです。
ぜひ、プロジェクトに取り入れてみてください。
Discussion