【问题标题】:Minimal IAM policy for ec2:RunInstancesec2:RunInstances 的最小 IAM 策略
【发布时间】:2013-12-05 19:05:39
【问题描述】:

我正在尝试缩小运行预定义机器映像的最低策略。该图像基于两个快照,我只想启动“m1.medium”实例类型。

基于此,在this pagethis article 的帮助下,我制定了以下政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1385026304010",
            "Effect": "Allow",
            "Action": [
                "ec2:RunInstances"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:InstanceType": "m1.medium"
                }
            },
            "Resource": [
                "arn:aws:ec2:us-east-1::instance/*",
                "arn:aws:ec2:us-east-1::image/ami-f1c3e498",
                "arn:aws:ec2:us-east-1::snapshot/snap-e2f51ffa",
                "arn:aws:ec2:us-east-1::snapshot/snap-18ca2000",
                "arn:aws:ec2:us-east-1::key-pair/shenton",
                "arn:aws:ec2:us-east-1::security-group/sg-6af56d02",
                "arn:aws:ec2:us-east-1::volume/*"
            ]
        }
    ]
}

该策略缩小了确切的映像、快照、安全组和密钥对,同时保持特定实例和卷处于打开状态。

我正在使用如下 CLI 工具,如 here 所述:

aws ec2 run-instances --dry-run \
    --image-id ami-f1c3e498 \
    --key-name shenton \
    --security-group-ids sg-6af56d02 \
    --instance-type m1.medium

~/.aws/config如下:

[default]
output = json
region = us-east-1
aws_access_key_id = ...
aws_secret_access_key = ...

该命令生成一般的You are not authorized to perform this operation 消息,并且编码的授权失败消息表明我的任何语句都不匹配,因此它拒绝该操作。

更改为"Resource": "*" 显然可以解决问题,但我想进一步了解为什么上述方法不起作用。我完全意识到这涉及到一定程度的猜测工作,所以我欢迎任何想法。

【问题讨论】:

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


    【解决方案1】:

    Amazon Web Services 的 Jeff Barr 联系了我,他很乐意帮助我找出问题所在。

    首先您需要使用以下语句解码授权失败消息:

    $ aws sts decode-authorization-message --encoded-message 6gO3mM3p....IkgLj8ekf

    确保 IAM 用户/角色拥有sts:DecodeAuthorizationMessage 操作的权限。

    响应包含一个 DecodedMessage 密钥,该密钥包含另一个 JSON 编码主体:

    {
        "allowed": false,
        "explicitDeny": false,
        "matchedStatements": {
            "items": []
        },
        "failures": {
            "items": []
        },
        "context": {
            "principal": {
                "id": "accesskey",
                "name": "testuser",
                "arn": "arn:aws:iam::account:user/testuser"
            },
            "action": "ec2:RunInstances",
            "resource": "arn:aws:ec2:us-east-1:account:instance/*",
            "conditions": { ... }
        }
    }
    

    context => resource 下,它将显示它试图与策略匹配的资源;如您所见,它需要一个帐号。因此,arn documentation 应理解为:

    除非另有说明,否则需要地区和帐户。

    在受影响的 ARN 中添加帐号或 * 可解决问题:

    "Resource": [
        "arn:aws:ec2:us-east-1:*:instance/*",
        "arn:aws:ec2:us-east-1:*:image/ami-f1c3e498",
        "arn:aws:ec2:us-east-1:*:snapshot/snap-e2f51ffa",
        "arn:aws:ec2:us-east-1:*:snapshot/snap-18ca2000",
        "arn:aws:ec2:us-east-1:*:key-pair/shenton",
        "arn:aws:ec2:us-east-1:*:security-group/sg-6af56d02",
        "arn:aws:ec2:us-east-1:*:volume/*"
    ]
    

    【讨论】:

    • AMI 的 arn 没有帐户 # - 所以它要么是空白的,要么是“*”。感谢您的这篇文章 - 如果没有它,我将永远无法解决这个问题!
    • 我和你做的一样,但是我的,初始化失败......不明白。你能分享你的完整政策吗
    • @Shafiulkarim 这就是我的全部政策;我想如果这不能回答你的问题,请随时问另一个人并用链接 ping 我。
    • 是的,我添加了一个新帖子link
    • 我创建了a little shell function,它解析出消息,取消转义,并漂亮地打印它,只给出初始编码消息。
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多