如何在Ubuntu上加密你的信息:Vault入门教程

介绍

Vault是一个开源工具,提供安全,可靠的方式来存储分发API密钥,访问令牌和密码等加密信息。在部署需要使用加密或敏感数据的应用程序时,您就应该试试Vault。

在本教程中,您将学会:

  • 安装Vault并将其配置为系统服务
  • 初始化加密的磁盘数据存储
  • 通过TLS安全存储和检索敏感值

通过一些策略,您将能够使用Vault安全地管理各种应用程序和敏感数据。

准备

在开始本教程之前,您需要以下内容:

  • 一个Ubuntu 16.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器
  • 在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
  • SSL证书,我们将使用它来保护Vault的HTTP API,如何设置此证书取决于你是否拥有可解析该服务器的域名。
- **如果你有域名**,保护你网站的最简单方法是使用[腾讯云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)这两篇文章。

第一步、安装Vault

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可执行文件安装在您的服务器上,因此下一步是将其配置为作为系统服务运行。

第二步、创建Vault配置文件

Systemd是Ubuntu的初始化系统。要将Vault设置为系统服务,我们需要设置以下内容:

  • Vault守护程序以系统用户运行
  • 存储Vault信息的数据目录
  • 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配置文件存在。
  • UserGroup,它控制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系统服务以初始化后端并开始运行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命令现在可以与守护进程通信。请注意,定义实际主机名来取代localhost127.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在初始化时将公开两条信息,请注意保存,这些信息仅出现一次:

  • 初始root令牌。这相当于Vault部署的root权限,允许管理所有Vault策略,挂载等。
  • 解密秘钥。这些用于在守护程序启动时解除Vault,这允许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密钥存储在具有值mypasswordmessage路径中。我们使用具有超级用户权限的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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Debian 9上为Nginx创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

2923
来自专栏云计算教程系列

如何在Ubuntu 16.04中为Nginx创建自签名SSL证书

TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

4390
来自专栏散尽浮华

Pupet自动化管理环境部署记录

废话不多说了,下面记录下Puppet在Centos下的部署过程: puppet是什么 puppet是一种基于ruby语言开发的Lnux、Unix、windows...

2236
来自专栏程序猿

SSL 证书部署过程

本文演示环境 操作系统(64位):Ubuntu 16.04 CentOS 7.3 服务器软件:Nginx和Apache SSL证书:DV SSL 域名:19...

1.3K6
来自专栏云计算教程系列

加固你的Roundcube服务器

Roundcube是一个Webmail客户端,具有强大的安全功能和来自其插件存储库的广泛自定义选项。本文介绍如何进一步保护基本的现有Roundcube安装。

2640
来自专栏云计算教程系列

如何使用CentOS 7上的Let's Encrypt来保护Apache

本教程将向您展示如何在运行Apache作为Web服务器的CentOS 7服务器上设置来自Let's Encrypt的TLS / SSL证书。此外,我们将介绍如何...

2410
来自专栏WindCoder

JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

这是一篇介绍JSON Web Token(JWT)的文章,虽然可能用到的例子和Laravel和AngularJS有关,但知道了原理便能写出适用于自己的。同时,由...

3551
来自专栏闻道于事

前后端分离之JWT用户认证(转)

在前后端分离开发时为什么需要用户认证呢?原因是由于HTTP协定是不储存状态的(stateless),这意味着当我们透过帐号密码验证一个使用者时,当下一个requ...

2001
来自专栏野路子程序员

给网站配置上HTTPS加密访问(Centos7+Apache+SSL证书)

7915
来自专栏编程之旅

腾讯云上免费部署HTTPS

最近在写微信小程序的时候,微信小程序需要所有的请求接口都部署在https协议上,于是就研究了一下怎么在腾讯云上部署https环境,发现还是比较简单的,首先我的服...

7.3K5

扫码关注云+社区

领取腾讯云代金券