条件にマッチしたIAMポリシーを見つける iam-policy-finder - fujiwara-ware 2024 day 15
この記事は fujiwara-ware advent calendar 2024 の15日目です。
iam-policy-finder とは
iam-policy-finder は、指定された条件にマッチする AWS IAM ポリシーを見つけるためのツールです。
なぜ作ったのか
時々、AWS から IAM ポリシー関連でお知らせが来ることがあります。
よくあるのは、仕様変更に伴い特定の IAM ポリシーの内容では今まで行えていた処理が行えなくなるので変更が必要だよ、というような内容です。その際、特定の条件(ある権限を持っているかなど)で対象のポリシーを見つける必要がありますが、これを手作業でやるのは大変です。
そこで、指定された条件にマッチするポリシーを見つけるためのツールを作りました。
使い方
ポリシーの名前で検索
$ iam-policy-finder 'Name == "AmazonEC2FullAccess"'
引数に与えるのは、CEL 式です。CEL については後述します。
ポリシーのJSONを文字列比較する
Document.matches('"lambda:[Gg]et[Ff]unction"')
&&
!Document.matches('"lambda:[Ll]ist[Tt]ags"')
iam-policy-finder では Document
という変数でポリシーの JSON 文字列を取得できます。この文字列に対して matches
や contains
などの文字列関数を使って条件を指定できます。
正規化したポリシーステートメントを検索
Statement.exists(s, (s.Action.exists(a, a == "s3:*") && s.Effect == "Allow"))
Statement
は正規化されたステートメントのリストです。ステートメントの中身を検索するために Statement.exists
を使います。詳しくはドキュメントを参照してください。
オプション
--filter
(-f
)
ポリシーのタイプであらかじめフィルタリングします。デフォルトではすべてのタイプを検索します。
指定できるのは "User", "Group", "Role", "LocalManagedPolicy", "AWSManagedPolicy" です。
--dump
見つかったポリシーの JSON を標準出力にダンプします。
--skip-evaluation-error
評価エラーをスキップします。評価エラーが発生した場合でも処理を打ち切らず、次のポリシーを評価します。
デフォルトでは評価エラーが発生すると処理が停止します。
--lc
Statement[].Action
と Statement[].NotAction
を正規化する際に小文字に変換します。
IAM ポリシーのアクションは大文字小文字を区別しませんが、CEL の比較は区別します。アクションを大文字小文字を区別せずに比較したい場合は --lc
オプションを使います。
CEL とは
CEL (Common Expression Language) は非チューリング完全で式評価に特化した、高速、安全に実行可能な式評価言語です。Go, Java, C++ に組み込み可能で、GoogleCloud の Certificate Authority Service, Kubernetes, Istio などで既に実用されています。
iam-policy-finder は、CEL を IAM ポリシーステートメントを柔軟に評価するために使っています。IAM ポリシーは、単純に文字列として評価するためには複雑すぎます。CEL を使うことで、特定の条件を持ったポリシーにマッチする式を簡単に書くことができます。
あと、単に使ってみたかったというのもあります。初めて使う技術の場合、いきなり大きなプロジェクトで採用するのはリスクです。まず小さなツールを使ってみることで、技術の理解を深めることができます。
まとめ
iam-policy-finder は、指定された条件にマッチする IAM ポリシーを見つけるためのツールです。CEL を使ってポリシーを柔軟に評価できるため、様々な条件でポリシーを検索することができます。
AWS からのお知らせに対応するために作ったツールですが、他にも様々な用途に使えるかもしれません。ぜひお試しください。
それでは、明日もお楽しみに!
参考資料
Discussion