为生产环境的 Vault 创建用户和安全策略
场景: 对密钥进行管理, 创建用户, 创建策略限制用户只能访问自己路径下的密钥信息.
添加 vault 用户账号
Access - Auth Method - 添加 Username & pasword的方式。 然后添加一个账号。 后续就可以使用新加的账号,以普通用户身份登陆。
使用 vault 生成密钥/保存密钥(健值对)
注意不要使用 cubbyhole 密码引擎。 cubbyhole 引擎里面所有路径都是跟着 token 对应的命名空间下存储的。 token 销毁, 存储的内容就销毁。 所以如果以用户登陆,创建 cubbyhole secrets。 重新登陆 存储的密钥就丢了。
https://www.vaultproject.io/docs/secrets/cubbyhole
可以使用 KV 引擎来存储密钥。KV 引擎存储的密钥是在物理存储中的。 vault secrets enable -path=kv kv 或者 vault secrets enable kv 启用了 kv/ 的路径
写入 kv 对 vault kv put kv/hello target=world vault kv get kv/hello vault kv list kv/
注意: 使用 terminal 控制台登陆, 打开多个 tab 的时候, 多个 tab 是共享 session的。意味着只能 login 一个用户。 显示当前使用的 token: vault print token
谁可以访问哪些内容, 由 policy 定义, 新创建的用户默认(default)创建不了 密钥。因为策略中没有定义权限 vault policy read default vault policy list
在后台设置 default policy, http://127.0.0.1:8200/ui/vault/policy/acl/default
增加一条配置使得所有用户可以添加 KV:
path “kv/*” { capabilities = [“read”, “update”] }
然后普通用户就可以创建 KV 了 vault kv put kv/hello target=world vault kv get kv/hello
限制用户 只能访问自己路径下面的密钥
在 vault 的授权策略中(Policy)中可以使用路径模板(Path Template)。
使用 userpass 的 accessor来引用用户名, accesor 在 vault 的 web 管理后台能看到: 模板 key: {{identity.entity.aliases.auth_userpass_54bc3354.name}}
# Grant permissions on user specific path
path "kv/data/{{identity.entity.aliases.auth_userpass_54bc3354.name}}/*" {
capabilities = [ "create", "update", "read", "delete", "list" ]
}
# For Web UI usage
path "kv/metadata/{{identity.entity.aliases.auth_userpass_54bc3354.name}}/*" {
capabilities = ["list"]
}
path "kv/metadata" {
capabilities = ["list"]
或者使用 Entity name 来做权限验证。 每一个创建的用户,默认有一个对应的 entity, entity的名字跟用户名是不一样的。 需要在管理后台把 entity 名字改成跟名字一样, 才可以访问 kv/username 路径下面的数据。
# Grant permissions on user specific path
path "kv/data/{{identity.entity.name}}/*" {
capabilities = [ "create", "update", "read", "delete", "list" ]
}
# For Web UI usage
path "kv/metadata/{{identity.entity.name}}/*" {
capabilities = ["list"]
}
path "kv/metadata" {
capabilities = ["list"]
}
然后使用 david 这个用户来测试对 kv的访问:
vault kv put kv/david/mysql host=localhost port=3306 vault kv get kv/david/mysql vault kv list kv/david
https://learn.hashicorp.com/tutorials/vault/policy-templating
命令行创建用户名/密码, 指定 policy 访问
https://learn.hashicorp.com/tutorials/vault/getting-started-policies?in=vault/getting-started
创建 Policy
$ vault policy write secret-policy - « EOF
# Dev servers have version 2 of KV secrets engine mounted by default, so will
# need these paths to grant permissions:
path "secret/data/*" {
capabilities = ["create", "update"]
}
path "secret/data/foo" {
capabilities = ["read"]
}
EOF
$vault policy write my-kv-policy - « EOF
# Grant permissions on user specific path
path "kv/data/{{identity.entity.aliases.auth_userpass_54bc3354.name}}/*" {
capabilities = [ "create", "update", "read", "delete", "list" ]
}
# For Web UI usage
path "kv/metadata/{{identity.entity.aliases.auth_userpass_54bc3354.name}}/*" {
capabilities = ["list"]
}
path "kv/metadata" {
capabilities = ["list"]
}
EOF
查看有哪些 auth & 启用 userauthpass
https://www.vaultproject.io/docs/auth/userpass vault auth list vault auth enable userpass
指定 Policy 创建用户
vault write auth/userpass/users/mitchellhg
password=foobarpasswd
policies=secret-policy,my-kv-policy
用户会有 default poliy 加上指定的 policy.
为已有用户设置 policy
vault write auth/userpass/users/david policies=my-kv-policy
以用户身份登陆
vault login -method=userpass
username=mitchellhg
password=foobarpasswd
Python 中使用 Vault
https://hvac.readthedocs.io/en/stable/overview.html#getting-started
Vault 中使用 TLS
在vault 的配置中指定 tls 证书文件, 即可启用 tls.
vim vault.hlc
listener "tcp" {
tls_disable = 0
tls_cert_file = "/etc/letsencrypt/live/example.com/fullchain.pem"
tls_key_file = "/etc/letsencrypt/live/example.com/privkey.pem"
}
export VAULT_ADDR=https://example.com:8200
https://www.linode.com/docs/guides/use-hashicorp-vault-for-secret-management/
- 原文作者:笃观文化科技
- 原文链接:https://www.ruoguedu.com/post/user-and-security-policy-management-for-production-vault/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。