首页 > 解决方案 > AWS:对控制台用户而不是 CLI 强制执行 MFA

问题描述

我正在尝试为特定用户组授予管理员权限并为同一组强制执行 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 用户设置单独的用户组。

标签: amazon-web-servicesamazon-s3cloudamazon-iamaws-access-policy

解决方案


推荐阅读