深入源码:terraform-aws-vault 的 install-vault 脚本设计解析:mlock、systemd 与目录布局
【免费下载链接】terraform-aws-vaultA Terraform Module for how to run Vault on AWS using Terraform and Packer项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-vault
terraform-aws-vault 是 HashiCorp 官方维护的开源 Terraform 模块,目标是让你用 Terraform 和 Packer 在 AWS 上快速、可靠地运行 HashiCorp Vault。在这个项目中,modules/install-vault/install-vault 脚本承担着"从零到一"的职责:它要在裸操作系统上完成依赖安装、目录布局创建、Vault 二进制部署,以及 mlock 权限配置,为后续的 systemd 守护进程托管铺平道路。本文将以源码视角,逐层拆解这个脚本的设计思路,帮助你理解一个生产级 Vault AMI 是如何被"铸造"出来的。
install-vault 脚本在 Packer 构建 AMI 中的角色
要理解 install-vault 的设计,先要看它在整个项目流水线中的位置。terraform-aws-vault 的典型部署分为两个阶段:
- 镜像阶段:通过 Packer 构建预装好 Vault 的 Amazon Machine Image(AMI)。示例模板位于 examples/vault-consul-ami/vault-consul.json,其中会调用
install-vault完成软件安装。 - 运行时阶段:EC2 实例启动时,通过 user-data 脚本调用
run-vault生成配置并拉起服务,示例见 examples/root-example/user-data-vault.sh。
也就是说,install-vault做的是"安装期"工作,run-vault做的是"运行期"工作。两者通过约定的目录布局和文件位置解耦——install 负责把二进制和辅助脚本放到约定位置,run 则默认按相对路径去寻找它们。
安装全流程:install-vault 脚本的五步设计
install-vault的install函数清晰地串联了五个步骤,每一步都对应一个独立函数,可读性极强:
- 安装依赖:
install_dependencies自动识别包管理器(apt-get或yum),安装awscli、curl、unzip、jq等基础工具,Ubuntu 还会额外安装libcap2-bin(mlock 配置需要用到)。 - 创建系统用户:
create_vault_user使用useradd --system创建一个无登录权限的系统用户vault,避免 Vault 以 root 身份运行。 - 创建目录布局:
create_vault_install_paths一次性创建所有 Vault 需要的目录,并统一 chown 给vault用户。 - 下载并安装二进制:
fetch_binary从 HashiCorp releases 地址下载 zip 包,install_binary解压、放置二进制、创建符号链接,并把run-vault脚本一并复制到约定目录。 - 配置 mlock:
configure_mlock通过setcap赋予 Vault 内存锁定的能力。
脚本还内置了retry重试函数:下载失败会等待 10 秒重试,最多 5 次,这对构建镜像时偶发的网络抖动非常友好。
Vault 安装目录布局:/opt/vault 各目录用途
目录布局是 install-vault 设计中最直观、也最值得借鉴的部分。默认安装路径为/opt/vault(可用--path参数覆盖),各子目录职责如下:
| 目录 | 权限 | 用途 |
|---|---|---|
/opt/vault/bin | 755 | 存放vault二进制和run-vault启动脚本 |
/opt/vault/config | 755 | 存放 Vault 的 HCL 配置文件(如default.hcl) |
/opt/vault/data | 755 | Vault 的运行时数据、PID 文件、Agent Token 文件 |
/opt/vault/tls | 755 | 存放 TLS 证书与私钥 |
/opt/vault/scripts | 755 | 存放辅助脚本(如 IAM 认证签名脚本) |
创建完成后,脚本执行chown -R vault:vault /opt/vault,保证所有目录归vault用户所有。这种"一个基础目录 + 功能子目录"的布局,让二进制、配置、数据、证书各归其位,既方便run-vault按相对路径推导,也便于后续做权限隔离和备份。
mlock 配置解析:Vault 内存为何不能被交换
这是脚本最核心的安全设计之一。Vault 在内存中保存着加密密钥(Master Key),如果操作系统把这段内存交换(swap)到磁盘,密钥就可能被攻击者从磁盘中恢复。因此 Vault 默认会调用mlock系统调用,将内存锁定在 RAM 中。
install-vault 中的configure_mlock函数只做了一件事:
sudo setcap cap_ipc_lock=+ep $(readlink -f $(which vault))这行命令为 Vault 二进制赋予了CAP_IPC_LOCK能力(capability),使其无需 root 权限即可执行 mlock。这里有两个细节值得注意:
$(which vault)拿到的是符号链接路径,所以用readlink -f解析出真实二进制文件,再对其设置 capability,否则设置会失效。- Ubuntu 18 默认没有
setcap命令,所以前面才需要额外安装libcap2-bin包。
值得一提的是,setcap只是"能力"层面,真正执行 mlock 还需要进程的资源限制(rlimit)足够大——这一步由run-vault生成的 systemd 配置中的LimitMEMLOCK=infinity完成。install 与 run 两个脚本在这一安全特性上形成了完美闭环。
systemd 与 run-vault:守护进程如何被拉起
install-vault 的 README 明确说明:脚本假设 systemd 已安装,它作为跨平台监督器,保证 Vault 开机自启、崩溃自动重启,日志统一由journalctl管理。不过 systemd 单元文件并非由 install-vault 生成,而是由运行期的 modules/run-vault/run-vault 脚本动态生成,写入/etc/systemd/system/vault.service。
生成的 unit 配置极具安全加固意识,几个关键点:
User=vault/Group=vault:以最小权限用户运行。ProtectSystem=full、PrivateTmp=yes、PrivateDevices=yes:限制进程对文件系统与设备的访问。NoNewPrivileges=yes:禁止进程获得新权限。AmbientCapabilities=CAP_IPC_LOCK、LimitMEMLOCK=infinity:与 install-vault 的 setcap 配置呼应,保障 mlock 生效。Restart=on-failure、RestartSec=5:崩溃后 5 秒自动拉起。ExecReload=/bin/kill --signal HUP $MAINPID:支持通过 HUP 信号优雅重载配置。
随后脚本依次执行systemctl daemon-reload、systemctl enable、systemctl restart,完成服务的注册与启动。除了 Vault Server 模式,run-vault还支持--agent模式启动 Vault Agent,配合 AWS IAM/EC2 认证实现自动登录,相关完整示例可参考 examples/vault-agent 与 examples/vault-iam-auth。
参数化设计:一个脚本适配多种安装场景
install-vault 没有把任何路径和版本写死,而是通过参数化实现高复用:
--version:指定 Vault 版本号,脚本会拼出官方下载地址。--download-url:直接指定 zip 包完整地址,用于安装 Vault Enterprise 等非公开发行版(两者二选一,脚本用assert_either_or强制校验)。--path:自定义安装路径,默认/opt/vault。--user:自定义运行用户,默认vault。--skip-package-update:跳过系统包更新,适合已在基础镜像中做过更新的场景。
配合 Packer 模板中的变量注入,同一个脚本既能构建 Ubuntu 16.04、Ubuntu 18.04、Amazon Linux 2 三种镜像,也能切换到企业版下载地址,通用性极强。
小结
回顾整个设计,install-vault 脚本的精华可以概括为三点:以约定的目录布局解耦安装与运行、以 capability 而非 root 权限解决 mlock 需求、以参数化适配多系统与企业版场景。它和 run-vault 一前一后、职责分明,共同支撑起 terraform-aws-vault 在 AWS 上的高可用 Vault 部署。对想自建 Vault 生产环境、或研究高质量 Shell 脚本设计的开发者来说,modules/install-vault/install-vault 与 modules/run-vault/run-vault 都是极佳的学习范本。如果想亲手体验完整流程,可以 clone 仓库后按 examples/vault-consul-ami/README.md 的指引构建自己的 Vault AMI。
【免费下载链接】terraform-aws-vaultA Terraform Module for how to run Vault on AWS using Terraform and Packer项目地址: https://gitcode.com/gh_mirrors/te/terraform-aws-vault
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考