动态机密信息与租约
短期有效且自动过期的凭据。
动态机密信息与租约 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
静态机密与动态机密
静态机密只创建一次,之后无限期重复使用,例如同一个数据库密码被十个服务共享多年。静态机密是默认做法,也是问题所在:它们有效期长、共享范围广且难以轮换。
动态机密按需生成、对单个使用者唯一,并会自动过期。保险库不会存储密码,而是每次有人请求时都创建全新的凭据。
这一项改变解决了机密管理中最棘手的问题:轮换变得自动化,任何泄露造成的影响范围也会缩小到接近于零。
动态机密的工作原理
动态机密要求保险库对后端系统拥有特权访问权限。以数据库为例,流程如下:
- 管理员使用根数据库凭据和创建模板配置保险库。
- 应用程序进行身份验证并请求凭据。
- 保险库在数据库上运行
CREATE USER,返回一个全新的用户名和密码。 - 租约到期后,保险库会自动运行
DROP USER。
应用程序永远不会看到长期有效的密码,而是获得一个与其身份和租约关联的临时密码。
# Configure Vault's database engine with a creation statement
vault write database/roles/billing-readonly \
db_name=appdb \
creation_statements="CREATE ROLE \"{{name}}\" LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON billing TO \"{{name}}\";" \
default_ttl="1h" max_ttl="24h"请求动态凭据
应用程序需要访问数据库时,会向保险库请求凭据。响应包含一个全新创建且唯一的用户名和密码,以及一份说明其有效时长的租约。
每个使用者都会获得自己的凭据。如果同一服务的两个实例启动,它们会收到两个不同的用户名,从而可以在数据库层面进行按使用者审计。
vault read database/creds/billing-readonly
# Example response:
# lease_id database/creds/billing-readonly/abc123
# lease_duration 1h
# password A1b-2Cd3-temp-xyz
# username v-approle-billing-9f3a2租约:生存时间契约
租约是一份契约,规定该机密在多长时间内有效。每个动态机密都带有一个TTL(生存时间)和一个可选的最大 TTL。
- 默认有效期:凭据在过期前可以存续的时间。
- 最大有效期:即使续期也不能超过的绝对上限。
租约到期后,保险库会撤销凭据,并主动删除数据库用户。过期不只是一个标志,它还会触发实际的清理操作。这正是泄露的动态机密能够自我修复的原因:被盗凭据在 TTL 时间窗口内就会失效。
续期与撤销租约
运行时间超过租约期限的长期运行应用程序必须在到期前续期。续期会将 TTL 延长至最大 TTL,超过该上限后,应用程序必须请求新的凭据。
运维人员也可以立即撤销租约,这相当于安全事件中的紧急停止开关。撤销租约会立即删除底层凭据,无论剩余 TTL 多长。
您甚至可以撤销某个前缀下的所有租约,从而立即切断整个服务或环境的访问。
# Renew a lease before it expires
vault lease renew database/creds/billing-readonly/abc123
# Revoke a single lease immediately (incident kill switch)
vault lease revoke database/creds/billing-readonly/abc123
# Revoke every lease under a path prefix
vault lease revoke -prefix database/creds/billing-readonly超越数据库
动态机密并不局限于数据库。保险库及类似工具可以为许多系统生成短期凭据:
- 云 IAM:通过类似 STS 的承担角色机制生成临时 AWS/GCP/微软云访问密钥。
- SSH:使用经过签名的短期 SSH 证书,而不是静态密钥。
- PKI/TLS:按需签发有效期较短的证书。
- RabbitMQ、MongoDB、服务发现系统:生成临时服务凭据。
到处都遵循同一种模式:请求、短暂使用、自动过期。静态的长期云密钥是造成泄露的常见来源;动态 IAM 凭据可以消除这类密钥。
# Generate temporary AWS credentials scoped to a role
vault read aws/creds/deploy-role
# returns short-lived access_key, secret_key, security_token
# Sign an SSH key for short-lived access (valid minutes, not forever)
vault write ssh/sign/admin public_key=@id_ed25519.pub ttl=15m动态机密为何能缩小影响范围
请分别考虑两种模型下凭据泄露的情况:
- 静态机密:密码会一直有效,直到人工发现问题、轮换密码并更新所有使用者。暴露窗口可能持续数天或数月。
- 动态机密:凭据会在其 TTL 内过期(通常为几分钟到一小时),并且仅分配给一个使用者,权限也极少。暴露窗口很短,损害范围受到控制。
动态机密将痛苦的手动轮换项目转变为系统的一项自动、持续的特性。
根凭据的权衡
动态机密功能强大,但要求保险库为每个后端系统持有一个权限极高的根凭据,以便创建它所签发的用户。这会将风险集中到保险库中。
缓解措施:
- 轮换根凭据本身,这样即使保险库也不会一直保留原始管理员密码。
- 将根账户的权限限制为创建和删除用户所必需的权限,不得授予更多权限。
- 严格隔离并监控保险库主机,因为它现在已成为高价值目标。
保险库可以轮换自己的根凭据,因此完成设置后,任何人类用户都不必知道它。
# After configuring the engine, rotate the root credential
# so even operators no longer know the original password
vault write -force database/rotate-root/appdb在应用程序代码中处理过期
应用程序必须编写为能够预期凭据发生变化。使用静态机密时,代码会在启动时读取一次密码。使用动态机密时,代码必须:
- 获取凭据,并记录其租约 TTL。
- 续期租约,或在过期前重新获取新凭据。
- 旧凭据被撤销后,平稳地重新建立连接。
一种常见模式是使用边车代理处理租约生命周期,并重写本地机密文件,这样应用程序只需重新加载其配置。还必须刷新连接池,以免它们继续使用已过期的凭据。
# Vault Agent auto-renews and re-templates on rotation
auto_auth { method "approle" { ... } }
template {
contents = "{{ with secret \"database/creds/billing-readonly\" }}{{ .Data.username }}:{{ .Data.password }}{{ end }}"
destination = "/run/secrets/db"
command = "systemctl reload billing-app"
}静态机密不可避免时
并非每个机密都能动态生成。有些第三方 API 只提供一个无法按需生成的长期密钥。对于这些静态机密,请采取补偿性控制措施:
- 将其存储在保险库中,绝不要写入代码。
- 将其权限限制为最小权限。
- 按照计划进行轮换(下一课将介绍)。
- 监控其使用情况,检查异常。
经验法则是:优先使用动态机密;如果不得不使用静态机密,就坚持不懈地进行轮换和审计。
持续集成与持续交付中的动态机密
持续集成与持续交付流水线是动态机密的典型使用场景。传统上,流水线会持有长期有效的部署密钥,因而容易成为攻击目标。使用动态机密后,流水线会:
- 使用其 OIDC 身份向保险库进行身份验证(例如 GitHub 自动化任务的 OIDC 令牌)。
- 请求仅在任务运行期间有效的短期云凭据。
- 在任务结束时让这些凭据自动过期。
系统中不会存在任何长期有效的部署密钥。即使流水线遭到入侵,其日志泄露的凭据在任何人读取日志时也已经失效。
# GitHub Actions job exchanges its OIDC token for a short-lived AWS role
# No static AWS keys stored as repo secrets
permissions:
id-token: write
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123:role/deploy
aws-region: eu-central-1快速检查
请检验您对租约和动态机密的理解。
回顾:动态机密与租约
您已经了解了短期且自动过期的凭据如何改变机密管理。
- 动态机密按需生成、对每个使用者唯一,并会自动过期,不同于重复使用的静态机密。
- 租约定义 TTL 和最大 TTL;到期时,保险库会撤销凭据并执行实际清理。
- 长期运行的应用程序可以续期租约,也可以将其立即撤销,作为安全事件中的紧急停止开关。
- 动态机密适用于数据库、云 IAM、SSH、PKI 等场景,可以缩小影响范围并自动执行轮换。
- 代价是保险库中需要保存一个权限较高的根凭据,因此应轮换它并严格限制其权限。
- 应用程序和持续集成与持续交付流程必须能够处理过期情况;应优先使用动态机密,并在无法避免使用静态机密时进行轮换。
接下来,我们将介绍如何轮换密钥,以及如何检测侥幸未被阻止的泄露。
常见问题解答
「动态机密信息与租约」课时是免费的吗?
是的 — 「动态机密信息与租约」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「动态机密信息与租约」这节课中我会学到什么?
短期有效且自动过期的凭据。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「动态机密信息与租约」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。