AWS控制台强制MFA但豁免CLI用户的IAM策略配置咨询
解决方案
核心逻辑说明
当前策略的问题是未区分控制台临时会话和CLI长期密钥请求的请求特征,调整逻辑基于两类请求的本质差异:
- 控制台登录属于临时会话场景,请求必然携带
aws:MultiFactorAuthPresent(标记是否完成MFA)和aws:TokenIssueTime(标记为临时会话)两个条件键 - CLI直接使用IAM用户长期访问密钥发起的请求,不会携带上述两个条件键
只需调整最后一条Deny语句的触发条件,让拦截规则仅对临时会话生效,即可满足需求。
调整后的完整策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowViewAccountInfo", "Effect": "Allow", "Action": [ "iam:GetAccountPasswordPolicy", "iam:ListVirtualMFADevices" ], "Resource": "*" }, { "Sid": "AllowManageOwnPasswords", "Effect": "Allow", "Action": [ "iam:ChangePassword", "iam:GetUser" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageOwnAccessKeys", "Effect": "Allow", "Action": [ "iam:CreateAccessKey", "iam:DeleteAccessKey", "iam:ListAccessKeys", "iam:UpdateAccessKey" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageOwnSigningCertificates", "Effect": "Allow", "Action": [ "iam:DeleteSigningCertificate", "iam:ListSigningCertificates", "iam:UpdateSigningCertificate", "iam:UploadSigningCertificate" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageOwnSSHPublicKeys", "Effect": "Allow", "Action": [ "iam:DeleteSSHPublicKey", "iam:GetSSHPublicKey", "iam:ListSSHPublicKeys", "iam:UpdateSSHPublicKey", "iam:UploadSSHPublicKey" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageOwnGitCredentials", "Effect": "Allow", "Action": [ "iam:CreateServiceSpecificCredential", "iam:DeleteServiceSpecificCredential", "iam:ListServiceSpecificCredentials", "iam:ResetServiceSpecificCredential", "iam:UpdateServiceSpecificCredential" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageOwnVirtualMFADevice", "Effect": "Allow", "Action": [ "iam:CreateVirtualMFADevice", "iam:DeleteVirtualMFADevice" ], "Resource": "arn:aws:iam::*:mfa/${aws:username}" }, { "Sid": "AllowManageOwnUserMFA", "Effect": "Allow", "Action": [ "iam:DeactivateMFADevice", "iam:EnableMFADevice", "iam:ListMFADevices", "iam:ResyncMFADevice" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "DenyAllExceptListedIfNoMFA", "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:GetUser", "iam:ListMFADevices", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice", "sts:GetSessionToken" ], "Resource": "*", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "false" }, "Null": { "aws:TokenIssueTime": "false" } } } ] }
调整点说明
仅修改了最后一条Deny语句的Condition规则:
- 新增
Null条件判断aws:TokenIssueTime不为空,代表仅对临时会话(控制台登录场景)生效 - 去掉原来的
BoolIfExists改为直接用Bool判断,因为临时会话必然存在aws:MultiFactorAuthPresent键,无需兼容不存在的场景
内容的提问来源于stack exchange,提问作者Norrec
相关产品推荐
相关产品推荐

