防拖库的最佳实践

2018-10-12  本文已影响309人  承诺一时的华丽

“拖库”,就是数据库被黑客整个拖下来。脸红的说,这个事射手也遇到过。

我信奉不能被同样的招数打败两次。所以最近再做项目时,我又仔细研究了一下,如何防止开发人员把数据库密码写在代码中,以免数据被拖库的方案。

先分析华住的拖库事件,这类安全风险背后的关键因素主要来自:

与上述因素相对应的,在传统开发模式下,产生的安全渗透点就会很多:

在这种传统的开发模式下,唯一的技术性安全措施,只能是通过数据仓库私有化,来保护代码和代码中的密码秘钥。

但是,墨菲定律说,如果一件事有可能会发生,就一定会发生。我们很难保证在每台个人开发设备上都留存了副本的分布式代码仓库永远不会被泄露。所以,将数据库等密码写在代码中,是不可取且安全风险极大的。


近代的开发模式,会通过配置文件保存数据库密码到配置文件,再利用 .gitignore 将配置文件排除在代码仓库之外,避免开发人员将含有密码的配置文件提交到代码仓库。

但是,这种模式也有它的问题:

而且,现代开发方法中倡导CI/CD(持续集成/持续部署),也会带来一些不尽方便的地方:

开发流程中的秘钥安全管理就此崩塌。


还有一种方案,是使用环境变量来存储秘钥的。这种管理方法,因为敏感密码不以文件形式存在,所以安全性略好。但是这也有问题:


况且,现在的大型项目,不光是数据库密码,还有 OSS/S3 秘钥,各种 API 凭据 Token,TLS证书、公钥、私钥等等。对于传统项目的安全管理挑战非常大。

那么,现在已经2018年了,什么才是开发流程安全的最佳实践? 正好最近借重写射手 API 服务端的机会,对一些新方案仔细调研了一番。

先说结论:现代开发项目应该启用某种专业化的秘钥管理系统(secret management solution),包括 AWS 的 KMS,谷歌的Cloud KMS,HashiCorp 的 Vault,K8S 的 Secret,swarm 的 secret 等等都可以。不过在这些选择中,我个人目前会更推荐使用 HashiCorp 的 Vault

vault-logo.png

秘钥管理服务和 Vault 的优点:

使用秘钥管理方案,为开发带来一个极大的好处。就是项目代码中就只剩一个 Token 是安全敏感的,只要内部开发人员不是怀有恶意的话,是不会接触到密码或秘钥等敏感信息。而这一个 Token 又是可以定时过期和更换的。这样即使 Token 被泄露,也可以做到让黑客没有足够的时间拖库。

转载:https://www.sagittarius.ai/blog/2018/9/3/hashicorp-vault

上一篇 下一篇

猜你喜欢

热点阅读