近日,美国的「大众点评」公司 Yelp 宣布正式开源其密码检测框架,该框架用于防止代码中的密码等相关敏感信息被提交到代码库中,它号称可以在保证安全性的同时不会给开发者的生产力带来任何影响。
GitHub 地址:https://github.com/Yelp/detect-secrets
众所周知,对于一个优秀的程序员来说,他是一定不能把密码或者密钥等敏感信息直接硬编码到程序代码中的,因为这极有可能引起相关的安全问题(也就意味着任何一个代码贡献者都可以获取这些密码,并使用它们访问相关系统)。
对于如何解决这类问题,以往的经验就是规则,每一个新入职或者新入行的程序员都被教育说,『千万不要在代码中泄露密码』,但即使是这样也无法保证不会发生意外,俗话说得好,人或者流程总是不可靠,也不可控的。
简单来说,要系统解决这个问题,除了流程和必要的培训之外,还有其他事情可以做,总结来说,有两个:
- 在代码被提交到代码库时设置 check 机制,如果发现有密码信息立即阻止提交。
- 如果密码被提交代码库中,也可以很快被发现,并在密码泄露之前对其进行修补。
为了不重复发明轮子,Yelp 团队先是花了很多时间调研已有的开源项目,比如 truffleHog、git-rob、git-secrets、Repo Supervisor。但他们发现,这些项目根本无法满足他们的要求。他们希望的解决方案能够:
1. 支持白名单
Yelp 现有的代码库中可能已经包含了密码,不过这不能成为影响服务部署的阻碍。他们要保证在某个时间点之后的代码提交中不包含密码,随后,在部署服务之前检查其中包含的所有密码,然后进行回溯性回滚,并使用更好的存储方式来保存密码。
2. 与软件开发生命周期集成
最佳的解决方案需要与开发人员的工作流程密切配合,因为密码管理是一个持续的过程,不能通过定期审核来强制执行。因此,解决方案的速度要快,不扫描不必要的文件。
3. 与已有的预提交框架兼容
Yelp 开发团队在提交代码之前,使用预提交框架来运行静态代码断言检查。因此,最佳的解决方案需要基于这个框架,并与现有的钩子保持向后兼容性。
4. 轻量级和模块化
方便定制化,并用在大型的生态系统中。
5. 编程语言无关性
该解决方案可以应用在所有的代码库上,不管是什么语言的代码库,而且支持不同的客户端(如 Python、Puppet、JavaScript、PHP、Java 等)。
Yelp 的解决方案使用了客户端预防和服务器端检测的办法,确保密码不会被意外提交到代码库中。客户端和服务器端都通过同一个密码检测引擎,所以当检测引擎发生变更时,两端都可以感知到。
为了防止提交密码,Yelp 使用现有的预提交框架来扫描被提交代码中可能存在的疑似密码的东西。扫描规则已经在检测引擎中配置好了。考虑到可能有人没有安装预提交钩子,所以持续集成管道中也集成了扫描流程。
有些密码可能不在持续集成管道中,并且开发人员也没有安装预提交框架,对于这些情况,Yelp 使用检测引擎定期扫描提交的代码。因为扫描是基于字符串的,所以不需要去解析抽象语法树,在保持语言无关性的同时,速度更快,也更灵活。因此,他们可以更频繁地扫描所有代码库,在不需要使用太多计算能力的情况下加快响应速度。
Yelp 的扫描使用了正则规则,可以检测出如下几种密码:
- API 秘钥
- AWS 秘钥
- OAuth 客户端秘钥
- SSH 私钥
- 其他高熵数字符串(比如使用 Shannon Entropy 计算的字符串)
需要注意的是,这个框架并非万能的解决方案。不过,相比“教育”开发者而言,这个框架可以帮助企业更方便高效地实现密码管理。
转自 http://www.infoq.com/cn/news/2018/06/preventing-secrets-coded-yelp