我正在尝试为特定用户组授予管理员权限并为同一组强制执行 MFA。不过,应该只对控制台用户强制执行 MFA,而不是在使用 AWS CLI 时强制执行。
这些是我一直在测试的策略:
策略 1 - 如果 MFA 授予管理员访问权限
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAdminAccessIfSignedInWithMFA",
"Effect": "Allow",
"Action": "*",
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
策略 2 - 仍然允许用户设置 MFA,以防它尚未激活
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": "iam:ListVirtualMFADevices",
"Resource": "*"
},
{
"Sid": "AllowManageOwnVirtualMFADevice",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:DeleteVirtualMFADevice"
],
"Resource": "arn:aws:iam::*:mfa/${aws:username}"
},
{
"Sid": "AllowManageOwnUserMFA",
"Effect": "Allow",
"Action": [
"iam:DeactivateMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": "arn:aws:iam::*:user/${aws:username}"
}
]
}
最后一项政策是从这一政策改编而来的。
aws:MultiFactorAuthPresent的官方文档说,据我了解,“Allow”、“BoolIfExists”和“true”的组合应该可以很好地满足我的目的:
如果密钥存在且存在,或者密钥不存在,则此条件匹配。Allow、BoolIfExists 和 true 的这种组合允许使用 MFA 进行身份验证的请求或无法使用 MFA 进行身份验证的请求。这意味着当请求者使用其长期访问密钥时,允许执行 AWS CLI、AWS API 和 AWS 开发工具包操作。此组合不允许来自可以但不包括 MFA 的临时凭证的请求。
如果您想知道为什么我不使用任何包含“拒绝”效果的(看似简单的)策略,例如:
"Effect" : "Deny",
"Condition" : { "BoolIfExists" : { "aws:MultiFactorAuthPresent" : "false" } }
...原因是:
Deny、BoolIfExists 和 false 的组合拒绝未使用 MFA 进行身份验证的请求。具体来说,它拒绝来自不包括 MFA 的临时凭证的请求。它还拒绝使用长期凭证发出的请求,例如使用访问密钥进行的 AWS CLI 或 AWS API 操作。*IfExists 运算符检查是否存在 aws:MultiFactorAuthPresent 键以及它是否存在,如其存在所示。当您想要拒绝任何未使用 MFA 进行身份验证的请求时,请使用此选项。这更安全,但可能会破坏使用访问密钥访问 AWS CLI 或 AWS API 的任何代码或脚本。
一切都按预期工作,除了我尝试使用 AWS CLI(使用访问密钥)访问资源时。我是否遗漏了什么或者文档是否具有误导性?
PS:我想避免为控制台和 CLI 用户设置单独的用户组。