🍷

Cloud Custodianを使ってみた

2022/09/13に公開

Cloud Custodianとは

パブリッククラウドのアカウントとリソースを管理するためのルールエンジンです。これにより、ユーザはポリシーを定義して、安全でコストが最適化された、適切に管理されたクラウドインフラストラクチャを実現できます。
一般的には、CSPM(Cloud Security Posture Management)と呼ばれるツールとなります。
Cloud Custodian

インストール

Linux、Windows、Dockerなどにインストール可能です。ここでは、MacOSにインストールします。

$ python3 -m venv custodian
$ source custodian/bin/activate

AWS用のパッケージをインストールします。

$ pip install c7n

Azure, GCP用も同じくインストールします。

$ pip install c7n_azure
$ pip install c7n_gcp

これでインストールは完了です。

ポリシーを作る

実行するポリシーを作ってみます。デフォルでSecurityHubのセキュリティ基準のようなコントロールがあればいいのですが、どうもなさそうです。
なので、試しに作ってみます。まずは、どんなポリシーが作れそうかマニュアルを確認します。

$ custodian schema aws
resources:
- aws.account
- aws.acm-certificate
- aws.airflow
- aws.alarm
- aws.ami
- aws.apigw-domain-name
- aws.app-elb
- aws.app-elb-target-group
- aws.app-flow
- aws.artifact-domain
- aws.artifact-repo
- aws.asg
- aws.backup-plan
- aws.backup-vault
- aws.batch-compute
- aws.batch-definition
- aws.batch-queue
- aws.cache-cluster
- aws.cache-snapshot
- aws.cache-subnet-group
- aws.catalog-portfolio
- aws.cfn

いっぱい出てくるので、S3に絞ってみます。

$ custodian schema aws.s3
Help
----

A Cloud Custodian resource

aws.s3:
  actions:
  - attach-encrypt
  - auto-tag-user
  - configure-lifecycle
  - copy-related-tag
  - delete
  - delete-bucket-notification
  - delete-global-grants
  - encrypt-keys
  - encryption-policy
  - invoke-lambda
  - invoke-sfn
  - mark-for-op
  - no-op
  - notify
  - post-finding
  - post-item
  - put-metric
  - remove-statements
  - remove-tag
  - remove-website-hosting
  - set-bucket-encryption
  - set-inventory
  - set-public-block
  - set-replication
  - set-statements
  - tag
  - toggle-logging
  - toggle-versioning
  - webhook
  filters:
  - bucket-encryption
  - bucket-logging
  - bucket-notification
  - check-public-block
  - config-compliance
  - cross-account
  - data-events
  - event
  - finding
  - global-grants
  - has-statement
  - iam-analyzer
  - inventory
  - is-log-target
  - marked-for-op
  - metrics
  - missing-policy-statement
  - no-encryption-statement
  - ops-item
  - ownership
  - reduce
  - value

actionsが是正ガードレール、filtersが発見的ガードレールという感じですかね。
fitersにある、bucket-loggingのヘルプを見てみます。

$ custodian schema aws.s3.filters.bucket-logging
Help
----

Filter based on bucket logging configuration.

:example:

.. code-block:: yaml

        policies:
          - name: add-bucket-logging-if-missing
            resource: s3
            filters:
              - type: bucket-logging
                op: disabled
            actions:
              - type: toggle-logging
                target_bucket: "{account_id}-{region}-s3-logs"
                target_prefix: "{source_bucket_name}/"

        policies:
          - name: update-incorrect-or-missing-logging
            resource: s3
            filters:
              - type: bucket-logging
                op: not-equal
                target_bucket: "{account_id}-{region}-s3-logs"
                target_prefix: "{account}/{source_bucket_name}/"
            actions:
              - type: toggle-logging
                target_bucket: "{account_id}-{region}-s3-logs"
                target_prefix: "{account}/{source_bucket_name}/"

Schema
------

properties:
  op:
    enum:
    - enabled
    - disabled
    - equal
    - not-equal
    - eq
    - ne
  target_bucket:
    type: string
  target_prefix:
    type: string
  type:
    enum:
    - bucket-logging
required:
- op
- type

Helpを見ると、サンプルポリシーが表示されているので、これを使ってみます。でも、いきなり、actionsは動かしたくないので、バケットのloggingが無効化になっているものをフィルタするポリシーを作ってみます。

$ vi policy.yaml
policies:
  - name: bucket-logging-if-missing
    resource: s3
    filters:
      - type: bucket-logging
        op: disabled

このポリシーを実行してみます。

$ custodian run  -s . policy.yml                
2022-09-13 17:53:22,854: custodian.policy:INFO policy:add-bucket-logging-if-missing resource:s3 region:ap-northeast-1 count:6 time:3.05

count:6 とあるので、このポリシーにヒットするバケットが6つあるみたいです。
後は同じような感じで自分の作りたいルールをpolicy.ymlに記載すればいいです。
公式サイトにもサンプルがあるので参考になると思います。
サンプルポリシー

まとめ

  • OSSのCSPMツールとして、Cloud Custodianを試してみました。
  • AWS、Azure、GCPに対応しているので、使えそうです
  • しかし、ポリシーを記載するのが結構面倒なので、デフォルトセットを用意して欲しいです。
  • あと、結果ももう少し詳細がわかる内容を出力して欲しいです。(オプションでもっと出せるのかな?)

Discussion