AWS IAM EC2策略仅限于源实例。

7
我正在处理一个设置问题,需要由于长时间未活动(即网页服务器访问日志中没有新内容)而终止AWS实例。这些实例是测试实例,并由CI/CD软件自动创建。
我希望这些实例能够识别它们已被遗弃并终止自身。我想为每个实例分配一个通用的IAM角色,该角色仅允许实例终止自身而不是同伴实例。
到目前为止,我已经做了以下工作:

我已经发现策略中有两个可用变量:

ec2-instance-id
ec2:SourceInstanceARN


我提出了几种角色策略的变化,但它们都不起作用:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:TerminateInstances",
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "ec2:SourceInstanceARN": "arn:aws:ec2:*:*:instance/${ec2-instance-id}"
                }
            }
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:TerminateInstances",
            "Resource": "arn:aws:ec2:*:*:instance/${ec2-instance-id}"
        }
    ]
}

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:TerminateInstances",
            "Resource": "${ec2:SourceInstanceARN}"
        }
    ]
}

实际上是否可能实现所需的行为,即仅允许实例在自身上执行特定操作(例如终止)?

更新:
我知道我可以使用标签进行操作,这是我目前正在做的事情,但这意味着所有带标记的实例都可以终止其对等实例。这种限制有点过于松散,我想真正将其限制在实例上。

AWS IAM:允许EC2实例停止自身
IAM策略,仅允许EC2实例API访问修改自身


如果仅关心终止实例,可以使用 InstanceInitiatedShutdownBehavior 设置为 Terminate 启动实例,并在机器上运行 /sbin/poweroff 代码。当 EC2 基础设施看到实例试图关闭电源时,该实例将被终止,就像您发送 API 请求终止它一样。 - Michael - sqlbot
@Michael-sqlbot 好主意!也可以运行 sudo shutdown now -h - John Rotenstein
3个回答

11
你的条件很接近答案。关键是要将实例ARN与ec2:sourceInstanceARN进行比较:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:DeleteTags",
                "ec2:DescribeTags",
                "ec2:CreateTags",
                "ec2:TerminateInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ARN": "${ec2:SourceInstanceARN}"
                }
            }
        }
    ]
}

显然,为了进行测试,我允许我的实例使用此策略对自己进行标记和停止。


2
你是如何使它工作的,@AntonBoritskiy?你运行了什么命令?当我尝试使用 aws ec2 describe-tags --filters Name=resource-id,Values=<instance id> 时,它依然被拒绝。 - Aidan Steele
我们这样运行它:aws ec2 terminate-instances --instance-ids $(curl http://169.254.169.254/latest/meta-data/instance-id/ 2>/dev/null) --region $(curl http://169.254.169.254/latest/meta-data/placement/availability-zone 2>/dev/null | sed 's/.$//') - Anton Boritskiy
3
你好@TomaszKapłoński, 有没有想法为什么这种情况不起作用: { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:ModifyInstanceMetadataOptions" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceArn": "${ec2:SourceInstanceARN}" }}}]} (aws:ARN似乎已被aws:SourceArn取代) - Rod Borchevskyi
1
这个已经不再起作用了 - https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html#access-analyzer-reference-policy-checks-error-unsupported-global-condition-key - Oleksandr Shmyrko
一样的,确认。 - undefined
显示剩余3条评论

2

"aws:ARN"条件不再起作用,对于使用IAM角色启动的实例,我发现以下方法能够起作用:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow instance to modify itself",
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteTags",
        "ec2:CreateTags"
        ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "aws:userid": "*:${ec2:InstanceID}"
        }
      }
    }
  ]
}

1
这实际上允许一个实例标记AWS中的任何资源,因为条件只是检查userid是否包含instanceID - undefined

-1
您可以在条件元素中使用 aws:useridec2:InstanceID
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:CreateTags",
                "ec2:RebootInstances",
                "ec2:StopInstances",
                "ec2:TerminateInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:userid": "*:${ec2:InstanceID}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["ec2:DescribeInstances"],
            "Resource": "*"
        }
    ]
}

注意!并非所有的EC2操作都支持资源级权限,所以授予此类访问权限的策略必须在资源元素中指定"*"
例如,大多数ec2:Describe*操作只有在Resource: "*"时才能正常工作。

我回到那个自动终止脚本并在这里发布更新时,我会试一试。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接