我有一个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}"
}
}
}
在上面,我根据这里的描述:http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html,动态地为已启动的EC2实例添加标签,其格式为“RoleId:InstanceId”,其格式为{aws:userid}指定的值:此方法验证,但是不起作用……或者因为它是动态的……或者因为动作类型不支持ResourceTag上下文键可能……
有没有办法实现这个目标?
谢谢.
最佳答案 基于资源标签的授权仅适用于某些操作.例如,请参阅:
EC2 Supported IAM actions.例如,不支持所有Describe操作,并且必须通过单独的策略声明进行许可.
作为支持资源标记,附加/分离卷的操作示例(请参阅上面的相同链接以获取支持的操作及其要求),因此以下策略可行:
{
"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 User Guide Reference Policy Variables),其中role-id是角色的唯一标识符,通过例如
aws iam get-role --role-name rolename