内容介绍:
一、凭证管理的基本原则
二、云上程序使用临时凭证的最佳实践
本次分享的内容是云上程序使用临时凭证的最佳实践。
一、凭证管理的基本原则
谈及凭证管理,我们需要了解凭证管理的基本原则,其核心包括两部分,一是缩短暴露时长,二是缩小暴露面积。如今很多手机APP都无需填写用户名和密码,只需通过手机号加验证码的方式即可实现注册和登录。验证码的有效期通常只有五分钟,超过这个时间,验证码就会失效,这体现了其缩短暴露时长的原则。对于缩短暴露面积,最常见的安全风险如AK泄露,如研发人员把AK明文写到代码中,又上传到了公开的仓库中,在世界范围内,只要能看到仓库的人都可以看到该AK的信息,暴露面积很大。
基于两大核心原则,在云上分为两大身份类型。第一类是人员身份,企业有很多的员工,人员身份往往对应到企业员工中具体的个人;第二类是程序身份,程序身份对应到业务甚至环境中,它需要通过AK等方式访问阿里云的API,以获取数据或进行运维管理操作。
这两大身份在身份凭据管理中都容易出现很多安全风险,如AK泄漏等。就如何系统化地规划身份凭据管理,提升安全水位,我们围绕两大身份和基本原则提供了一系列的解决方案和最佳实践。
对于人员身份,开启MFA多因素认证,使用SSO单点登录等。
对于程序身份,结合凭据管理的两大原则进行分析。第一,缩短暴露时长,与前面提到的手机验证码的案例,云上也有类似的方案,即本次分享的主题——使用临时凭据的方案(STS Token)。众所周知,使用固定AK易被泄露,使用STS Token就会自带有效期,如同手机验证码,其有效期一般是小时级别的。一旦有了有效期,研发人员就很难把STS Token硬编码到自己的代码里,因为几小时后可能就会失效。同时,STS Token还能刷新,刷新之后可以缩短其暴露时长,相对而言,可以极大地降低其泄露风险。
二、云上程序使用临时凭证的最佳实践
在云上,我们需要结合不同的应用部署的环境去使用不同的临时凭据方案。
1、解决方案
(1)ECS实例角色获取STS Token访问云资源
如果客户的应用部署在ECS上,则可以使用ECS实例角色方案获取STS Token。
在创建ECS实例时,可以直接配置ECS关联的RAM角色,或者在“实例设置”中为已有的ECS实例配置RAM角色。在ECS实例内部,客户的应用程序可以通过ECS的Meta服务获取STS 临时凭据,再基于STS 临时凭据访问其他产品的API。同时,临时凭据将自动地周期性更新,用户不需要关心其过期刷新的过程。如此,既可以规避永久凭据导致的安全风险问题,保证云账号的AK的安全性,也可以借助访问控制实现更精细化的控制和权限管理。
(2)ACK RRSA功能获取STS token访问云资源
如今,越来越多的客户开始使用K8S等云原生架构,阿里云也针对性地推出了相应的解决方案。下面的架构图展示了针对ACK集群使用临时凭据的方案:
虽然架构图相对复杂,但在产品化之后,运维管理员只需一键即可开启ACK集群中的RRSA组件完成配置。且研发人员使用也很简单,无需关心STS token过期刷新的逻辑,只需在阿里云官方提供的sdk的基础上稍做简单配置,即可在自己的代码中自动获取STS Token。并且在STS Token临过期时,sdk会自动刷新STS Token。
2、操作演示
这里演示如何使用ECS实例角色获取STS Token并访问云资源,以读取OSS文件为例。案例中有两个OSS Bucket,本次演示中部署在ECS上的程序只需要访问名为web-app-01 Bucket下的文件,其他Bucket下的文件无需也无权访问。
进入web-app-01 Bucket,可以看到下面有名为ram-role-test的文件。进入RAM控制台,创建ECS关联的角色,“可信实体类型”选择“阿里云服务”,“受信服务”选择“云服务器”,这样即可创建能与ECS实例关联的角色。案例中创建了名为ECSRamRoleTest的角色,并为其绑定权限策略。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListObjects",
"Resource":"acs:oss:*:*:web-app-01"
},
{
"Effect": "Allow",
"Action": "oss:GetObjects",
"Resource":"acs:oss:*:*:web-app-01/*"
}
]
}
在该权限策略中,仅允许该角色访问名为web-app-01 OSS Bucket下的文件对象。
进入ECS控制台,点击“创建实例”,在高级选项中选择一个实例RAM角色,案例中选择了创建的ECSRamRoleTest角色。如果是已有实例,可以在实例设置中点击“授予/收回RAM角色”,关联相应的RAM角色。
登录现有的机器上,已经写入了一段Python代码:
从这段代码可以看到,我们首先从ECS的Meta服务中获取到了实例角色的STS Token,用该STS Token分别从web-app-01和web-app-03两个Bucket中遍历文件对象。通过之前的步骤可以知道,我们只给实例角色授予了web-app-01 Bucket的权限。
运行这段代码,运行结果如下图所示:
可以看到已成功遍历了web-app-01下的所有文件,而在遍历web-app-03时,由于没有权限而报错。
以上是关于云上程序使用临时凭据的最佳实践。总之,如果应用部署在阿里云上,则建议使用临时凭据的方案,一方面能够极大地降低凭证泄露的风险,另一方面,如果泄露也可以有效地缩短凭证暴露的时长。