使用KMS自动解封
Hashicorp的Vault提供了一个解决方案来保护、存储和控制对秘密和其他敏感数据的访问。有多种方法可以实现高可用的Vault设置,有些人可能使用Vault服务器集群,还有一些人可能采用主从部署策略。在这篇博客中,我们将选择一种穷人的方法,以最小的配置和资源来实现一个不复杂和小规模的项目的高可用性。
这篇文章假设你对Vault有一个基本的了解,以及如何安装它。要了解更多关于在EC2实例上安装Vault服务器的信息,请参考我们关于Vault的SSH访问管理的博文。
为什么要为HA自动解封?
在我们进入实施细节之前,我们需要回答一个问题,为什么自动解封对于高可用性是必要的?Vault服务器总是在密封状态下启动。Vault存储中的数据总是以加密的形式存储。Vault被配置为知道如何访问物理存储和它的位置,但不知道如何解密其中的任何内容。解封是构建读取解密密钥以解密数据所需的主密钥的过程。如果Vault服务器自行重启或被用户手动重启,它就会回到密封状态,并将不得不手动解封。这可能会导致重大故障,在非工作时间会出现不必要的惊喜。
自动解封是一个过程,解封保险库所需的密钥存储在密钥管理系统中,如AWS KMS,并提供给保险库,以便在意外或强制重启时解封,不需要任何手动中断。
本解决方案中使用的组件:(我们将使用AWS作为云提供商)
- AWS KMS密钥
- 访问AWS KMS密钥所需的AWS IAM策略和角色
- 具有自动恢复功能的EC2服务器(以尽量减少因硬件故障而造成的中断)
- 将在EC2上部署Vault二进制文件
IAM和KMS设置
- 通过创建名为 "IAM "的策略开始实施。
VaultKMSUnsealPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:DescribeKey"],
"Resource": "*"
}
]
}
-
创建一个名为
VaultKMSUnsealRole的IAM角色,并将VaultKMSUnsealPolicy。 -
创建一个启用了自动恢复功能的EC2实例。(要了解更多关于自动恢复的信息,请浏览AWS博客)。
-
现在将
VaultKMSUnsealRole角色附加到EC2实例上。(如果你已经有一个IAM角色附加到你的实例上,跳过第2步,直接将VaultKMSUnsealPolicy附加到现有的角色上) -
进入AWS KMS部分,创建一个新的同步密钥,名为
vault。请注意密钥的ID,因为我们将在下一步使用它。
Vault配置设置
下载并安装Vault二进制文件。
在初始化保险库之前,必须执行以下步骤。一旦初始化,它就已经有了默认提供的5个密钥,然后必须用它来手动解封保险库。
注意。这个步骤必须在 vault operator init 运行之前完成。
修改或创建金库配置/etc/vault.d/vault.hcl以包括以下模块:
seal "awskms" {
region = "${aws_region}"
kms_key_id = "${kms_key}"
}
awskms是Vault用来与AWS KMS通信以获取和更新密钥的模块。aws_region指的是设置AWS KMS密钥的AWS区域kms_key_id是指在IAM和KMS设置部分创建的AWS KMS密钥( )的密钥ID。vault
一旦配置被更新为上述内容,用以下命令初始化保险库:
$ export VAULT_ADDR="http://127.0.0.1:8200"
$ vault operator init >> ~/vault.keys
Initial Root Token: s.######
Unseal Key 1: key1###
Unseal Key 2: key2###
Unseal Key 3: key3###
Unseal Key 4: key4###
Unseal Key 5: key5###
是的,我们做到了!!
我们现在有一个设置了自动解封功能的Vault服务器,部署在一个可自动恢复的EC2实例上。现在,如果你的EC2实例由于硬件故障或人为错误造成的事故而重新启动,Vault服务器将自动在解封状态下启动,并准备好使用,无需任何人工干预。