从薪火相传的密钥文件到“密码即服务”

一个可运行的软件项目一般包括两个要素:代码和密钥。咱们一般会使用无版本控制的FTP有版本控制的SVN、git等成熟的工具进行代码管理;而在我参加的大大小小、许许多多的项目中,密钥管理彷佛缺少成熟或标准的实践。本文将历数一下笔者在各个使用过的密钥管理实践并分析他们的优缺点。最后给你们推荐一款密钥管理工具:vault。git

在软件项目开发中,密钥经常应用于下面四个场景:github

  • 本地开发:一般包括开发环境的数据库密码、用于访问第三方API的token、一些私有程序包仓库的凭证等。
  • CICD流水线:好比Push Docker镜像的Docker仓库的访问凭证、用于部署的云服务凭证(AWS Secret等)、用于访问K8S集群的token等
  • 运行线上服务:线上服务启动所需的数据库密码、API Token等等,同时可能须要管理用于多套环境的不一样密钥。
  • 线上运维:线上发生事故时,须要在本地登入堡垒机(跳板机)的SSH Key或集群的访问凭证。

本地开发:“薪火相传”的密钥文件

当咱们加入一个团队时,一般会有一个Readme文档告诉你项目代码库的下载连接。除此以外它会告诉你须要向团队“前辈”索要密钥文件,否则你的代码是不能在本地启动的。同时有人告诉你,这个密钥文件千万不要加入到git仓库中。docker

这种“薪火相传”的密钥管理方式,是最原始也是最多见的方式。它经常会伴随这样几个问题:数据库

  • 密钥更换或者引入新的密钥后,团队其它成员由于没有获得最新的密钥文件,致使服务在本地起不来。

好比你会听到这样的对话:安全

  • A: “我拉了一下最近的代码,怎么就跑不起来了?”
  • 坐在旁边的B忽然想起了什么:“好吧,我想起来了!我改了一下数据库密码,忘记告诉你了,我把最新的密钥发给你。”或者“我新加了一个功能由于使用API-KEY要访问消息队列,我在本身本地的环境变量里面加上了这个KEY,忘记告诉大家了”
  • 随后B把最新的密钥文件传给了A。几天后,同在项目的C也遇到了一样的问题……
  • 误提交到代码仓库问题:

相信已经不止一次地听人提醒:千万不要将密钥文件明文提交到git。可是密钥泄露在代码仓库的问题依旧时有发生。markdown

本地开发:将密钥加密后存放在Git仓库

密钥和代码同样,在团队项目中一样须要进行共享、同步。密钥放在git仓库中原本是能够解决团队协做问题的,只不是不能被明文存储。那么,若是是将密钥加密后再提交到git仓库呢?架构

git-crypt即是这样一款可将git仓库中的密钥文件进行透明加密和解密的工具。它能够将密钥文件在push时加密,在pull下来后解密。更多介绍和使用说明能够参考:github.com/AGWA/git-cr…运维

借助git版本控制工具,它能够实现:微服务

  • 使用git进行密码共享
  • 密钥的版本控制
  • 用户权限管理

问题:工具

  • 密码可能在多个服务中使用,怎么同步?

持续集成流水线中的密钥管理

持续集成与持续部署(CI/CD)

在如今的Web项目的CI/CD流程中,一般会将项目代码通过构建打包生成docker镜像(制品);在部署阶段,不一样环境会采用相同的docker镜像,可是会使用不一样的环境变量(好比集群、域名、数据库地址密码等)传入到docker的运行时,从而完成在不一样环境的部署。

环境(变量)在不一样的CI/CD中有不一样形式,好比的Jenkins的Credential、GoCD的Environment、CircleCI的Context。

若是将全部的部署与运行时所须要的密钥数据都保存到pipeline上,会致使下面的问题

  • 过多的密码字段,将密码做为环境变量一个个传递到服务十分复杂
  • pipeline存环境变量通常加密后难以解密,若是你设置完本身都忘记了,那这个环境就完全忘了

解决的办法通常是在pipeline上保存尽可能少的密钥字段,咱们经过一次认证就能够具有获取全部密钥数据的权限。

密码即服务:Hashicorp Vault

在云和基础设施自动化时代,咱们应该知道一家名为Hashcorp的公司,其表明做有知名的terraform、consul、packer、vagrant。vault也是这家公司的产品之一,它经过API将密码以服务的方式暴露出去。它能够提供:

  • 中心化的密码服务
  • 更安全的加密存储
  • 密码的服务化
  • 丰富的第三方集成:实现认证的扩展、多平台密钥管理

Vault架构

服务化后的vault能够作到

  • 与Github身份认证集成,好比你能够作到只容许在特定git organization下的用户才能获取密钥
  • 签发临时的SSH证书:好比你只容许一个30分钟内有效的SSH KEY来登陆堡垒机
  • 生成临时的AWS KEY:好比你只能用一个30分钟内有效的AWS凭证
  • 按期更换数据库密码,由于数据库长期不更换会加大泄露的风险
  • OTP:基于时间的临时密码
  • 密码权限策略:只容许特定的微服务读取或者写入指定的密钥
  • 密码的revoke(同事下项目了怎么办?)

最佳实践

  • 不在本地持久化存储密钥
  • 密钥是有时效,按期轮换
  • 密钥获取者是有身份的
相关文章
相关标签/搜索