【问题标题】:HashiCorp Vault Python hvac readHashiCorp Vault Python hvac 读取
【发布时间】:2019-07-28 13:21:15
【问题描述】:

我想用 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 存在。

我确定我已通过正确的身份验证

但我的打印结果总是“无”。

我在哪里可以解决这个问题?

非常感谢

【问题讨论】:

  • 尝试检查您是否在通过保险库身份验证后获得保险库令牌,使用令牌并查看您是否可以自己获取机密(保险库 cli 或 http 请求)
  • 会不会和版本有关?我对 CLI 有类似的问题。如果我使用:Vault v0.10.1 ('756fdc4587350daf1c65b93647b2cc31a6f119cd') 我收到:"data": null 相反,如果我使用:Vault v0.10.0 ('5dd7f25f5c4b541f2da62d70075b6f82771a650d'),一切正常。有没有办法改变 pyhton 库版本?
  • 用pip安装最新版本
  • 不是 7.2 吗? root@pods:/# pip3 list 软件包版本 ----- --------- hvac 0.7.2
  • @mariannacattani 版本 0.10.0 和 0.10.1 之间似乎有一些关于 kv 后端的重大变化,请参阅更改日志:github.com/hashicorp/vault/blob/master/… 我建议检查您的服务器运行的版本@ 987654324@

标签: python-3.x hashicorp-vault


【解决方案1】:

如果你从 Vault 读取 KV 值,你需要 Mount Point 和 Path。 示例:

            vault_client.secrets.kv.v1.read_secret(
                path=path,
                mount_point=mount_point
            )

【讨论】:

    【解决方案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}
    

    【讨论】:

    • 如果我不想使用保险库令牌怎么办?是否可以仅使用服务帐户令牌获取机密?
    【解决方案3】:

    正如上面提到的@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”下找到

    【讨论】:

      【解决方案4】:

      我发现使用 hvac 进行身份验证更容易,然后使用 API directly

      可以跳过这个并使用 root/dev 令牌进行测试

      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 中添加路径。

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 2017-01-20
        • 2018-07-25
        • 1970-01-01
        • 2021-04-18
        • 1970-01-01
        • 2017-09-07
        • 2017-05-16
        • 2017-12-18
        相关资源
        最近更新 更多