📝

特定の権限を含むカスタマー管理ポリシーを抽出するスクリプトを AI で作ってみた

に公開

スクリプト

サンプルとして kms:Decrypt を含むポリシーを抽出します。

# すべてのローカルポリシーを取得し、kms:Decrypt を含むポリシーを抽出
aws iam list-policies --scope Local --query 'Policies[*].[PolicyName,Arn,DefaultVersionId]' --output json | \
jq -r '.[] | @sh' | \
while read -r policyName policyArn defaultVersionId; do
  # 各ポリシーの詳細を取得し、kms:Decrypt を含むポリシーをフィルタリング
  hasDecrypt=$(aws iam get-policy-version --policy-arn ${policyArn//\'/} --version-id ${defaultVersionId//\'/} | \
    jq -r 'if (.PolicyVersion.Document | tostring | contains("kms:Decrypt")) then "yes" else "no" end')
  
  # kms:Decrypt を含むポリシーの情報を表示
  if [ "$hasDecrypt" = "yes" ]; then
    echo "ポリシー名: ${policyName//\'/}"
    echo "ポリシーARN: ${policyArn//\'/}"
    echo "バージョンID: ${defaultVersionId//\'/}"
    echo "-----------------------------------"
  fi
done

実行結果

上記スクリプトを test.sh というファイルに保存して実行した結果です。

$ bash test.sh
ポリシー名: kms
ポリシーARN: arn:aws:iam::012345678901:policy/kms
バージョンID: v1
-----------------------------------
ポリシー名: AmazonLexV2KmsPolicyForS3Downloadc5568f345673
ポリシーARN: arn:aws:iam::012345678901:policy/service-role/AmazonLexV2KmsPolicyForS3Downloadc5568f345673
バージョンID: v1
-----------------------------------

AI による作成のためすべての環境での動作は保証できませんが、私の環境では期待通りの結果になりました。

分析

スクリプトを分析してみます。

カスタマー管理ポリシーの取得

aws iam list-policies --scope Local --query 'Policies[*].[PolicyName,Arn,DefaultVersionId]' --output json | \

list-policies コマンドで IAM ポリシーを取得する際、--scope Local を指定することでカスタマー管理ポリシーの実を取得しています。

list-policies — AWS CLI 2.27.2 Command Reference

To list only the customer managed policies in your Amazon Web Services account, set Scope to Local .

また、--query によって以下の 3 つのレスポンスを抽出しています。

  • PolicyName
  • Arn
  • DefaultVersionId

ループ処理

jq -r '.[] | @sh' | \
while read -r policyName policyArn defaultVersionId; do

list-policies コマンドでは IAM ポリシーの情報が配列で返されるため、ループ処理で個々のポリシーの情報を取得しています。

特定の権限でフィルタリング

hasDecrypt=$(aws iam get-policy-version --policy-arn ${policyArn//\'/} --version-id ${defaultVersionId//\'/} | \
    jq -r 'if (.PolicyVersion.Document | tostring | contains("kms:Decrypt")) then "yes" else "no" end')

get-policy-version コマンドで指定したバージョンのポリシーの詳細を取得しています。

get-policy-version — AWS CLI 2.27.2 Command Reference

Retrieves information about the specified version of the specified managed policy, including the policy document.

リクエストの --policy-arn--version-id には list-policies コマンドで取得した結果を使用しています。
次に jq コマンドでポリシーに kms:Decrypt という権限が含まれているかどうかをフィルタリングしています。

該当するポリシーの出力

if [ "$hasDecrypt" = "yes" ]; then
    echo "ポリシー名: ${policyName//\'/}"
    echo "ポリシーARN: ${policyArn//\'/}"
    echo "バージョンID: ${defaultVersionId//\'/}"
    echo "-----------------------------------"
fi

上述のフィルタリングで該当するポリシーが含まれていた場合、該当するポリシーに関する情報を出力します。

ユースケース

kms:Decrypt を例にあげると、Security Hub の KMS.1 のコントロールへの対応で上記スクリプトを使用できる可能性があります。

Security Hub controls for AWS KMS - AWS Security Hub

Checks whether the default version of IAM customer managed policies allow principals to use the AWS KMS decryption actions on all resources.

KMS.1 はカスタマー管理ポリシーが kms:Decrypt をすべてのリソース (*) に対して許可しているかどうかをチェックするコントロールです。
チェック対象となるポリシーはカスタマー管理ポリシーのみなので、上記スクリプトで対象のポリシーを抽出できる可能性があります。

スクリプト内の kms:Decrypt を他の権限に変更することで応用もできると思います。

まとめ

今回は特定の権限を含むカスタマー管理ポリシーを抽出するスクリプトを AI で作ってみました。
どなたかの参考になれば幸いです。

参考資料

Discussion