我想要求IAM用户在登录AWS控制台时使用MFA。我知道这对于API访问是可能的,但不确定在登录控制台时是否可以实现同样的访问。
更新
您可以使用基于IAM条件的IAM策略强制执行您的要求,该IAM条件指定aws:MultiFactorAuthAge密钥,如配置MFA-Protected API访问中带有MFA条件的IAM政策部分所述-您可以在两个级别强制执行:
- 存在性--要简单地验证用户是否已通过MFA身份验证,请检查aws:MultiFactorAuthAge密钥是否为空。(如果用户尚未通过MFA验证,此密钥不存在,并且因此为空。)
- Duration(持续时间)--如果您希望仅在MFA身份验证后的指定时间内授予访问权限,请使用数字条件类型来比较密钥的年龄到某个值(例如3600秒)
因此,针对所有AWS操作的通用IAM策略,只要测试MFA身份验证的存在,可能如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*",
"Condition":
{
"Null":{"aws:MultiFactorAuthAge":"false"}
}
}
]
}
初步答复
这是一种"它只是起作用"的情况,也就是说,对于AWS管理控制台的MFA保护访问,没有什么可做的,控制台依次使用API,并相应地使用登录用户的IAM凭据调用每个API操作(一旦用户配置并启用MFA设备,登录页面将需要自动输入MFA令牌)-另请参阅配置MFA-Protected API访问:中的通过控制台使用MFA-ProtectedAPI部分
AWS评估MFA-protected API策略以执行控制台中的操作,例如终止Amazon EC2实例。使用MFA设备设置IAM用户,并启用受MFA保护的API策略。然后,用户可以简单地通过MFA身份验证登录控制台,并遵守受MFA保护的API的策略。对于已经分配了MFA设备的用户,控制台体验不会改变(除了某些受MFA保护的API的可选时间限制,这些API需要更频繁的重新身份验证)。有关使用MFA设备设置IAM用户的更多信息,请参阅设置MFA设备。
Web控制台需要MFA
此处列出的IAM政策将执行以下操作:
- 允许用户更改自己的密码
- 允许用户查看和编辑自己的MFA设备(要求用户拥有MFA的必要组件)
- 如果用户在没有MFA的情况下登录到控制台,则阻止他们执行大多数操作
- 仍然允许用户在没有MFA的情况下登录时设置MFA
- 使用API密钥,不考虑MFA
最好将其创建为IAM策略,然后将其附加到具有控制台用户的用户组。您也可以将策略直接附加到用户,但这更难管理。
请注意,向您的帐户添加MFA设备不足以访问AWS资源;您需要使用MFA设备登录才能使其工作。因此,要设置MFA,您需要执行以下步骤:
- 登录AWS控制台
- 在右上角,单击标有用户名的下拉列表
- 转到";安全凭证">
- 添加MFA设备
- 注销
- 使用MFA重新登录;您现在可以正常使用AWS控制台
IAM政策如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ChangePassword",
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ListAccessKeys",
"iam:GetAccessKeyLastUsed",
"iam:GetUser"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "BlockMostAccessUnlessSignedInWithMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:ListVirtualMFADevices",
"iam:EnableMFADevice",
"iam:ResyncMFADevice",
"iam:DeleteVirtualMFADevice",
"iam:DeactivateMFADevice",
"iam:ListAccountAliases",
"iam:ListUsers",
"iam:ListSSHPublicKeys",
"iam:ListAccessKeys",
"iam:GetAccessKeyLastUsed",
"iam:ListServiceSpecificCredentials",
"iam:ListMFADevices",
"iam:GetAccountSummary",
"iam:ChangePassword",
"iam:GetUser",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
请注意,虽然这允许在不需要MFA的情况下使用大多数AWS API,但一些API调用将无法工作。特别是,任何使用临时AWS身份验证凭据的调用都将失败。例如:
- 使用ECR登录,因为这会生成一个临时密钥,并将其提供给docker
- 从AWS Secrets Manager检索值,因为这使用临时凭据与KMS对话
- 弹性Beanstalk操作,因为这些操作似乎在内部使用临时凭据
为了完成这些任务,您需要获得MFA API凭据(请参见下文)。另一个选项(特别适合ECR登录)是在没有MFA Required策略用于进行API调用的组中创建一个权限较低的用户。
处处要求MFA
为了增强安全性,您可以要求对web控制台和API进行MFA访问。为此,请将上述策略中的condition
更改为以下内容:
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
这样做的原因是,具有永久凭据的API调用根本不传递MultiFactorAuthPresent密钥,而控制台请求总是传递。如果MultiFactorAuthprest密钥不存在,则将此条件从Bool
更改为BoolIfExists
会将解析条件更改为true,从而阻止请求。
要将API与MFA一起使用,需要使用sts get-session-token
命令。例如,使用AWS CLI:
# Get the serial number of your MFA device
aws --profile <PROFILE_NAME> iam list-mfa-devices --user-name <IAM_USER_NAME>
# Get temporary API keys that will pass MFA verification
aws --profile <PROFILE_NAME> sts get-session-token --serial-number <MFA_SERIAL_NUMBER> --token-code <MFA_TOKEN>
# Export the temporary credentials for use in subsequent calls
export AWS_ACCESS_KEY_ID=<KEY>
export AWS_SECRET_ACCESS_KEY=<SECRET>
export AWS_SESSION_TOKEN=<SESSION_TOKEN>
如果您喜欢管理凭据获取过程的脚本,请使用命令行工具iam-mfa
:https://github.com/zagaran/iam-mfa.(免责声明:我是该工具的主要作者。)
与此同时,AWS本身提供了一个教程,介绍如何强制用户使用MFA设备,同时使他们能够自己管理MFA设备。这与Steffen更新的答案非常相似,但在细节上有所不同。
它由工作
- 基于此官方AWS模板创建IAM策略,该模板基本上禁止除没有活动MFA登录的IAM操作之外的所有操作
- 将策略分配给您的相关IAM用户或更好的IAM组
- 创建IAM用户并向他们传递初始凭据后,用户将收到一个您无权执行此操作所有操作,访问IAM安全控制台的除外
- 在注册MFA设备、注销并使用新的MFA令牌再次登录后,他们将能够按预期操作一切