在 AWS IAM 中,是否有办法通过脚本或在 Web 控制台中查找哪些现有策略包含给定操作?
例如,我想允许角色myRole
访问我所有 EC2 实例上的 DescribeTags 操作。我知道我可以使用适当的规则创建自己的策略,但如果存在这样的事情,我想使用现有的 Amazon 策略。
这是一个旧帖子,但它可能会帮助某人...... 不管别人怎么说,你都可以这样做。它只需要一些脚本。
您可以使用 AWS CLI 执行以下操作。
-
获取策略的 ARN 并存储在
policies_arn
阵列中。mapfile -t policies_arn < <(aws iam list-policies --query 'Policies[*].[Arn]' --output text)
-
获取每个策略的版本 ID 并存储在
policies_ver
数组中。mapfile -t policies_ver < <(aws iam list-policies --query 'Policies[*].[DefaultVersionId]' --output text)
-
使用 for 循环遍历每个策略并将策略文档存储在
policies.txt
for (( i=0; i<${#policies_arn[@]}; i++ )); do echo ${policies_arn[i]} >> policies.txt && aws iam get-policy-version --policy-arn ${policies_arn[i]} --version-id ${policies_ver[i]} --output json >> policies.txt; done
-
在文本编辑器中打开
policies.txt
并搜索您的操作。
注意:根据您的 CLI 配置,您可能需要也可能不需要 --output text
参数。但是,输出必须是文本(而不是 JSON)才能正常工作。
从那里,您可以轻松地将其转换为.sh
shell 脚本。
示例输出:
arn:aws:iam::123456789012:policy/DenyAllAccess
{
"PolicyVersion": {
"CreateDate": "2016-12-06T18:40:51Z",
"VersionId": "v1",
"Document": {
"Statement": [
{
"Action": "*",
"Effect": "Deny",
"Resource": "*"
}
],
"Version": "2012-10-17"
},
"IsDefaultVersion": true
}
}
干杯!
为了详细说明我对 https://stackoverflow.com/a/43128660/447862 的理解,重要的是从每个策略的默认版本中获取 JSON。由于我的机器没有mapfile
我选择使用Python。
import boto3, json, sys
iam = boto3.client('iam')
policy_arn = sys.argv[1]
policy_name = policy_arn.split('/')[-1]
version = iam.get_policy(PolicyArn=policy_arn)['Policy']['DefaultVersionId']
policy_version = iam.get_policy_version(PolicyArn=policy_arn, VersionId=version)
policy_document = policy_version['PolicyVersion']['Document']
with open(f"{policy_name}.json", 'w') as outfile:
outfile.write(json.dumps(policy_document, indent=2))
outfile.write('n')
将其保存为 aws-iam-policy-dump.py
,现在我可以将每个策略文档写入其自己的文件并根据需要进行搜索。
aws iam list-policies --query 'Policies[*].Arn' --output text > policy-arns.txt
for arn in $(cat policy-arns.txt); do
python aws-iam-policy-dump.py $arn
done
通过用 Python 做所有事情可能会更快,但这种混合方法对我来说已经足够好了。
aws iam list-policies --query 'Policies[*].[Arn, DefaultVersionId]' | jq -rc '.[] | join(" ")' | xargs -l bash -c 'aws iam get-policy-version --policy-arn=$0 --version-id=$1 --query="{"$0": PolicyVersion.Document.Statement[*].[Action, NotAction][][]}"' | jq -c | grep YOUR_POLICY_ACTION_HERE
- 这基本上在单个调用中捕获了所有 Arns 和版本
- 然后将输出联接到单个空格分隔的字符串中
- 然后,此字符串通过
xargs
发送到另一个 bash 进程,其中 ARN 和 VersionId 作为单独的参数传入以get-policy-version
- 其结果与 ARN 合并为一行
- 线条被整理出来,让您对正在寻找的搜索操作感到高兴。
我遇到了这个问题,正在寻找一种方法来查找可能包含特定操作的现有策略。该命令将根据策略数在 O(n) 时间内运行,因为会为您拥有的每个策略单独调用。
我不知道如何在上--query
.contains()
正常工作,以允许 aws 过滤而不是 grep。