保险库与机密存储
使用 Vault 等工具集中管理机密信息。
保险库与机密存储 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
secret 存储库能解决什么问题
secret 存储库(或保险库)是一个集中式、加固的服务,唯一职责是存储、控制并审计对密钥的访问。它取代了导致密钥扩散的分散文件和环境变量。
优秀的密钥管理器提供四项核心能力:
- 集中存储:唯一可信的事实来源。
- 访问控制:对哪些用户和工作负载可以读取每个密钥制定细粒度策略。
- 审计日志记录:记录每次访问,以便进行事件响应。
- 加密:密钥在静态存储和传输过程中均经过加密。
例如 HashiCorp 密钥保险库、AWS 密钥管理器、微软云密钥保险库和 GCP 密钥管理器。
HashiCorp 密钥保险库的结构
HashiCorp 密钥保险库是一款广受欢迎的开源密钥管理器。它将功能组织为可插拔的密钥引擎,并挂载到各个路径。
- KV 引擎存储静态键值密钥。
- 数据库引擎生成动态的短期有效数据库凭据。
- PKI 引擎按需签发 TLS 证书。
- 传输引擎提供加密服务,同时不暴露密钥。
您可以通过基于超文本传输协议的应用程序编程接口或 CLI 与保险库交互。每条路径都由策略控制,这些策略决定谁可以在那里读取或写入数据。
# Enable a KV v2 secrets engine at the 'secret/' path
vault secrets enable -path=secret kv-v2
# Write and read a static secret
vault kv put secret/app/db password='S3cr3t' user='app'
vault kv get secret/app/db封存与解封模型
保险库通过封存/解封机制保护其数据。保险库启动时处于封存状态;它知道加密数据的位置,却无法解密数据。
用于解密存储数据的主密钥本身又由解封密钥加密。借助Shamir 的秘密共享,解封密钥会被拆分为多个分片,并分发给不同的操作人员。
必须提供可配置的阈值(例如 5 个分片中的 3 个)才能重建密钥并解封保险库。任何单个人都无法独自解封,从而可以防范内部人员入侵。
# Initialize Vault: 5 key shares, threshold of 3 to unseal
vault operator init -key-shares=5 -key-threshold=3
# Each operator supplies one shard until threshold is met
vault operator unseal <shard-1>
vault operator unseal <shard-2>
vault operator unseal <shard-3>身份验证:您是谁
读取任何 secret 之前,客户端必须先进行身份验证以获取令牌。保险库支持许多针对不同身份定制的身份验证方法:
- AppRole:用于应用程序和持续集成系统(角色 ID + secret ID)。
- Kubernetes:使用容器组的服务账户令牌。
- AWS/GCP/Azure IAM:信任云平台身份。
- OIDC/LDAP:通过 SSO 为人类用户提供身份验证。
关键原则是:身份来自平台,而不是长期有效的密码。Kubernetes 容器组使用自己的服务账户令牌证明身份,因此无需容易泄露的引导 secret。
# App authenticates via AppRole to receive a token
vault write auth/approle/login \
role_id="db-app-role" \
secret_id="$WRAPPED_SECRET_ID"
# Response includes client_token used for subsequent reads使用策略进行授权
身份验证可以证明身份;策略决定该身份可以执行哪些操作。保险库策略使用 HCL 编写,并遵循最小权限原则,只授予工作负载所需的路径和能力。
此策略允许某个服务只读取属于自己的数据库 secret,除此之外什么也不能读取:
能力对应于应用程序编程接口动词:read、create、update、delete 和 list。默认拒绝,显式授予。
# policy: billing-app.hcl
path "secret/data/billing/*" {
capabilities = ["read"]
}
path "database/creds/billing-readonly" {
capabilities = ["read"]
}
# everything else is implicitly denied云原生密钥存储库
如果您在单一云环境中运行,云服务商的托管存储服务可以免去运维负担:无需封存/解封,也无需维护待修补的服务器:
- AWS 密钥管理器与 IAM 集成,并支持内置的自动轮换函数。
- 微软云密钥保险库使用 RBAC 存储密钥、加密密钥和证书。
- GCP 密钥管理器提供由 IAM 绑定控制的版本化密钥。
访问由云平台的 IAM 控制,因此工作负载可以使用现有角色读取密钥,无需单独的密码。代价是厂商锁定,并且与保险库相比,对多云环境的支持较弱。
# Read a secret from AWS Secrets Manager (workload uses its IAM role)
aws secretsmanager get-secret-value \
--secret-id prod/billing/db \
--query SecretString --output text
# GCP equivalent
gcloud secrets versions access latest --secret=billing-db加密即服务
有时您根本不想存储 secret,而是希望加密应用程序数据,同时让应用程序始终不持有加密密钥。保险库的传输引擎正是为此而设计的。
应用程序将明文发送给保险库,获得密文,却始终看不到密钥。解密过程也是如此。这称为加密即服务。
其优势在于:密钥只存在于保险库内部,可以集中轮换,而且被攻破的应用程序无法泄露自己从未持有过的密钥。
# Encrypt data without the app ever seeing the key
vault write transit/encrypt/orders-key \
plaintext=$(echo -n 'card=4111...' | base64)
# returns: ciphertext=vault:v1:abc123...
# Decrypt later
vault write transit/decrypt/orders-key ciphertext='vault:v1:abc123...'将密钥注入工作负载
保险库只有在应用程序能够不对路径或令牌进行硬编码的情况下才有用。常见的注入模式包括:
- 边车/代理:保险库代理与应用程序并行运行,进行身份验证,并将密钥写入共享的内存卷。
- CSI 驱动程序:Kubernetes 通过密钥存储 CSI 驱动程序将密钥挂载为文件。
- SDK 获取:应用程序在启动时直接调用保险库应用程序编程接口。
与环境变量相比,请优先挂载到内存文件系统(tmpfs),并避免将密钥写入磁盘,以免它们长期残留。
# Vault Agent template renders a secret to an in-memory file
template {
contents = "DB_PASS={{ with secret \"secret/app/db\" }}{{ .Data.data.password }}{{ end }}"
destination = "/run/secrets/db.env"
}审计日志与问责
保险库中的每个读取、写入和身份验证事件都应记录在审计日志中。这正是机密管理在安全事件中能够经得起审查的原因。
审计日志会回答关键问题:谁访问了哪个机密、访问时间以及访问地点。保险库会对日志中的敏感值进行哈希处理,因此日志本身不会泄露机密。
将审计日志发送到防篡改的独立系统(SIEM),这样即使攻击者攻陷了保险库主机,也无法同时删除其访问过哪些内容的证据。
# Enable a file audit device (HMAC-hashes secret values)
vault audit enable file file_path=/var/log/vault/audit.log
# Forward to a SIEM/syslog endpoint for tamper resistance
vault audit enable syslog tag="vault" facility="AUTH"保护保险库本身
如果集中式存储库失效,所有系统都会受到影响,因为风险集中在一个地方。请将其作为最关键的资产进行加固:
- 所有端点都使用TLS运行;绝不要以未加密的方式暴露 API。
- 将保险库置于私有网络中,并由严格的防火墙规则保护。
- 通过云 KMS 启用自动解封,避免手动处理密钥分片,但必须严格保护该 KMS 密钥。
- 使用较短的令牌 TTL和可续期租约,使被盗令牌快速过期。
- 及时安装补丁,并监控审计日志中的异常。
保险库用许多故障点换取了一个能够得到极强防护的故障点。
选择合适的存储库
不存在唯一最佳的工具;请根据您的环境选择存储库:
- 单一云平台、需求简单:使用原生管理器(AWS/微软云/GCP),以尽量减少运维负担。
- 多云或本地部署:HashiCorp 保险库提供一致且可移植的抽象层。
- 需要动态机密或加密即服务:保险库的引擎功能最强大。
- 主要使用容器编排平台:将存储库与 CSI 驱动程序或类似外部机密的操作器结合使用。
无论选择哪种方案,目标都相同:用一个经过审计且受访问控制的唯一事实来源,替代四处分散的明文机密。
快速检查
请检验您对保险库保护模型的理解。
回顾:保险库与机密存储库
您已经了解了如何用集中式、可审计的存储库替代四处分散的机密。
- 机密存储库提供集中式存储、访问控制、审计日志和加密功能。
- HashiCorp 保险库使用可插拔的机密引擎,并采用由 Shamir 的秘密共享保护的封存/解封模型。
- 身份验证方法从平台(Kubernetes、IAM、AppRole)中获取身份,而策略则强制执行最小权限。
- 云原生存储库(AWS、微软云、GCP)以可移植性换取较低的运维负担。
- 传输引擎提供加密即服务,因此应用程序无需持有密钥。
- 通过代理或 CSI 将机密注入内存存储,记录每次访问,并将保险库作为最关键的资产进行加固。
接下来,我们将通过动态生成短期机密,让机密变得更加安全。
常见问题解答
「保险库与机密存储」课时是免费的吗?
是的 — 「保险库与机密存储」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「保险库与机密存储」这节课中我会学到什么?
使用 Vault 等工具集中管理机密信息。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「保险库与机密存储」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。