Cloud Custodianを使ってみた
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