特定の権限を含むカスタマー管理ポリシーを抽出するスクリプトを 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