【发布时间】:2021-08-18 21:32:55
【问题描述】:
我正在为部署我们的Cloud Development Kit (CDK) 应用程序的 CI/CD 用户编写 IAM 角色。 CDK 应用程序由 lambda 函数、Fargate 等组成。问题是,CDK 不允许我指定它需要的所有角色。相反,它自己创建了一些。
几个例子:
- 每个具有日志保留的 lambda 函数都有另一个由 CDK 创建的 lambda,它将日志保留设置为日志组和日志流。
- 执行步进函数的 CloudTrail 事件需要具有
states:StartExecution权限的角色。
CDK 自动创建这些角色,并为它们设置内联策略。这迫使我授予我的 CI/CD 角色权限以创建角色和附加策略。因此,如果有人可以访问 CI/CD 用户(例如,如果我们的 GitHub 凭据泄露),攻击者可以创建新角色并授予他们管理员权限。
我尝试自己在一个单独的堆栈中创建所有角色,然后在 CDK 应用程序中使用这些角色。但正如我上面提到的(见上面的例子),它不可能无处不在......
我还尝试了部署者角色的 IAM 权限边界,但我不知道如何限制 iam:PutRolePolicy 的权限。 CDK 本质上做了以下工作:
根据AWS documentation,条件是非常基本的字符串比较。我需要能够选择传递给iam:PutRolePolicy 的策略文档中允许哪些操作。
这是我的权限边界示例,允许委托人创建角色并放置角色策略。见条件注释。
permission_boundary = aws_iam.ManagedPolicy(
scope=self,
id='DeployerPermissionBoundary',
managed_policy_name='DeployerPermissionBoundary',
statements=[
aws_iam.PolicyStatement(
actions=['iam:CreateRole'],
effect=aws_iam.Effect.ALLOW,
resources=[f'arn:aws:iam::{core.Aws.ACCOUNT_ID}:role/my-project-lambda-role']
),
aws_iam.PolicyStatement(
actions=['iam:PutRolePolicy'],
effect=aws_iam.Effect.ALLOW,
resources=[f'arn:aws:iam::{core.Aws.ACCOUNT_ID}:role/my-project-lambda-role'],
conditions=Conditions([
StringLike('RoleName', 'Required-role-name'),
StringLike('PolicyName', 'Required-policy-name'),
StringEquals('PolicyDocument', '') # I want to allow only specified actions like logs:CreateLogStream and logs:PutLogEvents
])
)
]
)
deployer_role = aws_iam.Role(
scope=self,
id='DeployerRole',
assumed_by=aws_iam.AccountRootPrincipal(),
permissions_boundary=permission_boundary,
inline_policies={
'Deployer': aws_iam.PolicyDocument(
statements=[
aws_iam.PolicyStatement(
actions=['iam:PutRolePolicy'],
effect=aws_iam.Effect.ALLOW,
resources=[f'arn:aws:iam::{core.Aws.ACCOUNT_ID}:role/my-project-lambda-role']
),
...
...
]
)
}
)
将PutRolePolicy 仅限于选定操作的正确方法是什么?我想允许logs:CreateLogStream 和logs:PutLogEvents,仅此而已。
我已经为此奋斗了很长一段时间,我不想退回到授予不必要的更多权限。提前谢谢大家!
【问题讨论】:
-
如何导入Conditions和StringEquals?请
标签: amazon-web-services amazon-cloudformation amazon-iam aws-cdk