FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 但是要把秘密放在哪呢?
  • 秘密管理平台
  • 权衡利弊
  • 入门指南
  • Vault 的甜蜜点
  • 内部设计
  • 入门指南
  • 安装和配置
  • Shamir 密钥环
  • 存储秘密
  • 基于角色的访问控制
  • Vault 自动化
  • Ansible
  • rc.d App Roles
  • 代理
  • 关停 Vault
在GitHub上编辑
导出为 PDF
  1. 2024-0506 配置管理对决

Hashicorp Vault

上一页rdist下一页在 GitHub 上向 FreeBSD 提交 PR

最后更新于1个月前

  • 作者:Dave Cottlehuber

  • 原文链接:

居家工作已成为新常态。但从安全性角度看,事情变得更为复杂。安全的办公室不复存在,那些精心锚定的安全边界和全天候的物理安全亦已消失。

专业的安全人员将我们关心的此类风险称为“威胁格局(threat landscape)”和“安全态势(security posture)”。

这是一种花哨的说法,即便我们可以下定决心,对诸如 GCSB(政府通信安全局)、克格勃(KBG,苏联国家安全委员会)、CIA(美国中央情报局)和摩萨德(Mossad,以色列情报和特殊使命局)及其他政府资助的攻击者漠不关心。但我们确实在意丢失在火车上笔记本电脑,或有人潜入办公室,窃取高价值物品——那些我们在乎的密码和凭据。

但是要把秘密放在哪呢?

尤其值得注意的是,攻击者和我们这些系统管理员和开发人员的共同兴趣是管理和定期轮换秘密。

你见过有多少环境,那里的数据库凭据从未修改过呢?跨系统、长时间运行的批处理作业,却使用着相同的密码?或者改变其中任何一个都可能导致意外停机,似火一样在公司内蔓延,并最终砸掉你的饭碗?

很显然,把便笺、凭据存放在 git 存储库,既不具可扩展性,也不安全。我们需要一些适用于绝大多数用例的,较为通用的解决方案。

那么聪明的 DevOps 工程师该怎么做呢?

传统解决方案是密码存储(如 BitWarden、1Password),并将这些工具扩展到团队中的各种命令行工具中。但这些工具只能解决小部分问题,并不能彻底解决所有问题。

它们主要是面向用户的工具,很难与复杂的 git 存储库、puppet 和 ansible 部署管道连接起来;也很难确保凭据定期轮换,并确保仅有指定的用户和系统才能访问。

秘密管理平台

秘密管理平台(SMP)有时也被称为密钥管理系统(KMS),通常被云供应商集成。Azure、Amazon、Google、Oracle 都为其平台提供了紧密耦合且完美集成的工具。

但是,如果你现在正在阅读着这本 FreeBSD 杂志,你极有可能对把所有秘密交给商业公司的做法感到极度不安。在理想情况下,我们希望自己来管理秘密,而不依赖外部第三方。

权衡利弊

这些系统专注于以高度安全和受控的方式分发和管理机要,使运维团队能够进行操作。

它们旨在解决在现代复杂环境中遇到的安全管理和编排秘密的挑战,在这些环境中,应用程序、系统和用户需要访问极度敏感的信息。

例如,它们能够集成修改秘密、触发采用该秘密的容器换代到新版本等功能。

他们可以使批处理作业能够临时解密金融信息,然后在安全加密后返回更新信息。

或者它可以提供一次性令牌:让新配置的服务连接到指定数据库,确保令牌既未在传输过程中被劫持,也无法被多个实例使用。

当配置(部署)新实例时,将获得新的一次性令牌,绑定实例和时间。

此类型的功能非常适合将系统部署和相关机密信息的访问分离开。这种掩人耳目的方式通常被称为单间部署——单个仅限一次性的令牌,紧密绑定到单个部署,在部署过程中由自动化工具集注入。在实例启动时使用此令牌,用于获取专用于该实例的运行时机密,亦可通过 IP 地址,或其他附加条件来绑定。

入门指南

本文主要介绍了 Hashicorp Vault,它有一个功能等价的开源分支叫 OpenBao——类似于 Terraform 是 OpenTofu 许可下的复刻。

Vault 的甜蜜点

Vault(和其他 KMS)并非存储 Webstorm IDE 激活码和护照扫描件的好地方。Vault 对终端用户并不友好,也注定无法在移动设备上使用。

但如果你正管理着服务器、数据库和网络,那它就非常棒。它可以轻松与 Terraform、Chef、Puppet、Ansible 以及几乎所有带有和使用命令行及终端界面的东西集成。

内部设计

在保险柜解锁后,从用户视角看,它的功能基本等价于其他 HTTP 可访问的键值存储。我们可以存储诸如 ssh 私钥、TLS 证书、常规密码,甚至让保险柜生成定时的限临时权限密码。

入门指南

Vault 支持使用共识协议和多个服务器的复杂部署,但我发现一台小型高度可靠的物理服务器(配备热备份和 zfs-replicate 备份)足矣。当然,我使用 Tarsnap 来进行彻底的离线备份——对于像我们所有的秘密如此关键的东西,这是绝对必要的!

安装和配置

通常须以 root 身份执行以下命令:

# pkg install -r FreeBSD security/vault
# mkdir -p /var/{db,log}/vault /usr/local/etc/vault
# chown root:vault /var/{db,log}/vault /usr/local/etc/vault
# chmod 0750 /usr/local/etc/vault
# chmod 0770 /var/{db,log}/vault

你可使用 sysrc(8),或你首选的操作工具来设置 rc.conf。

# /etc/rc.conf.d/vault or where-ever you prefer
vault_enable=YES
vault_config=/usr/local/etc/vault/vault.hcl

以及 vault 的配置文件。它很多选项,但大部分意义自明。对于我们的测试部署,我们会禁用 TLS 并使用回环 IP。

# /usr/local/etc/vault/vault.hcl
default_lease_ttl = “72h”
max_lease_ttl = “168h”

ui = true
disable_mlock = false

listener “tcp” {
address = “127.0.0.1:8200”
tls_disable = 1
tls_min_version = “tls12”
tls_key_file = “/usr/local/etc/vault/vault.key”
tls_cert_file = “/usr/local/etc/vault/vault.all”
}

storage “file” {
path = “/var/db/vault”
}

现在以前台模式运行守护进程:

$ vault server -config /usr/local/etc/vault/vault.hcl
==> Vault server configuration:

Administrative Namespace

            Api Address: http://127.0.0.1:8200
...

打开新的终端,让我们检查状态:

$ export VAULT_ADDR=http://localhost:8200/
$ vault status
vault status
Key                 Value
---                -----
Seal Type          shamir
Initialized        false
Sealed             true
Total Shares       0
Threshold          0
Unseal Progress    0/0
Unseal Nonce       n/a
Version             1.14.1
Build Date         2023-11-04T05:16:56Z
Storage Type       file
HA Enabled         false

注意,vault 尚未初始化,并且仍然处于封闭状态。让我们解决这个问题:

$ vault operator init --key-shares=3 --key-threshold=2
Unseal Key 1: jjcVgHTjWw3j4BsyDhugvS9we5t5qMAhJL8bSWzySjbG
Unseal Key 2: WfMeZPA7ixleQAMeeAqyey+gwrxDn9WNfSvdKzdLMaeA
Unseal Key 3: V9cd1eVBH6mstyoS2pbD6S80R7NJVz7jPvlPOcLOUVlw
Initial Root Token: hvs.RAeqzETRhOXOImMPw7xrXbAl

$ export VAULT_TOKEN=hvs.RAeqzETRhOXOImMPw7xrXbAl

$ vault status

Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed              true
Total Shares       3
Threshold          2
Unseal Progress    0/2
Unseal Nonce       n/a
Version            1.14.1
Build Date         2023-11-04T05:16:56Z
Storage Type       file
HA Enabled         false

注意,vault 已初始化,但仍处于封闭状态。接下来让我们使用新生成的密钥共享来解决这个问题:

$ vault operator unseal
Unseal Key (will be hidden):
Key Value
--- -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       3
Threshold          2
Unseal Progress    1/2
Unseal Nonce       6ce4351d-012b-df3f-a176-34d266f00795
Version            1.14.1
Build Date         2023-11-04T05:16:56Z
Storage Type       file
HA Enabled         false

请用不同的密钥重复解封,直至 sealed 变更为 false 。最后一步是启用审计,因为安全人员喜欢日志。

$ vault audit enable file path=/var/log/vault/audit.log
Success! Enabled the file audit device at: file/

可随时查看,这里从未存储过任何秘密,所以它只是请求的审计日志。

Shamir 密钥环

现在你已经打开了 Vault,把你的秘密通过加密的信鸽分发给你选择的秘密保管者。需要进行某种对应的仪式,并确保这些秘密得到充分保护,既要避免失误和其他问题,也要防范摩萨德和朝鲜特工。

到现在,你应该已经准备好存储秘密了。

存储秘密

Vault 有引擎这么一个概念——涉及简单的键值存储,还有用于 ssh 证书、AWS 和 Google Cloud 集成、RabbitMQ、PostgreSQL 等的引擎。每个引擎都需要单独启用。

$ vault secrets enable -version=2 kv
Success! Enabled the kv secrets engine at: kv/

从这儿开始,我们需要指定引擎类型和其挂载路径。可以将数据检索为 JSON 或 yaml 格式,甚至可以直接存储文件。

$ vault kv put -mount=kv blackadder scarlet_pimpernel=”we do not know”
=== Secret Path ===
kv/data/blackadder

======= Metadata =======
Key Value
--- -----
created_time 2024-05-12T23:04:50.283028044Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 1

$ vault kv get -mount=kv -format=json blackadder
{
“request_id”: “48141452-8f8f-b497-9c53-1af71e24e2a5”,
“lease_id”: “”,
“lease_duration”: 0,
“renewable”: false,
“data”: {
“data”: {
“scarlet_pimpernel”: “we do not know”
},
“metadata”: {
“created_time”: “2024-05-12T23:04:50.283028044Z”,
“custom_metadata”: null,
“deletion_time”: “”,
“destroyed”: false,
“version”: 1
}
},
“warnings”: null
}

$ vault kv put -mount=kv blackadder scarlet_pimpernel=”comte de frou frou”
=== Secret Path ===
kv/data/blackadder

======= Metadata =======
Key Value
--- -----
created_time 2024-05-12T23:08:22.369551931Z
custom_metadata <nil>
deletion_time n/a
destroyed false
version 2

$ vault kv get -mount=kv -format=yaml blackadder
data:
data:
scarlet_pimpernel: comte de frou frou
metadata:
created_time: “2024-05-12T23:08:22.369551931Z”
custom_metadata: null
deletion_time: “”
destroyed: false
version: 2
lease_duration: 0
lease_id: “”
renewable: false
request_id: 686965d9-811f-8689-d75f-a02f7dded9a7
warnings: null

$ vault kv put kv/blackadder scarlet_pimpernel=@/etc/motd.template

基于角色的访问控制

Vault 可以配置为使用 GitHub 认证,并将角色和认证委托给除 LDAP 外的其他系统。你们中的许多人会为这个消息而高兴。使用 GitHub 认证可以强制所有用户使用双因素身份验证(2FA),因此对小团队来说这是一个合理的权衡。

$ vault auth enable github
vault auth enable github
Success! Enabled github auth method at: github/

$ vault write auth/github/config organization=skunkwerks
Success! Data written to: auth/github/config

$ vault write auth/github/map/teams/admin value=admins
Success! Data written to: auth/github/map/teams/admin

将这个小策略文件放置在 /usr/local/etc/vault/admins.hcl:

# 授予 GitHub 管理员组成员在 `kv/` 挂载点中的所有权限
path “kv/*” {
capabilities = [“create”, “read”, “update”, “delete”, “list”]
}

然后在 Vault 中启用它:

$ vault policy write admins /usr/local/etc/vault/admins.hcl
Success! Uploaded policy: admins

你还可以为各种群体制定更为严格的策略(例如在权限、路径和所选挂载点),比如部署机器人。

现在就可以使用此令牌生成你的 vault 登录令牌了。

$ vault login -method=github token=$GITHUB
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run “vault login”
again. Future Vault requests will automatically use this token.

Key Value
--- -----
token hvs....
token_accessor ...
token_duration 72h
token_renewable true
token_policies [“admins” “default”]
identity_policies []
policies [“admins” “default”]
token_meta_org skunkwerks
token_meta_username dch

$ vault kv get -mount=kv -format=yaml blackadder
...

Vault 自动化

诸如 Chef、Puppet、Ansible 等自动化工具可以在部署时使用 Vault 存储密钥来解密;或在某些情况下,仅运行时解密。

让我们来看看第一种情况,即在部署时解密密钥。这实际上扩展了自动化工具的模板化能力,并依赖于能够在推送新的和更新的密钥之后触发服务重启。

我们有 4 种方式来使用 Vault:

  • Vault 可以发行绑定时间和 IP 的动态凭据(过期后会被吊销),适用于守护进程、定时任务和批处理脚本的时间限制

  • 我们还可以在运行时使用 Vault 代理来模板化文件

Ansible

有许多 ansible 插件,令人困惑的是,ansible 自带模块“vault”与 Hashicorp Vault 并不兼容。

安装插件,并使用典型的 lookup 功能:

super_secret: “{{lookup('hashivault', 'kv', 'blackadder', version=2)}}”

rc.d App Roles

AppRole 是一种自带的认证方法,专门用于机器和应用程序进行 Vault 认证,随后获取令牌,仅允许获取相关密钥。这通常被称为 cubby-hole(小单间)凭据,因为它只允许解包外层,获取内部密钥。

这些限制涉及时间限制、使用次数限制等。我们以受信任根进程生成这个受限的秘密 ID,并将其与角色 ID 一同传递给守护进程,以获取其自身的凭证。秘密 ID 可以设置为只有这些凭据才能被生成。

再次启用 approle 挂载点,然后创建我们的应用程序特定凭据,因为它是一种身份验证形式。为方便起见,这个 approle 将复用之前使用的 admins 组策略,但它应该有一个更为严格的策略,专门用于这个守护程序和服务。

$ vault auth enable approle
Success! Enabled approle auth method at: approle/

$ vault write auth/approle/role/beastie \
secret_id_ttl=60m \
token_num_uses=10 \
token_ttl=1h \
token_max_ttl=4h \
secret_id_num_uses=40 \
policies=”default,admins”
Success! Data written to: auth/approle/role/beastie

$ vault read auth/approle/role/beastie/role-id
Key Value
--- -----
role_id 6caaeac3-d8fa-a0e3-83ba-7d37750603c2

$ vault write -f auth/approle/role/beastie/secret-id
Key Value
--- -----
secret_id 8dd54c92-fe54-0d6d-bee6-e433e815aaa1
secret_id_accessor cb9bc17c-c756-42b3-c391-b61ebde12bff
secret_id_num_uses 0
secret_id_ttl 0s

如果我们想要使这些秘密在设想的守护程序 beastie 中可用,可以将这两个参数放入一个 /etc/rc.conf.d/beastie 文件,该文件可以安全地仅由 root 读取。

beastie_enable=YES
beastie_env=”
ROLE_ID=6caaeac3-d8fa-a0e3-83ba-7d37750603c2
SECRET_ID=8dd54c92-fe54-0d6d-bee6-e433e815aaa1
SECRET_PATH=kv/beastie
VAULT_ADDR=http://localhost:8200/
“

脚本 /usr/local/etc/rc.d/beastie 会运行一个预命令,以 root 身份获取秘密,并将其注入子环境。

start_precmd=${name}_vault
beastie_vault() {
# 使用 Vault 中的 approle 进行身份验证
VAULT_TOKEN=$(vault write auth/approle/login role_id=”$ROLE_ID” \
secret_id=”$SECRET_ID” \
-format=json | jq -r '.auth.client_token')

# 从 Vault 中提取秘密
export BEASTIE_SECRET=$(vault kv get -field=data -format=json ${SECRET_PATH} | jq -r .)
}

代理

Vault 还提供了代理模式,可以为你处理大部分凭据管理工作,并支持简单配置文件的模板化。

关停 Vault

在通常情况下,Vault 会保持长达数月之久的开启状态,除非进行补丁和升级。在发生安全事件时,只需中止运行 Vault 守护程序的服务器,或者执行命令 seal。这会关停 Vault,并卸载主密钥。

$ vault operator seal
Success! Vault is sealed.

在过去二十年间, DAVE COTTLEHUBER 一直致力于领先于网络上的恶意者至少一步之遥。从 OpenBSD 2.8 到 9.3 共九年,在这段时间内他获得了 Ports 提交权限。他倾向于使用 jail,和晦涩的的函数式编程语言,这与他喜欢分布式系统和边缘异常锋利的电动工具有异曲同工之处。

  • 职业牦牛牧人,自 2000 年以来剃 BSD 色的牦牛(译者注:即一直在开发使用 FreeBSD,解决相关故障)

  • FreeBSD ports@ 提交者

  • Ansible DevOops 大师

  • Elixir 开发者

  • 使用 RabbitMQ 和 Apache CouchDB 构建分布式系统

  • 喜欢越野滑雪,并演奏各种乐器的凯尔特民间音乐

其他工具也能用,但 已经被移植到了 FreeBSD,我相信 也很快就会被移植(译者注:目前正在进行审查 )。

Vault 将所有密钥和信息加密存储在磁盘上。因此,在启动时需要一个主密钥来解锁所有其他密钥。为了避免单一轻量化密钥,Vault 使用 和 Shamir 的秘密共享将一个庞大又复杂的密钥分割成单独的秘密,这些秘密可重新组合用以解锁 Vault。在支持 WASM 的现代网页浏览器中可测试 。

有着精巧地可配置的冗余度——比如仅需 5 把钥匙中的 3 把即可解锁保险柜。因此,你需要 3 位主系统管理员就能解锁它。但如果都不在场,你可以请求你的律师、会计借用他们的钥匙(如需要),以达到你的 3 位法定人数。每位管理员都在本地提交其解锁钥匙,并使用 API 质询来防止单一管理员窃取所有的主密钥。

最后,那些希望通过 github 认证来访问 vault 的用户,必须访问 ,添加新的个人令牌,权限为 admin— read:org。

和类似工具可以将秘密存储在 Vault 中,并且只在部署时使用查找功能解密它们

框架脚本 rc.d 可在启动使用 时提取它们的凭据,让本地 root 用户拥有仅允许发出小单间令牌的委派令牌。守护进程本身仅可检索自己的凭据

https://freebsdfoundation.org/our-work/journal/browser-based-edition/configuration-management-2/hashicorp-vault/
Vault
OpenBao
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=280619
SSS
Shamir 示例
SSS
https://github.com/settings/tokens
Ansible
app roles