【问题标题】:Can I search existing IAM policies for a specific action?我可以搜索现有 IAM 策略以查找特定操作吗?
【发布时间】:2016-07-08 15:40:12
【问题描述】:

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

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

【问题讨论】:

    标签: amazon-web-services amazon-iam


    【解决方案1】:

    这是一篇旧帖子,但它可能对某人有所帮助...尽管其他人说了什么,但您可以这样做。它只需要一点脚本。

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

    1. 获取策略的 ARN 并存储在 policies_arn 数组中。

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

    2. 获取每个策略的 VersionId 并存储在 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
        }
    }
    

    干杯!

    【讨论】:

    • 在上面的第 3 步中,您使用 policy.txt 和 ~/policies.txt,如果您在 ~ 中可以正常工作,但否则会在不同的位置创建两个文件。感谢您提供有用的实用程序,非常有帮助。
    • 好收获。固定。
    【解决方案2】:

    为了详细说明我对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 做所有事情可能会更快,但这种混合方法对我来说已经足够了。

    【讨论】:

    • 确实够好!感谢分享!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多