跳转至内容

Vault

来自 ArchWiki

VaultHashiCorp 提供的一款开源工具,用于安全地管理密钥和保护敏感数据。它提供加密即服务、访问控制和详细的审计日志记录。

安装

安装 vault 包。

配置

Vault可以运行在 开发模式下进行测试,也可以配置为具有增强安全设置的生产服务器。配置使用 "Hashicorp Command Language" (HCL) 格式定义在一个文件中。

开发模式

为了测试,Vault可以运行在 开发模式下,它会启动一个内存存储后端并自动解封。

警告 开发模式会将所有数据存储在内存中,不会持久化到磁盘。所有密钥和配置在重启后都会丢失。

要启动Vault的开发模式,请运行以下命令

$ vault server -dev

生产环境配置

要设置一个生产就绪的Vault服务器,请创建一个配置文件

# mkdir /etc/vault
# touch /etc/vault/config.hcl

然后,将您期望的配置设置添加到 /etc/vault/config.hcl

存储配置

Vault支持多种存储后端。对于简单的基于文件的后端,请使用

storage "file" {
    path = "/opt/vault/data"
}

对于高可用性或重度使用环境,请考虑使用 consul, dynamodbAUR, 或其他提供可伸缩性和可靠性的支持的存储解决方案。

监听器配置

Vault监听一个TCP端口以接收API请求。对于不带TLS的基本配置,请使用

listener "tcp" {
    address     = "127.0.0.1:8200"
    tls_disable = "true"
}

如果需要TLS进行安全通信,请按以下方式配置

listener "tcp" {
    address     = "127.0.0.1:8200"
    tls_disable = "false"
    tls_cert_file = "/etc/vault/vault-cert.pem"
    tls_key_file  = "/etc/vault/vault-key.pem"
}

UI配置

要启用Vault的Web界面,请添加

ui = true

API 和集群地址

设置API和集群地址以实现正确的网络通信

api_addr = "http://127.0.0.1:8200"
cluster_addr = "http://127.0.0.1:8201"

如果使用TLS

api_addr = "https://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"

安全注意事项

默认情况下,Vault会锁定内存以防止敏感数据被交换到磁盘。这通过确保密钥不会出现在可被未经授权的用户或取证工具访问的交换空间中来增强安全性。

但是,使用 mlock 需要确保系统有足够的内存并允许无限内存锁定。如果系统内存不足或内存限制受限,启用mlock可能会导致Vault意外失败。要安全地使用mlock,请确保

  • 系统有足够的可用RAM来容纳Vault的内存使用量。
  • systemd服务配置为
AmbientCapabilities=CAP_IPC_LOCK
LimitMEMLOCK=infinity

如果您的系统不满足这些要求,您可能需要禁用 mlock。要这样做(不推荐用于生产环境)

disable_mlock = true

审计日志配置

Vault使用审计设备来记录客户端请求和响应,用于安全和故障排除目的。审计日志有助于跟踪访问模式、检测异常并确保合规性。

配置基于文件的审计日志

要启用基于文件的审计日志,请在Vault中配置一个审计设备

audit_device "file" {
    path   = "/var/log/vault-audit.log"
    format = "json"
}

这将以JSON格式将审计事件记录到 /var/log/vault-audit.log,使其更易于解析和分析。

为确保Vault可以安全地写入审计日志,请设置正确的权限

# touch /var/log/vault-audit.log
# chown vault:vault /var/log/vault-audit.log
# chmod 640 /var/log/vault-audit.log
其他审计设备

除了文件,Vault还支持多种审计日志后端。有关支持的审计设备和高级配置选项的完整列表,请参阅 官方文档

日志配置

Vault提供日志记录功能,以帮助监控其操作、故障排除问题和分析系统行为。默认情况下,日志发送到stdout,但也可以写入文件。

要配置Vault将日志记录到文件,请在配置中指定日志文件路径和日志级别

log_file = "/var/log/vault.log"
log_level = "info"

为确保Vault能够正确写入日志,请调整文件权限

# touch /var/log/vault.log
# chown vault:vault /var/log/vault.log
# chmod 640 /var/log/vault.log

示例配置

以下是一个结合了上述设置的完整示例

storage "file" {
    path = "/opt/vault/data"
}

listener "tcp" {
    address     = "127.0.0.1:8200"
    tls_disable = "true"
}

ui = true

api_addr = "http://127.0.0.1:8200"
cluster_addr = "http://127.0.0.1:8201"

disable_mlock = true

audit_device "file" {
    path   = "/var/log/vault-audit.log"
    format = "json"
}

log_file = "/var/log/vault.log"
log_level = "info"

如果使用TLS

storage "file" {
    path = "/opt/vault/data"
}

listener "tcp" {
    address     = "127.0.0.1:8200"
    tls_disable = "false"
    tls_cert_file = "/etc/vault/vault-cert.pem"
    tls_key_file  = "/etc/vault/vault-key.pem"
}

ui = true

api_addr = "https://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"

disable_mlock = true

audit_device "file" {
    path   = "/var/log/vault-audit.log"
    format = "json"
}

log_file = "/var/log/vault.log"
log_level = "info"

创建存储目录

# mkdir -p /opt/vault/data
# chown -R vault:vault /opt/vault

将Vault运行为systemd服务

可选地,Vault可以作为 systemd 服务运行,以确保它在启动时自动启动,在失败时重新启动,并与Linux上的进程管理良好集成。这种方法在需要Vault在无人干预的情况下保持可用性的生产环境中特别有用。

创建systemd服务文件

创建一个单元文件

/etc/systemd/system/vault.service
[Unit]
Description=HashiCorp Vault - A secrets management solution
After=network.target

[Service]
User=vault
Group=vault
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
SecureBits=keep-caps
AmbientCapabilities=CAP_IPC_LOCK
LimitMEMLOCK=infinity
NoNewPrivileges=yes
ExecStart=/usr/bin/vault server -config=/etc/vault/config.hcl
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
ProtectKernelModules=yes
ProtectControlGroups=yes
ReadOnlyPaths=/etc/vault
SystemCallFilter=@system-service
SystemCallFilter=~@privileged

[Install]
WantedBy=multi-user.target

接下来,启用/启动 vault.service

用法

设置环境变量

设置环境变量以指定Vault地址。这确保Vault命令与正确的服务器实例进行交互,而无需每次都手动指定地址。

$ export VAULT_ADDR='http://127.0.0.1:8200'

要使此设置在重启后持久

/etc/environment
VAULT_ADDR='http://127.0.0.1:8200'

初始化Vault

Vault会加密和保护密钥,在重启后需要“解封”过程才能解密和访问它们。初始化时,Vault会生成多个解封密钥,并且需要其中一部分密钥才能解封Vault。这确保了没有单个人拥有全部访问权限,增加了额外的安全层。

要初始化Vault,请运行

$ vault operator init

这将输出5个解封密钥和一个初始root令牌。请妥善保存它们!

解封Vault并登录

自动解封

Vault可以配置为使用基于云的KMS服务(如AWS KMS、GCP KMS)或硬件安全模块(HSM)进行自动解封。这消除了启动时手动输入密钥的需要。有关更多信息,请参阅 官方Vault自动解封文档

手动解封

对于手动解封,Vault必须使用至少三个不同的密钥进行解封

$ vault operator unseal unseal-key-1
$ vault operator unseal unseal-key-2
$ vault operator unseal unseal-key-3

登录Vault

$ vault login root-token

访问UI

在浏览器中打开 http://127.0.0.1:8200。

您将看到一个登录屏幕,您可以使用您的root令牌访问Vault UI。