写点什么

如何防止密码被硬编码到代码中?Yelp 开源了自己的解决方案

2018 年 6 月 14 日

近日,美国的「大众点评」公司 Yelp 宣布正式开源其密码检测框架,该框架用于防止代码中的密码等相关敏感信息被提交到代码库中,它号称可以在保证安全性的同时不会给开发者的生产力带来任何影响。

GitHub 地址: https://github.com/Yelp/detect-secrets

众所周知,对于一个优秀的程序员来说,他是一定不能把密码或者密钥等敏感信息直接硬编码到程序代码中的,因为这极有可能引起相关的安全问题(也就意味着任何一个代码贡献者都可以获取这些密码,并使用它们访问相关系统)。

对于如何解决这类问题,以往的经验就是规则,每一个新入职或者新入行的程序员都被教育说,『千万不要在代码中泄露密码』,但即使是这样也无法保证不会发生意外,俗话说得好,人或者流程总是不可靠,也不可控的。

简单来说,要系统解决这个问题,除了流程和必要的培训之外,还有其他事情可以做,总结来说,有两个:

  1. 在代码被提交到代码库时设置 check 机制,如果发现有密码信息立即阻止提交。
  2. 如果密码被提交代码库中,也可以很快被发现,并在密码泄露之前对其进行修补。

为了不重复发明轮子,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 计算的字符串)

需要注意的是,这个框架并非万能的解决方案。不过,相比“教育”开发者而言,这个框架可以帮助企业更方便高效地实现密码管理。

2018 年 6 月 14 日 09:273775
用户头像

发布了 731 篇内容, 共 361.0 次阅读, 收获喜欢 1832 次。

关注

评论

发布
暂无评论
发现更多内容

前端工程化之创建项目

春生

前端 前端工程 前端架构 全栈工程师

偏头疼告诉我的,我想告诉每一个人

zkback

做好领路人——写给技术新人的导师建议

南方

管理 新人

为什么第三方联调应该先行?

大伟

Python deepcopy一个优化

么么哒

Python

MySQL死锁系列-常见加锁场景分析

程序员历小冰

MySQL

纯CSS“返回顶部”特效

寇云

CSS css3

地铁上看书的老外引发的思考

小天同学

写作 读书 个人感想 日常思考

认识数据产品经理(四 与互联网产品经理的区别)

马踏飞机747

大数据 互联网 产品经理 职业规划

一款开源且具有交互视图界面的实时 Web 日志分析工具!

JackTian

开源 GoAccess 实时 Web 日志分析工具 交互式查看器

《中国互联网简史》系列笔记之P2P

dongh11

读书笔记

只用CSS实现响应式Full-Width img 2种方法

寇云

CSS css3

python实现·十大排序算法之基数排序(Radix Sort)

南风以南

Python 排序算法 基数排序

git | IDEA 中如何压缩提交(压缩commit后再push 图文演示)

YoungZY

开发者工具 IDEA 开发工具

团队与领导力健康检查 | 体检表

Bob Jiang

团队建设

重学 Java 设计模式:实战原型模式

小傅哥

Java 设计模式 小傅哥 复杂代码优化 重构

时序数据库

pydata

写给产品经理的信(5):谈谈项目管理(青铜-王者)

夜来妖

产品 极客时间,项目管理 项目管理 产品经理 项目

自定义构造python白名单__builtins__

么么哒

Python

“新基建”方兴未艾,Smartbi Mining如何为产业数字化转型赋能?

infoq小陈

不懂送女朋友什么牌子的口红?没关系!Python 数据分析告诉你。

JackTian

Python 程序员 数据分析 python 爬虫 口红

解决版权难题,“豪横”字体自己做

zhoo299

设计 CG

Eureka 实例注册状态保持 STARTING 的问题排查

张晓辉

spring Spring Cloud netflix

如何通过样本数据推断其分布

张利东

Python

自定义列表样式

寇云

CSS css3

机器学习项目是如何开发和部署的?

陆道峰

人工智能 学习

HTML中实现合并单元格

JDoe

html

最香远程开发解决方案!手把手教你配置VS Code远程开发工具,工作效率提升N倍

柠檬橙

Linux 后台开发 vscode 后端

为什么要学习 Markdown?究竟有什么用?

JackTian

markdown markdown语法 markdown编辑器

互联网省份数据大揭秘,看看哪些地方是互联网的戈壁滩?

非著名程序员

程序员 互联网 IT

GitHub 上十个好用的软件

彭宏豪95

GitHub 效率 工具

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

如何防止密码被硬编码到代码中?Yelp开源了自己的解决方案-InfoQ