
GCPインフラにおける権限超過アカウントの大規模クリーンアップ
CureIAM は、GCP クラウドインフラ上で最小権限の原則を適用するための、使いやすく信頼性が高く高性能なエンジンです。DevOps チームやセキュリティチームが、必要な権限以上を付与された GCP インフラ上のアカウントを迅速にクリーンアップできるようにします。CureIAM は GCP IAM Recommender からレコメンデーションとインサイトを取得し、それらをスコアリングし、毎日自動的にそれらの推奨事項を適用します。スケジューリングや、これらの適用ジョブを大規模に実行するためのその他すべての側面を処理します。CureIAM は GCP IAM Recommender API と Cloudmarker フレームワーク上に構築されています。
CureIAM をスケーラブルかつ本番環境対応にする機能をご紹介します。
safe_to_apply_score、risk_score、over_privilege_score などのスコアが生成されます。各スコアは異なる目的を持ちます。たとえば、safe_to_apply_score は、CureIAM.yaml 設定ファイルで設定されたしきい値に基づいて、自動適用が可能かどうかを判断します。CureIAM は Python で構築されているため、以下のコマンドでローカル実行できます。実行する前に、設定ファイルを /etc/CureIAM.yaml、~/.CureIAM.yaml、~/CureIAM.yaml、または CureIAM.yaml のいずれかに用意し、サービスアカウントの JSON ファイルをカレントディレクトリに cureiamSA.json という名前で配置してください。この SA 秘密鍵の名前は変更可能ですが、Docker イメージをビルドする場合はこの名前を使用することを推奨します。設定ファイル内でこのファイルを GCP クラウド用に参照するようにしてください。
# 必要な依存関係をインストール
$ pip install -r requirements.txt
# CureIAM を今すぐ実行
$ python -m CureIAM -n
# CureIAM をスケジューラとして実行
$ python -m CureIAM
# CureIAM のヘルプを表示
$ python -m CureIAM --help
CureIAM は Docker 環境内でも実行可能です。これは完全にオプションであり、K8s クラスターへの CI/CD デプロイに使用できます。
# Dockerfile から Docker イメージをビルド
$ docker build -t cureiam .
# イメージをスケジューラとして実行
$ docker run -d cureiam
# イメージを今すぐ実行
$ docker run -f cureiam -m cureiam -n
CureIAM.yaml 設定ファイルは CureIAM エンジンの心臓部です。エンジンが行うすべての処理は、この設定ファイルで構成されたパイプラインに基づいています。設定をわかりやすくするために、セクションごとに分解して説明します。
logger:
version: 1
disable_existing_loggers: false
formatters:
verysimple:
format: >-
[%(process)s]
%(name)s:%(lineno)d - %(message)s
datefmt: "%Y-%m-%d %H:%M:%S"
handlers:
rich_console:
class: rich.logging.RichHandler
formatter: verysimple
file:
class: logging.handlers.TimedRotatingFileHandler
formatter: simple
filename: /tmp/CureIAM.log
when: midnight
encoding: utf8
backupCount: 5
loggers:
adal-python:
level: INFO
root:
level: INFO
handlers:
- rich_console
- file
schedule: "16:00"
この設定のサブセクションでは、Rich ロギングモジュールを使用し、CureIAM を毎日 16:00 に実行するようにスケジュールします。
CureIAM.yaml の plugins セクションに該当します。このセクションは、さまざまなプラグインの宣言と考えることができます。 plugins:
gcpCloud:
plugin: CureIAM.plugins.gcp.gcpcloud.GCPCloudIAMRecommendations
params:
key_file_path: cureiamSA.json
filestore:
plugin: CureIAM.plugins.files.filestore.FileStore
gcpIamProcessor:
plugin: CureIAM.plugins.gcp.gcpcloudiam.GCPIAMRecommendationProcessor
params:
mode_scan: true
mode_enforce: true
enforcer:
key_file_path: cureiamSA.json
allowlist_projects:
- alpha
blocklist_projects:
- beta
blocklist_accounts:
- [email protected]
allowlist_account_types:
- user
- group
- serviceAccount
blocklist_account_types:
- None
min_safe_to_apply_score_user: 0
min_safe_to_apply_score_group: 0
min_safe_to_apply_score_SA: 50
esstore:
plugin: CureIAM.plugins.elastic.esstore.EsStore
params:
# 後でElasticsearchがHTTPSを使用している場合は、httpをhttpsに変更
scheme: http
host: es-host.com
port: 9200
index: cureiam-stg
username: security
password: securepassword
これらのプラグイン宣言はすべて、次の形式である必要があります。
plugins:
<plugin-name>:
plugin: <class-name-as-python-path>
params:
param1: val1
param2: val2
たとえば、プラグイン CureIAM.stores.esstore.EsStore(この ファイル とクラス EsStore)の場合、yaml で定義されたすべてのパラメータは、同じプラグインクラスの __init__() 関数の宣言と一致する必要があります。
audits:
IAMAudit:
clouds:
- gcpCloud
processors:
- gcpIamProcessor
stores:
- filestore
- esstore
これから複数の監査を作成できます。ここで作成されたものは IAMAudit という名前で、gcpCloud、gcpIamProcessor、filestores、esstore の 3 つのプラグインを使用しています。これらは手順 2 で定義したプラグイン名と同じであることに注意してください。繰り返しになりますが、これはパイプラインを定義しているだけで、実際に実行しているわけではありません。次の手順で定義された実行対象として考慮されます。
run:
- IAMAudits
これで CureIAM の設定全体が完成します。完全なサンプルは こちら にあります。この設定駆動型パイプラインの概念は、Cloudmarker フレームワークから継承されています。
Elasticsearch ストアプラグインを使用して Elasticsearch にインデックスされた JSON は、Kibana でダッシュボードを生成するために使用できます。
[ぜひお願いします!] CureIAM のコア機能とドキュメントを改善するためのあらゆるコントリビューションを歓迎します。迷ったら PR を作成してください!
Gojek プロダクトセキュリティチーム ❤️
<<未定>>
=============
下位互換性の問題を回避するために、ライブラリにバージョンを追加。
docker compose を実行: docker-compose -f docker_compose_es.yaml up
mode_scan: true
mode_enforce: false