# 如何强制IAM用户使用MFA

不同于使用IAM Identity Center，可以在配置中要求新用户登录时必须注册MFA。IAM用户需要通过增加一个额外的身份权限策略来规定：所有操作都必须使用了MFA才能做，除了到IAM绑定MFA不需要。

因此，加了这个策略以后需要通知所有使用IAM用户的人如果看到权限报错提醒，需要先到IAM中自行绑定一个MFA，重新登录后才能恢复。

配置方法如下：

## 创建自定义权限策略

创建一个策略，要求所有操作都必须使用了MFA才能做，除了到IAM绑定MFA不需要。

策略内容：

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

策略名称：DenyAllExceptListedIfNoMFA

## 给IAM用户增加权限策略

负责管理权限的安全或者运维人员，登录AWS Console，进入IAM，选择要强制使用MFA的IAM 用户。选择“添加权限”，“直接附加策略”，选中刚才创建好的策略：“DenyAllExceptListedIfNoMFA”

添加完成后该用户无法进行任何操作，只能在IAM界面中绑定一个MFA，绑定后<mark style="color:red;">**重新登录**</mark>才能恢复之前的访问权限。

启用MFA可以选择硬件MFA（需要购买FIDO2安全密钥），passkey MFA（需要使用苹果电脑，苹果手机等支持指纹识别的设备）或者虚拟MFA（需要在手机上安装MFA软件，并扫描二维码）。

参考资料：<https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa.html>

## CLI使用时

先登录控制台右上角找到自己的“安全凭证”入口，打开可以看到MFA的ARN。复制留着要用。

替换 *<mark style="color:red;">arn:aws:iam::123456789012:mfa/your-iam-user</mark>*&#x4E3A;你自己的MFA ARN。并且替换*123456*为你自己从MFA软件上看到的6位数字：

aws sts get-session-token --serial-number *<mark style="color:red;">arn:aws:iam::123456789012:mfa/your-iam-user</mark>* --token-code *<mark style="color:red;">123456</mark>*

你会获得一套临时凭证，你将这套临时凭证写到AWS 凭证文件 (\~/.aws/credentials)中：

```ini
[temp]
aws_access_key_id=ASIAY625JPUYWTZWBYJT
aws_secret_access_key=KKzyL6BGapGDYy1rAcxV3zzYIRZWhQZp9KRDiBpc
aws_session_token=IQoJb3JpZ2luX2VjENj//////////wEaCXVzLWVhc3QtMSJIMEYCIQC/KoqDpLi92kOJC1ZVERhRm08DnWYJ675QbQUA+TzHUQIhANT1XQwZYyTdnG2TSVyKgb18ns7YPuYu4kA5bID2fyskKvECCND//////////wEQABoMNjE1OTg2NTkzMDczIgyAXsA+Ghw2+bH8O/AqxQJYlfGejE910F+l5owG2dGuA/5QcbA/mxz3uylY+/aY2csluqxFuYkf9zT/to/chw72x+iMgm3CK5RLIDXlboNiGmqDCYKx5l+3ehkuLjN3p/GIW5FKlxby94NSv+9rORoCn7ermz5R3EZ+zKRedPXhHvo37qwgDo9ZWJSI7eOgKt8biSWaLqDngUgc/nesMuLH8mXUmSLRyZov2jc7fLDChyC4xFIZ9t1CTbt6fnMustAljRa/nCVX4oxZ+we3ADTCU9m+3xNJrcbX6XrQ/c4RjBVnICYezxBPUGKiPuDMCngYP97g7RyWhTFTz/cNeicyiiNon9ACKY8hH6GHl+3VYM1xmW4ZO5ptmbcIoWwIQBEIANpZKO/4xQ9GNjwGGXs9jHAdl6nPWqHrUfCsEa/6ak9tAM+h+wiVpFGfhQKCEBWFCbZaMKrY9rUGOqYBSqm2z/6Kz9tcPuMTiysObz4x+5PFXybm1ZKM5uCZ1wMGRAin1Lt+fUNLhtC/fSXMus7bLMlX9TFVJAqmdTiRgInK7pMDQkcam89su7jkg+r9jp3RLi6qI2pCVbvK73UGvKmuKizTvnl0+/NTrV9EV20Y6y2TNoU43WkuT/SvajE+41hye0LmbOwaLCnYJsrVTmxIkujczGr/TkqHJrM5SJE3ipSJ8A==

```

之后调用CLI的时候声明使用这个临时凭证则获取了授权，例如：

```
aws s3 ls --profile temp
```

{% hint style="warning" %}
这种使用方式，绑定的MFA必须是虚拟MFA，也就是通过软件生成6位数的MFA，硬件MFA或者passkey的不支持。
{% endhint %}

这么更安全但是不够方便，最好是真人调试代码使用IAM Identity Center，登录IAM Identity Center后可以直接复制出临时安全凭据使用。

## 参考资料

文档：<https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html>

视频：

<https://www.youtube.com/watch?v=BNpbGHhk5Tc>
