一个可运行的软件项目一般包括两个要素:代码和密钥。咱们一般会使用无版本控制的FTP和有版本控制的SVN、git等成熟的工具进行代码管理;而在我参加的大大小小、许许多多的项目中,密钥管理彷佛缺少成熟或标准的实践。本文将历数一下笔者在各个使用过的密钥管理实践并分析他们的优缺点。最后给你们推荐一款密钥管理工具:vault。git
在软件项目开发中,密钥经常应用于下面四个场景:github
当咱们加入一个团队时,一般会有一个Readme文档告诉你项目代码库的下载连接。除此以外它会告诉你须要向团队“前辈”索要密钥文件,否则你的代码是不能在本地启动的。同时有人告诉你,这个密钥文件千万不要加入到git仓库中。docker
这种“薪火相传”的密钥管理方式,是最原始也是最多见的方式。它经常会伴随这样几个问题:数据库
好比你会听到这样的对话:安全
- A: “我拉了一下最近的代码,怎么就跑不起来了?”
- 坐在旁边的B忽然想起了什么:“好吧,我想起来了!我改了一下数据库密码,忘记告诉你了,我把最新的密钥发给你。”或者“我新加了一个功能由于使用API-KEY要访问消息队列,我在本身本地的环境变量里面加上了这个KEY,忘记告诉大家了”
- 随后B把最新的密钥文件传给了A。几天后,同在项目的C也遇到了一样的问题……
相信已经不止一次地听人提醒:千万不要将密钥文件明文提交到git。可是密钥泄露在代码仓库的问题依旧时有发生。markdown
密钥和代码同样,在团队项目中一样须要进行共享、同步。密钥放在git仓库中原本是能够解决团队协做问题的,只不是不能被明文存储。那么,若是是将密钥加密后再提交到git仓库呢?架构
git-crypt即是这样一款可将git仓库中的密钥文件进行透明加密和解密的工具。它能够将密钥文件在push时加密,在pull下来后解密。更多介绍和使用说明能够参考:github.com/AGWA/git-cr…运维
借助git版本控制工具,它能够实现:微服务
问题:工具
在如今的Web项目的CI/CD流程中,一般会将项目代码通过构建打包生成docker镜像(制品);在部署阶段,不一样环境会采用相同的docker镜像,可是会使用不一样的环境变量(好比集群、域名、数据库地址密码等)传入到docker的运行时,从而完成在不一样环境的部署。
环境(变量)在不一样的CI/CD中有不一样形式,好比的Jenkins的Credential、GoCD的Environment、CircleCI的Context。
若是将全部的部署与运行时所须要的密钥数据都保存到pipeline上,会致使下面的问题
解决的办法通常是在pipeline上保存尽可能少的密钥字段,咱们经过一次认证就能够具有获取全部密钥数据的权限。
在云和基础设施自动化时代,咱们应该知道一家名为Hashcorp的公司,其表明做有知名的terraform、consul、packer、vagrant。vault也是这家公司的产品之一,它经过API将密码以服务的方式暴露出去。它能够提供:
服务化后的vault能够作到