Vault是一个开源工具,提供安全,可靠的方式来存储分发API密钥,访问令牌和密码等加密信息。在部署需要使用加密或敏感数据的应用程序时,您就应该试试Vault。
在本教程中,您将学会:
通过一些策略,您将能够使用Vault安全地管理各种应用程序和敏感数据。
在开始本教程之前,您需要以下内容:
- **如果你有域名**,保护你网站的最简单方法是使用[腾讯云SSL证书服务](https://cloud.tencent.com/product/ssl),它提供免费的可信证书。[腾讯云SSL证书安装操作教程](https://cloud.tencent.com/document/product/400/6814)进行设置。
- **如果你没有域名**,建议您先去这里[注册一个域名](https://dnspod.cloud.tencent.com/),如果你只是使用此配置进行测试或个人使用,则可以使用自签名证书,不需要购买域名。自签名证书提供了相同类型的加密,但没有域名验证公告。关于自签名证书,你可以参考为[Apache创建自签名SSL证书](https://cloud.tencent.com/developer/article/1165840)和[如何为Nginx创建自签名SSL证书](https://cloud.tencent.com/developer/article/1160294)这两篇文章。
HashiCorp提供Vault单个二进制文件,因此我们将手动下载并安装Vault的可执行文件。
首先,下载64位Linux版的压缩Vault zip存档。您可以在Vault的下载页面上找到指向最新版本(撰写本文时为0.9.5)的链接。
wget https://releases.hashicorp.com/vault/0.9.5/vault_0.9.5_linux_amd64.zip
然后下载此文件的校验值,以便您可以验证下载。
wget https://releases.hashicorp.com/vault/0.9.5/vault_0.9.5_SHA256SUMS
接下来,验证zip存档完整性。这是为了确认zip存档的内容与Hashicorp在Vault 0.9.5版中发布的内容相匹配。
grep linux_amd64 vault_*_SHA256SUMS | sha256sum -c -
SHA256SUMS
文件中的每一行都有一个校验值和一个文件名,HashiCorp提供的一个zip存档。grep
命令的一部分打印带有64位Linux二进制文件的校验和和文件名,然后用pipes(|
)换行到下一个命令。SHA-256 -c
命令检查具有该行文件名的文件是否与该行的校验和匹配。
运行该命令应指示存档OK
。如果没有,请尝试重新下载该文件。
vault_0.9.5_linux_amd64.zip: OK
校验和验证完成后,安装unzip
命令以便解压缩存档。确保您的软件包存储库是最新的。
sudo apt-get update
sudo apt-get install unzip
然后将Vault二进制文件解压缩到工作目录中。
unzip vault_*.zip
Archive: vault_0.9.5_linux_amd64.zip
inflating: vault
将Vault可执行文件移动到系统中的PATH
目录中,以便可以从shell访问它。
sudo cp vault /usr/local/bin/
最后,在二进制文件上设置Linux标志。通过让二进制文件执行内存锁定而免除不必要的提权操作,这增加了额外的安全性。
sudo setcap cap_ipc_lock=+ep /usr/local/bin/vault
您现在可以使用vault命令。尝试检查Vault的版本以确保其有效。
vault --version
Vault v0.7.2 ('d28dd5a018294562dbc9a18c95554d52b5d12390')
Vault可执行文件安装在您的服务器上,因此下一步是将其配置为作为系统服务运行。
Systemd是Ubuntu的初始化系统。要将Vault设置为系统服务,我们需要设置以下内容:
systemd
配置文件。注意:在本教程中,我们的文件系统后端将加密的加密文件存储在本地文件系统
/var/lib/vault
中。这适用于不需要复制的本地或单服务器部署。
首先,创建一个Vault系统用户。
sudo useradd -r -d /var/lib/vault -s /bin/nologin vault
在这里,我们使用/var/lib/vault
做主目录。这将会是Vault数据目录。我们还将shell设置为/bin/nologin
将用户限制为非交互式系统帐户。
设置/var/lib/vault
所有权为vault用户和vault组。
sudo install -o vault -g vault -m 750 -d /var/lib/vault
现在让我们设置Vault的配置文件/etc/vault.hcl
。您将使用它来控制Vault中的各种选项,例如存储加密文件的位置。
sudo nano /etc/vault.hcl
将以下内容粘贴到文件中,并确保替换为您自己的域名:
backend "file" {
path = "/var/lib/vault"
}
listener "tcp" {
tls_disable = 0
tls_cert_file = "/etc/Tencent_Cloud_SSL/live/example.com/fullchain.pem"
tls_key_file = "/etc/Tencent_Cloud_SSL/live/example.com/privkey.pem"
}
此配置文件写到Vault在/var/lib/vault
磁盘上存储加密的文件,并配置Vault应使用从腾讯云教程生成的证书通过HTTPS侦听连接。
保存并关闭该文件,然后仅允许Vault用户读取它来保护Vault配置文件的权限。
sudo chown vault:vault /etc/vault.hcl
sudo chmod 640 /etc/vault.hcl
接下来,让Systemd管理进程,在/etc/systemd/system/vault.service
创建一个配置文件。
sudo nano /etc/systemd/system/vault.service
将以下内容复制并粘贴到文件中。这允许Vault作为系统服务程序在后台运行。
[Unit]
Description=a tool for managing secrets
Documentation=https://vaultproject.io/docs/
After=network.target
ConditionFileNotEmpty=/etc/vault.hcl
[Service]
User=vault
Group=vault
ExecStart=/usr/local/bin/vault server -config=/etc/vault.hcl
ExecReload=/usr/local/bin/kill --signal HUP $MAINPID
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK
Capabilities=CAP_IPC_LOCK+ep
SecureBits=keep-caps
NoNewPrivileges=yes
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target
服务配置选项很多,但上面定义中要注意的最重要的配置选项包括:
ConditionFileNotEmpty
,确保/etc/vault.hcl
配置文件存在。User
和Group
,它控制Vault运行的用户权限。ExecStart
,它指向我们之前安装的可执行文件,并定义了开始运行该服务的内容。ExecReload
,当Vault重新加载其配置文件时调用,例如,在运行systemctl reload vault
时。[Install]
,它允许我们在启动时运行此服务,因此我们不需要在重新启动后手动启动它。最后,Vault需要获得读取您使用腾讯云创建的证书的权限。默认情况下,这些证书和私钥只能由root访问。为了安全地使用这些文件,我们将创建一个名为pki的特殊组来访问这些文件。我们将创建组,然后将Vault用户添加到其中。
保存并关闭该文件,然后创建pki组。
sudo groupadd pki
更新目录中两个目录的权限,以允许pki组读取/etc/Tencent_Cloud_SSL
上的内容。
sudo chgrp pki /etc/letsencrypt/{archive,live}
sudo chmod g+rx /etc/letsencrypt/{archive,live}
然后将vault用户添加到pki组。这将授予Vault对证书的访问权限,以便它可以通过HTTPS安全地处理请求。
sudo gpasswd -a vault pki
为方便起见,最后一步是在/etc/hosts
添加规则以将请求定向到Vault localhost。
默认情况下,Vault将仅侦听127.0.0.1的请求。这是为了确保服务在正确保护之前不会暴露给公共互联网。您可以稍后更新,但目前,此配置更改将允许我们使用vault命令并正确解析HTTPS安全域名。
将example.com
替换为您获取腾讯云加密证书时的域名:
echo 127.0.0.1 example.com | sudo tee -a /etc/hosts
这会将127.0.0.1 example.com
增加到/etc/hosts
以便将任何example.com
的HTTP请求路由到localhost
。
通过设置Vault可执行文件,编写服务文件以及完成Vault配置文件,我们现在可以启动Vault并初始化加密文件存储。
首次启动Vault时,它将是未初始化的,这意味着它尚未准备好获取和存储数据。实际存储加密加密的后端也是未初始化的。启动Vault系统服务以初始化后端并开始运行Vault。
sudo systemctl start vault
您可以运行快速检查以确认服务已成功启动。
sudo systemctl status vault
该命令的输出应包括有关正在运行的服务的若干信息,例如其进程ID和资源使用情况。确保输出中包含以下行,表示服务正在正确运行。
. . .
Active: active (running)
. . .
如果服务未处于活动状态,请查看命令输出末尾的相应日志行以查看Vault的输出,这有助于检查问题。
接下来,我们将设置一个环境变量来告诉vault
命令如何连接到Vault服务器。此处,Vault已配置为仅侦听本地回送接口,因此将VAULT_ADDR
环境变量设置为本地HTTPS端点。
export VAULT_ADDR=https://example.com:8200
vault
命令现在可以与守护进程通信。请注意,定义实际主机名来取代localhost
或127.0.0.1
,正确验证HTTPS证书是很有必要的。
通过检查vault的状态,确认vault处于未初始化状态。
vault status
服务器应返回400错误,表示服务器尚未初始化。
Error checking seal status: Error making API request.
URL: GET https://example.com:8200/v1/sys/seal-status
Code: 400. Errors:
* server is not yet initialized
Vault在初始化时将公开两条信息,请注意保存,这些信息仅出现一次:
更具体地说,Vault的启封过程将使用密钥共享形成的密钥解密后端。也就是说,在初始化Vault时,您可以选择要创建的加密密钥以及在加密时间成功启动Vault的加密数量。
解密参数的典型简单值是创建三个密钥,并且在解密时需要至少两个密钥。这允许将重要的密钥共享分开并存储在不同的位置,一个密钥不足以启动Vault。
换句话说,每当启动Vault时,至少需要两个非加密密钥才能使服务可用。加密时,存储实际秘密值的文件将保持加密且无法访问。
使用上述参数初始化Vault:
vault init -key-shares=3 -key-threshold=2
以安全的方式保存每个解密令牌和初始root令牌。例如,一个选项是将一个加密密钥存储在密码管理器中,另一个密钥管理器存储在USB驱动器上,另一个选项是存储在GPG加密文件中。
您现在可以使用新创建的解密令牌来启动Vault。首先使用一个密钥解密。
vault operator unseal
该命令将要求取消封锁令牌:
Key (will be hidden):
输入后,命令输出将指示正在进行解密,但在Vault准备好使用之前仍需要一个解密密钥。
Sealed: true
Key Shares: 3
Key Threshold: 2
Unseal Progress: 1
Unseal Nonce: 3bdc838e-1b74-bc13-1d6f-c772f1694d83
再次运行该命令。
vault operator unseal
并输入不同的令牌:
Key (will be hidden):
命令的输出表明解密完成。
Seal Type shamir
Sealed false
Total Shares 3
Threshold 2
Version 0.9.5
Cluster Name vault-cluster-5511b3ff
Cluster ID 53522534-8ee1-8aec-86db-e13e4a499dd0
HA Enabled false
Vault现已解密并可随时使用。每当启动或重新启动Vault时,都需要执行这些解密步骤。
但是,解密是与Vault正常交互(例如读取和写入值)的不同过程,这些过程由令牌进行身份验证。在最后一步中,我们将创建必要的访问令牌和策略,以存储保密值并读取/写入Vault中的特定路径。
Vault文档中列举了几个加密后端,但是对于此示例,我们将使用通用加密后端。此后端在Vault中存储简单的键/值对。
首先,将先前生成的root令牌保存到shell变量以便于使用。
root_token=your_root_token_here
将值写入Vault中的路径。
VAULT_TOKEN=$root_token vault write secret/message value=mypassword
在此命令中,secret/
前缀表示我们正在写入generic
安装在secret
路径上的后端,并且我们将value
密钥存储在具有值mypassword
的message
路径中。我们使用具有超级用户权限的root令牌来编写通用加密文件。
在实际场景中,您可以存储外部工具可以使用的API密钥或密码等。虽然您可以使用root令牌再次读取加密值,但生成对我们的单个加密只具有只读权限的权限较低的令牌是有解读性的。
创建一个名为policy.hcl
的文件。
nano policy.hcl
使用以下Vault策略填充文件,该策略定义对工作目录中的加密路径的只读访问权限:
path "secret/message" {
capabilities = ["read"]
}
保存并关闭该文件,然后将此策略写入Vault。以下命令将创建一个以策略message-readonly
权限命名的策略。
VAULT_TOKEN=$root_token vault policy write message-readonly policy.hcl
您现在可以使用策略中指定的权限创建令牌。
VAULT_TOKEN=$root_token vault token create -policy="message-readonly"
输出将如下所示:
Key Value
--- -----
token your_token_value
token_accessor your_token_accessor
token_duration 768h0m0s
token_renewable true
token_policies [default message-readonly]
将token
值保存到变量app_token
。
app_token=your_token_value
您可以使用值app_token
来访问存储在secret/message
路径中的数据(Vault中没有其他值)。
VAULT_TOKEN=$app_token vault read secret/message
Key Value
--- -----
refresh_interval 768h0m0s
value mypassword
您还可以测试是否此无特权令牌无法执行其他操作,例如在Vault中列出加密文件。
VAULT_TOKEN=$app_token vault list secret/
Error reading secret/: Error making API request.
URL: GET https://example.com:8200/v1/secret?list=true
Code: 403. Errors:
* permission denied
这将验证权限较低的应用令牌无法执行任何破坏性操作,也无法访问Vault中的其他加密值。
在本文中,您在Ubuntu 16.04上安装,配置和部署了Vault。虽然本教程仅演示了使用非特权令牌,但Vault文档还提供了有关存储和访问机密的其他方法以及其他身份验证方法的更多信息。 更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Securely Manage Secrets with HashiCorp Vault on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。