开放平台小助手 2020-01-09 1026浏览量
作者丨向荣(荣涵)
阿里云开放平台高级技术专家,主要负责阿里云OpenAPI访问密钥(AccessKey),专注于给阿里云用户提供高效,安全的访问密钥,身份验证服务。
访问控制是阿里云提供的一项管理用户身份与资源访问权限的服务。使用RAM,您可以创建、管理RAM用户(例如员工、系统或应用程序),并可以控制这些RAM用户对资源的操作权限。当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低企业信息安全风险。
阿里云临时安全令牌(Security Token Service,STS)是阿里云提供的一种临时访问权限管理服务。
就像登陆阿里云网站需要输入账号和密码一样,我们访问阿里云产品或者服务提供的OpenAPI时,也需要这样的密钥体系,这就是OpenAPI的访问密钥:AccessKey(AccessKey ID和AccessKey Secret)。所以,类似登陆的账号和密码泄露的安全问题,OpenAPI的访问密钥同样存在泄露的风险,本文介绍了一种不直接使用OpenAPI的访问密钥的身份认证方式,可以有效避免因为访问密钥的代码中硬编码或者存储到配置文件而引入的泄露风险。
访问密钥是一个基本的2元组AccessKey(AccessKey ID和AccessKey Secret),AccessKey ID其实是做为一个索引来映射真实的密钥,AccessKey会在客户端和服务端共享,客户端使用AccessKey ID对应的密钥对请求的某些信息进行签名,然后把AccessKey ID和签名,以及相关信息都发给服务端,服务端做同样的事情,然后比对签名结果来标识身份认证合法与否。
接下来我们看看一般OpenAPI的访问时身份认证的工作过程。
大致流程如下:
在介绍访问密钥时,我们需要了解访问密钥的类型和使用场景,然后看使用场景中的泄露风险。对于阿里云用户来说,我们先说一下阿里云提供的两种身份。
• RAM用户不拥有资源,没有独立的计量计费,这些用户由所属云账号统一控制和付费。
• RAM用户归属于云账号,只能在所属云账号的空间下可见,而不是独立的云账号。
• RAM用户必须在获得云账号的授权后才能登录控制台或使用API操作云账号下的资源。
从阿里云提供两种身份描述和定义,我们可以看到他们具有相同的身份特性:
对于阿里云实体身份的访问密钥,如下泄露风险是显而易见的:
针对访问密钥的泄露高风险,我们有没有一些方案既能克服“最后一把密钥”的风险,又能很方便的进行可控的身份认证呢?很自然,我们会想出来的第一个方案:既然长期的访问密钥权限大,我们能不能换一种短期且权限可控的访问密钥呢,这就要介绍阿里云的另外一种身份类型和与之相对应的访问密钥。
RAM角色(RAM role)与RAM用户一样,都是RAM身份类型的一种,只不过RAM角色是一种虚拟用户,没有确定的身份认证密钥,需要被一个受信的实体用户扮演才能正常使用。简单说,可信实体扮演RAM角色,并使用角色令牌去访问RAM角色里规定的资源以及资源上的OpenAPI。
• RAM角色:RAM角色有确定的身份,可以被赋予一组权限策略,但没有确定的登录密码或访问密钥。RAM角色需要被一个受信的实体用户扮演,扮演成功后实体用户将获得RAM角色的安全令牌,使用这个安全令牌就能以角色身份访问被授权的资源。
• 可信实体(Trusted entity):角色的可信实体是指可以扮演角色的实体用户身份。创建角色时必须指定可信实体,角色只能被受信的实体扮演。可信实体可以是受信的阿里云账号、受信的阿里云服务或身份提供商。
• 角色令牌(Role token):角色令牌是角色身份的一种临时访问密钥。角色身份没有确定的访问密钥,当一个实体用户要使用角色时,必须通过扮演角色来获取对应的角色令牌,然后使用角色令牌来调用阿里云服务API。
对于虚拟身份类型(角色身份),对应的OpenAPI访问凭证就是上面说的角色令牌,是一种时效和权限可控的临时访问密钥。相对于阿里云实体身份的访问密钥的长效控制机制,STS提供的是一种临时访问授权。通过STS可以返回临时的访问密钥和令牌,这些信息可以直接发给临时用户用来访问阿里云服务。一般来说,从STS获取的权限会受到更加严格的限制,并且拥有时间限制,因此这些信息泄露之后对于系统的影响也很小。
阿里云用户在RAM中,定义一个角色,并授权了可以扮演此角色的可信实体,比如某主账户下的子用户账号A,然后授权账户可以访问RAM的接口获取临时访问密钥。账户A的访问流程就如下描述了。所以结合了STS访问密钥的方案一如下描述。
无密钥访问方案-基础方案里,我们把权限较大的长期访问密钥,替换成了STS临时访问密钥,由于STS在时间等属性上有限制,这样可以把原来泄露长期访问密钥带来的风险降低到短时间都维度,做到了一定程度的安全风险减小,但细心的同学还会发现,要获取一个STS临时访问密钥,还是需要云账户或者其RAM子用户的长期访问密钥,也还是没有解决“最后一把密钥”的问题。
既然阿里云RAM提供了角色功能,并能把这个角色授权给实体,这个是实体是账户或者服务,那可不可以把这个角色和某些特定实体关联呢,比如某个IP,某个区域或者环境等。这种环境可以映射到什么实体呢?我们看现阶段客户的应用绝大部分会运行在机器,docker容器或者某个运行环境(Serverless)里,在这个特定的范围里,比如某个机上,是否可以实现免输入长期访问密钥而调用RAM的OpenAPI获取STS临时访问密钥呢。我们接下来引入阿里云ECS的一个特殊角色来举例。
ECS实例RAM(Resource Access Management)角色让ECS实例扮演具有某些权限的角色,从而赋予实例一定的访问权限。实例RAM角色允许用户将一个角色关联到ECS实例,在实例内部基于STS临时凭证(临时凭证将周期性更新)访问其他云产品的API。一方面可以保证AccessKey安全,另一方面也可以借助RAM实现权限的精细化控制和管理。关于角色的详细描述,请参见角色。
首先,我们定一个特殊的角色,这个角色就是ECS实例角色,然后把这个角色授予这个特定的ECS实例,在这个实例里的应用可以通过如下流程进行完整的阿里云OpenAPI访问。
具体的配置和使用请参见实例RAM角色
本文提供介绍了阿里云关于去除OpenAPI访问密钥本地存储的安全方案及实现,这种方式既满足了便捷调用OpenAPI的需求,又不需要直接把访问密钥AccessKey固化在实例中,如写在配置文件中,有效的解决了固化访问密钥这种方式权限过高,存在泄露信息和难以维护等问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。