🚨

conftestを使った権限変更のブロックについて

2024/11/14に公開

この記事は、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リソースの権限管理をbigquery.tfに集約する例

ここでは、例としてTerraformでBigQueryリソースの権限管理をbigquery.tfファイルに集約するルールを設定します。このルールにより、権限設定を一元管理することで、予期せぬ変更や誤った権限付与を防ぐことができます。

たとえば、google_bigquery_dataset_iam_memberは特定のBigQueryデータセットにアクセス権限を付与するリソースですが、他にもBigQueryに関連する設定があり、bigquery.tfに集約することで権限管理を効率化できます。

対応の概要

今回の対応は以下の手順で行います。

  1. Regoでポリシーを定義
    BigQueryリソースの設定がbigquery.tf以外に記載されていないことを検証するポリシーを作成します。

  2. 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は非常に有用なツールです。

ぜひ、プロジェクトに取り入れてみてください。

Luup Developers Blog

Discussion