You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何审计HashiCorp Vault实例,获取用户所属角色/组的命名空间明细?

HashiCorp Vault 按命名空间审计用户-角色/组关联的可行方案

一、Postman 实现方案

Postman完全可以实现需求,核心是直接调用Vault的原生API完成数据采集,步骤如下:

  • 配置认证与命名空间:
    1. 通过Vault认证接口获取有效token(例如userpass方式调用 POST /v1/auth/userpass/login/<username>)。
    2. 在Postman中设置全局请求头:X-Vault-Token: <你的Vault Token>,若目标是特定命名空间,额外添加 X-Vault-Namespace: <目标命名空间>。
  • 获取所有实体列表:
    发送GET请求到 {{VAULT_ADDR}}/v1/identity/entity/id,返回结果中的keys字段包含所有实体ID。
  • 查询实体关联的组与角色:
    对每个实体ID,发送GET请求到 {{VAULT_ADDR}}/v1/identity/entity/id/<entity-id>:
    • groups字段返回该实体关联的组ID列表;
    • 若需获取认证角色(如userpass/ldap角色),可调用对应认证方法的列表接口(例如userpass的 GET /v1/auth/userpass/roles),再关联用户对应的角色信息。
  • 遍历所有命名空间:
    发送GET请求到 {{VAULT_ADDR}}/v1/sys/namespaces获取所有命名空间列表,逐个切换X-Vault-Namespace请求头,重复上述实体查询流程。

二、HVAC 实现方案(纠正误解:HVAC完全支持该需求)

你之前的初步研究可能有误,HVAC作为官方推荐的Python客户端,完全可以实现该审计需求。以下是极简实现示例:

import hvac

# 初始化Vault客户端
client = hvac.Client(url="http://your-vault-server:8200", namespace="default")
client.token = "your-valid-vault-token"

# 获取当前命名空间下的所有实体ID
entities = client.secrets.identity.list_entities()["data"]["keys"]

# 遍历实体,提取关联信息
for entity_id in entities:
    entity_data = client.secrets.identity.read_entity(entity_id=entity_id)["data"]
    print(f"实体名称: {entity_data['name']}")
    print(f"关联组ID: {entity_data['groups']}")
    print(f"直接绑定的策略: {entity_data['policies']}\n")

# 遍历所有命名空间的扩展逻辑
namespaces = client.sys.list_namespaces()["data"]["keys"]
for ns in namespaces:
    # 切换到目标命名空间
    client.namespace = ns.rstrip("/")
    # 重复上述实体查询流程
    ns_entities = client.secrets.identity.list_entities()["data"]["keys"]
    for entity_id in ns_entities:
        # 处理实体数据...
        pass

若需获取认证方法对应的角色,可调用对应模块的接口(例如userpass角色列表:client.auth.userpass.list_roles()),再通过实体的alias字段关联到具体角色。

三、Vault CLI + Shell脚本 实现方案

如果偏好运维原生工具,可结合Vault CLI与shell脚本快速完成审计:

# 登录Vault(若未登录)
vault login <your-vault-token>

# 遍历所有命名空间
for ns in $(vault list -format=json sys/namespaces | jq -r '.[]'); do
    echo "===== 命名空间: $ns ====="
    # 切换到目标命名空间
    vault namespace select $ns
    # 获取当前命名空间下的所有实体ID
    for entity_id in $(vault list -format=json identity/entity/id | jq -r '.[]'); do
        # 查询实体详情并提取关键信息
        vault read -format=json identity/entity/id/$entity_id | jq '{name: .data.name, groups: .data.groups, policies: .data.policies}'
    done
done

该方案适合快速批量导出数据,无需额外依赖开发环境。

内容的提问来源于stack exchange,提问作者hitman126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:20:46