亚马逊云科技 - 我能否在现有 IAM 策略中搜索特定操作



在 AWS IAM 中,是否有办法通过脚本或在 Web 控制台中查找哪些现有策略包含给定操作?

例如,我想允许角色myRole访问我所有 EC2 实例上的 DescribeTags 操作。我知道我可以使用适当的规则创建自己的策略,但如果存在这样的事情,我想使用现有的 Amazon 策略。

这是一个旧帖子,但它可能会帮助某人...... 不管别人怎么说,你都可以这样做。它只需要一些脚本。

您可以使用 AWS CLI 执行以下操作。

  1. 获取策略的 ARN 并存储在 policies_arn 阵列中。

    mapfile -t policies_arn < <(aws iam list-policies --query 'Policies[*].[Arn]' --output text)

  2. 获取每个策略的版本 ID 并存储在policies_ver数组中。

    mapfile -t policies_ver < <(aws iam list-policies --query 'Policies[*].[DefaultVersionId]' --output text)

  3. 使用 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

  4. 在文本编辑器中打开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
  1. 这基本上在单个调用中捕获了所有 Arns 和版本
  2. 然后将输出联接到单个空格分隔的字符串中
  3. 然后,此字符串通过xargs发送到另一个 bash 进程,其中 ARN 和 VersionId 作为单独的参数传入以get-policy-version
  4. 其结果与 ARN 合并为一行
  5. 线条被整理出来,让您对正在寻找的搜索操作感到高兴。

我遇到了这个问题,正在寻找一种方法来查找可能包含特定操作的现有策略。该命令将根据策略数在 O(n) 时间内运行,因为会为您拥有的每个策略单独调用。

我不知道如何在上--query .contains()正常工作,以允许 aws 过滤而不是 grep。

相关内容

  • 没有找到相关文章