

# IAM 中的 AWS 多重身份验证
<a name="id_credentials_mfa"></a>

为增强安全性，我们建议您配置 Multi-Factor Authentication (MFA) 以帮助保护 AWS 资源。您可以为所有 AWS 账户 的 AWS 账户根用户（包括独立账户、管理账户和成员账户）以及您的 IAM 用户启用 MFA。我们建议您尽可能使用防网络钓鱼的 MFA，例如通行密钥和安全密钥。这些基于 Fido 的身份验证器使用公钥加密技术，可抵御网络钓鱼、中间人和重放攻击，比基于 TOTP 的选项具有更强的安全级别。

对于根用户的所有账户类型，均强制实施 MFA。有关更多信息，请参阅 [保护您的 AWS Organizations 账户的根用户凭证](root-user-best-practices.md#ru-bp-organizations)。

当您为根用户启用 MFA 时，这只会影响根用户凭证。账户中的 IAM 用户是具有自己的凭证的不同身份，并且每个身份具有自己的 MFA 配置。有关使用 MFA 保护根用户的更多信息，请参阅 [AWS 账户根用户 的多重身份验证](enable-mfa-for-root.md)。

您的 AWS 账户根用户 和 IAM 用户最多可以注册 8 台任何类型的 MFA 设备。注册多台 MFA 设备可以提供灵活性，帮助您降低设备丢失或损坏时访问中断的风险。只需一台 MFA 设备即可登录 AWS 管理控制台 或通过 AWS CLI 创建会话。

**注意**  
我们建议您要求您的人类用户在访问 AWS 时使用临时凭证。您是否考虑过使用 AWS IAM Identity Center？ 您可以使用 IAM Identity Center 集中管理对多个 AWS 账户 的访问权限，并为用户提供受 MFA 保护的单点登录访问权限，可从一个位置访问其分配的所有账户。借助 IAM Identity Center，您可以在 IAM Identity Center 中创建和管理用户身份，或者轻松连接到现有的 SAML 2.0 兼容身份提供者。有关更多信息，请参阅*《AWS IAM Identity Center 用户指南》*中的[什么是 IAM Identity Center？](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)。

MFA 增加了额外安全性，要求用户在访问 AWS 网站或服务时除了提供登录凭证之外，还需提供 AWS 支持的 MFA 机制的唯一身份验证。

## MFA 类型
<a name="id_credentials_mfa-types"></a>

AWS 支持以下 MFA 类型：

**Contents**
+ [通行密钥和安全密钥](#passkeys-security-keys-for-iam-users)
+ [虚拟身份验证器应用程序](#virtual-auth-apps-for-iam-users)
+ [硬件 TOTP 令牌](#hardware-totp-token-for-iam-users)

### 通行密钥和安全密钥
<a name="passkeys-security-keys-for-iam-users"></a>

AWS Identity and Access Management 对 MFA 支持通行密钥和安全密钥。基于 FIDO 标准，通行密钥使用公有密钥加密技术来提供比密码更安全的强大防网络钓鱼身份验证。AWS 支持两种类型的通行密钥：设备绑定通行密钥（安全密钥）和同步通行密钥。
+ **安全密钥**：这些是物理设备，例如 YubiKey，用作身份验证的第二个因素。单个安全密钥可以支持多个根用户账户和 IAM 用户。
+ **同步通行密钥**：它们使用来自 Google、Apple、Microsoft 账户等提供商的凭证管理器以及第三方服务（例如 1Password、Dashlane 和 Bitwarden）作为第二个因素。

您可以使用内置生物识别身份验证器（例如，Apple MacBook 上的 Touch ID）来解锁凭证管理器并登录 AWS。通行密钥是通过您选择的提供商使用您的指纹、面部或设备 PIN 创建的。您还可以使用一台设备（如移动设备或硬件安全密钥）上的跨设备身份验证 (CDA) 密钥在另一台设备（如笔记本电脑）上登录。有关更多信息，请参阅[跨设备身份验证](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda) (CDA)。

您可以跨设备同步通行密钥以方便登录 AWS，从而增强可用性和可恢复性。有关启用通行密钥和安全密钥的更多信息，请参阅 [为根用户启用密钥或安全密钥（控制台）](enable-fido-mfa-for-root.md)。

FIDO 联盟维护一份与 FIDO 规范兼容的所有经 [FIDO 认证产品](https://fidoalliance.org/certification/fido-certified-products/)的列表。

### 虚拟身份验证器应用程序
<a name="virtual-auth-apps-for-iam-users"></a>

虚拟身份验证器应用程序在电话或其他设备上运行，并模拟物理设备。虚拟身份验证器应用程序采用[基于时间的一次性密码](https://datatracker.ietf.org/doc/html/rfc6238)（TOTP）算法，并支持单个设备上的多个令牌。在登录期间，用户必须在出现提示时从该设备键入有效代码。分配给用户的每个令牌必须是唯一的。用户无法从另一个用户的令牌键入代码来进行身份验证。

我们建议您使用防网络钓鱼的 MFA，[例如通行密钥或安全密钥，以获得](#passkeys-security-keys-for-iam-users)最强的保护。如果您还不能使用通行密钥或安全密钥，我们建议您在等待硬件购买批准或等待硬件到达时，使用虚拟 MFA 设备作为临时措施。有关可用作虚拟 MFA 设备的一些受支持应用程序的列表，请参阅[多重身份验证（MFA）](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。

有关为 IAM 用户设置虚拟 MFA 设备的说明，请参阅 [在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)。

**注意**  
当您通过 AWS 管理控制台或在登录过程中添加新的虚拟 MFA 设备时，系统会删除您的 AWS 账户中未分配的虚拟 MFA 设备。未分配的虚拟 MFA 设备是指您账户中的设备，但在登录过程中不被账户根用户或 IAM 用户使用。已删除这些设备，因此可以向您的账户添加新的虚拟 MFA 设备。它还允许您重复使用设备名称。  
要查看账户中未分配的虚拟 MFA 设备，您可以使用 [list-virtual-mfa-devices](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-virtual-mfa-devices.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html) call 调用。
要停用虚拟 MFA 设备，您可以使用 [deactivate-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/deactivate-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 调用。设备将变为未分配状态。
要将未分配的虚拟 MFA 设备附加到您的 AWS 账户根用户或 IAM 用户，您需要设备生成的身份验证码，以及 [enable-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 调用。

### 硬件 TOTP 令牌
<a name="hardware-totp-token-for-iam-users"></a>

硬件设备以[基于时间的一次性密码（TOTP）算法](https://datatracker.ietf.org/doc/html/rfc6238)为基础生成六位数字代码。在登录时，用户必须在另一个网页上键入来自该设备的有效代码。

这些令牌仅与 AWS 账户 一起使用。您只能使用具有与 AWS 安全共享的唯一令牌种子的令牌。令牌种子是在制作令牌时生成的私有密钥。从其他来源购买的令牌不能用于 IAM。为确保兼容性，您必须通过以下链接之一购买硬件 MFA 设备：[OTP 令牌](https://www.amazon.com/SafeNet-IDProve-Time-based-6-Digit-Services/dp/B002CRN5X8)或 [OTP 显卡](https://www.amazon.com/SafeNet-IDProve-Card-Amazon-Services/dp/B00J4NGUO4)。
+ 分配给用户的每台 MFA 设备必须是唯一的。用户无法从另一个用户的设备键入代码来进行身份验证。有关受支持硬件 MFA 设备的信息，请参阅[多重身份验证（MFA）](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。
+ 如果想使用物理 MFA 设备，我们建议使用安全密钥来代替硬件 TOTP 设备。安全密钥不需要电池，具有防网络钓鱼功能，并可在一台设备上支持多个用户。

您只能从 AWS 管理控制台 启用密钥或安全密钥，而不能从 AWS CLI 或 AWS API 启用。在启用安全密钥之前，您必须对设备拥有物理访问权限。

有关为 IAM 用户设置硬件 TOTP 令牌的说明，请参阅 [在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)。

**注意**  
**基于 SMS 短信的 MFA** – AWS 已终止对短信多重身份验证（MFA）的支持。我们建议拥有使用基于短信的 MFA 的 IAM 用户的客户切换到以下替代方法之一：[密码或安全密钥](id_credentials_mfa_enable_fido.md)、[虚拟（基于软件）MFA 设备](id_credentials_mfa_enable_virtual.md)或[硬件 MFA 设备](id_credentials_mfa_enable_physical.md)。您可以确定账户中拥有已分配短信 MFA 设备的用户。在 IAM 控制台中，从导航窗格中选择**用户**，然后在表的 **MFA** 列中查找具有 **SMS** 的用户。

## MFA 建议
<a name="id_credentials_mfa-recommendations"></a>

为了帮助保护您的 AWS 身份，请遵循以下 MFA 身份验证建议。
+ 我们建议您使用防网络钓鱼的 MFA（例如通行密钥和安全密钥 ）作为 MFA 设备。这些基于 Fido 的身份验证器可针对网络钓鱼等攻击提供最强大的保护。
+ 我们建议您在您的 AWS 账户 中为 AWS 账户根用户 和 IAM 用户启用多台 MFA 设备。这可以使您提高 AWS 账户 中的安全门槛，简化对高权限用户（例如 AWS 账户根用户）的访问管理。
+ 您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。注册多台 MFA 设备后，只需一台 MFA 设备即可以该用户的身份登录 AWS 管理控制台 或通过 AWS CLI 创建会话。IAM 用户必须使用现有的 MFA 设备进行身份验证，然后才能启用或禁用其他 MFA 设备。
+ 如果 MFA 设备丢失、被盗或无法访问，您可以使用剩余 MFA 设备中的一台访问 AWS 账户，而无需执行 AWS 账户 恢复程序。如果 MFA 设备遗失或被盗，应将解除该设备与所关联 IAM 主体的关联。
+ 通过使用多个 MFA，在地理位置上分散或进行远程办公的员工可以使用基于硬件的 MFA 访问 AWS，同时无需在员工之间协调单个硬件设备的实物交换。
+ 通过为 IAM 主体使用额外的 MFA 设备，您使用一个或多个 MFA 来满足日常需要，同时在安全的物理位置（例如保管库或保险柜）保存物理 MFA 设备，以满足备份和冗余的需要。

**备注**  
您无法将安全密钥或通行密钥的 MFA 信息传递给 AWS STS API 操作来请求临时凭证。使用安全密钥或通行密钥时，您可通过运行 `aws login` 命令获取与 AWS CLI 和 AWS SDK 配合使用的凭证。
您无法使用 AWS CLI 命令或 AWS API 操作来启用 [FIDO 安全密钥](id_credentials_mfa_enable_fido.md)。
多个根用户或 IAM MFA 设备不能使用相同的名称。

## 其他资源
<a name="id_credentials_mfa-resources"></a>

以下资源可帮助您了解有关 MFA 的更多信息。
+ 有关使用 MFA 访问 AWS 的更多信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。
+  您可以利用 IAM Identity Center 来启用对 AWS 访问门户、IAM Identity Center 集成应用以及 AWS CLI 的安全访问。有关更多信息，请参阅[在 IAM Identity Center 中启用 MFA](https://docs.aws.amazon.com/singlesignon/latest/userguide/mfa-getting-started.html)。

# 在 AWS 管理控制台 中分配密钥或安全密钥
<a name="id_credentials_mfa_enable_fido"></a>

密钥是一种[多重身份验证（MFA）设备](id_credentials_mfa.md)，可用于保护您的 AWS 资源。AWS 支持同步密钥和设备绑定密钥（也称为安全密钥）。

同步密钥允许 IAM 用户在其许多设备（甚至是新设备）上访问其 FIDO 登录凭证，而不必在每个账户上重新注册每台设备。同步密钥包括 Google、Apple 和 Microsoft 等第一方凭证管理器以及第三方凭证管理器（例如1 Password、Dashlane 和 Bitwarden）作为第二个因素。还可以使用设备上的生物识别技术（如 TouchID、FaceID）来解锁选择的凭证管理器以使用密钥。

或者，设备绑定密钥绑定到 FIDO 安全密钥，您可以其插入计算机的 USB 端口，然后在出现提示时点击以安全地完成登录过程。如果您已将 FIDO 安全密钥用于其他服务，它将有一个 [AWS 支持的配置](id_credentials_mfa_fido_supported_configurations.md)（例如，来自 Yubico 的 YubiKey 5 Series），您也可以将其用于 AWS。否则，如果要在 AWS 中使用面向 MFA 的 WebAuthn，您需要购买 FIDO 安全密钥。此外，FIDO 安全密钥可以在同一台设备上支持多个 IAM 用户后根用户，从而增强在保护账户安全方面的实用性。有关这两种设备类型的规格和购买信息，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。

您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。注册多台 MFA 设备后，只需一台 MFA 设备即可以该用户的身份登录 AWS 管理控制台 或通过 AWS CLI 创建会话。建议注册多个 MFA 设备。例如，您可以注册内置身份验证器，也可以注册保存在物理安全位置的安全密钥。如果您无法使用内置身份验证器，则可以使用已注册的安全密钥。对于身份验证器应用程序，我们还建议您在这些应用程序中启用云备份或同步功能，以避免在设备丢失或损坏身份验证器应用程序时失去对账户的访问权限。

**注意**  
我们建议您要求您的人类用户在访问 AWS 时使用临时凭证。您的用户可以与一个身份提供商联合身份到 AWS中，使用其企业凭证和 MFA 配置进行身份验证。为了管理对 AWS 的访问和业务应用程序，我们建议您使用 IAM Identity Center。有关更多信息，请参阅《[IAM Identity Center 用户指南](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)》。

**Topics**
+ [所需权限](#enable-fido-mfa-for-iam-user-permissions-required)
+ [为您自己的 IAM 用户启用密钥或安全密钥（控制台）](#enable-fido-mfa-for-own-iam-user)
+ [为其他 IAM 用户启用密钥或安全密钥（控制台）](#enable-fido-mfa-for-iam-user)
+ [替换密钥或安全密钥](#replace-fido-mfa)
+ [使用密钥或安全密钥的受支持配置](id_credentials_mfa_fido_supported_configurations.md)

## 所需权限
<a name="enable-fido-mfa-for-iam-user-permissions-required"></a>

要为您自己的 IAM 用户管理 FIDO 密钥，同时保护与 MFA 相关的敏感操作，您必须具有以下策略中的权限：

**注意**  
ARN 值是静态值，不用于指示注册身份验证器所使用的协议。我们已弃用 U2F，因此所有新的实现都使用 WebAuthn。

------
#### [ JSON ]

****  

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

------

## 为您自己的 IAM 用户启用密钥或安全密钥（控制台）
<a name="enable-fido-mfa-for-own-iam-user"></a>

您只能从 AWS 管理控制台 为您自己的 IAM 用户启用密钥或安全密钥，而不能从 AWS CLI 或 AWS API 启用。在启用安全密钥之前，您必须对设备拥有物理访问权限。

**为您自己的 IAM 用户启用密钥或安全密钥（控制台）**

1. 使用 AWS 账户 ID 或账户别名、您的 IAM 用户名和密码登录到 [IAM 控制台](https://console.aws.amazon.com/iam)。
**注意**  
为方便起见，AWS登录页面使用浏览器 Cookie 记住您的 IAM 用户名和账户信息。如果您之前以其他用户身份登录，请选择页面底部的 **Sign-in to a different account**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台 安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-user.shared.console.png)

1. 在所选 IAM 用户的页面上，选择**安全凭证**选项卡。

1. 在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在 **MFA 设备名称**页面上，输入**设备名称**，选择**密钥或安全密钥**，然后选择**下一步**。

1. 在**设置设备**上，设置您的密钥。使用面部或指纹等生物识别数据、设备 PIN 码或将 FIDO 安全密钥插入计算机的 USB 端口并点按即可创建密钥。

1. 按照浏览器上的说明进行操作，然后选择**继续**。

现在，您已经注册了用于 AWS 的密钥或安全密钥。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 为其他 IAM 用户启用密钥或安全密钥（控制台）
<a name="enable-fido-mfa-for-iam-user"></a>

您只能从 AWS 管理控制台 为其他 IAM 用户启用密钥或安全密钥，而不能从 AWS CLI 或 AWS API 启用。

**为其他 IAM 用户启用密钥或安全密钥（控制台）**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 在**用户**下，选择要为其启用 MFA 的用户的名称。

1. 在所选 IAM 用户页面上，选择**安全凭证**选项卡。

1. 在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在 **MFA 设备名称**页面上，输入**设备名称**，选择**密钥或安全密钥**，然后选择**下一步**。

1. 在**设置设备**上，设置您的密钥。使用面部或指纹等生物识别数据、设备 PIN 码或将 FIDO 安全密钥插入计算机的 USB 端口并点按即可创建密钥。

1. 按照浏览器上的说明进行操作，然后选择**继续**。

现在，您已经注册了供其他 IAM 用户用于 AWS 的密钥或安全密钥。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 替换密钥或安全密钥
<a name="replace-fido-mfa"></a>

您一次最多可以向 AWS 账户根用户 和 IAM 用户分配 8 台 [ 当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。如果用户丢失 FIDO 身份验证器或者出于某种原因需要进行替换，必须先停用旧的 FIDO 身份验证器。然后，您可以为用户添加新 MFA 设备。
+ 要停用当前与 IAM 用户关联的设备，请参阅 [停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为 IAM 用户添加新的 FIDO 安全密钥，请参阅 [为您自己的 IAM 用户启用密钥或安全密钥（控制台）](#enable-fido-mfa-for-own-iam-user)。

如果无权访问新的密钥或安全密钥，则可以启用新的虚拟 MFA 设备或硬件 TOTP 令牌。有关说明，请参阅以下章节之一：
+ [在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md) 
+ [在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md) 

# 使用密钥或安全密钥的受支持配置
<a name="id_credentials_mfa_fido_supported_configurations"></a>

您可以通过使用当前支持的配置，将 FIDO2 设备绑定密钥（也称为安全密钥）配置为 IAM 的多重身份验证（MFA）方法。这包括 IAM 支持的 FIDO2 设备及支持 FIDO2 的浏览器。在注册 FIDO2 设备之前，请确认您使用的是最新版本的浏览器和操作系统（OS）。相关功能在不同的浏览器、身份验证器和操作系统客户端上可能有不同的行为。如果您的设备在一种浏览器上注册失败，则可以尝试使用其他浏览器注册。

FIDO2 是开放身份验证标准，作为 FIDO U2F 的扩展，基于公有密钥加密提供同样高级别的安全性。FIDO2 由 W3C Web 身份验证规范（WebAuthn API）和 FIDO 联盟客户端到身份验证器协议（CTAP，一种应用程序层协议）组成。CTAP 支持客户端或平台（如浏览器或操作系统）与外部身份验证器之间进行通信。当您在 AWS 中启用经 FIDO 认证的身份验证器时，安全密钥会创建仅适用于 AWS 的新密钥对。首先，输入您的凭证。出现提示时，点击安全密钥，这会响应 AWS 发出的身份验证质询。要了解有关 FIDO2 标准的更多信息，请参阅 [FIDO2 项目](https://en.wikipedia.org/wiki/FIDO2_Project)。

## AWS 支持的 FIDO2 设备
<a name="id_credentials_mfa_fido_supported_devices"></a>

IAM 支持 FIDO2 安全设备，这些设备可通过 USB、Bluetooth或 NFC 连接到您的设备。IAM 还支持 TouchID 或 FaceID 等平台身份验证器。IAM 不支持 Windows Hello 的本地密钥注册。若要创建和使用密钥，Windows 用户应使用[跨设备身份验证](https://passkeys.dev/docs/reference/terms/#cross-device-authentication-cda)，即使用来自一台设备（例如移动设备）的密钥或硬件安全密钥在另一台设备（如笔记本电脑）上登录。

**注意**  
AWS 需要访问您的计算机上的物理 USB 端口以验证您的 FIDO2 设备。安全密钥不支持虚拟机、远程连接或浏览器的无痕模式。

FIDO 联盟维护一份与 FIDO 规范兼容的所有 [FIDO2 产品](https://fidoalliance.org/certification/fido-certified-products/)的列表。

## 支持 FIDO2 的浏览器
<a name="id_credentials_mfa_fido_browsers"></a>

FIDO2 安全设备能否在 Web 浏览器中运行，取决于具体的浏览器和操作系统组合。以下浏览器当前支持使用安全密钥：


****  

| Web 浏览器 | macOS 10.15\$1 | Windows 10 | Linux | iOS 14.5\$1 | Android 7\$1 | 
| --- | --- | --- | --- | --- | --- | 
| Chrome | 支持 | 是 | 是 | 是 | 否 | 
| Safari | 是 | 否 | 否 | 是 | 否 | 
| Edge | 是 | 是 | 否 | 是 | 否 | 
| Firefox | 支持 | 是 | 否 | 是 | 否 | 

**注意**  
当前支持 FIDO2 的大多数 Firefox 版本默认情况下不会启用支持。有关在 Firefox 中启用 FIDO2 支持的说明，请参阅 [排查通行密钥和 FIDO 安全密钥问题](troubleshoot_mfa-fido.md)。  
macOS 上的 Firefox 可能不完全支持通行密钥的跨设备身份验证工作流程。系统可能会提示您触摸安全密钥，而不是继续进行跨设备身份验证。建议使用其他浏览器（例如 Chrome 或 Safari）在 macOS 上使用通行密钥登录。

要详细了解支持 FIDO2 认证设备（如 YubiKey）的浏览器，请参阅 [Operating system and web browser support for FIDO2 and U2F](https://support.yubico.com/hc/en-us/articles/360016615020-Operating-system-and-web-browser-support-for-FIDO2-and-U2F)。

### 浏览器插件
<a name="id_credentials_mfa_fido_plugins"></a>

AWS 仅支持原生支持 FIDO2 的浏览器。AWS 不支持使用插件来添加 FIDO2 浏览器支持。某些浏览器插件与 FIDO2 标准不兼容，这可能会导致 FIDO2 安全密钥产生意外结果。

有关禁用浏览器插件和其他问题排查提示的信息，请参阅[我无法启用我的 FIDO 安全密钥](troubleshoot_mfa-fido.md#troubleshoot_mfa-fido-cant-enable)。

## 设备认证
<a name="id_credentials_mfa_fido_certifications"></a>

我们仅在注册安全密钥期间捕获和分配与设备相关的认证，例如 FIPS 验证和 FIDO 认证级别。从 [FIDO Alliance Metadata Service（MDS）](https://fidoalliance.org/metadata/)获取设备认证。如果您的安全密钥的认证状态或级别发生变化，则不会自动反映在设备标签中。要更新设备的认证信息，请再次注册设备，以获取更新的认证信息。

AWS 在设备注册期间提供以下认证类型作为条件密钥，从 FIDO MDS 获得：FIPS-140-2、FIPS-140-3 和 FIDO 认证级别。您可以根据首选认证类型和级别，在其 IAM policy 中指定特定身份验证器的注册。有关更多信息，请参阅下面的策略。

### 设备认证策略示例
<a name="id_credentials_mfa_fido_certifications_policies"></a>

以下用例显示允许您为 MFA 设备注册 FIPS 认证的示例策略。

**Topics**
+ [用例 1：只允许注册通过 FIPS-140-2 L2 认证的设备](#id_credentials_mfa_fido_certifications_policies_use_case_1)
+ [用例 2：允许注册通过 FIPS-140-2 L2 和 FIDO L1 认证的设备](#id_credentials_mfa_fido_certifications_policies_use_case_2)
+ [用例 3：允许注册通过 FIPS-140-2 L2 或 FIPS-140-3 L2 认证的设备](#id_credentials_mfa_fido_certifications_policies_use_case_3)
+ [使用案例 4：允许已通过 FIPS-140-2 L2 认证并支持其他 MFA 类型（例如虚拟身份验证器和硬件 TOTP）的设备注册](#id_credentials_mfa_fido_certifications_policies_use_case_4)

#### 用例 1：只允许注册通过 FIPS-140-2 L2 认证的设备
<a name="id_credentials_mfa_fido_certifications_policies_use_case_1"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2"
                }
            }
        }
    ]
}
```

------

#### 用例 2：允许注册通过 FIPS-140-2 L2 和 FIDO L1 认证的设备
<a name="id_credentials_mfa_fido_certifications_policies_use_case_2"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2",
                    "iam:FIDO-certification": "L1"
                }
            }
        }
    ]
}
```

------

#### 用例 3：允许注册通过 FIPS-140-2 L2 或 FIPS-140-3 L2 认证的设备
<a name="id_credentials_mfa_fido_certifications_policies_use_case_3"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Create"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-2-certification": "L2"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:EnableMFADevice",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:RegisterSecurityKey" : "Activate",
                    "iam:FIDO-FIPS-140-3-certification": "L2"
                }
            }
        }
    ]
}
```

------

#### 使用案例 4：允许已通过 FIPS-140-2 L2 认证并支持其他 MFA 类型（例如虚拟身份验证器和硬件 TOTP）的设备注册
<a name="id_credentials_mfa_fido_certifications_policies_use_case_4"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:RegisterSecurityKey": "Create"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:RegisterSecurityKey": "Activate",
          "iam:FIDO-FIPS-140-2-certification": "L2"
        }
      }
    },
    {
      "Effect": "Allow",
      "Action": "iam:EnableMFADevice",
      "Resource": "*",
      "Condition": {
        "Null": {
          "iam:RegisterSecurityKey": "true"
        }
      }
    }
  ]
}
```

------

## AWS CLI 和 AWS API
<a name="id_credentials_mfa_fido_cliapi"></a>

AWS 支持仅在 AWS 管理控制台 中使用密钥或安全密钥。在 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/) 和 [AWS API](https://aws.amazon.com/tools/) 中不支持使用密钥和安全密钥进行 MFA，也不支持使用密钥和安全密钥访问 [MFA 保护的 API 操作](id_credentials_mfa_configure-api-require.md)。

## 其他资源
<a name="id_credentials_mfa_fido_additional_resources"></a>
+ 有关在 AWS 中使用密钥和安全密钥的更多信息，请参阅 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)。
+ 有关在 AWS 中对密钥和安全密钥进行故障排除的帮助信息，请参阅 [排查通行密钥和 FIDO 安全密钥问题](troubleshoot_mfa-fido.md)。
+ 有关 FIDO2 支持的一般行业信息，请参阅 [FIDO2 项目](https://en.wikipedia.org/wiki/FIDO2_Project)。

# 在 AWS 管理控制台 中分配虚拟 MFA 设备
<a name="id_credentials_mfa_enable_virtual"></a>

**重要**  
AWS 建议您在登录 AWS 时，尽可能使用通行密钥或安全密钥作为 MFA。有关更多信息，请参阅 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)。

您可以将手机或其他设备作为虚拟多重身份验证（MFA）设备。为此，请安装符合 [RFC 6238](https://datatracker.ietf.org/doc/html/rfc6238) 的移动应用程序，这是一种基于标准的 TOTP（基于时间的一次性密码）算法。这些应用程序生成六位数的身份验证代码。由于身份验证器可以在不安全的移动设备上运行，而且代码有可能与未经授权的各方共享，因此基于 TOTP 的 MFA 无法提供与 [FIDO2](https://en.wikipedia.org/wiki/FIDO_Alliance#FIDO2) 安全密钥和通行密钥等防网络钓鱼选项相同的安全级别。我们建议您使用通行密钥或安全密钥进行 MFA，以最有效地防范网络钓鱼等攻击。

如果您还不能使用通行密钥或安全密钥，我们建议您在等待硬件购买批准或等待硬件到达时，使用虚拟 MFA 设备作为临时措施。

大多数虚拟 MFA 应用程序支持创建多个虚拟设备，从而允许您在多个 AWS 账户 或用户中使用相同的应用程序。您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台 [MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。只需一台 MFA 设备即可登录 AWS 管理控制台 或通过 AWS CLI 创建会话。建议注册多个 MFA 设备。对于身份验证器应用程序，我们还建议您启用云备份或同步功能，以帮助避免在设备丢失或损坏时失去对账户的访问权限。

AWS 需要可产生六位数 OTP 的虚拟 MFA 应用程序。有关您可以使用的虚拟 MFA 应用程序的列表，请参阅 [Multi-Factor Authentication](https://aws.amazon.com/iam/features/mfa/?audit=2019q1)。

**Topics**
+ [所需权限](#mfa_enable_virtual_permissions-required)
+ [为 IAM 用户启用虚拟 MFA 设备（控制台）](#enable-virt-mfa-for-iam-user)
+ [替换虚拟 MFA 设备](#replace-virt-mfa)

## 所需权限
<a name="mfa_enable_virtual_permissions-required"></a>

要管理您的 IAM 用户的虚拟 MFA 设备，您必须具有以下策略中的权限：[AWS：允许使用 MFA 完成身份验证的 IAM 用户在“安全凭证”页面上管理自己的 MFA 设备。](reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.md)。

## 为 IAM 用户启用虚拟 MFA 设备（控制台）
<a name="enable-virt-mfa-for-iam-user"></a>

您可在 AWS 管理控制台 中使用 IAM 为您账户中的 IAM 用户启用和管理虚拟 MFA 设备。您可以将标签附加到 IAM 资源（包括虚拟 MFA 设备），以识别、组织和控制对这些资源的访问。只有在使用 AWS CLI 或 AWS API 时，才能标记虚拟 MFA 设备。要使用 AWS CLI 或 AWS API 启用和管理 MFA 设备，请参阅 [在 AWS CLI 或 AWS API 中分配 MFA 设备](id_credentials_mfa_enable_cliapi.md)。有关标记 IAM 资源的更多信息，请参阅 [AWS Identity and Access Management 资源的标签](id_tags.md)。

**注意**  
您必须拥有对将托管用户的虚拟 MFA 设备的硬件的物理访问权限以便配置 MFA。例如，您可能为使用在智能手机上运行的虚拟 MFA 设备的用户配置 MFA。在这种情况下，您必须具有智能手机才能完成该向导。因此，您可能想让用户配置和管理他们自己的虚拟 MFA 设备。在此情况下，您必须授予用户执行必要的 IAM 操作所需的权限。有关更多信息以及授予这些权限的 IAM 策略示例，请参阅 [IAM 教程：允许用户管理其凭证和 MFA 设置](tutorial_users-self-manage-mfa-and-creds.md) 和示例策略 [AWS：允许使用 MFA 完成身份验证的 IAM 用户在“安全凭证”页面上管理自己的 MFA 设备。](reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.md)。

**为 IAM 用户启用虚拟 MFA 设备（控制台）**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 在 **用户**列表中，选择 IAM 用户的名称。

1. 选择 **Security Credentials (安全凭证)** 选项卡。在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入**设备名称**，选择**身份验证器应用程序**，然后选择**下一步**。

   IAM 将生成并显示虚拟 MFA 设备的配置信息，包括 QR 代码图形。此图形是秘密配置密钥的表示形式，适用于不支持 QR 代码的设备上的手动输入。

1. 打开您的虚拟 MFA 应用程序。有关可用于托管虚拟 MFA 设备的应用程序的列表，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。

   如果虚拟 MFA 应用程序支持多个虚拟 MFA 设备或账户，请选择相应的选项以创建新的虚拟 MFA 设备或账户。

1. 确定 MFA 应用程序是否支持 QR 代码，然后执行以下操作之一：
   + 在向导中，选择 **Show QR 代码 (显示 QR 代码)**，然后使用该应用程序扫描 QR 代码。这可能是摄像头图标或使用设备的摄像头扫描代码的**扫描代码**选项。
   + 在向导中，选择 **Show secret key**（显示私有密钥），然后在您的 MFA 应用程序中键入私有密钥。

   完成操作后，虚拟 MFA 设备会开始生成一次性密码。

1. 在**设置设备**页面中的 **MFA 代码 1** 框中，键入虚拟 MFA 设备当前显示的一次性密码。请等候 30 秒，以便设备生成新的一次性密码。然后在 **MFA code 2 (MFA 代码 2)** 框中键入第二个一次性密码。选择 **Add MFA**（添加 MFA）。
**重要**  
生成代码之后立即提交您的请求。如果生成代码后等待很长时间才提交请求，MFA 设备会成功与用户关联，但 MFA 设备无法同步。这是因为基于时间的一次性密码（TOTP）很快会过期。这种情况下，您可以[重新同步设备](id_credentials_mfa_sync.md)。

虚拟 MFA 设备现在已准备好与 AWS 一起使用了。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

**注意**  
当您通过 AWS 管理控制台或在登录过程中添加新的虚拟 MFA 设备时，系统会删除您 AWS 账户中未分配的虚拟 MFA 设备。未分配的虚拟 MFA 设备是指您账户中的设备，但在登录过程中不被账户根用户或 IAM 用户使用。已删除这些设备，因此可以向您的账户添加新的虚拟 MFA 设备。它还允许您重复使用设备名称。  
要查看账户中未分配的虚拟 MFA 设备，您可以使用 [list-virtual-mfa-devices](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-virtual-mfa-devices.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html) 调用。
要停用虚拟 MFA 设备，您可以使用 [deactivate-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/deactivate-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 调用。设备将变为未分配状态。
要将未分配的虚拟 MFA 设备附加到您的 AWS 账户根用户或 IAM 用户，您需要设备生成的身份验证码，以及 [enable-mfa-device](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/enable-mfa-device.html) AWS CLI 命令或 [API](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 调用。

## 替换虚拟 MFA 设备
<a name="replace-virt-mfa"></a>

您的 AWS 账户根用户 和 IAM 用户最多可以注册 **8** 台 MFA 类型任意组合的 MFA 设备。如果用户丢失设备或出于任何原因需要更换设备，请先停用旧设备。然后，您可以为用户添加新设备。
+ 要停用当前与其他 IAM 用户关联的设备，请参阅 [停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为其他 IAM 用户添加替换虚拟 MFA 设备，请按照上述 [为 IAM 用户启用虚拟 MFA 设备（控制台）](#enable-virt-mfa-for-iam-user) 过程中的步骤进行操作。
+ 要为 AWS 账户根用户添加替换虚拟 MFA 设备，请按照 [为根用户启用虚拟 MFA 设备（控制台）](enable-virt-mfa-for-root.md) 过程中的步骤操作。

# 在 AWS 管理控制台 中分配硬件 TOTP 令牌
<a name="id_credentials_mfa_enable_physical"></a>

**重要**  
AWS 建议您在登录 AWS 时，尽可能使用通行密钥或安全密钥作为 MFA。有关更多信息，请参阅 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)。

硬件 TOTP 令牌以基于时间的一次性密码（TOTP）算法为基础生成一个六位数字代码。在登录过程中，用户必须在出现提示时从该设备键入有效代码。分配给用户的每个 MFA 设备都必须是唯一的；进行身份验证时，某个用户无法从另一个用户的设备键入代码。MFA 设备不能跨账户或用户共享。

硬件 TOTP 令牌和 [FIDO 安全密钥](id_credentials_mfa_enable_fido.md)都是您购买的物理设备。硬件 MFA 设备会在您登录 AWS 时生成 TOTP 验证码来验证身份。此类设备需要使用电池，并且随着时间推移可能需要更换以及与 AWS 重新同步。FIDO 安全密钥采用公钥加密技术，不需要电池，并且可提供无缝的身份验证流程。我们建议使用 FIDO 安全密钥，是因为此类密钥能够抵御网络钓鱼攻击，是 TOTP 设备的更安全替代方案。此外，FIDO 安全密钥可以在同一台设备上支持多个 IAM 用户后根用户，从而增强在保护账户安全方面的实用性。有关这两种设备类型的规格和购买信息，请参阅[多重身份验证](https://aws.amazon.com/iam/details/mfa/)。



您可以从 AWS 管理控制台、命令行或 IAM API 为 IAM 用户启用硬件 TOTP 令牌。要为 AWS 账户根用户 启用 MFA 设备，请参阅[为根用户启用硬件 TOTP 令牌（控制台）](enable-hw-mfa-for-root.md)。

您最多可以向 AWS 账户根用户 和 IAM 用户注册 **8** 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。注册多台 MFA 设备后，只需一台 MFA 设备即可以该用户的身份登录 AWS 管理控制台 或通过 AWS CLI 创建会话。

**重要**  
我们建议您为用户启用多台 MFA 设备，以便在 MFA 设备丢失或无法访问时能够继续访问您的账户。

**注意**  
如果想从命令行启用 MFA 设备，请使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html)。如要使用 IAM API 启用 MFA 设备，请使用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 操作。

**Topics**
+ [所需权限](#enable-hw-mfa-for-iam-user-permissions-required)
+ [为您自己的 IAM 用户启用硬件 TOTP 令牌（控制台）](#enable-hw-mfa-for-own-iam-user)
+ [为其他 IAM 用户启用硬件 TOTP 令牌（控制台）](#enable-hw-mfa-for-iam-user)
+ [替换物理 MFA 设备](#replace-phys-mfa)

## 所需权限
<a name="enable-hw-mfa-for-iam-user-permissions-required"></a>

要为您自己的 IAM 用户管理硬件 TOTP 令牌，同时保护与 MFA 相关的敏感操作，您必须具有以下策略中的权限：

------
#### [ JSON ]

****  

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

------

## 为您自己的 IAM 用户启用硬件 TOTP 令牌（控制台）
<a name="enable-hw-mfa-for-own-iam-user"></a>

 您可以从 AWS 管理控制台 启用您自己的硬件 TOTP 令牌。

**注意**  
在启用硬件 TOTP 令牌之前，您必须拥有对设备的物理访问权限。

**为您自己的 IAM 用户启用硬件 TOTP 令牌（控制台）**

1. 使用 AWS 账户 ID 或账户别名、您的 IAM 用户名和密码登录到 [IAM 控制台](https://console.aws.amazon.com/iam)。
**注意**  
为方便起见，AWS 登录页面使用浏览器 Cookie 记住您的 IAM 用户名和账户信息。如果您之前以其他用户身份登录，请选择页面底部的 **Sign-in to a different account**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台 安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-user.shared.console.png)

1. 在 **AWS IAM 凭证**选项卡的**多重身份验证（MFA）**部分中，选择**分配 MFA 设备**。

1. 在向导中，键入 **Device name**（设备名称），选择 **Hardware TOTP token**（硬件 TOTP 令牌），然后选择 **Next**（下一步）。

1. 键入设备序列号。序列号通常位于设备的背面。

1. 在 **MFA code 1 (MFA 代码 1)** 框中，输入 MFA 设备显示的六位数编码。您需要按设备正面的按钮来显示编码。  
![\[IAM 控制面板，MFA 设备\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/MFADevice.png)

1. 在设备刷新期间等候 30 秒，然后在 **MFA code 2 (MFA 代码 2)** 框中键入第二个六位数编码。您需要再次按设备正面的按钮来显示第二个编码。

1. 选择 **Add MFA**（添加 MFA）。
**重要**  
在生成身份验证代码后立即提交您的请求。如果生成代码后等待很长时间才提交请求，MFA 设备会成功与用户关联，但 MFA 设备无法同步。这是因为基于时间的一次性密码（TOTP）很快会过期。这种情况下，您可以[重新同步设备](id_credentials_mfa_sync.md)。

设备已准备就绪，可在 AWS 上使用。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 为其他 IAM 用户启用硬件 TOTP 令牌（控制台）
<a name="enable-hw-mfa-for-iam-user"></a>

 您可以从 AWS 管理控制台 为其他 IAM 用户启用硬件 TOTP 令牌。

**为其他 IAM 用户启用硬件 TOTP 令牌（控制台）**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 选择要为其启用 MFA 的用户的名称。

1. 选择 **Security Credentials (安全凭证)** 选项卡。在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择 **Assign MFA device**（分配 MFA 设备）。

1. 在向导中，键入 **Device name**（设备名称），选择 **Hardware TOTP token**（硬件 TOTP 令牌），然后选择 **Next**（下一步）。

1. 键入设备序列号。序列号通常位于设备的背面。

1. 在 **MFA code 1 (MFA 代码 1)** 框中，输入 MFA 设备显示的六位数编码。您需要按设备正面的按钮来显示编码。  
![\[IAM 控制面板，MFA 设备\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/MFADevice.png)

1. 在设备刷新期间等候 30 秒，然后在 **MFA code 2 (MFA 代码 2)** 框中键入第二个六位数编码。您需要再次按设备正面的按钮来显示第二个编码。

1. 选择 **Add MFA**（添加 MFA）。
**重要**  
在生成身份验证代码后立即提交您的请求。如果生成代码后等待很长时间才提交请求，MFA 设备会成功与用户关联，但 MFA 设备无法同步。这是因为基于时间的一次性密码（TOTP）很快会过期。这种情况下，您可以[重新同步设备](id_credentials_mfa_sync.md)。

设备已准备就绪，可在 AWS 上使用。有关在 AWS 管理控制台上使用 MFA 的信息，请参阅 [已启用 MFA 的登录](console_sign-in-mfa.md)。

## 替换物理 MFA 设备
<a name="replace-phys-mfa"></a>

您一次最多可以向您的 AWS 账户根用户 和 IAM 用户分配 8 台[当前支持的 MFA 类型](https://aws.amazon.com/iam/features/mfa/)任意组合的 MFA 设备。如果用户丢失设备或出于任何原因需要替换它，您必须先停用旧设备。然后，您可以为用户添加新设备。
+ 要停用当前与用户关联的设备，请参阅[停用 MFA 设备](id_credentials_mfa_disable.md)。
+ 要为 IAM 用户添加替代用硬件 TOTP 令牌，请按照本主题前面部分的过程 [为其他 IAM 用户启用硬件 TOTP 令牌（控制台）](#enable-hw-mfa-for-iam-user) 中的步骤进行操作。
+ 要为 AWS 账户根用户 添加替代用硬件 TOTP 令牌，请按照本主题前面部分的过程 [为根用户启用硬件 TOTP 令牌（控制台）](enable-hw-mfa-for-root.md) 中的步骤进行操作。

# 在 AWS CLI 或 AWS API 中分配 MFA 设备
<a name="id_credentials_mfa_enable_cliapi"></a>

您可以使用 AWS CLI 命令或 AWS API 操作为 IAM 用户启用虚拟 MFA 设备。您无法使用 AWS CLI、AWS API、Tools for Windows PowerShell 或任何其他命令行工具为 AWS 账户根用户 启用 MFA 设备。不过，可以使用 AWS 管理控制台 为根用户启用 MFA 设备。

当您从 AWS 管理控制台启用 MFA 设备时，控制台会为您执行多个步骤。如果您改用 AWS CLI、Tools for Windows PowerShell 或 AWS API 创建虚拟设备，则必须按正确的顺序手动执行这些步骤。例如，要创建虚拟 MFA 设备，您必须创建 IAM 对象，将代码提取为字符串或 QR 代码图形。然后，您必须同步该设备并将其与 IAM 用户关联。有关更多详细信息，请参阅 [New-IAMVirtualMFADevice](https://docs.aws.amazon.com/powershell/latest/reference/Index.html?page=New-IAMVirtualMFADevice.html&tocid=New-IAMVirtualMFADevice) 的 **Examples**（示例）部分。对于物理设备，您可以跳过创建步骤，直接同步该设备并将其与用户关联。

您可以将标签附加到 IAM 资源（包括虚拟 MFA 设备），以识别、组织和控制对这些资源的访问。只有在使用 AWS CLI 或 AWS API 时，才能标记虚拟 MFA 设备。

使用 SDK 或 CLI 的 IAM 用户可以通过调用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html) 来启用其他 MFA 设备，也可以通过调用 [https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html) 来停用现有的 MFA 设备。要成功执行此操作，用户必须首先调用 [https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html) 并使用一个现有的 MFA 设备提交 MFA 代码。此调用将会返回临时安全凭证，然后才可以使用这些凭证对需要 MFA 身份验证的 API 操作进行签名。有关示例请求和响应，请参阅 [`GetSessionToken`– 不可信环境中用户的临时凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken)。

**在 IAM 中创建虚拟设备实体来代表虚拟 MFA 设备**  
这些命令提供在以下很多命令中代替序列号的设备 ARN。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateVirtualMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateVirtualMFADevice.html)

**启用 MFA 设备，以便在 AWS 上使用**  
这些命令将设备与 AWS 同步，并将其与用户关联。如果设备是虚拟设备，则将虚拟设备的 ARN 用作序列号。

**重要**  
在生成身份验证代码后立即提交您的请求。如果生成代码后等待很长时间才提交请求，MFA 设备会成功与用户关联，但 MFA 设备无法同步。这是因为基于时间的一次性密码（TOTP）很快会过期。如果发生这种情况，可以使用下面介绍的命令重新同步设备。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html)

**停用设备**  
使用这些命令可取消设备与用户的关联并停用设备。如果设备是虚拟设备，则将虚拟设备的 ARN 用作序列号。您还必须单独删除虚拟设备实体。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html)

**列出虚拟 MFA 设备实体**  
使用以下命令列出虚拟 MFA 设备实体。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-virtual-mfa-devices.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-virtual-mfa-devices.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html)

**要标记虚拟 MFA 设备**  
使用这些命令来标记虚拟 MFA 设备。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/tag-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/tag-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_TagMFADevice.html)

**要为虚拟 MFA 设备列出标签**  
使用这些命令列出附加到虚拟 MFA 设备的标签。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-device-tags.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-mfa-device-tags.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html)

**要取消虚拟 MFA 设备的标签**  
使用这些命令删除附加到虚拟 MFA 设备的标签。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/untag-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/untag-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_UntagMFADevice.html)

**重新同步 MFA 设备**  
如果设备生成的代码不被 AWS 接受，则使用这些命令。如果设备是虚拟设备，则将虚拟设备的 ARN 用作序列号。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html)

**删除 IAM 中的虚拟 MFA 设备实体**  
在取消设备与用户的关联后，可以删除设备实体。
+ AWS CLI: [https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/delete-virtual-mfa-device.html) 
+ AWS API：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteVirtualMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteVirtualMFADevice.html)

**恢复丢失或无法正常工作的虚拟 MFA 设备**  
有时，托管虚拟 MFA 应用程序的用户设备丢失、更换或无法正常工作。在这种情况下，用户无法自行将其恢复。该用户必须与管理员联系，才能将设备停用。有关更多信息，请参阅 [在 IAM 中恢复受 MFA 保护的身份](id_credentials_mfa_lost-or-broken.md)。

# 检查 MFA 状态
<a name="id_credentials_mfa_checking-status"></a>

使用 IAM 控制台检查 AWS 账户根用户 或 IAM 用户是否启用了有效的 MFA 设备。

**检查根用户的 MFA 状态**

1. 使用您的根用户凭证登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。

1. 在 **Multi-Factor Authentication (MFA)** 下查看 MFA 是已启用还是已禁用。如果尚未激活 MFA，系统会显示一个提醒符号 (![\[Alert icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-alert-icon.console.png))。

如果要为账户启用 MFA，请参阅以下章节之一：
+ [为根用户启用虚拟 MFA 设备（控制台）](enable-virt-mfa-for-root.md)
+ [为根用户启用密钥或安全密钥（控制台）](enable-fido-mfa-for-root.md)
+ [为根用户启用硬件 TOTP 令牌（控制台）](enable-hw-mfa-for-root.md)

**检查 IAM 用户的 MFA 状态**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择 **Users**（用户）。

1. 如有必要，请通过完成以下步骤来将 **MFA** 列添加到用户表中：

   1. 在最右侧的表上方，选择设置图标 (![\[Settings icon\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/console-settings-icon.console.png))。

   1. 在 **Manage Columns** 中，选择 **MFA**。

   1. （可选）清除不希望在用户表中显示的任何列标题的复选框。

   1. 选择 **Close** 返回到用户列表。

1. **MFA** 列告知您 MFA 设备的启用情况。如果用户没有处于活动状态的 MFA 设备，控制台将显示 **None**（无）。如果用户启用了 MFA 设备，则 **MFA** 列将显示启用的设备类型，并附上值 **Virtual**（虚拟）、**Security key**（安全密钥）、**Hardware**（硬件）或 **SMS**（短信）。
**注意**  
AWS 已终止对短信多重身份验证（MFA）的支持。我们建议拥有使用基于短信的 MFA 的 IAM 用户的客户切换到以下替代方法之一：[虚拟（基于软件）MFA 设备](id_credentials_mfa_enable_virtual.md)、[FIDO 安全密钥](id_credentials_mfa_enable_fido.md)或[硬件 MFA 设备](id_credentials_mfa_enable_physical.md)。您可以确定账户中拥有已分配短信 MFA 设备的用户。为此，请转到 IAM 控制台，从导航窗格中选择**用户**，然后在表的 **MFA** 列中查找具有 **SMS** 的用户。

1. 要查看有关用户的 MFA 设备的其他信息，请选择要检查其 MFA 状态的用户的名称，然后选择 **Security credentials** 选项卡。

1. 如果用户没有处于活动状态的 MFA 设备，控制台将显示**无 MFA 设备。在**多重身份验证（MFA）**部分中分配 MFA 设备以提高 AWS 环境的安全性**。如果用户启用了 MFA 设备，则 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分显示有关这些设备的详细信息：
   + 设备名称
   + 设备类型
   + 设备的标识符，例如物理设备的设备序列号或虚拟设备的 AWS 中的 ARN
   + 何时创建设备

要删除或重新同步设备，请选择设备旁边的单选按钮，然后选择 **Remove**（删除）或 **Resync**（重新同步）。

有关启用 MFA 的更多信息，请参阅以下章节：
+ [在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)
+ [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md)
+ [在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)

# 重新同步虚拟和硬件 MFA 设备
<a name="id_credentials_mfa_sync"></a>

您可以使用 AWS 重新同步虚拟和硬件 Multi-Factor Authentication (MFA) 设备。如果您尝试使用的设备并未同步，则将导致用户的登录尝试失败，IAM 会提示您重新同步设备。

**注意**  
FIDO 安全密钥不同步。如果 FIDO 安全密钥丢失或损坏，您可以将其停用。有关停用任何 MFA 设备类型的说明，请参阅[停用其他 IAM 用户的 MFA 设备（控制台）](id_credentials_mfa_disable.md#deactivate-mfa-for-user)。

作为 AWS 管理员，您可以重新同步您的 IAM 用户无法同步的虚拟和硬件 MFA 设备。

如果您的 AWS 账户根用户 MFA 设备不工作，可以使用 IAM 控制台重新同步该设备（完成登录过程与否均可实现）。如果您无法成功地重新同步设备，则可能需要取消关联并重新关联该设备。有关此操作的更多信息，请参阅 [停用 MFA 设备](id_credentials_mfa_disable.md) 和 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

**Topics**
+ [所需权限](#id_credentials_mfa_sync_console-permissions-required)
+ [重新同步虚拟和硬件 MFA 设备（IAM 控制台）](#id_credentials_mfa_sync_console)
+ [重新同步虚拟和硬件 MFA 设备 (AWS CLI)](#id_credentials_mfa_sync_cli)
+ [重新同步虚拟和硬件 MFA 设备 (AWS API)](#id_credentials_mfa_sync_api)

## 所需权限
<a name="id_credentials_mfa_sync_console-permissions-required"></a>

要为您自己的 IAM 用户重新同步虚拟或硬件 MFA 设备，您必须具有以下策略的权限。此策略不允许您创建或停用设备。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowListActions",
            "Effect": "Allow",
            "Action": [
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowUserToViewAndManageTheirOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "BlockAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}
```

------

## 重新同步虚拟和硬件 MFA 设备（IAM 控制台）
<a name="id_credentials_mfa_sync_console"></a>

您可以使用 IAM 控制台重新同步虚拟和硬件 MFA 设备。

**重新同步您自己 IAM 用户的虚拟或硬件 MFA 设备（控制台）**

1. 使用 AWS 账户 ID 或账户别名、您的 IAM 用户名和密码登录到 [IAM 控制台](https://console.aws.amazon.com/iam)。
**注意**  
为方便起见，AWS登录页面使用浏览器 Cookie 记住您的 IAM 用户名和账户信息。如果您之前以其他用户身份登录，请选择页面底部的 **Sign-in to a different account**（登录到其他账户）以返回主登录页面。在此处，您可以输入要重新导向到您账户 IAM 用户登录页面的 AWS 账户 ID 或账户别名。

   要获取 AWS 账户 ID，请联系管理员。

1. 在右上角的导航栏中，选择您的用户名，然后选择 **Security credentials**（安全凭证）。  
![\[AWS 管理控制台安全凭证链接\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-user.shared.console.png)

1. 在 **AWS IAM 凭证**选项卡的**多重身份验证（MFA）**部分中，选择 MFA 设备旁边的单选按钮，然后选择**重新同步**。

1. 依次将设备上按顺序生成的两个代码键入 **MFA code 1 (MFA 代码 1)** 和 **MFA code 2 (MFA 代码 2)** 中。然后选择 **Resync**（重新同步）。
**重要**  
生成代码之后立即提交您的请求。如果您生成代码，然后等待了很长时间才提交请求，则请求看起来有效，但实际上设备仍然不同步。这是因为基于时间的一次性密码（TOTP）很快会过期。

**重新同步其他 IAM 用户的虚拟或硬件 MFA 设备（控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **Users**，然后选择其 MFA 设备需要重新同步的用户的名称。

1. 选择**安全凭证**选项卡。在**多重身份验证（MFA）**部分中，选择 MFA 设备旁边的单选按钮，然后选择**重新同步**。

1. 依次将设备上按顺序生成的两个代码键入 **MFA code 1 (MFA 代码 1)** 和 **MFA code 2 (MFA 代码 2)** 中。然后选择 **Resync**（重新同步）。
**重要**  
生成代码之后立即提交您的请求。如果您生成代码，然后等待了很长时间才提交请求，则请求看起来有效，但实际上设备仍然不同步。这是因为基于时间的一次性密码（TOTP）很快会过期。

**在登录前重新同步您的根用户 MFA（控制台）**

1. 在 **Amazon Web Services Sign In With Authentication Device**（亚马逊云科技使用身份验证设备登录）页面上，选择 **Having problems with your authentication device?（身份验证设备出现问题？） Click here**（点击此处）。
**注意**  
您可能会看到不同的文本，例如**使用 MFA 登录**和**排除您的身份验证设备故障**。不过，它们提供了相同的功能。

1. 在 **Re-Sync With Our Servers (与服务器重新同步)** 部分中，依次将设备上按顺序生成的两个代码键入 **MFA code 1 (MFA 代码 1)** 和 **MFA code 2 (MFA 代码 2)** 中。然后选择 **Re-sync authentication device**。

1. 如有必要，请再次键入您的密码，然后选择**登录**。然后使用您的 MFA 设备完成登录。

**在登录后重新同步您的根用户 MFA 设备（控制台）**

1. 选择 **Root user**（根用户）并输入您的 AWS 账户 电子邮件地址，以账户拥有者身份登录 [IAM 控制台](https://console.aws.amazon.com/iam/)。在下一页上，输入您的密码。
**注意**  
作为根用户，您无法登录到**以 IAM 用户身份登录**页面。如果您看到**以 IAM 用户身份登录**页面，请选择该页面底部附近的**使用根用户电子邮件登录**。要获取以根用户身份登录方面的帮助，请参阅《AWS 登录 用户指南》**中的[以根用户身份登录 AWS 管理控制台](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-          root-user-sign-in-tutorial.html)。

1. 在导航栏的右侧选择您的账户名称，然后选择 **Security credentials**（安全凭证）。如有必要，选择 **Continue to Security Credentials**（继续使用安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 展开页面上的 **Multi-factor authentication (MFA) (多重身份验证)** 部分。

1. 选中设备旁边的单选按钮，然后选择 **Resync**（重新同步）。

1. 在 **Resync MFA device**（重新同步 MFA 设备）对话框中，依次将设备上按顺序生成的两个代码键入 **MFA code 1**（MFA 代码 1）和 **MFA code 2**（MFA 代码 2）中。然后选择 **Resync**（重新同步）。
**重要**  
生成代码之后立即提交您的请求。如果生成代码后等待很长时间才提交请求，MFA 设备会成功与用户关联，但 MFA 设备无法同步。这是因为基于时间的一次性密码（TOTP）很快会过期。

## 重新同步虚拟和硬件 MFA 设备 (AWS CLI)
<a name="id_credentials_mfa_sync_cli"></a>

您可以从 AWS CLI 重新同步虚拟和硬件 MFA 设备。

**重新同步 IAM 用户的虚拟或硬件 MFA 设备 (AWS CLI)**  
在命令提示符处，发布 [aws iam resync-mfa-device](https://docs.aws.amazon.com/cli/latest/reference/iam/resync-mfa-device.html) 命令：
+ 虚拟 MFA 设备：将设备的 Amazon Resource Name (ARN) 指定为序列号。

  ```
  aws iam resync-mfa-device --user-name Richard --serial-number arn:aws:iam::123456789012:mfa/RichardsMFA --authentication-code1 123456 --authentication-code2 987654
  ```
+ 硬件 MFA 设备：将硬件设备的序列号指定为序列号。格式因供应商而异。例如，您可以从 Amazon 购买 gemalto 令牌。它的序列号通常是四个字母，后跟四个数字。

  ```
  aws iam resync-mfa-device --user-name Richard --serial-number ABCD12345678 --authentication-code1 123456 --authentication-code2 987654
  ```

**重要**  
生成代码之后立即提交您的请求。如果您生成代码，然后等待了很长时间才提交请求，则请求将失败，因为代码很快就会过期。

## 重新同步虚拟和硬件 MFA 设备 (AWS API)
<a name="id_credentials_mfa_sync_api"></a>

IAM 有一个执行同步的 API 调用。在这种情况下，建议您授予虚拟和硬件 MFA 设备用户访问此 API 调用的权限。然后，基于此 API 调用构建工具，这样您的用户即可随时根据需要重新同步其设备。

**重新同步 IAM 用户的虚拟或硬件 MFA 设备 (AWS API)**
+ 发送 [ResyncMFADevice](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResyncMFADevice.html) 请求。

# 停用 MFA 设备
<a name="id_credentials_mfa_disable"></a>

如果您在使用多重身份验证（MFA）设备作为 IAM 用户登录时遇到问题，请与管理员联系以获取帮助。

作为管理员，您可以停用其他 IAM 用户的设备。此操作允许用户不使用 MFA 登录。如果 MFA 设备已更换或设备暂时不可用，您可以将此作为临时解决方案。但是，我们建议您尽快为用户启用新设备。要了解如何启用新 MFA 设备，请参阅 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

**注意**  
如果您使用 API 或 AWS CLI 从 AWS 账户 中删除用户，您必须停用或删除用户的 MFA 设备。您在删除用户的过程中执行此更改。有关删除用户的更多信息，请参阅 [移除或停用 IAM 用户](id_users_remove.md)。

**Topics**
+ [停用 MFA 设备（控制台）](#deactive-mfa-console)
+ [停用 MFA 设备 (AWS CLI)](#deactivate-mfa-cli)
+ [停用 MFA 设备 (AWS API)](#deactivate-mfa-api)

## 停用 MFA 设备（控制台）
<a name="deactive-mfa-console"></a><a name="deactivate-mfa-for-user"></a>

**停用其他 IAM 用户的 MFA 设备（控制台）**

1. 登录 AWS 管理控制台，单击 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户**。

1. 要停用用户的 MFA 设备，请选择要删除其 MFA 的用户的名称。

1. 选择**安全凭证**选项卡。

1. 在**多重身份验证（MFA）**下，选择 MFA 设备旁边的单选按钮，选择**删除**，然后选择**删除**。

   随即从 AWS 中删除该设备。该设备将不能用于登录或验证请求，直到它重新激活并与 AWS 用户或 AWS 账户根用户 相关联。<a name="deactivate-mfa-for-root"></a>

**取消激活 AWS 账户根用户的 MFA 设备（控制台）**

1. 选择 **Root user**（根用户）并输入您的 AWS 账户 电子邮件地址，以账户拥有者身份登录 [IAM 控制台](https://console.aws.amazon.com/iam/)。在下一页上，输入您的密码。
**注意**  
作为根用户，您无法登录到**以 IAM 用户身份登录**页面。如果您看到**以 IAM 用户身份登录**页面，请选择该页面底部附近的**使用根用户电子邮件登录**。要获取以根用户身份登录方面的帮助，请参阅《AWS 登录 用户指南》**中的[以根用户身份登录 AWS 管理控制台](https://docs.aws.amazon.com/signin/latest/userguide/introduction-to-          root-user-sign-in-tutorial.html)。

1. 在导航栏的右侧选择您的账户名称，然后选择 **Security credentials**（安全凭证）。如有必要，选择 **Continue to Security Credentials**（继续使用安全凭证）。  
![\[导航菜单中的安全凭证\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/security-credentials-root.shared.console.png)

1. 在 **Multi-factor authentication (MFA)** [多重身份验证（MFA）] 部分中，选择要停用的 MFA 设备旁边的单选按钮，然后选择 **Remove**（删除）。

1. 选择**移除 **。

   AWS 账户 的 MFA 设备已停用。检查与您的 AWS 账户 相关联的电子邮件邮箱中有无来自 Amazon Web Services 的确认邮件。该电子邮件向您通知 Amazon Web Services 多重验证 (MFA) 已停用。邮件将来自 `@amazon.com` 或 `@aws.amazon.com`。

**注意**  
当您通过 AWS 管理控制台或在登录过程中添加新的虚拟 MFA 设备时，系统会删除您 AWS 账户中未分配的虚拟 MFA 设备。未分配的虚拟 MFA 设备是指您账户中的设备，但在登录过程中不被账户根用户或 IAM 用户使用。已删除这些设备，因此可以向您的账户添加新的虚拟 MFA 设备。它还允许您重复使用设备名称。

## 停用 MFA 设备 (AWS CLI)
<a name="deactivate-mfa-cli"></a>

**停用 IAM 用户的 MFA 设备 (AWS CLI)**
+ 运行以下命令：[https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html](https://docs.aws.amazon.com/cli/latest/reference/iam/deactivate-mfa-device.html)

## 停用 MFA 设备 (AWS API)
<a name="deactivate-mfa-api"></a>

**停用 IAM 用户的 MFA 设备 (AWS API)**
+ 调用此操作：[https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html](https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html)

# 在 IAM 中恢复受 MFA 保护的身份
<a name="id_credentials_mfa_lost-or-broken"></a>

若[虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)或[硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)似乎运行正常，但您却无法使用它访问 AWS 资源，则可能是与 AWS 不同步所导致的。有关同步虚拟 MFA 设备或硬件 MFA 设备的信息，请参阅[重新同步虚拟和硬件 MFA 设备](id_credentials_mfa_sync.md)。[FIDO 安全密钥](id_credentials_mfa_enable_fido.md)不同步。

如果 AWS 账户根用户 的 [MFA 设备](id_credentials_mfa.md)丢失、损坏或无法工作，您可以恢复账户访问权限。IAM 用户必须与管理员联系，才能将装置停用。

**重要**  
建议您激活多台 MFA 设备。注册多台 MFA 设备有助于确保在设备丢失或损坏时继续访问。您的 AWS 账户根用户 和 IAM 用户最多可以注册 8 台任何类型的 MFA 设备。

## 先决条件 – 使用其他 MFA 设备
<a name="mfa-lost-or-broken-prerequisites"></a>

如果您的[多重身份验证（MFA）设备](id_credentials_mfa.md)丢失、损坏或无法正常工作，您可以使用已注册到同一根用户或 IAM 用户的另一台 MFA 设备登录。

**要使用其他 MFA 设备登录**

1. 使用您的 AWS 账户 ID 或账户别名和密码登录 [AWS 管理控制台](url-comsole-domain;iam)。

1. 在**需要其他验证**页面或**多重身份验证**页面上，选择**尝试另一种 MFA 方法**。

1. 使用您选择的 MFA 设备类型进行身份验证。

1. 根据您是否使用备用 MFA 设备成功登录，下一步会有所不同。
   + 如果您已成功登录，则可以 [重新同步虚拟和硬件 MFA 设备](id_credentials_mfa_sync.md)，这可能会解决问题。如果 MFA 设备丢失或损坏，则您可以将其停用。有关停用任何 MFA 设备类型的说明，请参阅[停用 MFA 设备](id_credentials_mfa_disable.md)。
   + 如果您无法使用 MFA 登录，则请使用 [恢复根用户用户 MFA 设备](#root-mfa-lost-or-broken) 或 [恢复 IAM 用户 MFA 设备](#iam-user-mfa-lost-or-broken) 中的步骤恢复受 MFA 保护的身份。



## 恢复根用户用户 MFA 设备
<a name="root-mfa-lost-or-broken"></a>

如果您无法使用 MFA 登录，则可以使用其他身份验证方法登录，方法是使用在您的账户中注册的电子邮件和主要联系电话号码验证您的身份。

作为根用户使用替代的身份验证因素登录之前，确认您能够访问与您的账户关联的电子邮件和主要联系人电话号码。如果您需要更新主要联系人电话号码，则请以具有*管理员*访问权限的 IAM 用户身份而非根用户身份登录。有关更新账户联系信息的其他说明，请参阅《*AWS Billing 用户指南*》中的[编辑联系信息](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-primary.html)。如果您无权访问电子邮件和主要联系人电话号码，则必须联系 [AWS 支持](https://support.aws.amazon.com/#/contacts/aws-mfa-support)。

**重要**  
我们建议您不断更新与根用户关联的电子邮件地址和联系电话号码，以便成功恢复账户。有关更多信息，请参阅《AWS 账户管理 参考指南》中的 [更新 AWS 账户的主要联系人](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact-primary.html)**。

**使用替代的身份验证因素作为 AWS 账户根用户登录**

1.  选择**根用户**并输入您的 AWS 账户 电子邮件地址，以账户拥有者身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

1. 在**需要其他验证**页面上，选择要用于身份验证的 MFA 方法，然后选择**下一步**。
**注意**  
可能会显示替代文本，例如 **Sign in using MFA**（使用 MFA 登录）、**Troubleshoot your authentication device**（对身份验证设备进行故障排除）或 **Troubleshoot MFA**（对 MFA 进行故障排除），但其功能均相同。如果您无法使用替代身份验证因素验证您的账户电子邮件地址和主要联系人电话号码，则请与 [AWS 支持](https://support.aws.amazon.com/#/contacts/aws-mfa-support) 联系以停用您的 MFA 设备。

1. 根据您使用的 MFA 类型，您将看到不同的页面，但是 **MFA 问题排查**选项的功能相同。在**需要其他验证**页面或**多重身份验证**页面上，选择 **MFA 问题排查**。

1. 如果需要，请再次键入您的密码，然后选择 **Sign in**。

1. 在**身份验证设备问题排查**页面的**使用替代身份验证因素登录**部分中，选择**使用替代因素登录**。

1. **使用替代身份验证因素登录**页面上，通过验证电子邮件地址完成账户身份验证，然后选择**发送验证电子邮件**。

1. 检查与您的 AWS 账户 关联的电子邮件中有无来自 Amazon Web Services（recover-mfa-no-reply@verify.signin.aws）的邮件。按照电子邮件中的指导进行操作。

   如果您没有在账户中看到该电子邮件，请检查垃圾邮件文件夹，或者返回到浏览器并选择 **Resend the email**。

1. 在验证您的电子邮件地址后，您可以继续验证您的账户的身份。要验证您的主要联系人电话号码，请选择 **Call me now**（立即呼叫我）。

1. 接听 AWS 打来的电话，在听到提示时，在手机键盘上输入从 AWS 网站获得的 6 位数号码。

   如果您没有接到 AWS 打来的电话，请选择 **Sign in (登录)** 以再次登录到控制台并重新开始。或者，请参阅[多重身份验证（MFA）设备丢失或无法使用](https://support.aws.amazon.com/#/contacts/aws-mfa-support)联系支持人员以获取帮助。

1. 在验证您的电话号码后，您可以通过选择 **Sign in to the console** 登录到您的账户。

1. 下一步取决于您使用的 MFA 的类型：
   + 对于虚拟 MFA 设备，请从您的设备中删除账户。然后，转至 [AWS Security Credentials](https://console.aws.amazon.com/iam/home?#security_credential) 页面并删除旧的 MFA 虚拟设备实体，然后再创建一个新的。
   + 对于 FIDO 安全密钥，请转至 [AWS Security Credentials](https://console.aws.amazon.com/iam/home?#security_credential)（安全凭证）页面并停用旧 FIDO 密钥然后再启用一个新密钥。
   + 对于硬件 TOTP 令牌，请联系第三方提供商以帮助您修复或更换设备。您可以继续使用替代的身份验证因素登录，直到您收到新设备为止。在您拥有新的硬件 MFA 设备后，请转至 [AWS 安全凭证](https://console.aws.amazon.com/iam/home?#security_credential)页面并删除旧的 MFA 设备。
**注意**  
不必将丢失或被盗的 MFA 设备替换为相同类型的设备。例如，如果 FIDO 安全密钥损坏，您订购了一个新的密钥，则可以使用虚拟 MFA 或硬件 TOTP 令牌，直到新 FIDO 安全密钥到达。

**重要**  
如果您的 MFA 设备丢失或被盗，则请在登录并建立替换 MFA 设备后更改您的根用户密码。攻击者可能窃取了身份验证设备，也可能拥有您当前的密码。有关更多信息，请参阅 [更改AWS 账户根用户密码](root-user-password.md)。

## 恢复 IAM 用户 MFA 设备
<a name="iam-user-mfa-lost-or-broken"></a>

如果您是无法使用 MFA 登录的 IAM 用户，则无法自行恢复 MFA 设备。您必须与管理员联系，才能将设备停用。然后，您可以启用新设备。

**作为 IAM 用户获取有关 MFA 设备的帮助**

1. 请联系 AWS 管理员或其他为您提供 IAM 用户的用户名和密码的相关人员。管理员必须停用 MFA 设备 (如[停用 MFA 设备](id_credentials_mfa_disable.md)中所述)，以便您能够登录。

1. 下一步取决于您使用的 MFA 的类型：
   + 对于虚拟 MFA 设备，请从您的设备中删除账户。然后，启用虚拟设备，如[在 AWS 管理控制台 中分配虚拟 MFA 设备](id_credentials_mfa_enable_virtual.md)中所述。
   + 对于 FIDO 安全密钥，请联系第三方提供商帮助您更换设备。当您收到新的 FIDO 安全密钥时，请将其启用，如 [在 AWS 管理控制台 中分配密钥或安全密钥](id_credentials_mfa_enable_fido.md) 中所述。
   + 对于硬件 TOTP 令牌，请联系第三方提供商以帮助您修复或更换设备。在您拥有新的物理 MFA 设备后，请启用设备，如[在 AWS 管理控制台 中分配硬件 TOTP 令牌](id_credentials_mfa_enable_physical.md)中所述。
**注意**  
不必将丢失或被盗的 MFA 设备替换为相同类型的设备。您最多可以拥有 8 台任意组合的 MFA 设备。例如，如果 FIDO 安全密钥损坏，您订购了一个新的密钥，则可以使用虚拟 MFA 或硬件 TOTP 令牌，直到新 FIDO 安全密钥到达。

1. 如果您的 MFA 设备丢失或被盗，还请更改密码，以防攻击者盗走您的身份验证设备及还可能拥有您当前的密码。有关更多信息，请参阅 [管理 IAM 用户的密码](id_credentials_passwords_admin-change-user.md)。

# 使用 MFA 保护 API 访问
<a name="id_credentials_mfa_configure-api-require"></a>

利用 IAM policy，可以指定用户可调用哪些 API 操作。您可以通过要求用户使用多重身份验证（MFA）进行身份验证，然后才允许他们执行特别敏感的操作，从而应用额外的安全性。

例如，您可能拥有允许用户执行 Amazon EC2 `RunInstances`、`DescribeInstances` 和 `StopInstances` 操作的策略。但您可能希望限制破坏性操作（如 `TerminateInstances`），并确保用户只能在使用 AWS MFA 设备进行身份验证后执行该操作。

**Topics**
+ [概述](#MFAProtectedAPI-overview)
+ [方案：跨账户委派的 MFA 保护](#MFAProtectedAPI-cross-account-delegation)
+ [方案：当前账户中 API 操作访问的 MFA 保护](#MFAProtectedAPI-user-mfa)
+ [方案：拥有基于资源的策略的资源的 MFA 保护](#MFAProtectedAPI-resource-policies)

## 概述
<a name="MFAProtectedAPI-overview"></a>

向 API 操作添加 MFA 保护包括以下任务：

1. 管理员为每个用户配置 AWS MFA 设备，这些用户必须发出要求 MFA 身份验证的 API 请求。有关更多信息，请参阅 [IAM 中的 AWS 多重身份验证](id_credentials_mfa.md)。

1. 管理员为用户创建包含 `Condition` 元素的策略，以检查用户是否已使用 AWS MFA 设备进行身份验证。

1. 用户会调用支持 MFA 参数的 AWS STS API 操作之一：[AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 或 [GetSessionToken](https://docs.aws.amazon.com/STS/latest/APIReference/API_GetSessionToken.html)。调用中包含与用户关联的设备的设备标识符，以及该设备生成的基于时间的一次性密码 (TOTP)。在任一情况下，用户都会取回稍后用来向 AWS 发出其他请求的临时安全凭证。
**注意**  
仅在服务支持临时安全凭证时，该服务的 API 操作的 MFA 保护才可用。有关这些服务的列表，请参阅[使用临时安全凭证访问 AWS](https://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html)。

如果授权失败，AWS 将返回“访问被拒绝”错误消息（与任何未授权的访问一样）。由于采用受 MFA 保护的 API 策略，因此，如果用户在未获得有效的 MFA 身份验证的情况下试图调用 API 操作，则 AWS 将拒绝用户访问策略中指定的 API 操作。如果 API 操作请求的时间戳在策略中指定的允许范围之外，也会拒绝操作。用户必须使用 MFA 代码和设备序列号请求新的临时安全凭证，通过 MFA 重新进行身份验证。

### 带 MFA 条件的 IAM policy
<a name="MFAProtectedAPI-policies"></a>

带 MFA 条件的策略可附加到以下项：
+ 对于 IAM 用户或组：
+ Amazon S3 存储桶、Amazon SQS 队列或 Amazon SNS 主题等资源
+ 可由用户担任的 IAM 角色的信任策略

可使用策略中的 MFA 条件检查以下属性：
+ Existence（存在性）- 如果只是验证用户是否已使用 MFA 进行身份验证，请检查 `aws:MultiFactorAuthPresent` 密钥在 `Bool` 条件中是否为 `True`。仅当用户使用短期凭证验证时，才会有该键。长期凭证，例如访问密钥，不包括此键。
+ Duration (持续时间) - 如果您只希望在 MFA 身份验证后的指定时间内授予访问权限，请使用数值条件类型将 `aws:MultiFactorAuthAge` 密钥的有效期与某个值（如 3600 秒）进行比较。请注意，如果未使用 MFA，则 `aws:MultiFactorAuthAge` 键不会显示。

以下示例说明了 IAM 角色的信任策略，该策略包含一个 MFA 条件，用于测试是否存在 MFA 身份验证。利用此策略，`Principal` 元素中指定的 AWS 账户 中的用户（将 `ACCOUNT-B-ID` 替换为有效的 AWS 账户 ID）能够代入此策略附加的角色。但是，此类用户仅在已使用 MFA 进行身份验证的情况下才能够担任角色。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Principal": {"AWS": "ACCOUNT-B-ID"},
    "Action": "sts:AssumeRole",
    "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
  }
}
```

------

有关 MFA 的条件类型的更多信息，请参阅[AWS 全局条件上下文密钥](reference_policies_condition-keys.md)、[数字条件运算符](reference_policies_elements_condition_operators.md#Conditions_Numeric)和[用于检查条件键是否存在的条件运算符](reference_policies_elements_condition_operators.md#Conditions_Null)。

### 在 GetSessionToken 和 AssumeRole 之间选择
<a name="scenarios"></a>

AWS STS 提供了两个 API 操作，可供用户传递 MFA 信息：`GetSessionToken` 和 `AssumeRole`。用户调用哪个 API 操作来获取临时安全凭证，取决于采用以下哪个方案。

**将 `GetSessionToken` 用于以下方案：**
+ 调用访问 AWS 账户 中的资源的 API 操作，该账户与发出请求的 IAM 用户相同。请注意，来自 `GetSessionToken` 请求的临时凭证*仅*在您将 MFA 信息包含在凭证请求中时才能访问 IAM 和 AWS STS API 操作。由于 `GetSessionToken` 返回的临时凭证包含 MFA 信息，因此您可以检查由该凭证发出的单个 API 操作中的 MFA。
+ 访问受基于资源且包含 MFA 条件的策略所保护的资源。

`GetSessionToken` 操作旨在使用 MFA 验证用户身份。您不能使用策略来控制身份验证操作。

**将 `AssumeRole` 用于以下方案：**
+ 调用访问相同或不同 AWS 账户 中的资源的 API 操作。API 调用可包含任何 IAM 或 AWS STS API。请注意，要保护访问，您可以在用户担任角色时强制执行 MFA。由 `AssumeRole` 返回的临时凭证未将 MFA 信息包含在上下文中，因此您无法检查单个 API 操作的 MFA。这就是您必须使用 `GetSessionToken` 限制对受基于资源的策略保护的资源的访问的原因。

**注意**  
IAM 用户使用 MFA 登录时，AWS CloudTrail 日志将包含 MFA 信息。如果 IAM 用户代入某个 IAM 角色，CloudTrail 还将在利用代入角色执行操作的 `sessionContext` 属性中记录 `mfaAuthenticated: true`。但是，当使用代入角色的凭证进行 API 调用时，CloudTrail 日志记录与 IAM 要求的内容是分开的。有关更多信息，请参阅 [CloudTrail userIdentity 元素](https://docs.aws.amazon.com//awscloudtrail/latest/userguide/cloudtrail-event-reference-user-identity.html)。

本文档稍后将提供有关如何实现这些方案的详细信息。

### 有关受 MFA 保护的 API 访问的要点
<a name="MFAProtectedAPI-important-points"></a>

了解 API 操作的 MFA 保护的以下几个方面非常重要：
+ MFA 保护仅通过使用临时安全凭证提供，而该凭证必须使用 `AssumeRole` 或 `GetSessionToken` 获取。
+ 无法将受 MFA 保护的 API 访问与 AWS 账户根用户凭证配合使用。
+ 无法将受 MFA 保护的 API 访问与 U2F 安全密钥配合使用。
+ 将 MFA 设备与 AWS 服务配合使用时，无法向联合身份用户分配这些设备；因此，这些用户无法访问受 MFA 控制的 AWS 资源。(请参阅下一个要点。) 
+ 返回临时凭证的其他 AWS STS API 操作不支持 MFA。对于 `AssumeRoleWithWebIdentity` 和 `AssumeRoleWithSAML`，用户通过外部提供程序进行身份验证，并且 AWS 无法确定该提供程序是否需要 MFA。对于 `GetFederationToken`，MFA 不一定要与特定用户相关联。
+ 同样，长期凭证（IAM 用户访问密钥和根用户访问密钥)）无法用于受 MFA 保护的 API 访问，因为它们不会过期。
+ 此外，可以在没有 MFA 信息的情况下调用 `AssumeRole` 和 `GetSessionToken`。在此情况下，发起人将取回临时安全凭证，但这些临时凭证的会话信息不指示使用 MFA 进行身份验证的用户。
+ 要建立 API 操作的 MFA 保护，可将 MFA 条件添加到策略。策略必须包含 `aws:MultiFactorAuthPresent` 条件键以强制使用 MFA。对于跨账户委派，角色的信任策略必须包含条件键。
+ 如果您允许其他 AWS 账户 访问您账户中的资源，则您的资源安全性取决于受信任账户（另一个账户，而不是您的账户）的配置。即使在您强制实施多重身份验证时，也是如此。有权创建虚拟 MFA 设备的受信任账户中的任何标识都可以构建 MFA 索赔，以满足您角色的信任策略的该部分。在允许其他账户的成员访问必须进行多重身份验证的 AWS 资源之前，您应确保受信任账户的所有者遵循安全最佳实践。例如，受信任账户应仅允许特定的受信任身份访问敏感 API 操作，例如 MFA 设备管理 API 操作。
+ 如果策略包含 MFA 条件，则在以下情况下，将拒绝请求：用户未进行 MFA 身份验证或用户提供了无效的 MFA 设备标识符或无效的 TOTP。

## 方案：跨账户委派的 MFA 保护
<a name="MFAProtectedAPI-cross-account-delegation"></a>

在此方案中，您希望将访问权委托给另一账户中的 IAM 用户，但前提是该用户已使用 AWS MFA 设备进行身份验证。有关跨账户委派的更多信息，请参阅 [角色术语和概念](id_roles.md#id_roles_terms-and-concepts)。

假设您有一个账户 A（拥有待访问资源的信任账户）以及 IAM 用户 Anaya，她拥有管理员权限。她希望向账户 B（受信任账户）中的用户 Richard 授予访问权，但希望确保 Richard 在担任该角色之前已使用 MFA 进行身份验证。

1. 在信任账户 A 中，Anaya 创建一个名为 `CrossAccountRole` 的 IAM 角色，并将该角色的信任策略中的主体设置为账户 B 的账户 ID。此信任策略授予对 AWS STS `AssumeRole` 操作的权限。Anaya 还向信任策略添加 MFA 条件，如以下示例中所示。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Allow",
       "Principal": {"AWS": "ACCOUNT-B-ID"},
       "Action": "sts:AssumeRole",
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }
   }
   ```

------

1. Anaya 在该角色中添加一个权限策略，以指定允许该角色执行的操作。具有 MFA 保护的角色权限策略与任何其他角色权限策略没有差别。以下示例说明了 Anaya 添加到角色的策略；该策略允许担任该角色的用户对账户 A 中的表 `Books` 执行任何 Amazon DynamoDB 操作。此策略还允许 `dynamodb:ListTables` 操作，此操作是在控制台中执行操作所必需的。
**注意**  
该权限策略不包含 MFA 条件。了解 MFA 身份验证仅用于确定用户是否可以担任此角色很重要。在用户担任此角色后，将不会进行进一步的 MFA 检查。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TableActions",
               "Effect": "Allow",
               "Action": "dynamodb:*",
               "Resource": "arn:aws:dynamodb:*:111122223333:table/Books"
           },
           {
               "Sid": "ListTables",
               "Effect": "Allow",
               "Action": "dynamodb:ListTables",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 在受信任账户 B 中，管理员确保已使用 AWS MFA 设备配置 IAM 用户 Richard，并且该用户知道设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

1. 在账户 B 中，管理员将以下策略附加到用户 Richard（或该用户所在的组），该策略允许该用户调用 `AssumeRole` 操作。资源被设置到 Anaya 在第 1 步中创建的角色的 ARN。注意，该策略不包含 MFA 条件。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sts:AssumeRole"
               ],
               "Resource": [
                   "arn:aws:iam::111122223333:role/CrossAccountRole"
               ]
           }
       ]
   }
   ```

------

1. 在账户 B 中，Richard（或 Richard 正在运行的应用程序）调用 `AssumeRole`。API 调用包含要担任角色的 ARN (`arn:aws:iam::ACCOUNT-A-ID:role/CrossAccountRole`)、MFA 设备的 ID 和 Richard 从其设备中获取的当前 TOTP。

   当 Richard 调用 `AssumeRole` 时，AWS 将确定他是否拥有有效的凭证，包括 MFA 要求。如果是这样的话，Richard 将成功担任角色，并且可在使用角色的临时凭证时对账户 A 中名为 `Books` 的表执行任何 DynamoDB 操作。

   有关调用 `AssumeRole` 的程序的示例，请参阅[使用 MFA 身份验证调用 AssumeRole](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-assumerole)。

## 方案：当前账户中 API 操作访问的 MFA 保护
<a name="MFAProtectedAPI-user-mfa"></a>

在此方案中，您应确保仅当您 AWS 账户 中的用户已使用 AWS MFA 设备进行身份验证后才能访问敏感 API 操作。

假设您拥有账户 A，其中包含一组需要使用 EC2 实例的开发人员。普通开发人员可以使用实例，但他们未获得 `ec2:StopInstances` 或 `ec2:TerminateInstances` 操作的权限。您希望仅允许几个受信任用户执行这些“破坏性”特权操作，因此您将 MFA 保护添加到允许这些敏感 Amazon EC2 操作的策略中。

在此方案中，用户 Sofía 是受信任用户之一。用户 Anaya 是账户 A 中的管理员。

1. Anaya 确保已使用 AWS MFA 设备配置 Sofía，并且 Sofía 知道该设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

1. Anaya 创建一个名为 `EC2-Admins` 的组并将用户 Sofía 添加到该组中。

1. Anaya 将以下策略附加到 `EC2-Admins` 组。此策略授予用户调用 Amazon EC2 `StopInstances` 和 `TerminateInstances` 操作的权限，但前提是该用户已使用 MFA 进行身份验证。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Action": [
         "ec2:StopInstances",
         "ec2:TerminateInstances"
       ],
       "Resource": ["*"],
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }]
   }
   ```

------

1. 
**注意**  
要使此策略生效，用户必须先注销，然后重新登录。

   如果用户 Sofía 需要停止或终止 Amazon EC2 实例，则她（或她正在运行的应用程序）可调用 `GetSessionToken`。此 API 操作传递 MFA 设备的 ID 和 Sofía 从其设备获取的当前 TOTP。

1. 用户 Sofía（或 Sofía 正在使用的应用程序）使用由 `GetSessionToken` 提供的临时凭证来调用 Amazon EC2 `StopInstances` 或 `TerminateInstances` 操作。

   有关调用 `GetSessionToken` 的程序的示例，请参阅本文档后面的 [使用 MFA 身份验证调用 GetSessionToken](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-getsessiontoken)。

## 方案：拥有基于资源的策略的资源的 MFA 保护
<a name="MFAProtectedAPI-resource-policies"></a>

在此方案中，您是 S3 存储桶、SQS 队列或 SNS 主题的所有者。您希望确保访问资源的任何 AWS 账户 中的任何用户都已使用 AWS MFA 设备进行身份验证。

此方案介绍了一种提供跨账户 MFA 保护的方法，无需用户先担任角色。在此情况下，用户可在满足以下三个条件时访问资源：用户已使用 MFA 进行身份验证、能够从 `GetSessionToken` 获取临时安全凭证且在受资源策略信任的账户中。

假设您在账户 A 中并创建一个 S3 存储桶。您希望向几个不同 AWS 账户 中的用户授予对此存储桶的访问权，但前提是这些用户已使用 MFA 进行身份验证。

在此方案中，用户 Anaya 是账户 A 中的管理员。用户 Nikhil 是账户 C 中的 IAM 用户。

1. 在账户 A 中，Anaya 创建一个名为 `Account-A-bucket` 的存储桶。

1. Anaya 向该存储桶添加存储桶策略。该策略允许账户 A、账户 B 或账户 C 中的所有用户执行存储桶中的 Amazon S3 `PutObject` 和 `DeleteObject` 操作。该策略包含 MFA 条件。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [{
       "Effect": "Allow",
       "Principal": {"AWS": [
         "ACCOUNT-A-ID",
         "ACCOUNT-B-ID",
         "ACCOUNT-C-ID"
       ]},
       "Action": [
         "s3:PutObject",
         "s3:DeleteObject"
       ],
       "Resource": ["arn:aws:s3:::ACCOUNT-A-BUCKET-NAME/*"],
       "Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
     }]
   }
   ```

------
**注意**  
Amazon S3（仅）针对*根*账户访问提供“MFA 删除”功能。在您设置存储桶的版本化状态时，可启用 Amazon S3 MFA Delete 功能。Amazon S3 MFA Delete 功能不适用于 IAM 用户，在管理时独立于 MFA 保护的 API 访问。即使 IAM 用户具有删除存储桶的权限，但在启用 Amazon S3 MFA Delete 功能时，也无法执行删除。有关 Amazon S3 MFA Delete 功能的更多信息，请参阅 [MFA Delete](https://docs.aws.amazon.com/AmazonS3/latest/dev/MultiFactorAuthenticationDelete.html)。

1. 在账户 C 中，管理员确保已使用 AWS MFA 设备配置用户 Nikhil，并且该用户知道设备的 ID。设备 ID 是序列号（如果是硬件 MFA 设备）或设备的 ARN（如果是虚拟 MFA 设备）。

1. 在账户 C 中，Nikhil（或他正在运行的应用程序）将调用 `GetSessionToken`。此调用包括 MFA 设备的 ID 或 ARN 以及 Nikhil 从其设备中获取的当前 TOTP。

1. Nikhil（或他正在使用的应用程序）使用 `GetSessionToken` 返回的临时凭证调用 Amazon S3 `PutObject` 操作以将文件上传到 `Account-A-bucket`。

   有关调用 `GetSessionToken` 的程序的示例，请参阅本文档后面的 [使用 MFA 身份验证调用 GetSessionToken](id_credentials_mfa_sample-code.md#MFAProtectedAPI-example-getsessiontoken)。
**注意**  
在此情况下，`AssumeRole` 返回的临时凭证将不可用。尽管用户可以提供 MFA 信息来担任角色，但 `AssumeRole` 返回的临时凭证不包含 MFA 信息。需要此信息才能满足策略中的 MFA 条件。

# 示例代码：使用多重验证请求凭证
<a name="id_credentials_mfa_sample-code"></a>

以下示例说明如何调用 `GetSessionToken` 和 `AssumeRole` 操作并传递 MFA 身份验证参数。无需任何权限即可调用 `GetSessionToken`，但您必须拥有允许您调用 `AssumeRole` 的策略。随后，返回的凭证将用于列出账户中的所有 S3 存储桶。

## 使用 MFA 身份验证调用 GetSessionToken
<a name="MFAProtectedAPI-example-getsessiontoken"></a>

以下示例说明了如何调用 `GetSessionToken` 并传递 MFA 身份验证信息。然后使用 `GetSessionToken` 操作返回的临时安全凭证来列出账户中的所有 S3 存储桶。

附加到运行此代码的用户（或用户所在的组）的策略提供了返回的临时凭证的权限。对于此示例代码，该策略必须向用户授予请求 Amazon S3 `ListBuckets` 操作的权限。

以下代码示例演示如何使用 `GetSessionToken`。

------
#### [ CLI ]

**AWS CLI**  
**要获取 IAM 身份的一组短期凭证**  
以下 `get-session-token` 命令将检索进行调用的 IAM 身份的一组短期凭证。生成的凭证可用于策略要求多重身份验证（MFA）的请求。凭证在生成 15 分钟后过期。  

```
aws sts get-session-token \
    --duration-seconds 900 \
    --serial-number "YourMFADeviceSerialNumber" \
    --token-code 123456
```
输出：  

```
{
    "Credentials": {
        "AccessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
        "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE",
        "Expiration": "2020-05-19T18:06:10+00:00"
    }
}
```
有关更多信息，请参阅《AWS IAM 用户指南》**中的[请求临时安全凭证](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken)。  
+  有关 API 详细信息，请参阅《AWS CLI 命令参考》**中的 [GetSessionToken](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/get-session-token.html)。

------
#### [ PowerShell ]

**适用于 PowerShell V4 的工具**  
**示例 1：返回包含在设定时间段内有效的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。用于请求临时凭证的凭证是根据当前 shell 默认值推断出来的。要指定其他凭证，请使用 -ProfileName 或 -AccessKey/-SecretKey 参数。**  

```
Get-STSSessionToken
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**示例 2：返回包含有效期为一小时的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。用于发出请求的凭证是从指定的配置文件中获得的。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**示例 3：使用与其凭证在配置文件“myprofilename”中指定的账户关联的 MFA 设备的标识号和该设备提供的值，返回包含有效期为一小时的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile -SerialNumber YourMFADeviceSerialNumber -TokenCode 123456
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
+  有关 API 详细信息，请参阅《AWS Tools for PowerShell Cmdlet Reference (V4)》**中的 [GetSessionToken](https://docs.aws.amazon.com/powershell/v4/reference)。

**Tools for PowerShell V5**  
**示例 1：返回包含在设定时间段内有效的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。用于请求临时凭证的凭证是根据当前 shell 默认值推断出来的。要指定其他凭证，请使用 -ProfileName 或 -AccessKey/-SecretKey 参数。**  

```
Get-STSSessionToken
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**示例 2：返回包含有效期为一小时的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。用于发出请求的凭证是从指定的配置文件中获得的。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
**示例 3：使用与其凭证在配置文件“myprofilename”中指定的账户关联的 MFA 设备的标识号和该设备提供的值，返回包含有效期为一小时的临时凭证的 `Amazon.RuntimeAWSCredentials` 实例。**  

```
Get-STSSessionToken -DurationInSeconds 3600 -ProfileName myprofile -SerialNumber YourMFADeviceSerialNumber -TokenCode 123456
```
**输出**：  

```
AccessKeyId                             Expiration                              SecretAccessKey                        SessionToken
-----------                             ----------                              ---------------                        ------------
EXAMPLEACCESSKEYID                      2/16/2015 9:12:28 PM                    examplesecretaccesskey...              SamPleTokeN.....
```
+  有关 API 详细信息，请参阅《*AWS Tools for PowerShell Cmdlet Reference (V5)*》中的 [GetSessionToken](https://docs.aws.amazon.com/powershell/v5/reference)。

------
#### [ Python ]

**适用于 Python 的 SDK（Boto3）**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sts#code-examples)中查找完整示例，了解如何进行设置和运行。
通过传递 MFA 令牌获取会话令牌，然后使用令牌列出账户的 Amazon S3 存储桶。  

```
def list_buckets_with_session_token_with_mfa(mfa_serial_number, mfa_totp, sts_client):
    """
    Gets a session token with MFA credentials and uses the temporary session
    credentials to list Amazon S3 buckets.

    Requires an MFA device serial number and token.

    :param mfa_serial_number: The serial number of the MFA device. For a virtual MFA
                              device, this is an Amazon Resource Name (ARN).
    :param mfa_totp: A time-based, one-time password issued by the MFA device.
    :param sts_client: A Boto3 STS instance that has permission to assume the role.
    """
    if mfa_serial_number is not None:
        response = sts_client.get_session_token(
            SerialNumber=mfa_serial_number, TokenCode=mfa_totp
        )
    else:
        response = sts_client.get_session_token()
    temp_credentials = response["Credentials"]

    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )

    print(f"Buckets for the account:")
    for bucket in s3_resource.buckets.all():
        print(bucket.name)
```
+  有关 API 详细信息，请参阅《AWS SDK for Python（Boto3）API 参考》**中的 [GetSessionToken](https://docs.aws.amazon.com/goto/boto3/sts-2011-06-15/GetSessionToken)。

------

## 使用 MFA 身份验证调用 AssumeRole
<a name="MFAProtectedAPI-example-assumerole"></a>

下面的示例说明了如何调用 `AssumeRole` 并传递 MFA 身份验证信息。然后使用 `AssumeRole` 返回的临时安全证书列出账户中的所有 Amazon S3 存储桶。

有关此方案的更多信息，请参阅[方案：跨账户委派的 MFA 保护](id_credentials_mfa_configure-api-require.md#MFAProtectedAPI-cross-account-delegation)。

以下代码示例演示如何使用 `AssumeRole`。

------
#### [ .NET ]

**适用于 .NET 的 SDK**  
 查看 GitHub，了解更多信息。查找完整示例，了解如何在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/STS#code-examples)中进行设置和运行。

```
using System;
using System.Threading.Tasks;
using Amazon;
using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;

namespace AssumeRoleExample
{
    class AssumeRole
    {
        /// <summary>
        /// This example shows how to use the AWS Security Token
        /// Service (AWS STS) to assume an IAM role.
        ///
        /// NOTE: It is important that the role that will be assumed has a
        /// trust relationship with the account that will assume the role.
        ///
        /// Before you run the example, you need to create the role you want to
        /// assume and have it trust the IAM account that will assume that role.
        ///
        /// See https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html
        /// for help in working with roles.
        /// </summary>

        // A region property may be used if the profile or credentials loaded do not specify a region,
        // or to use a specific region.
        private static readonly RegionEndpoint REGION = RegionEndpoint.USWest2;

        static async Task Main()
        {
            // Create the SecurityToken client and then display the identity of the
            // default user.
            var roleArnToAssume = "arn:aws:iam::123456789012:role/testAssumeRole";

            var client = new Amazon.SecurityToken.AmazonSecurityTokenServiceClient(REGION);

            // Get and display the information about the identity of the default user.
            var callerIdRequest = new GetCallerIdentityRequest();
            var caller = await client.GetCallerIdentityAsync(callerIdRequest);
            Console.WriteLine($"Original Caller: {caller.Arn}");

            // Create the request to use with the AssumeRoleAsync call.
            var assumeRoleReq = new AssumeRoleRequest()
            {
                DurationSeconds = 1600,
                RoleSessionName = "Session1",
                RoleArn = roleArnToAssume
            };

            var assumeRoleRes = await client.AssumeRoleAsync(assumeRoleReq);

            // Now create a new client based on the credentials of the caller assuming the role.
            var client2 = new AmazonSecurityTokenServiceClient(credentials: assumeRoleRes.Credentials, REGION);

            // Get and display information about the caller that has assumed the defined role.
            var caller2 = await client2.GetCallerIdentityAsync(callerIdRequest);
            Console.WriteLine($"AssumedRole Caller: {caller2.Arn}");
        }
    }
}
```
+  有关 API 详细信息，请参阅《适用于 .NET 的 AWS SDK API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/DotNetSDKV3/sts-2011-06-15/AssumeRole)。

------
#### [ Bash ]

**AWS CLI 及 Bash 脚本**  
 查看 GitHub，了解更多信息。查找完整示例，了解如何在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/aws-cli/bash-linux/iam#code-examples)中进行设置和运行。

```
###############################################################################
# function iecho
#
# This function enables the script to display the specified text only if
# the global variable $VERBOSE is set to true.
###############################################################################
function iecho() {
  if [[ $VERBOSE == true ]]; then
    echo "$@"
  fi
}

###############################################################################
# function errecho
#
# This function outputs everything sent to it to STDERR (standard error output).
###############################################################################
function errecho() {
  printf "%s\n" "$*" 1>&2
}

###############################################################################
# function sts_assume_role
#
# This function assumes a role in the AWS account and returns the temporary
#  credentials.
#
# Parameters:
#       -n role_session_name -- The name of the session.
#       -r role_arn -- The ARN of the role to assume.
#
# Returns:
#       [access_key_id, secret_access_key, session_token]
#     And:
#       0 - If successful.
#       1 - If an error occurred.
###############################################################################
function sts_assume_role() {
  local role_session_name role_arn response
  local option OPTARG # Required to use getopts command in a function.

  # bashsupport disable=BP5008
  function usage() {
    echo "function sts_assume_role"
    echo "Assumes a role in the AWS account and returns the temporary credentials:"
    echo "  -n role_session_name -- The name of the session."
    echo "  -r role_arn -- The ARN of the role to assume."
    echo ""
  }

  while getopts n:r:h option; do
    case "${option}" in
      n) role_session_name=${OPTARG} ;;
      r) role_arn=${OPTARG} ;;
      h)
        usage
        return 0
        ;;
      \?)
        echo "Invalid parameter"
        usage
        return 1
        ;;
    esac
  done

  response=$(aws sts assume-role \
    --role-session-name "$role_session_name" \
    --role-arn "$role_arn" \
    --output text \
    --query "Credentials.[AccessKeyId, SecretAccessKey, SessionToken]")

  local error_code=${?}

  if [[ $error_code -ne 0 ]]; then
    aws_cli_error_log $error_code
    errecho "ERROR: AWS reports create-role operation failed.\n$response"
    return 1
  fi

  echo "$response"

  return 0
}
```
+  有关 API 详细信息，请参阅《AWS CLI Command Reference**》中的 [AssumeRole](https://docs.aws.amazon.com/goto/aws-cli/sts-2011-06-15/AssumeRole)。

------
#### [ C\$1\$1 ]

**SDK for C\$1\$1**  
 查看 GitHub，了解更多信息。查找完整示例，学习如何在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sts#code-examples)中进行设置和运行。

```
bool AwsDoc::STS::assumeRole(const Aws::String &roleArn,
                             const Aws::String &roleSessionName,
                             const Aws::String &externalId,
                             Aws::Auth::AWSCredentials &credentials,
                             const Aws::Client::ClientConfiguration &clientConfig) {
    Aws::STS::STSClient sts(clientConfig);
    Aws::STS::Model::AssumeRoleRequest sts_req;

    sts_req.SetRoleArn(roleArn);
    sts_req.SetRoleSessionName(roleSessionName);
    sts_req.SetExternalId(externalId);

    const Aws::STS::Model::AssumeRoleOutcome outcome = sts.AssumeRole(sts_req);

    if (!outcome.IsSuccess()) {
        std::cerr << "Error assuming IAM role. " <<
                  outcome.GetError().GetMessage() << std::endl;
    }
    else {
        std::cout << "Credentials successfully retrieved." << std::endl;
        const Aws::STS::Model::AssumeRoleResult result = outcome.GetResult();
        const Aws::STS::Model::Credentials &temp_credentials = result.GetCredentials();

        // Store temporary credentials in return argument.
        // Note: The credentials object returned by assumeRole differs
        // from the AWSCredentials object used in most situations.
        credentials.SetAWSAccessKeyId(temp_credentials.GetAccessKeyId());
        credentials.SetAWSSecretKey(temp_credentials.GetSecretAccessKey());
        credentials.SetSessionToken(temp_credentials.GetSessionToken());
    }

    return outcome.IsSuccess();
}
```
+  有关 API 详细信息，请参阅《适用于 C\$1\$1 的 AWS SDK API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForCpp/sts-2011-06-15/AssumeRole)。

------
#### [ CLI ]

**AWS CLI**  
**要代入角色**  
以下 `assume-role` 命令将检索 IAM 角色 `s3-access-example` 的一组短期凭证。  

```
aws sts assume-role \
    --role-arn arn:aws:iam::123456789012:role/xaccounts3access \
    --role-session-name s3-access-example
```
输出：  

```
{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROA3XFRBF535PLBIFPI4:s3-access-example",
        "Arn": "arn:aws:sts::123456789012:assumed-role/xaccounts3access/s3-access-example"
    },
    "Credentials": {
        "SecretAccessKey": "9drTJvcXLB89EXAMPLELB8923FB892xMFI",
        "SessionToken": "AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=",
        "Expiration": "2016-03-15T00:05:07Z",
        "AccessKeyId": "ASIAJEXAMPLEXEG2JICEA"
    }
}
```
该命令的输出包含访问密钥、私有密钥和会话令牌，您可以使用它们对 AWS 进行身份验证。  
要使用 AWS CLI，则可以设置与角色关联的命名配置文件。使用配置文件时，AWS CLI 将调用 assume-role 并为您管理凭证。有关更多信息，请参阅《AWS CLI 用户指南》**中的[在 AWS CLI 中使用 IAM 角色](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html)。  
+  有关 API 详细信息，请参阅《AWS CLI 命令参考》**中的 [AssumeRole](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html)。

------
#### [ Java ]

**适用于 Java 的 SDK 2.x**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sts#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
import software.amazon.awssdk.services.sts.model.StsException;
import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
import software.amazon.awssdk.services.sts.model.Credentials;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Locale;

/**
 * To make this code example work, create a Role that you want to assume.
 * Then define a Trust Relationship in the AWS Console. You can use this as an
 * example:
 *
 * {
 * "Version":"2012-10-17",		 	 	 
 * "Statement": [
 * {
 * "Effect": "Allow",
 * "Principal": {
 * "AWS": "<Specify the ARN of your IAM user you are using in this code example>"
 * },
 * "Action": "sts:AssumeRole"
 * }
 * ]
 * }
 *
 * For more information, see "Editing the Trust Relationship for an Existing
 * Role" in the AWS Directory Service guide.
 *
 * Also, set up your development environment, including your credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */
public class AssumeRole {
    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <roleArn> <roleSessionName>\s

                Where:
                    roleArn - The Amazon Resource Name (ARN) of the role to assume (for example, arn:aws:iam::000008047983:role/s3role).\s
                    roleSessionName - An identifier for the assumed role session (for example, mysession).\s
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String roleArn = args[0];
        String roleSessionName = args[1];
        Region region = Region.US_EAST_1;
        StsClient stsClient = StsClient.builder()
                .region(region)
                .build();

        assumeGivenRole(stsClient, roleArn, roleSessionName);
        stsClient.close();
    }

    public static void assumeGivenRole(StsClient stsClient, String roleArn, String roleSessionName) {
        try {
            AssumeRoleRequest roleRequest = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .build();

            AssumeRoleResponse roleResponse = stsClient.assumeRole(roleRequest);
            Credentials myCreds = roleResponse.credentials();

            // Display the time when the temp creds expire.
            Instant exTime = myCreds.expiration();
            String tokenInfo = myCreds.sessionToken();

            // Convert the Instant to readable date.
            DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                    .withLocale(Locale.US)
                    .withZone(ZoneId.systemDefault());

            formatter.format(exTime);
            System.out.println("The token " + tokenInfo + "  expires on " + exTime);

        } catch (StsException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Java 2.x API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForJavaV2/sts-2011-06-15/AssumeRole)。

------
#### [ JavaScript ]

**SDK for JavaScript (v3)**  
 查看 GitHub，了解更多信息。查找完整示例，了解如何在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascriptv3/example_code/sts#code-examples)中进行设置和运行。
创建客户端。  

```
import { STSClient } from "@aws-sdk/client-sts";
// Set the AWS Region.
const REGION = "us-east-1";
// Create an AWS STS service client object.
export const client = new STSClient({ region: REGION });
```
代入 IAM 角色。  

```
import { AssumeRoleCommand } from "@aws-sdk/client-sts";

import { client } from "../libs/client.js";

export const main = async () => {
  try {
    // Returns a set of temporary security credentials that you can use to
    // access Amazon Web Services resources that you might not normally
    // have access to.
    const command = new AssumeRoleCommand({
      // The Amazon Resource Name (ARN) of the role to assume.
      RoleArn: "ROLE_ARN",
      // An identifier for the assumed role session.
      RoleSessionName: "session1",
      // The duration, in seconds, of the role session. The value specified
      // can range from 900 seconds (15 minutes) up to the maximum session
      // duration set for the role.
      DurationSeconds: 900,
    });
    const response = await client.send(command);
    console.log(response);
  } catch (err) {
    console.error(err);
  }
};
```
+  有关 API 详细信息，请参阅《适用于 JavaScript 的 AWS SDK API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/sts/command/AssumeRoleCommand)。

**SDK for JavaScript (v2)**  
 查看 GitHub，了解更多信息。查找完整示例，了解如何在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javascript/example_code/sts#code-examples)中进行设置和运行。

```
// Load the AWS SDK for Node.js
const AWS = require("aws-sdk");
// Set the region
AWS.config.update({ region: "REGION" });

var roleToAssume = {
  RoleArn: "arn:aws:iam::123456789012:role/RoleName",
  RoleSessionName: "session1",
  DurationSeconds: 900,
};
var roleCreds;

// Create the STS service object
var sts = new AWS.STS({ apiVersion: "2011-06-15" });

//Assume Role
sts.assumeRole(roleToAssume, function (err, data) {
  if (err) console.log(err, err.stack);
  else {
    roleCreds = {
      accessKeyId: data.Credentials.AccessKeyId,
      secretAccessKey: data.Credentials.SecretAccessKey,
      sessionToken: data.Credentials.SessionToken,
    };
    stsGetCallerIdentity(roleCreds);
  }
});

//Get Arn of current identity
function stsGetCallerIdentity(creds) {
  var stsParams = { credentials: creds };
  // Create STS service object
  var sts = new AWS.STS(stsParams);

  sts.getCallerIdentity({}, function (err, data) {
    if (err) {
      console.log(err, err.stack);
    } else {
      console.log(data.Arn);
    }
  });
}
```
+  有关 API 详细信息，请参阅《适用于 JavaScript 的 AWS SDK API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/AWSJavaScriptSDK/sts-2011-06-15/AssumeRole)。

------
#### [ PowerShell ]

**适用于 PowerShell V4 的工具**  
**示例 1：返回一组临时凭证（访问密钥、秘密密钥和会话令牌），这些凭证可用于在一小时内访问请求用户通常可能无法访问的 AWS 资源。返回的凭证具有所担任角色的访问策略和所提供策略允许的权限（您不能使用所提供策略授予超出所担任角色访问策略定义权限的权限）。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -Policy "...JSON policy..." -DurationInSeconds 3600
```
**示例 2：返回一组有效期为一小时的临时凭证，其拥有的权限与所担任角色访问策略中定义的权限相同。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600
```
**示例 3：返回一组临时凭证，提供与用于执行 cmdlet 的用户凭证关联的 MFA 的序列号和生成的令牌。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -SerialNumber "GAHT12345678" -TokenCode "123456"
```
**示例 4：返回一组临时凭证，其已承担客户账户中定义的角色。对于第三方可以担任的每个角色，客户账户必须使用每次担任该角色时都必须在 -ExternalId 参数中传递的标识符来创建角色。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -ExternalId "ABC123"
```
+  有关 API 详细信息，请参阅《AWS Tools for PowerShell Cmdlet Reference (V4)》**中的 [AssumeRole](https://docs.aws.amazon.com/powershell/v4/reference)。

**Tools for PowerShell V5**  
**示例 1：返回一组临时凭证（访问密钥、秘密密钥和会话令牌），这些凭证可用于在一小时内访问请求用户通常可能无法访问的 AWS 资源。返回的凭证具有所担任角色的访问策略和所提供策略允许的权限（您不能使用所提供策略授予超出所担任角色访问策略定义权限的权限）。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -Policy "...JSON policy..." -DurationInSeconds 3600
```
**示例 2：返回一组有效期为一小时的临时凭证，其拥有的权限与所担任角色访问策略中定义的权限相同。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600
```
**示例 3：返回一组临时凭证，提供与用于执行 cmdlet 的用户凭证关联的 MFA 的序列号和生成的令牌。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -SerialNumber "GAHT12345678" -TokenCode "123456"
```
**示例 4：返回一组临时凭证，其已承担客户账户中定义的角色。对于第三方可以担任的每个角色，客户账户必须使用每次担任该角色时都必须在 -ExternalId 参数中传递的标识符来创建角色。**  

```
Use-STSRole -RoleSessionName "Bob" -RoleArn "arn:aws:iam::123456789012:role/demo" -DurationInSeconds 3600 -ExternalId "ABC123"
```
+  有关 API 详细信息，请参阅《*AWS Tools for PowerShell Cmdlet Reference (V5)*》中的 [AssumeRole](https://docs.aws.amazon.com/powershell/v5/reference)。

------
#### [ Python ]

**适用于 Python 的 SDK（Boto3）**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/python/example_code/sts#code-examples)中查找完整示例，了解如何进行设置和运行。
代入需要 MFA 令牌的 IAM 角色并使用临时凭证列出该账户的 Amazon S3 存储桶。  

```
def list_buckets_from_assumed_role_with_mfa(
    assume_role_arn, session_name, mfa_serial_number, mfa_totp, sts_client
):
    """
    Assumes a role from another account and uses the temporary credentials from
    that role to list the Amazon S3 buckets that are owned by the other account.
    Requires an MFA device serial number and token.

    The assumed role must grant permission to list the buckets in the other account.

    :param assume_role_arn: The Amazon Resource Name (ARN) of the role that
                            grants access to list the other account's buckets.
    :param session_name: The name of the STS session.
    :param mfa_serial_number: The serial number of the MFA device. For a virtual MFA
                              device, this is an ARN.
    :param mfa_totp: A time-based, one-time password issued by the MFA device.
    :param sts_client: A Boto3 STS instance that has permission to assume the role.
    """
    response = sts_client.assume_role(
        RoleArn=assume_role_arn,
        RoleSessionName=session_name,
        SerialNumber=mfa_serial_number,
        TokenCode=mfa_totp,
    )
    temp_credentials = response["Credentials"]
    print(f"Assumed role {assume_role_arn} and got temporary credentials.")

    s3_resource = boto3.resource(
        "s3",
        aws_access_key_id=temp_credentials["AccessKeyId"],
        aws_secret_access_key=temp_credentials["SecretAccessKey"],
        aws_session_token=temp_credentials["SessionToken"],
    )

    print(f"Listing buckets for the assumed role's account:")
    for bucket in s3_resource.buckets.all():
        print(bucket.name)
```
+  有关 API 详细信息，请参阅《AWS SDK for Python（Boto3）API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/boto3/sts-2011-06-15/AssumeRole)。

------
#### [ Ruby ]

**适用于 Ruby 的 SDK**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/ruby/example_code/iam#code-examples)中查找完整示例，了解如何进行设置和运行。

```
  # Creates an AWS Security Token Service (AWS STS) client with specified credentials.
  # This is separated into a factory function so that it can be mocked for unit testing.
  #
  # @param key_id [String] The ID of the access key used by the STS client.
  # @param key_secret [String] The secret part of the access key used by the STS client.
  def create_sts_client(key_id, key_secret)
    Aws::STS::Client.new(access_key_id: key_id, secret_access_key: key_secret)
  end

  # Gets temporary credentials that can be used to assume a role.
  #
  # @param role_arn [String] The ARN of the role that is assumed when these credentials
  #                          are used.
  # @param sts_client [AWS::STS::Client] An AWS STS client.
  # @return [Aws::AssumeRoleCredentials] The credentials that can be used to assume the role.
  def assume_role(role_arn, sts_client)
    credentials = Aws::AssumeRoleCredentials.new(
      client: sts_client,
      role_arn: role_arn,
      role_session_name: 'create-use-assume-role-scenario'
    )
    @logger.info("Assumed role '#{role_arn}', got temporary credentials.")
    credentials
  end
```
+  有关 API 详细信息，请参阅《适用于 Ruby 的 AWS SDK API Reference》**中的 [AssumeRole](https://docs.aws.amazon.com/goto/SdkForRubyV3/sts-2011-06-15/AssumeRole)。

------
#### [ Rust ]

**适用于 Rust 的 SDK**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1/examples/sts/#code-examples)中查找完整示例，了解如何进行设置和运行。

```
async fn assume_role(config: &SdkConfig, role_name: String, session_name: Option<String>) {
    let provider = aws_config::sts::AssumeRoleProvider::builder(role_name)
        .session_name(session_name.unwrap_or("rust_sdk_example_session".into()))
        .configure(config)
        .build()
        .await;

    let local_config = aws_config::from_env()
        .credentials_provider(provider)
        .load()
        .await;
    let client = Client::new(&local_config);
    let req = client.get_caller_identity();
    let resp = req.send().await;
    match resp {
        Ok(e) => {
            println!("UserID :               {}", e.user_id().unwrap_or_default());
            println!("Account:               {}", e.account().unwrap_or_default());
            println!("Arn    :               {}", e.arn().unwrap_or_default());
        }
        Err(e) => println!("{:?}", e),
    }
}
```
+  有关 API 详细信息，请参阅《AWS SDK for Rust API Reference》**中的 [AssumeRole](https://docs.rs/aws-sdk-sts/latest/aws_sdk_sts/client/struct.Client.html#method.assume_role)。

------
#### [ Swift ]

**适用于 Swift 的 SDK**  
 查看 GitHub，了解更多信息。在 [AWS 代码示例存储库](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/swift/example_code/iam#code-examples)中查找完整示例，了解如何进行设置和运行。

```
import AWSSTS

    public func assumeRole(role: IAMClientTypes.Role, sessionName: String)
        async throws -> STSClientTypes.Credentials
    {
        let input = AssumeRoleInput(
            roleArn: role.arn,
            roleSessionName: sessionName
        )
        do {
            let output = try await stsClient.assumeRole(input: input)

            guard let credentials = output.credentials else {
                throw ServiceHandlerError.authError
            }

            return credentials
        } catch {
            print("Error assuming role: ", dump(error))
            throw error
        }
    }
```
+  有关 API 详细信息，请参阅《AWS SDK for Swift API 参考》**中的 [AssumeRole](https://sdk.amazonaws.com/swift/api/awssts/latest/documentation/awssts/stsclient/assumerole(input:))。

------