Secure your Secrets in DevOps w
ith Hashicorp Vault
DevOps 工程师的安全神经
身为DevOps 工程师的你是否遭遇过这样的尴尬,独立开发的创新试验品需要上传GitHub来托管,其中某properties 文件却着实记录着公司的测试数据库的种种连接信息。那么就单独把这个文件配置到不可上传的列表里吧(但愿每次都能记得)。这样,我就是一个对安全尽责的DevOps工程师了吗?想想看,这个文件将一直保存在我的电脑本地,而这台加过密、随身携带的电脑,就满足了我对数据安全最苛刻的需求了吗。这些数据真的应该安心地躺在本地的文件夹里吗?除了我本人有没有其他人也无必要地保存了副本?失去了托管,我要如何方便地查看、管控、更新这些数据?如果答案是肯定的,那么首先,为你鼓掌,为了一位有着安全意识的DevOps工程师。至于上述这些困扰着你神经的安全问题,Hashicorp Vault也许完全可以替你照顾。
What is Hashicorp Vault
开发者对Vault的定位是一款管理秘密的工具(A Tool for Managing Secrets)。其中管理包含加密、存储、访问控制等功能,秘密则几乎包含了任何形式的令牌、密码、证书、API密钥等等。此外,作为一款安全工具,Vault提供非常实用的功能,比如管理租用,密钥失效、滚动租期和审计。通过一个统一的接口,用户可以访问加密的 Key/Value 存储器,接入加解密服务,生成AWS平台、SQL或非SQL数据库的秘密信息、X.509证书等等。其中最核心和精致的功能,就是解决开头提到的秘密信息的存储和控制访问。
Vault的读写与加密存储
下载安装了Vault后(官网提供详细教程),首先需要在本地创建一个vault sever实例:
声明并初始化这个vault server,在不配置任何初始化参数的情况下,vault server将默认生成五个开启密钥,任意三个组合可用于今后开启这个vault server。此番设计可应用于如下场景,五个密钥分别由五位管理员保管,其中任意三人的权限相加,便达到开启vault server的阈值。当然,很多情况下,我们对于vault的应用不需要如此严格的计算,所以vault也允许通过配置init命令的参数生成任意数目的开启密钥,和开启所需的阈值。
初始化vault server的过程中,除密钥之外,我们注意到,同时产生了另外一个秘密信息,Initial Root Token。这个令牌可用于vault server的最高权限用户的登录,也可以用于创建新的用户令牌,从而实现系统的多用户访问。Root用户需要输入持有的Initial Root Token进行登录:
作为Root用户,此刻我们终于有了读写Vault backend storage的权限,这个独立的storage任何时刻都将只存储加密后的数据,而不会存储解密所需的密钥。即使被攻击者获取也无法解密。
为了了解当前vault server具备的功能,可以使用list命令查看vault server的全部路径和引擎:
可以看到的secrets engine(用于管理秘密信息的引擎)的列表中,kv引擎专门用于存储 Key/Value 对。这个引擎当前存在于vault server的secret/ 路径下。因此,我们将可以在secret/路径下创建任意子路径,并存入需要加密的 K/V对:
在secret/路径下创建properties子路径,写入两组值usr,pswd,由于图示中是第三次改写该路径,所以记录version为 3。需要注意的是,put命令每一次将内容写入一个路径会擦除原有的存储内容,如只需添加新的内容,可以使用patch命令替代put。
接下来,试试读取secret/properties路径下的内容:
#p#分页标题#e#
可以看到刚刚创建的两条内容usr和pswd。由于中文输入法的引号被当作字符而非符号,pswd的值带上了引号,也由此可见输入value时英文的引号可以省略。
更实用的操作是,Hashicorp Vault提供http 接口实现上述读写动作。Hashicorp 为Go、Ruby提供了官方的开发库。也认可了很多其它语言可使用的第三方库,如Bettercloud为Java提供的vault-java-driver。
更多语言选择可以参考:
https://www.vaultproject.io/api/libraries.html
到这里我们读写vault server的操作就完成了,这个操作如vault的大部分功能一样,可以通过http 请求实现。有时也将如我们所演示的,登录、开启vault服务器直接进行读写,当更新数据完成后,相应之前的开启命令,需要关闭并封锁vault服务器:
此时不需要任何管理员权限,只需要输入seal命令即可完成安全封锁vault服务器的动作。此后vault将等待下一次管理员们合力或独力开启:
上图演示的是单一密钥开启vault服务器的操作。
至此,我们了解了初始化->登录->读写->封印 vault服务器的happy path。然而Vault的功能绝不限于此,对于多用户细分到路径的访问控制,密钥的发放和回收,多种格式秘密信息的保管都是Hashicorp Vault的亮点。
希望通过本文分享它的一个实用的功能,能为身为DevOps工程师的你解决一点日常的安全思虑。如有更多兴趣的,Hashicorp Vault也在官网详细地展示了更多强大的功能,希望能对你的日常工作有所助益,为安全设计带来些许灵感。