内容介绍:
一、凭证管理的基本原则
二、云上安全使用AccessKey的最佳实践
本次分享的内容是云上安全使用AccessKey的最佳实践。
一、凭证管理的基本原则
前面的课程中提到过凭证管理的基本原则,其核心包括两部分,一是缩短暴露时长,二是缩小暴露面积。如今很多手机APP都无需填写用户名和密码,只需通过手机号加验证码的方式即可实现注册和登录。验证码的有效期通常只有五分钟,超过这个时间,验证码就会失效,这体现了其缩短暴露时长的原则。对于缩短暴露面积,最常见的安全风险如AK泄露,如研发人员把AK明文写到代码中,又上传到了公开的仓库中,在世界范围内,只要能看到仓库的人都可以看到该AK的信息,暴露面积很大。
基于两大核心原则,在云上分为两大身份类型。第一类是人员身份,企业有很多的员工,人员身份往往对应到企业员工中具体的个人;第二类是程序身份,程序身份对应到业务甚至环境中,它需要通过AK等方式访问阿里云的API,以获取数据或进行运维管理操作。
二、云上安全使用AccessKey的最佳实践
对于程序身份来说,基本包括如下几个场景:
1、临时凭据
如客户的应用部署在阿里云上,其本身没有多云诉求,这种情况下,推荐使用临时凭据(STS token)的方案,类似于有一定有效期的手机验证码,使用临时的存在有效期的STS token就体现了缩短暴露时长的原则,可以极大降低凭据泄露的风险。
2、固定AK
如客户的应用需要在多云部署,或部署在自己云下的IDC上。此时,也需要访问阿里云的资源,使用固定AK无可避免。安全使用固定AK应遵循凭证管理的两大原则,第一条,缩短暴露时长,对固定AK进行周期性的轮转,设定时间替换旧的AK,降低暴露时长。第二条,缩小暴露面积,可以通过集中化管控,通过加密的手段确保未经授权的人无法直接接触到明文的AK。
针对固定AK的使用场景,我们推荐通过KMS凭据管家来实现AK的安全使用。
(1)解决方案及客户价值
我们可以将固定AK使用凭据的形式统一的存放在KMS凭据管家中。开发人员在应用程序中进行相应的配置,通过凭据名称实现动态获取;同时,KMS凭据管家还支持对固定AK进行定期自动轮转,无需手动操作;此外,开发人员也无需感知;最后,KMS还支持对凭据进行自动加密,保证AK加密存储的,并且KMS和阿里云平台结合度较高。
如此,一方面,我们可以统一集中管理AK的配置,另一方面通过加密和轮转的方式,可以极大降低AK泄露的风险,减少安全隐患。
(2)实际操作演示
进入KMS控制台,首先在“实例管理”中根据企业自身需要创建KMS实例并购买相应规格的实例。在购买、使用KMS实例后,进入密钥管理页面,创建用户主密钥用以凭据加密。点击创建密钥,选择对称密钥类型,对于加密主密钥,可以开启自动轮转。
在这创建凭据之前,还需要进行一些授权行为,需要创建受信给KMS的RAM角色,并赋予相应的权限。进入RAM控制台,点击“创建角色”,“可信实体类型”选择阿里云服务,选择“受信服务”密钥管理服务。创建好角色,并赋予相应权限之后,KMS就会通过扮演角色对AK进行集中的管理和轮转。
接下来,开始创建凭据,进入KMS凭据管理页面,选择RAM凭据,点击“创建凭据”,选择需要管理的创建有AK的RAM用户,“加密主密钥”中选择之前在“密钥管理”中创建的用户主密钥,开启自动轮转,这样KMS即可实现对AK的自动轮转。
应用程序要想获取AK凭据,需要先创建应用接入点。进入接入点页面,首先创建“权限策略”。但要注意,如果应用程序不在阿里云上,则需要选择“KMS共享网关”作用域,通过公网获取凭证。如果应用部署在云上,就可以选择相应的KMS实例,这样就可以通过VPC接入地址来获取凭据了。
接着配置相应的权限。在完成“权限策略”的创建之后,再创建“应用接入点”,如果应用部署在云下,则选择“标准创建”的创建模式,“认证方式”选择ClientKey,输入自定义的加密口令权限策略,使用创建的权限策略。如果应用部署在云上,则可以直接使用快速创建。点击“确定”,浏览器会自动下载ClientKey。这样,就可以通过ClientKey在AK程序中获取AK的凭证了。
创建接入点之后,写入了一段Java的程序示例。
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.4</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core-managed-credentials-provider
</artifactId>
<version>1.3.3</version>
</dependency>
该案例中使用的是RAM凭据插件的sdk。首先需要进行一定的配置:
将下载的ClientKey放到程序中,其中ClientKey包含两个文件,一个是JSON文件,是应用身份凭据的内容,另一个是txt文件,是凭据口令。然后将两个文件放到resources下,然后创建名为managed_credentials_providers.proper
ties的配置文件,并在该文件中指定ClientKey文件所在的文件路径。至此,完成了相应的配置。
使用KMS SDK提供的ProxyAcsClient,指定需要获取的凭证名称,KMS SDK就可用自动使用配置的ClientKey获取托管在KMS上的AK,并用AK初始化aliyun-java-sdk的Client。然后,就可以使用Client访问阿里云。
我们也可以查看AK拥有的权限,以课上托管的是app-01RAM用户的AK为例:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ecs:DescribeInstanceAttribute",
"Resource":"acs:ecs:*1849504696059831:instance/i-bp15l4
47c3217m5ezjdm",
}
]
}
对该RAM用户,我们分配了一个自定义策略,限制其只能调用ECS的DescribeInstanceAttribute API,查询确定实例的实例属性。
在代码中,可以查询实例的实例属性,以及没有权限的ECS实例。运行程序,可以看到有权限的实例可以正常返回,没有权限的实例会报错,提示“没有权限”。
以上是关于云上安全使用AccessKey最佳实践的所有内容,总之,如果应用没有部署在阿里云上,建议优先使用(STS token)的方案;如果应用场景必须使用固定AK,则可以从加密、轮转、集中管理三个方面对AK进行安全加固,也可以使用KMS凭据管理的功能管理AK,保证AK的安全使用。