我正在阅读 AWS 文档,解释如何创建 CodePipeline 服务角色。但是,我不明白为什么需要以下声明:
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": "*"
}
在
RolePolicy.json
文件内。
我不要求解释什么是
iam:PassRole
以及我们一般使用它的原因和时间。据我所知,它允许主体将角色传递给另一个服务。然而,我很困惑为什么我们需要它,特别是在 CodePipeline 服务中。所以,
Q1:在这种情况下,主体是什么,角色是什么,服务是什么?
Q2:使用起来不是不安全吗
"Resource": "*"
?
更新 特别针对亲密选民滥用者:我提出两个问题,因为它们是相关且不可分割的。是否最好再创建一篇具有相同文本的帖子并提出不同的问题?抱歉,听起来很标准
假设您正在构建 CodePipeline 来部署由 RDS 数据库组成的 CloudFormation 堆栈。
在 CodePipeline 中设置 CloudFormation 部署操作时,您需要指定 CloudFormation 可用于执行部署的角色(授予权限,例如
rds:CreateDBInstance
)。调用操作时,此角色 (resource) 将从 CodePipeline (principal) 传递到 CloudFormation (service)。当您导航到 CloudFormation 控制台时,您将在堆栈信息中找到相同的角色 ARN。
另一个示例是 ECS 的部署操作,其中 CodePipeline 传递新任务定义的任务执行角色。
您是对的,在 IAM 策略中使用
Resource": "*"
过于宽泛。 AWS 文档中提供的角色可以涵盖广泛的案例,并且通常可以缩小范围。例如:
iam:PassRole
权限可以仅限于管道设计传递的角色
可以添加条件以允许角色仅传递给特定服务(本例中为 CloudFormation):
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::000000000000:role/your-cloudformation-deployment-role",
"Condition": {
"StringEqualsIfExists": {
"iam:PassedToService": [
"cloudformation.amazonaws.com"
]
}
}
}