【问题标题】:AWS IAM customized policy at instance level for EC2 doesn't work用于 EC2 的实例级别的 AWS IAM 自定义策略不起作用
【发布时间】:2017-06-02 10:48:34
【问题描述】:

为用户创建了 AWS IAM 策略,以授予仅停止和启动实例的权限,但如果我提供特定实例 ARN 资源,则它不起作用。默认 EC2 只读权限已授予用户描述 EC2 实例以及添加的自定义示例策略,如下所示:

示例政策:

  {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "ec2:Describe*",
                    "ec2:StopInstances",
                    "ec2:RunInstances",
                    "ec2:StartInstances"
                ],
                "Effect": "Allow",
                "Resource": "*"    

这行得通

                "Resource": "arn:aws:ec2:<region>:<account id>:instance/<instance id>"  
                "Resource": "arn:aws:ec2:<region>:<account id>:instance/*" 
                "Resource": "arn:aws:ec2:<region>::instance/*"
                "Resource": "arn:aws:ec2:::instance/*"
                "Resource": "arn:aws:ec2:::*"     

这些不起作用

            }
        ]
    }

于 1 月 23 日编辑(以显示我到底做了什么)

目标:向用户授予对单个 EC2 实例的启动和停止实例权限。

测试了不同的组合策略,但除了"Resource": "*"之外,它们都不起作用:

登录: admin_user(完全访问权限)

创建一个实例如下:

  1. 地区:俄勒冈州

  2. 可用区: us-west-2c

  3. 实例 ID: i-xxx3dxxx32xxxxxxe

  4. 所有者: xxx23xxx11

创建了一个用户: testec2_user

授予用户的权限:

  1. EC2 只读(可用策略)
  2. 自定义策略只允许停止和启动 i-xxx38xxx32xx45 实例如下:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:Describe*",
                "ec2:RunInstances"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:us-west-2c:xxx23xxx11:instance/i-xxx3dxxx32xxxxxxe"
        }
            ] }
    

testec2_user 登录并尝试启动停止的实例并收到以下错误:

You are not authorized to perform this operation. Encoded authorization failure message

我计划使用 AWS 的 sts decode authorization message 对收到的消息进行解码。

【问题讨论】:

    标签: amazon-web-services amazon-ec2 amazon-iam policy


    【解决方案1】:

    DescribeInstances 不支持资源级权限。 (见Unsupported Resource-Level Permissions)。

    如果 Amazon EC2 API 操作不支持资源级 权限,您可以授予用户使用该操作的权限,但您 必须为策略声明的资源元素指定 *。

    Read more

    因此,您可以将您的策略​​重写为:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": [
                    "ec2:Describe*",
                    "ec2:RunInstances"
                ],
                "Effect": "Allow",
                "Resource": "*"
            },
            {
                "Action": [
                    "ec2:StopInstances",
                    "ec2:StartInstances"
                ],
                "Effect": "Allow",
                "Resource": "arn:aws:ec2:<region>:<account>:instance/<instance-id>"
            }
        ]
    }
    

    编辑

    RunInstances需要访问除了Instance之外的几种资源类型(如ImageKey pair网络接口放置组安全组快照子网) 并接受每种资源类型的特定 ARN 格式。所以,arn:aws:ec2:&lt;region&gt;:&lt;account id&gt;:instance/* 是不够的,你会得到一个 UnauthorizedOperation 错误。 “资源” 元素应该是:

    "Resource": "*"
    

    这是最简单的方法,或者:

    "Resource": [
        "arn:aws:ec2:<region>:<account>:instance/*",
        "arn:aws:ec2:<region>::image/*",
        "arn:aws:ec2:<region>:<account>:key-pair/*",
        "arn:aws:ec2:<region>:<account>:network-interface/*",
        "arn:aws:ec2:<region>:<account>:placement-group/*",
        "arn:aws:ec2:<region>:<account>:security-group/*",
        "arn:aws:ec2:<region>::snapshot/*",
        "arn:aws:ec2:<region>:<account>:subnet/*",
        "arn:aws:ec2:<region>:<account>:volume/*"
    ]
    

    这更复杂,但可以对每个资源提供细粒度的控制。例如,您可以只允许对特定 EC2 映像 ID 或子网 ID 执行 RunInstances。有关详细信息,请参阅RunInstances 部分here

    关于 PassRole 权限的补充说明

    在执行 RunInstances 时,如果 EC2 实例应包含实例配置文件,则启动 EC2 实例的用户还必须具有 IAM PassRole 权限,以便在执行期间将角色与实例关联发射。例如:

    {
        "Version": "2012-10-17",
        "Statement": [
            ...
            {
                "Action": "iam:PassRole",
                "Effect": "Allow",
                "Resource":"arn:aws:iam::<account>:role/<role-name>"
            }
        ]
    }
    

    这样,您可以确保用户不会将角色传递给 EC2 实例,其中该角色的权限超出了您希望用户拥有的权限。

    有关授予使用 IAM 角色启动 EC2 实例的权限的更多信息,请参阅 this AWS 博客文章。

    【讨论】:

    • 我尝试了所有可能的解决方案,但实例级权限不起作用。我尝试了没有描述的策略,因为描述在 EC2 只读策略(分配给用户)上可用。但是,在资源级别保留停止、启动和运行实例权限,但用户仍然存在权限问题。 "Resource": "*" 如何工作而不是 "Resource": "arn:aws:ec2:&lt;region&gt;:&lt;account id&gt;:instance/&lt;instance id&gt;" 用于停止、启动和运行实例操作。
    • 好像RunInstances 不接受arn:aws:ec2:&lt;region&gt;:&lt;account id&gt;:instance/&lt;instance id&gt; 格式的ARN。它必须是arn:aws:ec2:&lt;region&gt;:&lt;account id&gt;:instance/*。我已经相应地更新了我的答案。有关详细信息,请参阅此处的 RunInstances 部分:docs.aws.amazon.com/AWSEC2/latest/APIReference/…
    • 感谢您的快速回复。让我试试看!
    • @Kahlid 它仍然无法正常工作。您是否针对任何情况测试过此政策?
    • 你是对的。 RunInstances 编辑未完成。我已经更新了答案(在测试并验证它在我这边工作之后)。
    【解决方案2】:

    这是您指定多个资源的方式:

    …
          "Effect": "Allow",
          "Action": "s3:*",
          "Resource": [
            "arn:aws:s3:::BUCKET-NAME/home/${aws:username}",
            "arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*"
          ]
        }
      ]
    }
    

    来源: http://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html

    编辑:

    如果您想过滤掉而不是手动包含所有必需的资源,也可以使用条件。

    【讨论】:

    • 感谢您的回复。我已经尝试过 S3,它确实可以正常工作,但我的问题与 EC2 实例级别权限有关。
    猜你喜欢
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多