保险库不支持完全未经身份验证的访问。令牌从根本上与保险库如何向最终用户(包括运营商)公开有关。
没有办法绕过它,最终结果中将涉及令牌,因此令牌到期,撤销和更新。使用周期性令牌是最简单的方法。
»定期令牌
在某些情况下,撤销令牌会在很长一段时间内出现问题 [...]。在这种情况下,可以使用周期性令牌。可以通过以下几种方式创建定期令牌:
- 通过 [...]带有
auth/token/create
端点的根令牌
[...] 只要令牌在这些时间段内成功更新,它就永远不会过期。在根令牌之外,它是目前 Vault 中令牌拥有无限生命周期的唯一方式。
鉴于将为此使用根令牌,创建令牌包括“公共”访问的最后一个生活质量功能,即设置已创建令牌的令牌 id 的能力。
»创建代币
创建一个新令牌。某些选项仅在由根令牌调用时可用。
“参数
id
( string: ""
) – 客户端令牌的 ID。只能由根令牌指定。提供的 ID 可能不包含.
字符。否则,令牌 ID 是随机生成的值。
创建令牌时,它需要附加一个策略,否则它会继承创建它的令牌的范围。对于根令牌,这是不可取的。创建策略并将其绑定到令牌包括一个特殊的内置策略来简化令牌生命周期任务,即默认令牌策略。
»默认政策
默认策略是无法删除的内置 Vault 策略。默认情况下,它附加到所有令牌,但可以通过支持身份验证方法在令牌创建时明确排除。
[...]
要查看 Vault 安装的默认策略授予的所有权限,请运行:
$ vault read sys/policy/default
要禁用默认策略的附加:
$ vault token create -no-default-policy
需要禁用此默认策略,因为它允许令牌所有者访问auth/token/revoke-self
,并破坏令牌被所有人使用的能力。
$ vault read sys/policy/default -format=table
Key Value
--- -----
name default
rules # Allow tokens to look up their own properties
path "auth/token/lookup-self" {
capabilities = ["read"]
}
# Allow tokens to renew themselves
path "auth/token/renew-self" {
capabilities = ["update"]
}
# Allow tokens to revoke themselves
path "auth/token/revoke-self" {
capabilities = ["update"]
}
使用这些事实,设置对保管库端点的访问以读取 jwt 签名密钥的公共部分归结为使用根令牌:
- 创建保管库令牌
- 具有公开共享
id
值“jwk”
- 作为周期性令牌,没有父级
- 具有该期间的 TTL 的最高可能值
- 没有附加默认策略
- 绑定到自定义策略
- 可以读取公共 jwt 签名密钥
- 可以在其令牌上查找自我
- 可以在其令牌上更新自我
这是一个脚本来演示所有这些如何组合在一起:
#!/bin/bash
mkdir -p /vault/config/
cat <<EOT > /vault/config/init.hcl
storage "inmem" {}
disable_mlock = "true"
listener "tcp" {
tls_disable = "true"
address = "0.0.0.0:8200"
}
api_addr = "http://127.0.0.1:8200"
EOT
nohup vault server --config /vault/config/init.hcl > /vault/nohup.log 2>&1 &
echo $! > /vault/nohup_pid.txt
sleep 1
VAULT_INIT=$(vault operator init -key-shares=1 -key-threshold=1 2>&1)
VAULT_ROOT=$(echo "$VAULT_INIT" 2>&1 | jq -r ".root_token")
VAULT_UNSEAL=$(echo "$VAULT_INIT" 2>&1 | jq -r ".unseal_keys_hex[0]")
UNSEAL_OPERATION=$(vault operator unseal "$VAULT_UNSEAL" 2>&1)
LOGIN_OPERATION=$(printf "$VAULT_ROOT" | vault login - 2>&1)
vault secrets enable transit 2>&1 >/dev/null
vault write "transit/keys/jwt-signing" type=rsa-4096 exportable=false 2>&1 >/dev/null
cat <<EOT > /vault/config/jwk.policy.hcl
path "transit/keys/jwt-signing" {
capabilities = ["read"]
}
path "/auth/token/lookup-self" {
capabilities = ["read"]
}
path "/auth/token/renew-self" {
capabilities = ["update"]
}
EOT
vault policy write "jwk" /vault/config/jwk.policy.hcl 2>&1 >/dev/null
vault write auth/token/create-orphan id="jwk" no_default_policy="true" policies="jwk" ttl="0" explicit_max_ttl="0" num_uses="0" period="2764800" 2>&1 >/dev/null
curl -s -H "X-Vault-Token: jwk" "http://localhost:8200/v1/transit/keys/jwt-signing" | jq -r '.data.keys["1"].public_key'
哪个打印:
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxoZ3HfPOTtcKGXpPSg15
l/ElL4NzNr4YjQrMlRCxw3LPfum1VIyAXupvFb6+dIsmyF9kEE8kXCePpioaEZwo
hlqrqTOrrJRzbsA5znnJPW/S8BuMm1o44x4EXQuc8cWTFc3aP2IgNnMSP31urIpy
/gFoHlYkNCydHSMzCB/oQ33IwpB6KCy7c8ChB2ZqTSlfiXHYkCA4QVLxY/Aoitqz
pAN988QwFDtXwzFxaayT/awS6pSgH75Twrs5K7JnC/97uEl2IQDYrB+DXugGvoHa
ZFi1KqdA2sCRW70ephox0+byLjAYsYI55eWdMtOdCcLfDoIHt/V5YaolzqJgNMSv
t6VfIL139xnnX2L66P/BJ2MOr/BtDlb7bUhVoGFojBoZd2UvNBSK+b1Jgydy+ZNy
5XIDtEnW+TzEHhgMyjLnBl4r54ncDsF++2qqRoyxjFQNBLxTNgxLj6joxfu3OvOP
MQOpBlYwHIYpsvImY5tV2XVioT8VTVeHmZfL52H7K+CkIoP5rebX6R+JdrIuvFht
Gn9GpMsJBJe+g0zCwM1tEfWct/vkIMNcOp4gwhUI129tLOeEep0sbAQCj5Ee+U9U
1M4yh4U1yvRIK2Y5jjZnr7JeW+jf2jHbpKmunFq3s5HMTjxOTmfM84cvdt5bqbzB
ly1rdyPowulT/l7qQtUJCi8CAwEAAQ==
-----END PUBLIC KEY-----
这是尽可能接近“未经身份验证”的访问。
不要忘记每月至少定期更新此令牌一次!
curl -s -X POST -H "X-Vault-Token: jwk" http://localhost:8200/v1/auth/token/renew-self