保管库:启用未经身份验证的"public"资源



我正在创建一个用于签名JWT的传输RSA密钥,并希望将此策略提供给任何可以连接到vault实例而无需身份验证的调用方(假设TLS已经在所有客户端上运行(。

path "transit/keys/jwt-signing" {
capabilities = ["read"]
}

需要什么策略和身份验证后端的组合来模拟vault中标准pki机密引擎管理的一些端点中存在的行为?

取自:https://www.vaultproject.io/api-docs/secret/pki#read-ca证书


»阅读CA证书

此终结点检索PEM格式的CA证书[…]。

这是一个未经身份验证的端点[强调矿]

»样品申请

$ curl 
http://127.0.0.1:8200/v1/pki/ca/pem

我想以类似的方式公开我的签名令牌的公共部分,以在API中构造典型的.well-known/jkws端点。

vault中不支持完全未经身份验证的访问。代币从根本上与保险库向最终用户(包括运营商(公开的方式有关。

没有办法绕过它,令牌将参与最终结果,因此,令牌过期、吊销和续订。使用周期性令牌是最简单的方法。


»周期性代币

在某些情况下,在很长一段时间内,撤销代币会有问题。在这种情况下,可以使用周期性令牌。周期性代币可以通过以下几种方式创建:

  1. 通过[…]具有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"]
}

使用这些事实,设置对vault端点的访问以读取jwt签名密钥的公共部分,可以归结为使用根令牌:

  • 创建保管库令牌
    • 具有公开共享的id值;jwk">
    • 作为周期性令牌,没有父级
    • 具有该时段的TTL的最高可能值
    • 没有附加默认策略
  • 绑定到自定义策略
    • 可以读取公共jwt签名密钥
    • 可以在其令牌上查找self
    • 可以在其令牌上续订self

这里有一个脚本来演示如何将所有这些结合在一起:

#!/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

最新更新