场景: 对密钥进行管理, 创建用户, 创建策略限制用户只能访问自己路径下的密钥信息.

添加 vault 用户账号

Access - Auth Method - 添加 Username & pasword的方式。 然后添加一个账号。 后续就可以使用新加的账号,以普通用户身份登陆。

Auth Method

Auth Method - Create User

使用 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/