2

我正在用 Python 编写一个方法,该方法接受引擎名称,并列出目录中的所有子目录和机密。我一直在玩 hvac,我已经能够使用以下命令列出特定目录中的所有秘密:

client = hvac.Client()
client = hvac.Client(
  url=os.environ['VAULT_URL'],
  token=os.environ['VAULT_TOKEN']
)

path='myDirectory'
mount_point='myEngine'
response=client.secrets.kv.read_secret_version(
  path=path,
  mount_point=mount_point
)

print(response['data']['data'])

如前所述,这确实成功了,并且确实输出了指定路径内的内容,但是如果我想列出 中的所有内容mount_point,我已经找到了说我应该使用的答案list_secrets,但我似乎无法开始list_secrets工作也没有指定 a path

我尝试了以下方法,但收效甚微。

mount_point = 'myEngine'
list_response = client.secrets.kv.v2.list_secrets(
  path=mount_point
)

list_folders = list_response['data']['keys']
print(list_folders)

这显然不起作用,但如果我同时给它path和,它确实有效mount_point,但这给了我路径的内容,我需要引擎中的所有内容。

我知道给它mount_pointfor 路径似乎很奇怪,但我真的想不出还有什么办法来列出整个路径,而且我mount_point看到过看起来与此类似的旧示例。

有没有一种方法可以像我想要的那样以 JSON 格式获取输出,或者甚至可以列出引擎本身内部的所有内容(递归),然后自己构建 json 会很棒。

4

2 回答 2

2

您可以使用该client.adapter.request()功能来实现您的目标。将挂载名称传递给以下调用:

client.adapter.request("GET", "v1/<mount name>/metadata/?list=1")

这将返回 JSON,您可以对其进行解析以获取您要查找的密钥。下面的示例 JSON:

{'request_id': '16fedd1b-50b3-f46a-44c7-22d0a0c8edef', 'lease_id': '', 'renewable': False, 'lease_duration': 0, 'data': {'keys': ['test', 'test2']},'wrap_info':无,'警告':无,'auth':无}

上面的输出对应于 Vault UI 中的以下视图:

密钥的 Vault UI 视图

于 2021-09-10T08:47:51.147 回答
0

您可以使用以下内容递归地列出所有使用 hvac 的机密。

def list_secrets(client, path=None, mount_path=None):
    list_response = client.secrets.kv.v2.list_secrets(
        path=path,
        mount_point=mount_path
    )

    return list_response


def list_all_secrets(client, global_path_list, path=None, mount_path=None):
    if mount_path is None:
        pass

    if path is None:
        try:
            response = list_secrets(client, mount_path=mount_path)
        except VaultError:
            return
    else:
        response = list_secrets(client, mount_path=mount_path, path=path)

    keys = response['data']['keys']

    for key in keys:
        if key[-1] == "/":
            if path is not None:
                _path = path + key
            else:
                _path = key
            list_all_secrets(client, global_path_list, mount_path=mount_path, path=_path)
        else:
            _temp = path + key

            if _temp is None:
                pass
            else:
                global_path_list.append(_temp)

    return global_path_list

global_path_list = []

secrets_list = list_all_secrets(client, global_path_list, 'myDirectory/', 'myEngine/')

print(secrets_list)
于 2021-11-30T03:15:28.903 回答