Policy as Codeでインフラのコンプライアンスを自動実現! 「Pulumi CrossGuard」を活用してみよう

2023年7月4日(火)
大関 研丞 (Kenneth Ozeki)
第5回となる今回は、Policy as Codeの概要を解説し、「Pulumi CrossGuard」を利用してPulumiでリソースを作成する際のポリシーチェック を行うハンズオンを実践していきます。

【ハンズオン】Pulumi CrossGuardによるポリシー適用

ハンズオンの流れ

今回のハンズオンの流れと関連するサービス/リソースの全体像は以下のとおりです。ハンズオン実施前には「事前準備」を行います(後述)。最初はPulumi公式HP記載の手順に沿う形ですが、後半はポリシー設定をカスタマイズしてポリシーチェックの様子を確認します。ポリシーおよびPulumi ProgramはPythonで作成し、AWSリソースをデプロイしていきます。

  1. 新規でポリシーを作成する
  2. 新規でProject/Stack(dev)を作成する
  3. ポリシーの適用を確認する①
  4. ポリシーをカスタマイズする
  5. Programを編集する
  6. ポリシーの適用を確認する②

また、ハンズオン実施時の最終的なディレクトリ構成は以下のようになります。

test-crossguard
├── policypack
│   ├── PulumiPolicy.yaml
│   ├── __main__.py
│   ├── requirements.txt
│   ├── tmp.py
│   └── venv
└── program
    ├── Pulumi.dev.yaml
    ├── Pulumi.yaml
    ├── __main__.py
    ├── __main__.py.before
    ├── requirements.txt
    └── venv

前提

  • ハンズオンを実施する上で必要なAWSのアクセス権限を有する
    • VPC/サブネット/セキュリティグループなど、ひと通りのネットワーク関連のリソースを作成できる権限
    • EC2インスタンスを作成できる権限
  • PCにPythonを導入済み(version 3.7以上)

事前準備

Pulumiを利用したAWSリソースデプロイのハンズオンを実施するには、事前に以下の作業が実施済みである必要があります。前回で事前準備の手順を解説しているので、まだ実施されていない方はそちらをご確認ください。

  • Pulumi CLIのインストール
  • Pulumiアカウント新規作成
  • AWSアカウントへのPulumiアクセス設定

ポリシーの新規作成

Pulumi Program作成前に、ポリシーを準備します。

  1. 作業用ディレクトリを作成し、ディレクトリを移動します。
    $ mkdir test-crossguard && cd test-crossguard
  2. ポリシー用のディレクトリを作成し、ディレクトリを移動します。
    $ mkdir policypack && cd policypack
  3. ポリシーテンプレート生成コマンド「pulumi policy new <テンプレート名>」を実行します。今回はAWSリソースをpythonで作成するため、テンプレート名は「aws-python」のようになります。
    $ pulumi policy new aws-python
    
    Created Policy Pack!
    Installing dependencies...
    
    Creating virtual environment...
    Finished creating virtual environment
    Updating pip, setuptools, and wheel in virtual environment...
    Collecting pip
      Using cached pip-23.1.2-py3-none-any.whl (2.1 MB)
    Collecting setuptools
      Downloading setuptools-68.0.0-py3-none-any.whl (804 kB)
         |████████████████████████████████| 804 kB 2.8 MB/s 
    Collecting wheel
    ~~~
    Your new Policy Pack is ready to go! ✨
    
    Once you're done editing your Policy Pack:
    
       * To run the Policy Pack against a Pulumi program, in the directory of the Pulumi program run `pulumi up --policy-pack /Users/k-ozeki/Desktop/cl-blog/pulumi-cl-blog/20230610-pulumi-crossguard/policypack`
       * To publish the Policy Pack, run `pulumi policy publish [org-name]`
    作成が完了すると、以下のファイルが生成されます。
    $ ls -F
    
    PulumiPolicy.yaml   __main__.py   requirements.txt  venv/
    【参考】ポリシーテンプレートの選択
    Pulumi Projectのテンプレート生成コマンド「pulumi new」と同じように、ポリシーのテンプレート生成もPythonやjavascriptなどの言語と、GCPやAWSなどクラウドプロバイダー/サービスとの組み合わせで多くのポリシーテンプレートが用意されています。テンプレート名が分からない場合は引数を指定せず「pulumi policy new」コマンドを実行すると以下のようにテンプレート一覧が表示されるため、この中から目的のテンプレートを選択できます。
    $ pulumi policy new
    Please choose a template:  [Use arrows to move, type to filter]
      aws-javascript                            A minimal Policy Pack for AWS using JavaScript.
      aws-premium-policies-typescript           A minimal Policy Pack for AWS using Pulumi Premium Policies and TypeScript. (See README.md for installation)
    > aws-python                                A minimal Policy Pack for AWS using Python.
      aws-typescript                            A minimal Policy Pack for AWS using TypeScript.
      awsguard-javascript                       A minimal AWSGuard Policy Pack using JavaScript.
      awsguard-typescript                       A minimal AWSGuard Policy Pack using TypeScript.
      azure-classic-javascript                  A minimal Policy Pack for Azure using JavaScript.
      azure-classic-python                      A minimal Policy Pack for Azure using Python.
      azure-classic-typescript                  A minimal Policy Pack for Azure using TypeScript.
      azure-javascript                          A minimal Policy Pack for Azure using JavaScript.
      azure-premium-policies-typescript         A minimal Policy Pack for Azure using Pulumi Premium Policies and TypeScript. (See README.md for installation)
      azure-python                              A minimal Policy Pack for Azure using Python.
      azure-typescript                          A minimal Policy Pack for Azure using TypeScript.
      gcp-javascript                            A minimal Policy Pack for GCP using JavaScript.
      gcp-python                                A minimal Policy Pack 
    ~~(略)~~
  4. テンプレート生成直後のポリシーコードを確認します。
    $ cat __main__.py
     
    from pulumi_policy import (
        EnforcementLevel,
        PolicyPack,
        ReportViolation,
        ResourceValidationArgs,
        ResourceValidationPolicy,
    )
    
    def s3_no_public_read_validator(args: ResourceValidationArgs, report_violation: ReportViolation):
        if args.resource_type == "aws:s3/bucket:Bucket" and "acl" in args.props:
            acl = args.props["acl"]
            if acl == "public-read" or acl == "public-read-write":
                report_violation(
                    "You cannot set public-read or public-read-write on an S3 bucket. " +
                    "Read more about ACLs here: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html")
    
    s3_no_public_read = ResourceValidationPolicy(
        name="s3-no-public-read",
        description="Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets.",
        validate=s3_no_public_read_validator,
    )
    
    PolicyPack(
        name="aws-python",
        enforcement_level=EnforcementLevel.MANDATORY,
        policies=[
            s3_no_public_read,
        ],
    )
    コードの各パートについて、以下で解説していきます。
    from pulumi_policy import (
        EnforcementLevel,
        PolicyPack,
        ReportViolation,
        ResourceValidationArgs,
        ResourceValidationPolicy,
    )
    ・パッケージimportパートでは、Pulumi Policy SDKがimportされます。コードで利用されるPulumi Policy SDKの詳細はこちらで確認できます。
    def s3_no_public_read_validator(args: ResourceValidationArgs, report_violation: ReportViolation):
        if args.resource_type == "aws:s3/bucket:Bucket" and "acl" in args.props:
            acl = args.props["acl"]
            if acl == "public-read" or acl == "public-read-write":
                report_violation(
                    "You cannot set public-read or public-read-write on an S3 bucket. " +
                    "Read more about ACLs here: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html")
    ・ポリシーチェック対象のリソースtype/propertyの指定と、propertyで具体的にどのような値を取る場合に、どのような違反メッセージを出力(report_violation)するかのvalidator定義部分になります。
    s3_no_public_read = ResourceValidationPolicy(
        name="s3-no-public-read",
        description="Prohibits setting the publicRead or publicReadWrite permission on AWS S3 buckets.",
        validate=s3_no_public_read_validator,
    )
    ・上記であらかじめ設定したvalidatorを用いてPolicyを作成します。Policy nameはPulumi OrganizationまたはPulumi Accountの中で重複しないようにします。
    PolicyPack(
        name="aws-python",
        enforcement_level=EnforcementLevel.MANDATORY,
        policies=[
            s3_no_public_read,
        ],
    )
    ・PolicyPack classでは対象のPolicyとEnforcemenetLavelを指定します。Policyは複数指定できますが、今回は1つのPolicy「s3_no_public_read」のみ指定されています。PolicyPack nameはPulumi OrganizationまたはPulumi Accountの中で重複しないようにします。

コードの構成としてはシンプルで「validatorの作成」「Policyの作成」「PolicyPackの作成」が主になります。今回生成されたテンプレートでは「S3 Bucketがインターネット公開されていないかどうか」のポリシーチェックが行われるコードになります。

著者
大関 研丞 (Kenneth Ozeki)
クリエーションライン株式会社 Data Platform Team
前職では保険や金融エンタープライズのミッションクリティカルシステム(オンプレミス、仮想サーバー、CDN等のインフラ系業務)の設計/構築を経験。クリエーションラインに転職後はクラウドエンジニアとしてGCP関連の案件でインフラの設計/構築、IaCやCI/CDを用いたDevOpsの導入、コンテナ(Kubernetes)基盤の構築、運用自動化ツールの作成などを担当。
クリエーションラインの技術ブログをチェック

連載バックナンバー

システム運用技術解説
第10回

Pulumiの最新機能「Pulumi ESC」を使ってみよう

2023/12/26
最終回となる今回は、2023年12月時点でリリースされている新機能の紹介と、その新機能の中から「Pulumi ESC」を用いたハンズオンを実践していきます。
システム運用技術解説
第9回

TerraformからPulumiへの移行

2023/11/28
第9回となる今回は、既にTerraformでAWS環境に作成されているリソースをPulumiへ移行するケースを想定して、CoexistenceとConversionのハンズオンを実践していきます
システム運用技術解説
第8回

既に存在するリソースをPulumiで管理してみよう

2023/10/19
第8回となる今回は、既にクラウド環境にデプロイされているリソースをPulumiで管理(import)する方法について、ハンズオンで実践していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています