我可以搜索现有的 IAM 策略以执行特定操作吗?
Can I search existing IAM policies for a specific action?
在 AWS IAM 中,有没有办法通过脚本或在 Web 控制台中找到包含给定操作的现有策略?
例如,我想允许角色 myRole
访问我所有 EC2 实例上的 DescribeTags 操作。我知道我可以使用适当的规则创建自己的政策,但如果存在这样的事情,我想使用现有的亚马逊政策。
这是一篇旧文章 post,但它可能会对某些人有所帮助...不管别人怎么说,您都可以这样做。它只需要一些脚本。
您可以使用 AWS CLI 执行以下操作。
获取策略的 ARN 并存储在 policies_arn
数组中。
mapfile -t policies_arn < <(aws iam list-policies --query 'Policies[*].[Arn]' --output text)
获取每个策略的 VersionIds 并存储在 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
}
}
干杯!
详细说明我对 的理解,重要的是从每个策略的默认版本中获取 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 中,有没有办法通过脚本或在 Web 控制台中找到包含给定操作的现有策略?
例如,我想允许角色 myRole
访问我所有 EC2 实例上的 DescribeTags 操作。我知道我可以使用适当的规则创建自己的政策,但如果存在这样的事情,我想使用现有的亚马逊政策。
这是一篇旧文章 post,但它可能会对某些人有所帮助...不管别人怎么说,您都可以这样做。它只需要一些脚本。
您可以使用 AWS CLI 执行以下操作。
获取策略的 ARN 并存储在
policies_arn
数组中。mapfile -t policies_arn < <(aws iam list-policies --query 'Policies[*].[Arn]' --output text)
获取每个策略的 VersionIds 并存储在
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
}
}
干杯!
详细说明我对 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 中的所有操作可能会更快,但这种混合方法对我来说已经足够好了。