使用场景
用户购买了ECS实例,并且打算在ECS中部署企业的应用程序。这些应用程序需要使用AccessKey访问其他云服务API。有两种做法:
- 将AccessKey直接嵌入在代码中。
- 将AccessKey保存在应用程序的配置文件中。
这样会带来两个问题:
- 保密性问题:如果AccessKey以明文形式存在于ECS实例中,它都可能随快照、镜像及镜像创建出来的实例被泄露。
- 难运维性问题:由于AccessKey存在于实例中,如果要更换AccessKey(比如周期性轮转或切换用户身份),那么需要对每个实例和镜像进行更新并重新部署,这会增加对实例和镜像管理的复杂性。
您可以通过为ECS实例配置RAM角色解决上述问题。允许应用程序通过获取角色身份的动态令牌来访问云服务API,从而实现无AccessKey的应用身份与授权管理。
为ECS实例配置RAM角色
ECS结合身份管理与资源访问控制服务(Resource Access Management,RAM)提供的访问控制能力,允许给每一个ECS示例(即用户应用程序的运行环境)配置一个拥有合适权限的RAM角色身份,应用程序通过获取该角色身份的动态令牌来访问云服务API。具体流程如下图所示:
操作流程如下:
- 云账号在RAM中创建一个ECS实例型RAM角色,并对角色授予合适的权限策略。
说明 ECS实例型RAM角色:是RAM服务角色中的一种类型,表示该角色是由用户创建并授权给该用户的ECS实例所使用。
- 启动ECS实例时,配置创建好的RAM角色。
- ECS服务根据所配置的RAM角色,调用AssumeRole去访问STS请求获取该角色的STS token。
- STS服务会验证ECS服务身份及该角色的授权类型,验证通过后颁发STS token,否则拒绝请求。
更多详细信息,请参见通过控制台使用实例RAM角色或通过API使用实例RAM角色。
- 获取到STS token后,ECS将通过Metadata服务将STS token提供给实例中的应用程序访问。
例如:在Linux中执行如下命令,即可获取STS token及过期时间等元数据信息。
$ curl http://100.100.100.200/latest/meta-data/ram/security-credentials/<roleName>
说明
- STS token过期时间通常为1小时,STS token在有效期内都能正常访问云服务API,在过期之前ECS服务会自动刷新STS token。
- 如果STS token权限不足,那么需要找管理员给实例RAM角色添加足够的权限。
- 实例RAM角色的权限更新后,STS token权限立即生效,无需重新启动ECS实例。
- 使用STS token调用云服务API。
说明 如果您的应用程序使用了Alibaba Cloud SDK,那么Alibaba Cloud SDK将会自动从ECS Metadata服务中获取实例RAM角色的STS token,开发者无需在SDK中配置任何AccessKey相关的信息。更多详细信息,请参见
配置RamRole实现ECS实例的无AK访问。
管理员与操作员职责分离
对于很多企业用户,授权者和ECS实例操作者通常都是职责分离,是不同的RAM用户。针对管理员与操作员职责分离原理如下:
说明
- 如果RAM用户不拥有管理员权限,仅有ECS权限。在创建ECS实例并配置RAM角色时,ECS服务会强制检查当前用户是否拥有指定RAM角色的
ram:PassRole
权限,否则无法成功创建ECS实例。
- 只有被授权用户才能为ECS实例配置RAM角色,避免RAM角色权限被滥用。
若想实现管理员与操作员职责分离,只需在为ECS实例配置RAM角色的基础上,根据Step 1.5使管理员给操作员增加一个
PassRole
权限即可。管理员可以通过RAM按如下Policy示例创建一个自定义策略,然后将这个自定义策略授权给操作员。
{
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
//替换rolename
为自己的RAM角色名称。
"Resource": "acs:ram:*:*:role/<rolename>"
}
],
"Version": "1"
}
相关文档