AWS IAM实例配置文件,用于管理具有该配置文件的EC2实例

时间:2016-06-01 19:37:15

标签: amazon-web-services amazon-iam

我有一个IAM用户启动包含一个的CloudFormation堆栈 - 带有的EC2实例 - 与a相关联的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}"
            }
        }
    }

在上文中,我使用格式" RoleId:InstanceId"动态地向已启动的EC2实例添加标记。为{aws:userid}指定的值定义,基于此处的描述:http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html。这种方法可以验证,但不起作用......或者因为它是动态的......或者因为动作类型不支持ResourceTag上下文密钥...

有没有办法实现这个目标?

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

,前提是volume和ec2实例都标记有标记' policyuser'和value等于role-id:ec2-instance-id(参见IAM User Guide Reference Policy Variables),其中role-id是角色的唯一标识符,通过例如

aws iam get-role --role-name rolename