摘要: 在之前文章中, 其中一个遗留问题是如何存放访问 ACM 配置本身的敏感信息, 比如要访问 ACM 本身需要的 AccessKey ID(简称 AK)或 Secret AccessKey(简称 SK)如何存放, 即所谓敏感配置的 "最后一公里" 问题.
在如何在阿里云上安全的存放您的配置 https://yq.aliyun.com/articles/579006 一文中, 我们介绍了如何通过 ACM 存放您的敏感配置, 并进行加密. 这样做的目的有两个:
在应用程序或对应生产环境容器或系统中, 无需持久化任何敏感数据信息(如数据库连接串, 等), 以防止生产环境或开发过程中的敏感信息泄露.
配置数据在配置中心存放且全程加密, 进一步保证数据的安全性.
然而在之前文章中, 其中一个遗留问题是如何存放访问 ACM 配置本身的敏感信息, 比如要访问 ACM 本身需要的 AccessKey ID(简称 AK)或 Secret AccessKey(简称 SK)如何存放, 即所谓敏感配置的 "最后一公里" 问题. 而就在最近 ACM 发布的 4.4 版本中包含了一个重要的功能 "ACM SDK 支持 ECS 实例 RAM 角色", 使得上述问题得到彻底解决. 我们来看看 ACM 是怎么做的.
为说明 ACM 的做法, 本文将分为两个部分:
第一部分, 通过简单介绍 "ECS 实例 RAM 角色" 的原理, 让读者理解如何可以不通过输入 AK/SK 来调用阿里云的 SDK.
第二部分, 通过介绍 ACM 支持 "ECS 实例 RAM 角色" 的方法和使用场景, 让读者进一步理解如何利用 ACM 的彻底在代码中去掉敏感配置和 AK/SK 的.
"ECS 实例 RAM 角色" 原理
首先来看看所谓 "ECS 实例 RAM 角色" 的原理. ECS 实例 RAM 角色 https://www.alibabacloud.com/help/zh/doc-detail/54235.htm 是阿里云 RAM 角色的一种, 它让 ECS 实例扮演具有某些权限的角色, 从而赋予实例一定的访问权限. 实例 RAM 角色允许用户通过一个 RAM 角色关联到 ECS 实例, 在实例内部基于 STS(Security Token Service)临时凭证 (临时凭证将周期性更新) 访问其他云产品的 API. 这样, 一方面可以保证 Access Key 安全, 另一方面也可以借助 RAM 实现权限的精细化控制和管理.
ECS 实例 RAM 角色的推出, 主要就是为了解决敏感信息 AK/SK 的存放难题, 这跟 ACM 敏感配置信息存放要解决的 "最后一公路" 问题是一致的. 我们接下来通过 ECS 实例 RAM 角色的使用步骤 https://yq.aliyun.com/articles/336403 来窥探其中原理, 如下图:
如上图, ECS 的实例角色在使用时, 分为 5 个步骤.
1. 云账号 (root) 在 RAM 中创建一个 ECS 实例型的 RAM-Role, 并对角色授予合适的 Policy 权限
2. 启动 ECS 实例时, 可以配置使用上一步骤中创建的 RAM-Role
(注: 以上两步的具体操作请参考通过控制台使用实例型 RAM 角色 或 通过 API 使用实例型 RAM 角色)
通过以上两个步骤后, ECS 服务在创建实例时:
根据所配置的 RAM 角色, 调用 AssumeRole 去访问 STS 请求获取该角色的 STS Token;
STS 服务会验证 ECS 服务身份及该角色的授权类型, 验证通过后颁发 STS Token, 否则拒绝请求.
获取到 STS Token 后, ECS 将通过 Metadata 服务提供给实例中的应用程序访问(HTTP 访问地址: 100.100.100.200 ).
STS Token 过期时间通常为 6 小时, 在过期之前 ECS 服务会自动维护 STS Token 的刷新.
3. 应用程序获取 STS Token
ECS 实例中的应用程序需要通过访问 ECS Metadata 服务来获取相应的 STS Token. 比如, 在 Linux 中执行命令:
$ curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ <roleName>
即可获取 STS Token 及过期时间等元数据信息.
4. 使用 STS Token 调用云服务 API
这是关键的一步. 如果用户的应用程序使用了阿里云 SDK, 且阿里云 SDK 已经支持从 ECS Metadata 服务中获取实例 RAM 角色的 STS Token, 那么开发者无需在 SDK 中配置任何 AK 相关敏感信息. 详细使用方法, 请参考阿里云 SDK 支持 InstanceProfileCredentialsProvider.
5. STS Token 在有效期内及权限范围内都能正常访问云服务 API
如果 STS Token 过期, 那么需要从 ECS Metadata 服务中重新获取 STS Token; 如果 STS Token 权限不足, 那么需要找管理员给实例 RAM 角色添加足够的权限. 实例 RAM 角色的权限更新后, STS Token 权限立即生效, 用户无需重新启动 ECS 实例.
ACM 支持 "ECS 实例 RAM 角色" 的方法和使用场景
ACM 支持 "ECS 实例 RAM 角色" 的方法和上诉架构的原理相同. 用户在使用该方案时, 需要先操作 "步骤 1 - 在 RAM 中创建一个 ECS 实例型的 RAM-Role", 和 "步骤 2 - 启动 ECS 实例时, 可以配置使用上一步骤中创建的 RAM-Role". 作为阿里云 SDK 的一部分, ACM SDK 本身默认帮助用户完成 3,4,5 三个步骤, 用户只需要通过调用 ACM SDK 专注业务敏感配置获取即可.
为进一步理解以上所属原理, 我们设想一个场景, 用户需要通过一个数据库连接串 (含密码) 访问某数据库. 在常规场景下, 用户需要在配置文件中设置这些敏感信息, 并将配置发布到生产环境. 而在使用 ACM 以后, 用户将不再需要存放任何敏感信息在应用程序中; 取而代之的, 程序员在连接相关服务时只需要完成两部分工作,
基于 ACM SDK 获取业务的敏感配置信息, 如数据库连接串, 等.
基于获取的敏感配置信息去调用对应的服务.
注: 以上两个步骤不需要应用程序设置任何 AK/SK 信息.
用户使用 ACM SDK 基于 "ECS 实例 RAM 角色" 获取配置的方法和场景如下图所示.
如图所示, 对于第二步 ACM SDK 去 ACM 服务获取配置的关键步骤中, ACM SDK 将默认基于 ECS MetaService 中 "ECS 实例 RAM 角色" 的 STS Token 临时认证信息向 ACM 服务进行认证, 而不需要任何外部的 AK,SK 的输入, 从而绕开了用户手动输入 AK, SK 的要求.
如图上所描述, 该方法的适用场景包括任何携带敏感信息的数据服连接串, 服务器临时登录信息, 第三方软件的 license 信息, 等.
总结
以上文章概述了如何利用 ACM 来存取程序的敏感信息. 通过这种做法, 在安全方面应用将得到以下优点:
通过将敏感配置信息从程序中剥离并在 ACM 中保存, 使得在开发和生产环境中最大程度保证了敏感信息不会被泄露.
同时, 应用通过 "ECS 实例 RAM 角色" 的临时认证信息访问 ACM, 在生产环境中不持久化任何永久性 AK/SK 信息, 杜绝了永久性 AK/SK 泄露带来的安全性问题.
在接下来章节中, 我们将提供一个代码实例来进一步讲解如何使用 ACM 来存放敏感配置, 敬请期待.
来源: http://www.bubuko.com/infodetail-2631419.html