AWS IAM 实例配置文件,使用该配置文件管理 EC2 实例

问题描述 投票:0回答:2

我有一个 IAM 用户启动了一个 CloudFormation 堆栈,其中包含 - EC2 实例 - 与某个实例关联的 IAM 实例配置文件 - IAM 角色

在 AWS::CloudFormation::Init 块中,EC2 实例执行一些要求其调用某些 ec2:* API 操作的操作。但是,该实例应该只能为该实例本身调用这些操作。

启动堆栈的用户仅具有附加一组预定义策略和创建角色的权限。像这样的东西

"CloudFormationStackLauncher": {
  "Type": "AWS::IAM::ManagedPolicy",
  "Properties": {
    "Description": "Allows attached entity to attach and detach required policies from roles it creates.",
    "PolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "iam:AttachRolePolicy",
            "iam:DetachRolePolicy"
          ],
          "Resource": "*",
          "Condition": {
            "ArnEquals": {
              "iam:PolicyArn": [
                "arn:aws:iam:::policy/InstanceThatCanManageItself",                    
              ]
            }
          }
        },
        {
          "Effect": "Allow",
          "Action": [
            "iam:CreateRole"
          ],
          "Resource": "*"
        }
      ]
    }
  }
}

所以我需要策略 InstanceThatCanManageItself 的定义(需要由具有完全管理员权限的用户提前定义)。理想情况下,它看起来像:

    {
        "Effect": "Allow",
        "Action": [
            "ec2:*"
        ],
        "Resource": [
            "${ec2:SourceInstanceARN}"
        ]
    }

但它表示此策略无效,因为策略变量 ec2:SourceInstanceARN 不是有效 ARN 的格式。我尝试过在 EC2 实例上使用标签并向策略添加条件,但当条件是动态时它似乎不起作用,如下所示:

   {
        "Effect": "Allow",
        "Action": [
            "ec2:*"
        ],
        "Resource": [
            "*"
        ],
        "Condition": {
            "StringLike": {
                "ec2:ResourceTag/role" : "${aws:userid}"
            }
        }
    }

在上面,我根据此处的描述动态地将一个标签添加到启动的 EC2 实例,其格式为“RoleId:InstanceId”,为 {aws:userid} 指定的值定义:http://docs .aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html。这种方法有效,但不起作用...要么因为它是动态的...或者因为操作类型不支持 ResourceTag 上下文键可能...

有什么办法可以做到这一点吗?

谢谢。

amazon-web-services amazon-iam
2个回答
2
投票

基于资源标签的授权仅适用于某些操作。例如,请参阅:EC2 支持的 IAM 操作。例如,不支持所有描述操作,必须通过单独的策略声明获得许可。
作为支持资源标签、附加/分离卷的操作示例(有关支持的操作及其要求,请参阅上面的相同链接),因此以下策略将起作用:

{
"Version": "2012-10-17",
"Statement": [        
    {
        "Effect": "Allow",
        "Action": [
            "ec2:AttachVolume",
            "ec2:DetachVolume"
        ],
        "Resource": "*",
        "Condition": {
            "StringLike": {
                "ec2:ResourceTag/policyuser": "${aws:userid}"
            }
        }
    }
]
}

,前提是卷和 ec2 实例都标有标签“policyuser”且值等于 role-id:ec2-instance-id(请参阅IAM 用户指南参考策略变量),其中 role-id 是角色,通过例如获得

aws iam get-role --role-name rolename

0
投票

您可以使用

ec2:InstanceID
IAM 条件键作为资源块中的变量,以便使用此策略的实例只能访问其自身:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ec2:AssociateAddress",
                "ec2:AttachVolume",
                "ec2:CreateTags",
                "ec2:StopInstances",
                "ec2:TerminateInstances"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:*:*:instance/${ec2:InstanceID}",
                "arn:aws:*:*:elastic-ip/*",
                "arn:aws:*:*:volume/*"
            ]
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.