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

关于Vault Agent自动生成过期AppRole Secret ID及部署的技术咨询

问题

我在应用Docker镜像构建阶段通过Jenkins注入HashiCorp Vault的Role ID和Secret ID,之后Vault Agent读取这些信息连接Vault,通过模板向应用传递密钥。现咨询:

  1. 当Secret ID过期后,Vault Agent是否会自动生成新的Secret ID?还是需要通过Jenkins定期结合Ansible注入新的Secret ID?
  2. 我使用Ansible部署应用,但无法找到在运行时向HashiCorp Vault Agent安全传递Secret ID的方法,缺少Secret ID容器无法启动。

以下是我的相关配置:

Jenkinsfile

stage('vault') {
    steps {
        dir ("./vault"){
            withCredentials([string(credentialsId: 'vault_django_role_id', variable: 'role_id'), string(credentialsId: 'vault_django_secret_id', variable: 'secret_id')]) {
                sh 'echo $role_id > django-role_id'
                sh 'echo $secret_id > django-secret_id'
            }
            sh 'docker build -t crns-vault:latest .'
        }
    }
}

Vault服务器配置命令

数据库密钥配置

vault write postgres/config/crns \
    plugin_name="postgresql-database-plugin" \
    allowed_roles="django" \
    connection_url="postgresql://{{username}}:{{password}}@192.168.5.6:5432/crns" \
    username="admincrns" \
    password="crns@123"

vault write postgres/creds/django \
  db_name="crns" \
  creation_statements=CREATE ROLE "{{name}}" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT all ON ALL TABLES IN SCHEMA public TO "{{name}}"; \
  default_ttl="30s" \
  max_ttl="24h"

AppRole配置命令

vault write auth/approle/role/django token_policies="django"

vault read auth/approle/role/django/role-id

vault write -f auth/approle/role/django/secret-id

Vault Agent配置

pid_file = "./pidfile"

auto_auth {
  method {
    type = "approle"

    config = {
      role_id_file_path = "/vault-agent/django-role_id"
      secret_id_file_path = "/vault-agent/django-secret_id"
      remove_secret_id_file_after_reading = false
    }
  }

  sink {
    type = "file"
    config = {
      path = "/vault-agent/token"
    }
  }
}

template {
  source = "/vault-agent/secrets.tpl"
  destination = "/usr/share/django/secrets/.env"
}

cache {
  use_auto_auth_token = true
}

listener "tcp" {
    address = "0.0.0.0:8200"
    tls_disable = true
}

secrets.tpl模板

{{ with secret "postgres/creds/django" -}}

DB_USER={{ .Data.username }}

DB_PASSWORD={{ .Data.password }}

{{- end }}

{{ with secret "kv/django/static" -}}

DB_ENGINE={{ .Data.data.DB_ENGINE }}

DB_DATABASE={{ .Data.data.DB_DATABASE }}

DB_HOST={{ .Data.data.DB_HOST }}

DB_PORT={{ .Data.data.DB_PORT }}

{{- end }}

我是Vault新手,了解到Secret ID应为动态生成,想确认Vault Agent是否会自动处理Secret ID更新,还是需要手动通过每日Ansible周期任务来处理?同时请指出当前配置中的不推荐做法。


回答

关于Secret ID过期后的更新问题

你的当前配置下,Vault Agent不会自动生成新的Secret ID。原因是你使用的是静态Secret ID(提前生成并写入镜像),Agent的AppRole认证方式默认只会读取指定文件中的Secret ID,没有自动轮换能力。

如果要实现Secret ID自动轮换,需要调整AppRole和Agent的配置:

  1. 启用AppRole的Secret ID轮换:创建AppRole时添加secret_id_num_uses和secret_id_ttl参数,让Secret ID自动过期,同时允许Agent通过Role ID生成新的Secret ID(需给该Role绑定对应权限)。示例命令:
    vault write auth/approle/role/django \
      token_policies="django" \
      secret_id_ttl="24h" \
      secret_id_num_uses="100" \
      secret_id_rotate=true
    
  2. 修改Vault Agent的AppRole认证配置:去掉secret_id_file_path,保留role_id_file_path(或直接配置role_id),并开启generate_secret_id=true。这样Agent会自动向Vault请求生成新的Secret ID,无需手动注入。示例配置片段:
    auto_auth {
      method {
        type = "approle"
        config = {
          role_id_file_path = "/vault-agent/django-role_id"
          generate_secret_id = true
          secret_id_ttl = "24h"
        }
      }
    }
    

如果不想改动现有AppRole配置,确实需要通过Jenkins+Ansible定期生成新的Secret ID并注入运行环境,但这会增加运维复杂度,并非推荐方案。

当前配置中的不推荐做法

  • 将Secret ID打包进Docker镜像:构建阶段把Secret ID写入文件并打包进镜像,会导致镜像本身携带敏感信息,一旦镜像泄露,Secret ID就会被窃取;且Secret ID过期后必须重新构建镜像才能更新,完全违背动态密钥的设计理念。
  • 禁用TLS的Listener配置:Agent的Listener开启tls_disable = true,明文传输数据存在被窃听风险,生产环境必须启用TLS加密。
  • 静态存储Secret ID:手动生成固定的Secret ID,未启用自动轮换,一旦Secret ID泄露,攻击者可长期利用该身份访问Vault。
  • 数据库管理员密码硬编码:在Vault的PostgreSQL配置中直接硬编码password="crns@123",该敏感信息应存储在Vault的KV引擎中,而非明文写在配置命令里。

运行时安全传递Secret ID的替代方案

如果暂时无法启用自动生成Secret ID,可通过以下方式在运行时传递Secret ID,避免打包进镜像:

  • 使用Docker secrets:将Secret ID存储为Docker secret,容器运行时挂载到/vault-agent/django-secret_id路径,Agent读取该文件即可。
  • 使用环境变量:通过Ansible部署时,从Jenkins或Vault直接获取最新的Secret ID,作为环境变量注入容器(注意:环境变量可能被容器内进程读取,安全性略低于Docker secrets)。
  • 使用Vault Agent Injector:若为K8s环境,可使用Vault Agent Injector自动注入Secret ID和Role ID,无需手动处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:57:14