HashiCorp Vault Python hvac读取

7
我希望能够使用Python从pod中读取我的密码。我尝试了以下代码:
import os
import hvac
f = open('/var/run/secrets/kubernetes.io/serviceaccount/token')
jwt = f.read()
client = hvac.Client()
client = hvac.Client(url='https://vault.mydomain.internal')
client.auth_kubernetes("default", jwt)
print(client.read('secret/pippo/pluto'))

我相信secret/pippo/pluto是存在的。

我确信我的身份已经得到了正确的认证。

但每次打印时,我总是收到“None”的回答。

我应该从哪里入手解决这个问题呢?

非常感谢。


尝试检查在验证到Vault后是否获得了Vault令牌,使用该令牌并查看自己是否可以获取机密(Vault CLI或HTTP请求)。 - Amityo
可能与版本有关吗?我在CLI中遇到了类似的问题。如果我使用:Vault v0.10.1('756fdc4587350daf1c65b93647b2cc31a6f119cd'),我会收到:“data”:null的消息。 如果我使用:Vault v0.10.0('5dd7f25f5c4b541f2da62d70075b6f82771a650d'),则一切正常。是否有办法更改Python库的版本? - marianna cattani
使用pip安装最新版本。 - Amityo
不是7.2吗? root@pods:/# pip3 list 包名 版本号
hvac 0.7.2
- marianna cattani
@mariannacattani,看起来在0.10.0和0.10.1版本之间关于kv后端的一些重要更改。请参阅更改日志:https://github.com/hashicorp/vault/blob/master/CHANGELOG.md#0101097-april-25th-2018 我建议您使用client.seal_status检查服务器运行的版本是什么。 - bagljas
4个回答

7
如果您从Vault中读取KV值,您需要挂载点(Mount Point)和路径(Path)。 例如:
            vault_client.secrets.kv.v1.read_secret(
                path=path,
                mount_point=mount_point
            )

如何找到挂载点的名称? - Dmitry Polovinkin

2

就像@shawn在上面提到的那样,下面的命令对我也有效

import hvac
vault_url = 'https://<vault url>:8200/'
vault_token = '<vault token>'
ca_path = '/run/secrets/kubernetes.io/serviceaccount/ca.crt'  
secret_path = '<secret path in vault>'

client = hvac.Client(url=vault_url,token=vault_token,verify= ca_path)
client.is_authenticated()

read_secret_result = client.read(secret_path)
print(read_secret_result)
print(read_secret_result['data']['username'])
print(read_secret_result['data']['password'])

注意: ca_path 是Pod存储K8s CA的位置,通常应该在 "/run/secrets/kubernetes.io/serviceaccount/ca.crt" 下找到。


2

我在我的K8s Python3 Pod中尝试了您提供的方法,我成功地获取了Vault密钥数据。

您需要在hvac.Client中指定正确的vault token参数,并禁用client.auth_kubernetes方法。

试一下,并记住您的代码应该在K8s Python容器中运行,而不是在您的主机上运行。

import hvac

f = open('/var/run/secrets/kubernetes.io/serviceaccount/token')
jwt = f.read()
print("jwt:", jwt)
f.close()
client = hvac.Client(url='http://vault:8200', token='your_vault_token')
# res = client.auth_kubernetes("envelope-creator", jwt)
res = client.is_authenticated()
print("res:", res)
hvac_secrets_data_k8s = client.read('secret/data/compliance')
print("hvac_secrets_data_k8s:", hvac_secrets_data_k8s)

以下是结果:

92:qfedu shawn$ docker exec -it 202a119367a4 bash
airflow@airflow-858d8c6fcf-bgmwn:~$ ls
airflow-webserver.pid  airflow.cfg  config  dags  logs  test_valut_in_webserver.py  unittests.cfg  webserver_config.py
airflow@airflow-858d8c6fcf-bgmwn:~$ python test_valut_in_webserver.py
jwt: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia
res: True
hvac_secrets_data_k8s: {'request_id': '80caf0cb-8c12-12d2-6517-530eecebd1e0', 'lease_id': '', 'renewable': False, 'lease_duration': 0, 'data': {'data': {'s3AccessKey': 'XXXX', 's3AccessKeyId': 'XXXX', 'sftpPassword': 'XXXX', 'sftpUser': 'XXXX'}, 'metadata': {'created_time': '2020-02-07T14:04:26.7986128Z', 'deletion_time': '', 'destroyed': False, 'version': 4}}, 'wrap_info': None, 'warnings': None, 'auth': None}

如果我不想使用Vault令牌怎么办?只使用服务账户令牌获取机密是否可行? - Sai Prasad Goud

1
我发现使用hvac进行身份验证更容易,然后直接使用API
可以跳过此步骤,使用root/dev token进行测试。
import hvac as h
client = h.Client(url='https://<vault url>:8200/')
username = input("username")
import getpass
password = getpass.getpass()
print(client.token)
del username,password

获取挂载列表
import requests,json

vault_url = 'https://<vault url>:8200/'
vault_token = '<vault token>'

headers = {
    'X-Vault-Token': vault_token
}

response = requests.get(vault_url+'v1/sys/mounts', headers=headers)
json.loads(response.text).keys() #The ones ending with / is your mount name

然后获取密码(必须先创建一个密码)

mount = '<mount name>'
secret = '<secret name>'
response = requests.get(vault_url+'v1/'+mount+'/'+secret, headers=headers)
response.text

要获取由root创建的密码的用户名/密码访问权限,您需要在JSON中的策略下添加路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接