gpt4 book ai didi

amazon-web-services - 带条件的 CDK 应用程序的 IAM 权限边界

转载 作者:行者123 更新时间:2023-12-05 03:58:54 28 4
gpt4 key购买 nike

我正在为 CI/CD 用户编写一个 IAM 角色,该角色部署我们的 Cloud Development Kit (CDK)应用程序。 CDK 应用程序由 lambda 函数、Fargate 等组成。问题是,CDK 不允许我指定它需要的所有角色。相反,它自己创造了一些。

几个例子:

  1. 每个具有日志保留功能的 lambda 函数都有一个由 CDK 创建的另一个 lambda,它将日志保留设置为日志组和日志流。
  2. 执行步骤函数的 CloudTrail 事件需要具有 states:StartExecution 权限的角色。

CDK 自动创建这些角色,并为其添加内联策略。这迫使我授予 CI/CD 角色创建角色和附加策略的权限。因此,如果任何人能够访问 CI/CD 用户(例如,如果我们的 GitHub 凭据泄露),攻击者就可以创建新角色并授予他们管理员权限。

我尝试在单独的堆栈中自己创建所有角色,然后在 CDK 应用程序中使用这些角色。但正如我上面提到的(参见上面的示例),这并不是在所有地方都是可能的......

我还尝试了部署者角色的 IAM 权限边界,但我不知道如何限制 iam:PutRolePolicy 的权限。 CDK 本质上执行以下操作:

  1. iam:CreateRole
  2. iam:PutRolePolicy

根据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:CreateLogStreamlogs:PutLogEvents 而没有其他。

我已经为此奋斗了相当长一段时间,并且我不想退回到授予不必要的更多权限。预先感谢大家!

最佳答案

以下是 CDK 1.4.0 的 Python 解决方案,灵感来自 GitHub 上的 @matthewtapper 代码。这允许您为堆栈中的所有角色设置权限边界。

不用说它非常难看,因为 python CDK 不提供方面的构造对象。我们必须深入挖掘 JSII 来解析对象。希望它能帮助某人。

from jsii._reference_map import _refs
from jsii._utils import Singleton
import jsii

@jsii.implements(core.IAspect)
class PermissionBoundaryAspect:

def __init__(self, permission_boundary: Union[aws_iam.ManagedPolicy, str]) -> None:
"""
:param permission_boundary: Either aws_iam.ManagedPolicy object or managed policy's ARN as string
"""
self.permission_boundary = permission_boundary

def visit(self, construct_ref: core.IConstruct) -> None:
"""
construct_ref only contains a string reference to an object. To get the actual object, we need to resolve it using JSII mapping.
:param construct_ref: ObjRef object with string reference to the actual object.
:return: None
"""
kernel = Singleton._instances[jsii._kernel.Kernel]
resolve = _refs.resolve(kernel, construct_ref)

def _walk(obj):
if isinstance(obj, aws_iam.Role):
cfn_role = obj.node.find_child('Resource')
policy_arn = self.permission_boundary if isinstance(self.permission_boundary, str) else self.permission_boundary.managed_policy_arn
cfn_role.add_property_override('PermissionsBoundary', policy_arn)
else:
if hasattr(obj, 'permissions_node'):
for c in obj.permissions_node.children:
_walk(c)
if obj.node.children:
for c in obj.node.children:
_walk(c)

_walk(resolve)

用法:

stack.node.apply_aspect(PermissionBoundaryAspect(managed_policy_arn))

关于amazon-web-services - 带条件的 CDK 应用程序的 IAM 权限边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559701/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com