TL;DR:使用 Kubernetes Pod 从 Vault CLI 登录的正确方法是什么Kubernetes 身份验证方法。
我想从我的 HashiCorp Vault Raft 存储中创建定期快照。因此,我创建了一个 Kubernetes CronJob,运行与我的 Vault 集群相同的映像,并按计划执行以下命令:
vault operator raft snapshot save /backups/daily-$(date +"%Y-%m-%d-%H-%M").snap
/backups
是挂载到 Pod 的持久卷。
当然,Pod 需要通过 Vault 进行身份验证。我有Kubernetes 身份验证方法已启用。CronJob/Job 创建的 Pod 使用服务帐户运行vault-backups
。因此,我向 Vault 添加了一个角色,该角色绑定到命名空间中的vault_backups
服务帐户,并为其分配了一条新策略,内容如下:vault-backups
vault
raft_snapshots_read
path "/sys/storage/raft/snapshot"
{
capabilities = ["read"]
}
对于实际登录我目前正在执行以下操作:
export VAULT_TOKEN=$(vault write auth/kubernetes/login \
role=vault_backups \
jwt=$(cat /run/secrets/kubernetes.io/serviceaccount/token) |\
grep -w token |\
awk '{print $2}')
此命令现在使用服务帐户的 JWT 令牌vault-backups
以角色登录。它返回包含令牌的vault_backup
格式化输出(默认情况下)。我 grep 并解析包含令牌的行以将其保存到。table
VAULT_TOKEN
之后raft snapshot save
命令成功执行并且我已将快照保存到卷中。
解决方案有效,但我不确定这是否是正确的方法。首先,解析输出感觉有点奇怪。特别是因为有命令vault login
。但vault login -method kubernetes
它失败了:
未知身份验证方法:kubernetes。使用“vault auth list”查看完整的身份验证方法列表。此外,某些身份验证方法仅可通过 HTTP API 获得。
vault auth list
包含类型条目kubernetes
,因此我认为它是仅通过 HTTP API 提供。
我知道有选项可以将输出作为vault write auth/kubernetes/login
JSON,但 a) 容器中没有安装任何可以解析 JSON 的东西(如jq
)并且 b) 这仍然是一个两步过程,其中包括解析结果。这只是更加结构化然后。
那么有没有更好的方法实现登录呢?
提前致谢!
答案1
在浏览其他教程时,我发现有一个参数-field=<FIELD NAME>
,可用于过滤vault write
特定字段的输出。
现在登录信息如下:
export VAULT_TOKEN=$(vault write -field=token auth/kubernetes/login \
role=vault_backups \
jwt=$(cat /run/secrets/kubernetes.io/serviceaccount/token))
不管怎么说,多谢拉。