Я пытаюсь создать защищенную MFA роль, предоставляющую AdministratorAccess
, которую может принять другой пользователь. Я могу получить его, чтобы определить пользователя и политику разрешений роли. Однако когда я определяю требование MFA, принципал и разрешенное действие дублируются в политике разрешений, что делает условие требования MFA бесполезным.
Мой код CDK выглядит следующим образом:
from aws_cdk import (
aws_iam as iam,
core,
)
class AssumeRoleStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
user = iam.User(self, 'myuser')
role = iam.Role(self, 'myrole',
assumed_by=iam.ArnPrincipal(user.user_arn),
max_session_duration=core.Duration.hours(8))
role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name('AdministratorAccess'))
role.assume_role_policy.add_statements(
iam.PolicyStatement(principals=[user],
actions=['sts:AssumeRole'],
conditions={'Bool': {'aws:MultiFactorAuthPresent': True}})
)
user.add_to_policy(iam.PolicyStatement(actions=['sts:AssumeRole'], resources=[role.role_arn]))
Результирующая политика разрешений роли выглядит следующим образом:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678910:user/assume-role-myuserZ09A543B-1ULCILBM447SF"
},
"Action": "sts:AssumeRole"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678910:user/assume-role-myuserZ09A543B-1ULCILBM447SF"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
Это не то, что я хочу, потому что - как упоминалось выше - пользователь сможет взять на себя роль даже без присутствия MFA. Мне нужно следующее:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::012345678910:user/assume-role-myuserZ09A543B-1ULCILBM447SF"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
Я уже пытался определить роль без аргумента assumed_by
и вместо этого добавить принципала в assume_role_policy
, но класс iam.Role
требует принципала. , Точно так же, iam.PolicyStatement
в assume_role_policy.add_statements()
не позволяет пропустить ни аргумент principals
, ни actions
.
Как я могу создать политику разрешений роли без избыточностей и без необходимости делать условия бесполезными из-за них