はじめに
前回はPulumiのSecurityについて解説しました。今回は、前回で少し触れたPulumi Policy as Codeのポリシーエンジンとなる「Pulumi CrossGuard」について解説していきます。後半のハンズオンでは、「Pulumi CrossGuard」を利用して実際にPulumiでリソースを作成する際のポリシーチェックの様子を確認していきます。
Policy as Codeについて
そもそも、Policy as Codeとはなんでしょうか? まず、その概要を少しおさらいします。
Policy as Codeの概要
一般的に、Policy as Code(PaC)とはインフラストラクチャやアプリケーションのあるべき姿をあらかじめコードとしてポリシー定義し、インフラストラクチャデプロイ時などにポリシーチェックを実施するアプローチです。「AWS S3にインターネット公開の設定を持たせないようにしたい」「スペックの高すぎるインスタンスを作らせたくない」「リソースの名前にある特定の文字を含めるようにしたい」場合など、通常はリソース作成前に目視で設定内容を精査しますが、これをコードで自動的にチェックできるようにするのがPaCの考え方です。
アプリケーションやインフラストラクチャから、PaCによるポリシーチェック機能を切り離してアーキテクチャを考えることができます。第1回でも説明したInfrastructure as Codeと同様に、ポリシーもコードとして定義するため、ソフトウェアエンジニアリングでお馴染みのGitなどによるバージョン管理、CI/CDの活用、レビュー手法の導入など、DevOpsとの親和性も高いです。
Policy as Codeの代表的なポリシーエンジン
年々Policy as Code(PaC)の注目度が高まってきている中、本記事を執筆している現在(2023年6月時点)までの代表的なPaCのポリシーエンジンとして、例えば以下のものが挙げられます。
- Open Policy Agent(OPA)
クラウドネイティブ環境でのPaCのための汎用的なオープンソースソフトウェアです。コードを定義するための宣言型言語(Rego)と、ポリシーの評価を行うAPIを提供しています。汎用的なポリシーエンジンだけあって、Kubernetes、Docker、LinuxやAWSなどのクラウドプロバイダーでも利用できます。
- Terraform Policy as Code(Sentinel)
HashiCorp社が提供するオープンソースのIaCツール「Terraform」のSaaS「Terraform Cloud」で有料プランとしてPolicy as Codeの機能が提供されています。HCLで記述したtfファイルについて、Policy as Codeを使用してリソースの作成や変更に対する制約やガイドラインを定義できます。元々HashiCorp社が提供するPaCフレームワーク「Sentinel」と組み合わせて利用されます。
- Kubernetes Pod Security Admission
Kubernetesクラスタ内でのPodのポリシーをチェックするためのツールです。Pod Security Standardsに基づいてPodのSecurityContextを自動チェックします。
- Pulumi CrossGuard
Pulumi CrossGuardはPulumiの一部として提供されるポリシーエンジンでオープンソースとして提供されており、Pulumi独自のポリシーエンジンです。CrossGuardを使用することでPulumiのプロジェクトにポリシーチェックを実行し、リソースの作成や変更に対するポリシーの遵守を確保できます。
以上のように、コンテナ/サーバ/クラウドプロバイダー/IaCツールなど、様々な場面でそれぞれ活用できるポリシーエンジンが存在することから、PaCに対する注目度の高さが伺えます。
Pulumi CrossGuardについて
Pulumi CrossGuardの概要
前述の通り、Pulumi CrossGuardはPulumiが提供するポリシーエンジンで、Pulumiでリソース作成前のプレビュー時(pulumi preview)およびアップデート時(pulumi up)に自動的にポリシーをチェックする機能です。
Pulumiでは、ポリシー設定の1単位を「Policy」と呼び、Policyの集合を「Policy Pack」と定義しています。ポリシー違反時のアクションは「Enforcement Level」と呼ばれ、「Disabled(何もしない)」「Advisory(違反メッセージのみ出力)」「Mandatory(デプロイブロック)」の3つが選択できます。最終的に、Enforcement LevelとPolicy Packを組み合わせてポリシーチェックが行われます。
PulumiのPolicy as CodeはPolicy PackとEnforcement Levelの組み合わせ
Pulumi CrossGuardのポリシーチェックには2通りの方法があり、ポリシーをあらかじめPulumi Cloud(SaaS)に用意する方法と、ローカル環境に用意する方法があります。Pulumi Cloud側でポリシーを用意してポリシーチェックしたい場合は、Pulumiの有償プラン「Business Critical」に加入する必要がありますが、ローカル環境で用意したポリシーの設定を利用してポリシーチェックを実施したい場合は無料で利用できます。
Pulumi Cloud側 ポリシー設定
01 | $ pulumi preview --policy-pack ../policypack |
02 | Previewing update (dev) |
07 | + pulumi:pulumi:Stack test-program-cl-dev create 1 error |
08 | + └─ aws:s3:Bucket my-bucket create |
12 | pulumi:pulumi:Stack (test-program-cl-dev): |
16 | [mandatory] aws-python v0.0.1 s3-no-public-read (aws:s3/bucket:Bucket: my-bucket) |
17 | Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets. |
21 | bucket_name: output<string> |
【ローカル環境で用意したポリシーを利用している様子】
ポリシー自体の言語は現在(2023年6月時点)、TypeScript/JavaScript/PythonがStableで利用でき、Open Policy Agent(OPA)はPreviewとなっています。公式ではポリシーのサンプルファイルがAWS/GCPなどの各クラウドプロバイダー、およびJavaScript/Pythonなどの言語でそれぞれこちらに用意されているので、参考にしてください。
また、CrossGuardではユーザ自らがポリシーを用意しますが、AWSのためのポリシーチェックのベストプラクティスに基づいてあらかじめ用意されたポリシーのセットがオープンソースライブラリとして利用できます(AWSGuard)。まだpreview版ですが、気になる方はぜひ触ってみてください。なお、AWSGuard利用にはNode.jsのインストールが必要になります。
Pulumi CrossGuardポリシーチェックイメージ
Pulumi CrossGuardによるポリシーチェックは、下図のようなイメージになります。前述の通り、ローカル環境でポリシーを用意するか、Pulumi Cloudで用意するかで少し作業手順は異なります。
・ローカル環境のポリシーチェック
無料プランを含め、Pulumiの全プランで利用できる方法です。Pulumi CLIを実行するローカル環境にあらかじめポリシーのコードを用意し、実際にリソース作成のコマンド(pulumi up)やプレビュー(pulumi preview)を実行する際にポリシーを格納するディレクトリのパスを指定してポリシーチェックを行います。ポリシーに違反したリソースがある場合は、コマンド実行環境のCLIに違反内容が標準出力されます(Enforcement Levelが「Advisory」「Mandatory」の場合)
ローカル環境におけるポリシーチェックイメージ
・Pulumi Cloud (SaaS)のポリシーチェック
Pulumiの有償プラン「Business Critical」でのみ利用できる方法です。ポリシーの設定(Policy Pack)自体はPulumi Cloudで保持されますが、事前にポリシーのコードをローカル環境に用意して、「pulumi policy publish」コマンドでPulumi Cloudにポリシー設定を一度pushする必要があります。どのポリシーをどのPulumi Stackに、どのEnforcement Levelで適用するかの設定も、あらかじめ「Policy Group」として定義しますが、Policy Groupの定義はPulumi CloudのGUIコンソール画面か、またはPulumi CLIから実行できます。
Policy Groupを適切に設定したら、あとは通常通りリソース作成コマンド(pulumi up)を実行すれば、ポリシーのチェックが自動的に行われます。ポリシーに違反したリソースがある場合は、コマンド実行環境のCLIに違反内容が標準出力され、かつPulumi CloudのStack更新履歴にもその違反内容が記録されます。
Pulumi Cloudにおけるポリシーチェックイメージ
Business Criticalでのみ利用可能なPulumi Cloudでのポリシーチェックは、無料プランのローカル環境のポリシーチェックと比較して、以下の点が優れていると言えます。
- ポリシー設定と適用対象のStackとの紐付けを「Policy Group」として定義するため管理がしやすい
- あらかじめPolicy Groupを定義しなくても、全てのStackにデフォルトでポリシーチェックをが行うPolicy Group「default-policy-group」がPulumiで事前に用意されている(最初はdefault-policy-groupのポリシー設定(Policy Pack)は空だが、全てのStackが自動的にdefault-policy-groupに紐付けられる)
- ポリシーに違反したリソースの更新履歴がPulumi Cloudで保管され、閲覧できる
Pulumiが事前に用意するPolicy Group「default-policy-group」
Pulumi Cloudでのポリシーチェックについて気になる方は、有償プランの2週間トライアルが用意されているため、ぜひ試してみてください。以降のハンズオンでは無料プランでも利用できるローカル環境のポリシーチェックを実践していきますので、ご心配なく。