AWS Identity and Access Management
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

带 MFA 条件的示例策略

下面的示例演示了可用于将 MFA 条件添加到策略中的其他方法。要了解如何使用这些示例 JSON 策略文档创建 IAM 策略,请参阅在 JSON 选项卡上创建策略

注意

以下示例演示了直接附加到您自己的 AWS 账户中的 IAM 用户或组的策略。若要跨账户使示例适应 MFA 保护 API,您可以改用 IAM 角色并将 MFA 条件检查置于角色信任策略而不是角色访问策略中。有关更多信息,请参阅 方案:跨账户委派的 MFA 保护

示例 1:在最近进行 MFA 身份验证后允许访问 (GetSessionToken)

下面的示例演示了附加到用户或组的策略,该策略仅在用户在前一小时 (3600 秒) 内使用 MFA 进行身份验证的情况下授予 Amazon EC2 访问权。请注意,如果具有长期凭证和此策略的用户调用 Amazon EC2 API,,因为该键MultiFactorAuthAge在长期凭证的请求环境中不存在,所以该调用将失败。您可以通过更改运算符为NumericLessThanIfExists来允许长期凭证,或者您可要求用户获取首先使用 sts:GetSessionToken API 和 MFA 进行验证的短期凭证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["ec2:*"], "Resource": ["*"], "Condition": {"NumericLessThan": {"aws:MultiFactorAuthAge": "3600"}} }] }

示例 2:若未进行有效的 MFA 身份验证,则拒绝访问特定 API (GetSessionToken)

下面的示例演示了一个附加到用户或组的策略,该策略允许访问全部 Amazon EC2 API,但拒绝访问 StopInstancesTerminateInstances (如果用户未进行 MFA 身份验证)。该策略需要两个语句来实现所需效果。第一个语句 (包含 "Sid": "AllowAllActionsForEC2") 允许所有 Amazon EC2 操作。当缺少 MFA 身份验证上下文 (意味着未使用 MFA) 时,第二个语句 (包含 "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent") 拒绝了 StopInstancesTerminateInstances 操作。

注意

对 Deny 语句中的 MultiFactorAuthPresent 的条件检查不应是 {"Bool":{"aws:MultiFactorAuthPresent":false}},因为当未使用 MFA 时该键不存在且无法进行计算。因此,请改为在检查值之前,使用 BoolIfExists 检查来查看该键是否存在。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllActionsForEC2", "Effect": "Allow", "Action": "ec2:*", "Resource": "*" }, { "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": false}} } ] }

示例 3:若最近未进行有效的 MFA 身份验证,则拒绝访问特定 API (GetSessionToken)

下面的示例演示一个附加到用户或组的策略,该策略允许访问全部 Amazon EC2 API,但拒绝访问 StopInstancesTerminateInstances,除非用户在前一小时内使用 MFA 身份验证进行了身份验证。此示例在前例的基础上扩展,需要三个语句来实现所需效果。前两个语句与前列中的相同。如果完全未使用 MFA (缺少 MFA 上下文),第二语句仍将包含拒绝 StopInstancesTerminateInstances 的条件。如果 MFA 身份验证存在,但比请求早 1 个多小时发生,则以下示例中的第三个语句 (包含 "Sid": "DenyStopAndTerminateWhenMFAIsOlderThanOneHour") 将包含拒绝 StopInstancesTerminateInstances 操作的一个额外条件。例如,IAM 用户可能使用 MFA 登录到 AWS 管理控制台,然后在两个小时之后尝试停止或终止 EC2 实例。以下策略将阻止这种情况。要在这种情况下停止或终止 EC2 实例,用户必须注销并使用 MFA 重新登录,然后在登录后的一个小时内停止或终止实例。

注意

第一个 Deny 语句中的 MultiFactorAuthPresent 的条件检查使用 "BoolIfExists",因为当未使用 MFA 时该键不存在且无法进行计算。如果未使用 MFA,而值不存在,将返回 true,语句匹配并拒绝访问。

仅当 MFA 上下文在请求中存在时,条件 aws:MultiFactorAuthAge 才存在。因此,语句 2 涵盖了 MFA 完全不存在的情况,语句 3 涵盖了 MFA 不存在的情况并计算其是否在正确的时间范围内发生。同样,当键不存在时,… IfExists 语句会导致测试返回 true,语句匹配,并且用户被拒绝访问这些 API。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAllActionsForEC2", "Effect": "Allow", "Action": "ec2:*", "Resource": "*" }, { "Sid": "DenyStopAndTerminateWhenMFAIsNotPresent", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"BoolIfExists": {"aws:MultiFactorAuthPresent": false}} }, { "Sid": "DenyStopAndTerminateWhenMFAIsOlderThanOneHour", "Effect": "Deny", "Action": [ "ec2:StopInstances", "ec2:TerminateInstances" ], "Resource": "*", "Condition": {"NumericGreaterThanIfExists": {"aws:MultiFactorAuthAge": "3600"}} } ] }