众所周知,AWS在账号体系这块支持使用MFA,而我们在使用MFA的时候通常有如下几种场景:
所以说嘛,安全这个事是相对的,回到安全哲学上,这件事取决于要保护的业务资产的重要程度和价值。下面就上述几种情况的使用场景及配置方法,做一下逐一说明。(需要留意的是目前在AWS中国区只支持虚拟MFA设备,不支持硬件MFA设备或者Yubikey。)
我有一个附加了管理员权限的IAM User,但是没有附加任何MFA相关的Policy。这种情况下就属于用不用MFA都行的场景,通常适用于安全意识比较高,可以自觉配置的MFA的同学,比如说企业的安全工程师。或者作为测试账号用用。
下面我们就来看看MFA功能如何配置:
配置完成后,当我们在控制台登录该IAM User时,是需要输入PIN code的(CLI不需要)。
登录之后,就可以访问里头的服务和资源了。CLI可以直接使用,而无需使用MFA:
1 | aws s3 ls --profile mfa_tonghua --region cn-north-1 |
可以看到上述配置有一个小问题,就是我没有MFA的Policy,当这个User取消MFA之后仍然可以正常登录AWS控制台。那作为一家安全意识比较高的企业或者团队,要求强制使用MFA,如果不使用的话,就不让你继续访问AWS的服务,这里我就说说这个Policy该怎么实现 [2]。按照文档中的Policy,几乎不用做任何修改,附加至User上看看(arn:aws:iam::需要替换成符合中国区规范的arn地址 arn:aws-cn:iam::)。
1 | { |
策略配置成功之后,当我们在CLI中访问可以看到已经报访问拒绝(Access Denied)的错误了。
然后,当我把MFA设备取消激活之后,发现在控制台登录也会被禁止访问了(准确的说,是可以登录成功,但是无法访问任何资源,只有激活MFA之后才能继续使用)。
恩,构造好类似这样的URL:https://console.amazonaws.cn/iam/home?region=cn-north-1#/users/mfa_tonghua?section=security_credentials当前用户可以给自己创建虚拟MFA设备啦。
那你可能就要说了,我控制台上能输入PIN Code访问了,那我CLI咋整啊,有啥参数可以指定吗。emm,莫得慌张CLI可以这么玩[3](思路就是输入PIN Code创建临时访问凭证,然后使用临时的访问凭证去访问AWS资源):
1 | aws sts get-session-token --serial-number arn:aws-cn:iam::123456789012:mfa/mfa_tonghua --token-code 631424 --profile mfa_tonghua --region cn-north-1 |
–token-code 参数就是虚拟MFA设备上头的动态PIN Code。
然后配置临时的访问凭证访问即可:
1 | export AWS_ACCESS_KEY_ID=333 |
可以看到已经可以使用临时访问凭证,访问AWS的资源了:
如果您通过–debug查看的话可以看到,使用的凭证就是在环境变量env中加载出来的:
1 | 2019-11-25 06:10:51,777 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: env |
如果您不想使用环境变量中的临时凭证了,使用unset命令,删掉指定的环境变量即可。
上面那种CLI/Console中都强制使用MFA是最稳的一种方式。有的时候,业务部门的同事jio着CLI上还要输入MFA的PIN Code然后拿临时访问凭证好麻烦啊,能不能CLI上不走MFA额,这件事情是可以做到的,但是在做之前要明确几件事情:
1 | "Effect" : "Deny", |
唯一的区别就是将BoolIfExists修改为Bool,先测试一下看看效果,稍后会对这些Key做详细的解读。
可以看到CLI上已经无需使用MFA了,而控制台仍然需要:
搞定!
在这一小节,我就着重说一说Policy中跟MFA息息相关的Policy Key,一共如下几个:
1 | "Effect" : "Deny", |
临时访问凭证中包含aws:MultiFactorAuthPresent这个Key,
在请求上下文中,如果包含aws:MultiFactorAuthPresent这个Key,并且这个Key等于true代表用了MFA,等于false代表没走MFA。
那回到这个Policy,当我使用了MFA时,aws:MultiFactorAuthPresent==true,然后这个Condition不成立,就不会执行该Policy,然后就会allow继续操作,如果我没使用MFA,aws:MultiFactorAuthPresent==false,条件成立,Policy生效,会Deny掉相关的API call。当我使用持久凭证时,没有aws:MultiFactorAuthPresent这个Key,所以默认Condition成立,进而Policy成立,会Deny掉相关API call。
在控制台中使用MFA,CLI中不使用MFA的Policy解读:
1 | "Effect" : "Deny", |
在请求上下文中,aws:MultiFactorAuthPresent == true(使用MFA)时,Condition不成立,Policy不生效,可以执行相关API call,等于false时,Condition成立,Policy生效,会被Deny掉相关API call。
注意了,以下的配置目前并不适用于AWS中国区,但是为了保证文章的完整性,我在AWS Global区域做了测试。
先来看看YubiKey:
再登录的时候就变成这样了:
当然,遇到问题了也别慌,参考下这个[5],看能不能解决您的问题。
硬件MFA设备先不看了,我的设备是8位的,它的好像只能6位?
记录一下AWS使用MFA的常见场景,备忘。
[1] Multi-factor Authentication, https://aws.amazon.com/cn/iam/features/mfa/
[2] AWS: Allows MFA-Authenticated IAM Users to Manage Their Own MFA Device on the My Security Credentials Page, https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.html
[3] How do I use an MFA token to authenticate access to my AWS resources through the AWS CLI?, https://aws.amazon.com/premiumsupport/knowledge-center/authenticate-mfa-cli/?nc1=h_ls
[4] AWS Global Condition Context Keys, https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html
[5] Troubleshooting U2F Security Keys, https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_mfa-u2f.html