Hashicorp Vault:通过 CLI 和 API 的令牌管理
Source: Dev.to
介绍
在与 HashiCorp Vault 交互时,令牌是进行身份验证和授权的手段。令牌由不同的引擎提供,并关联策略和角色,赋予对 Vault 按路径受控功能的访问权限。
本文详细说明了令牌管理的所有 CLI 与 API 选项,并提供了多个动手示例命令,演示如何创建具有特定属性的令牌。背景材料来源于官方 HashiCorp Vault 文档中关于 token CLI 命令和 Token 认证方法(API)的说明。
令牌生命周期
- 创建 – 通过认证方法、向已定义的密钥存储发出
vault write命令,或通过命令行创建令牌。静态信息和元数据会随令牌一起存储。 - 更新 – 令牌唯一可更新的值是其过期日期。如果令牌可续期、仍然有效且未超过显式定义的
max-ttl,则可以续期。新的过期时间为当前时间加上其定义的 TTL。 - 过期 / 撤销 – 除根令牌外,所有令牌在其 TTL 到期或被撤销后即失效。其关联的数据会被删除,任何与该令牌绑定的租约也会被移除。
Vault 令牌命令组
vault token 命令组实现了与令牌生命周期相对应的交互:
| Command | Description |
|---|---|
create | 在当前令牌的上下文中创建新令牌(在成功执行 vault login 后隐式存储,或通过 VAULT_TOKEN 设置)。 |
capabilities | 打印特定路径的令牌能力(策略查询)。 |
lookup | 显示关于令牌或令牌访问器的全部信息。 |
renew | 续期尚未过期且未超出使用限制的令牌。 |
revoke | 立即撤销令牌,阻止其进一步使用。子令牌也会被撤销。 |
注意: 令牌值长度为 92 个字符,但在下面的示例中仅显示前 8 个字符。
vault token create
在当前令牌的上下文中实例化一个受管理的新令牌。默认情况下,会生成一个子令牌,拥有与父令牌相同的策略。策略可以被限制但不能被扩展;父令牌必须具备足够的权限。可以显式指定 TTL 来创建可续期的令牌;否则令牌不可续期。无论哪种情况,max-ttl 都限制了最大有效时间范围。
可用标志
类型
-type– 创建 service(服务)或 batch(批处理)令牌。
能力
-orphan– 移除与用于创建的令牌的关联。生成的令牌独立存在,可作为其他令牌的父令牌。-renewable– 令牌默认可续期;使用此标志可禁用续期。
访问控制
-policy– 将指定策略附加到令牌。多次使用该标志可附加多个策略。-role– 为令牌分配角色(特定于认证的数据结构),继承角色中定义的所有属性。
有效期
-explicit-max-ttl– 为令牌设置一个绝对、不可扩展的持续时间。-period– 当续期时延长令牌 TTL 的时长(周期性令牌)。-ttl– 初始 TTL 值。若省略,则使用引擎或 Vault 基础配置的 TTL。-use-limit– 令牌可用于执行操作的绝对次数。
标识
-id– 提供自定义令牌 ID(默认是随机的 92 字符 base62 字符串)。-display-name– 人类可读的元数据。-entity-alias– 将令牌链接到已定义的别名(必须在allowed_entity_aliases中被允许)。-metadata– 用于标识的额外键值对(可重复)。
示例创建
多策略令牌
vault token create -policy=secret-management -policy=kv2-management
日志输出
| Key | Value |
|---|---|
| accessor | 32OK6kKt2rk7mw4jQ0ZbXT3E |
| creation_time | 1753526225 |
| creation_ttl | 0s |
| display_name | root |
| entity_id | n/a |
| expire_time | |
| explicit_max_ttl | 0s |
| id | hvs.HTMdJOhL |
| meta | |
| num_uses | 0 |
| orphan | true |
| path | auth/token/root |
| policies | [root] |
| ttl | 0s |
| type | service |
带有限续期的周期性令牌
vault token create -policy=secret-management -period=24h -use-limit=10
日志输出
| Key | Value |
|---|---|
| accessor | inIuUf1uTkYjxHBxOOVg442Q |
| creation_time | 1755334894 |
| creation_ttl | 24h |
| display_name | token |
| entity_id | n/a |
| expire_time | 2025-08-17T11:01:34.540229+02:00 |
| explicit_max_ttl | 0s |
| id | hvs.CAESIOam |
| issue_time | 2025-08-16T11:01:34.540235+02:00 |
| meta | |
| num_uses | 10 |
| orphan | false |
| path | auth/token/create |
| period | 24h |
| policies | [default secret-management] |
| renewable | true |
| ttl | 23h59m39s |
| type | service |
批处理令牌
vault token create -policy=kv2-management -type=batch -ttl=1h
日志输出
| Key | Value |
|---|---|
| accessor | n/a |
| creation_time | 1755335083 |
| creation_ttl | 1h |
| display_name | token |
| entity_id | n/a |
| expire_time | 2025-08-16T12:04:43+02:00 |
| explicit_max_ttl | 0s |
| id | hvb.AAAAAQLX |
| issue_time | 2025-08-16T11:04:43+02:00 |
| meta | |
| num_uses | 0 |
| orphan | true |
| path | auth/token/create |
| policies | [default kv2-management] |
| renewable | false |
| ttl | 59m45s |
| type | batch |
带显式 Max TTL 的孤儿令牌
vault token create -policy=kv2-management -orphan -explicit-max-ttl=24h
日志输出
| Key | Value |
|---|---|
| accessor | aiLPJrzGBU0lC1QdKDN1gHak |
| creation_time | 1755335696 |
| creation_ttl | 24h |
| display_name | token |
| entity_id | n/a |
| expire_time | 2025-08-17T11:14:56.773281+02:00 |
| explicit_max_ttl | 24h |
| id | hvs.CAESIIpt |
| issue_time | 2025-08-16T11:14:56.77329+02:00 |
| meta | |
| num_uses | 0 |
| orphan | true |
| path | auth/token/create |
| policies | [default kv2-management] |
| renewable | true |
| ttl | 23h59m44s |
| type | service |
vault token lookup
显示关于令牌的所有运行时信息和元数据,包括创建时间、过期时间戳、类型、关系、附加的策略以及访问路径。令牌可以直接使用其值或使用访问器来指定。
vault token lookup $TOKEN
日志输出(示例)
| Key | Value |
|---|---|
| accessor | e1FpV6OfhwrqwE8LWF0pldTN |
| creation_time | 1755361260 |
| creation_ttl | 1h |
| display_name | token |
| entity_id | n/a |
| expire_time | 2025-08-16T18:52:24.218038+02:00 |
| explicit_max_ttl | 24h |
| id | hvs.CAESIPEd |
| issue_time | 2025-08-16T17:52:24.218038+02:00 |
| … | … |
(为简洁起见,省略了其他字段。)