云中凭据管理的步步进化

2024-08-10 08:01   北京  

聚焦AI与安全,洞察本质,化繁为简

点击上方蓝字,关注本号,持续进步。

有些事情看上去很简单,但解决起来很难,凭据的保存管理就是这种情况。凭据是用于验证用户、设备或应用程序身份的敏感信息,确保只有授权的实体能够访问特定的资源或服务。用得比较多的是密码(Password)和SK(secret key,一种用于应用程序的身份鉴别方法),还有包括证书,Oauth Token,密钥等,都可以归为此类。

人机密码管理

自从需要身份认证,密码就成了必要手段,针对密码的攻击也层出不穷。密码这个东西一直备受诟病,但目前还没有完全的替代方案。

在云里,人机密码的管理,有两个基本手段:

  1. 类似Web类的应用,采用单点登录(SSO)的方法,集中管理用户和权限,在密码的基础上,加上双因素或多因素认证,这个问题基本解决的比较好。

  2. Ssh 密码,这个无法接入统一的SSO系统,目前比较好的解决方案是堡垒机纳管。堡垒机作为一个集中的权限,密码管理系统,对密码的使用范围,使用时间,轮转等,有非常好的机制。

通过以上两个方法,基本能解决密码的问题。

机机凭据管理

真正的麻烦在这里。

程序要连接服务,也需要用到用户名密码,比如数据库。程序有一点和人不一样,它不怕密码复杂,所以后来AWS启用了一种新的验证方法,AK/SK,就是用很长的随机字符串代替用户名密码,这样做的好处是不怕暴力破解,已经被各类API调用广泛使用,但保存的问题仍然存在。

最初有人会把凭据直接写到代码里,这样的话,如果修改一下数据库密码,就得改程序。后来进步了一点,把密码写到一个配置文件里,便于修改,很多开源软件的实现基本就是这样的。但黑客一旦拿到这个配置文件,就拿到了密码和权限,后果大家都知道的。AWS有个服务,他们会扫描Github,如果发现ak/sk并且验证在AWS可用的话,会迅速找到该as/sk的主人,然后夺命连环call,直接修改了为止。

大约2012年前后,华为发布了第一版的安全红线,史称红线1.0,规定凭据必须加密保存,不允许以明文形式出现,包括代码,配置文件,数据库,日志等。一旦定义成红线问题,就必须得彻底解决,八仙过海,各显神通,因为密码这东西没有特征,扫描挺难的,我见过的扫描脚本都有几十种。这事大约折腾了两三年,明文凭据的问题基本解决了。发布的设备,程序不会有明文凭据。

但程序的安装包或镜像里,仍然是有凭据的,虽然它以加密的形式存在。程序在运行的时候,要能使用这个凭据,程序得有解密能力。所以,如果黑客能够拿到安装包,简单的debug,基本就可以密码。还有一个问题就是,研发会知道这个密码,Beta环境也会有这个密码,这个是非常危险的。

华为云在运行了几年后,各种攻击逐步增加,要防患于未然,引入了蓝军(就是攻击队,这个有地方叫Red Team)。蓝军很容易拿到安装包并破解,很快,在安装包里使用密码的方法大家不可接受了。

于是有了第一次的密码升级,安装包里不再预置密码,采用的是方法是在自动化上线的时候,通过流水线将包含现网密码的配置文件注入到软件包中再部署。这样的好处只有极少数人会接触这个密码,非现网环境的密码和现网环境的密码完全隔离,看上去非常好了。

但这个方案仍然是不行的。它有个非常大的问题,就是修改密码非常麻烦。

随着护网,蓝军攻击能力的提升及黑客攻击事件的调查,发现过几次密码失窃的情况。一旦密码失窃,就要迅速更换密码。按现有的方案,密码更换是手工的,有些服务一个region就有几百个节点甚至更多,全球有几十个region,本来的SLA要求24个小时解决(看上去挺慢了),但这些服务依然无法按时完成。

其实即使密码不丢,也需要定期修改,快速轮转才是密码安全的最好手段,系统需要一个自动化的方案。

经过各方多次讨论,形成了一个凭据管理服务的方案,主要框图如下:

  1. 在系统中增加一个凭据管理服务,配置初始化的密码,由凭据管理服务统一保管。

  2. 凭据管理服务会自动轮转密码(就是用旧密码去服务端换一个新密码,然后旧密码失效),这样保证密码的有效期只有一个小时(其实也可以更短),黑客即使拿到,也只有很短的时间可用。所有的系统管理员也不知道密码是什么,杜绝人为风险。凭据管理服务里的密码都是做了很多的加密等保护手段。

  3. 客户端在连接服务端的时候,先去凭据管理服务申请一个密码,使用完即丢弃,不落盘。这样,即使客户端被攻破,密码也基本不会丢。客户端的开发也容易,只要使用一个统一的SDK就可以。

细心的人也能看出来一个问题,就是凭据管理服务和客户端之间又多了一次鉴权,这个仍然需要一些特殊凭据,仍然有丢失的可能。实际上,这块做了很多设计,来保护这个问题,不能保证绝对安全,但攻击的难度绝对很大。具体方案属保密信息,不再讨论。

做到这个程度,凭据的问题算基本解决了。

扩展看看

也曾经讨论过,ak/sk也好,密码也好,就是一种应用的身份识别手段,有没有更好的方法,不用凭据行不行?

有一种方法是使用对机器授权的方法,但只有在部分场景下可用,详见如何安全地使用公有云2--IAM,身份认证与访问管理

目前看还没找到完善的解决方案。全球都没找到。所以自动化轮转仍然是最主流的方案。

这个方案不算新,有专门的一类软件,就叫Credentials Management System(凭据管理系统),商业化的此类软件卖得都比较贵。也有开源的,HashiCorp Vault就是一个典型。但对超大规模的支持不够理想,你可以用,但还是要改造的。

AWS首先提供了相关功能,叫Secrets Manager。后来各个云也都开始提供对外提供凭据管理服务了。

如果你的凭据还没有使用凭据管理服务或自己实现相似的功能,建议尽快切吧,否则数不尽的麻烦。

后记

在做ASPM调查的时候,发现他们很多开始提供一个功能,叫做Secrets Manager,Secrets是包含凭据的。但我看了几家,基本还集中在研发段,代码,配置文件等的扫描和跟踪,最重要的现网部分都还没看到。也就是红线1.0的自动化水平。
从这个角度,当前ASPM也没想象中那么好。
但看看Descope的方案,重点处理的其实就是这个问题,解决方案也会完整一些。有兴趣可以看看这篇 安全公司,种子轮能融5300万美元?

END


# ONE

关注我,持续有料。

点赞转发,与朋友分享价值信息,也是对我最大的鼓励。

AI与安全
理清逻辑,找到规律,看清趋势。作者前华为云高级安全专家,现为独立顾问。
 最新文章