- Vault做什么?如何工作?
1. Vault 是什么?
Vault 是由 HashiCorp 开发的一款用于 安全管理机密信息 的工具。它可以安全地存储、访问和管理敏感数据,如 API 密钥、密码、证书、加密密钥等。Vault 提供了统一的接口来管理这些机密信息,并确保它们的安全性、可审计性和可扩展性。
2.Vault 的核心功能包括:
机密管理:安全存储和访问敏感数据。
加密解密服务:提供加密和解密功能,无需自己管理密钥。
动态机密:按需生成短期有效的机密信息(如数据库凭证)。
身份验证和授权:支持多种身份验证方式(如 LDAP、GitHub、AWS IAM 等),并基于策略控制访问权限。
审计日志:记录所有操作,便于审计和合规性检查。
3.Vault 在你的系统上通过以下方式工作:
(1)安装与启动
Vault 以二进制文件的形式安装在你的系统中。
启动后,Vault 会读取配置文件(如 `/etc/vault.d/vault.hcl`)来确定其行为。
例如:使用哪种存储后端(如文件系统、Consul、S3 等)。
监听哪个网络接口和端口。
是否启用 TLS 加密通信。
(2)初始化与解封
初始化:Vault 首次启动时需要初始化,生成一个根令牌(Root Token)和多个解封密钥(Unseal Keys)。
解封:Vault 启动后处于“密封”状态,无法访问存储的机密信息。必须使用解封密钥解封 Vault 后才能使用。
(3)存储机密信息
Vault 将机密信息加密后存储在配置的存储后端(如本地文件系统、Consul、S3 等)。
存储的机密信息可以是静态的(如密码、API 密钥)或动态的(如临时数据库凭证)。
(4)访问控制
Vault 使用策略来控制用户或应用程序对机密信息的访问权限。
用户或应用程序需要通过身份验证(如令牌、LDAP、GitHub 等)来获取访问权限。
(5)动态机密
Vault 可以按需生成动态机密信息。
例如:为应用程序生成一个临时的数据库用户名和密码。
动态机密的有效期通常很短,过期后会自动撤销。
(6)加密解密服务
Vault 可以作为加密服务,提供加密和解密功能。
应用程序可以将数据发送给 Vault 进行加密,Vault 使用其管理的密钥对数据进行加密,并返回加密后的结果。
(7)审计与监控
Vault 会记录所有操作(如读取、写入、解封等)到审计日志中。
审计日志可以用于合规性检查和故障排查。
4.Vault 的工作流程示例
假设你需要在应用程序中访问一个数据库密码:
(1)应用程序请求访问:
应用程序向 Vault 发送请求,要求获取数据库密码。
(2)身份验证:
Vault 验证应用程序的身份(如通过令牌或 AWS IAM 角色)。
(3)授权检查:
Vault 检查应用程序是否有权限访问请求的机密信息。
(4)返回机密信息:
如果授权通过,Vault 从存储后端读取数据库密码,并将其返回给应用程序。
(5)动态机密(可选):
如果配置了动态机密,Vault 会生成一个临时的数据库用户名和密码,并返回给应用程序。
(6)审计日志:
Vault 将此次访问记录到审计日志中。
5.Vault 的典型使用场景
(1)管理应用程序的机密信息:
存储和管理应用程序的 API 密钥、数据库密码等。
(2)动态生成数据库凭证:
为每个应用程序实例生成临时的数据库用户名和密码。
Ps:
Vault 动态生成的数据库凭证是真实有效的,可以成功登录数据库。Vault 会与数据库进行交互,完成以下操作:
创建用户: 在数据库中创建一个新的用户,并授予其必要的权限。
设置密码: 为该用户生成一个随机密码。
返回凭证: 将生成的用户名和密码返回给应用程序。
应用程序可以使用这些凭证连接到数据库并执行操作。在凭证过期后,Vault 会自动撤销该用户的权限,确保安全性。
(3)加密解密服务:
提供加密和解密功能,保护敏感数据。
(4)多环境机密管理:
在开发、测试和生产环境中统一管理机密信息。
(5)合规性与审计:
记录所有机密访问操作,满足合规性要求。
- Vault使用操作说明
1.初始化 Vault
1.1 启动 Vault 服务
确保 Vault 服务已经启动。如果使用的是开发模式,可以通过以下命令快速启动:
<bash>
vault server -dev
注意:开发模式仅用于测试,数据存储在内存中,重启后数据丢失。
对于生产环境,需要配置文件并启动服务:
<bash>
vault server -config=/path/to/config.hcl
1.2 初始化 Vault
首次启动后,Vault 会处于“密封”状态,需要初始化:
<bash>
vault operator init
初始化时,Vault 会输出:
• Unseal Keys:解封密钥,通常有 5 个,至少需要 3 个才能解封。
• Root Token:初始管理令牌,具有最高权限。
重要:记录这些密钥和令牌,丢失后无法恢复!
2.解封 Vault
2.1 解封 Vault
使用初始化时生成的 Unseal Key 解封 Vault:
<bash>
vault operator unseal <unseal-key>
需要输入足够的 Unseal Key(默认 3 个)才能完全解封。
2.2 验证解封状态
检查 Vault 是否已解封:
<bash>
vault status
如果显示包含`Sealed: false`,则表示 Vault 已成功解封。
3.配置 Vault引擎
解封后,Vault 已经可以运行,但默认情况下,它并没有配置任何存储机密信息的后端(Secret Engine)或认证方式(Auth Method)。因此,需要进行一些基本配置,以便能够存储和管理机密信息。
Secret引擎是Vault中用于存储和管理机密信息的组件。默认情况下,Vault提供了多种Secret引擎,例如kv、database、aws等。你需要根据需求启用相应的Secret引擎。
3.1 启用 Secret 引擎
根据需求启用不同的 Secret 引擎。例如,启用通用的`kv`引擎:
<bash>
vault secrets enable -path=secret kv
secrets enable:启用一个Secret引擎
path=secret:指定Secret引擎的路径。可以根据需要更改路径,例如/myapp/secret
kv:指定启用的 Secret 引擎类型为kv 。
执行后,可以在路径/secret下存储和管理机密信息。
3.2 配置动态 Secret 引擎
例如:配置数据库动态凭证引擎:
<bash>
vault secrets enable database
vault write database/config/mydb \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
allowed_roles="*" \
username="db_admin" \
password="db_password"
plugin_name:指定使用的数据库插件。
connection_url:数据库的连接 URL。
allowed_roles:允许的角色。
username 和password:数据库管理员的用户名和密码。
3.3 创建角色
为动态 Secret 创建角色:
<bash>
vault write database/roles/myrole \
db_name=mydb \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}'; GRANT ALL PRIVILEGES ON *.* TO '{{name}}'@'%';"
db_name:数据库配置的名称。
creation_statements:SQL 语句,用于创建用户并授予权限。
5.配置认证方式
认证方式(Auth Method)用于定义如何验证用户或服务的身份。默认情况下,Vault 提供了多种认证方式,例如 userpass、token、ldap等。
5.1启用认证方式
userpass是一种简单的用户名和密码认证方式,适用于测试和小型环境。
<bash>
vault auth enable userpass
auth enable:启用一个认证方式。
userpass:指定启用的认证方式为userpass。
5.2创建用户
在启用userpass认证方式后,你需要创建用户并分配策略。
<bash>
vault write auth/userpass/users/john password="password" policies="default"
auth/userpass/users/john:指定创建的用户名为john。
password:用户的密码。
policies:分配给用户的策略。默认为default,可以根据需求创建自定义策略。
5.3登录
使用创建的用户登录 Vault:
<bash>
vault login -method=userpass username=john password=password
-method=userpass:指定使用userpass认证方式。
username和password:用户的用户名和密码。
登录成功后,Vault 会返回一个访问令牌(Token),可以使用其进行后续操作。
6.管理机密信息
6.1 写入机密
将机密信息存储到 Vault 中:
<bash>
vault kv put secret/myapp/config username="admin" password="password123"
6.2 读取机密
从 Vault 中读取机密信息:
<bash>
vault kv get secret/myapp/config
6.3 列举机密
列出某个路径下的所有机密:
<bash>
vault kv list secret/
7.管理用户和策略
7.1 创建用户
创建用户并分配策略:
<bash>
vault auth enable userpass
vault write auth/userpass/users/john password="password" policies="default"
7.2 创建策略
定义访问策略:
<bash>
vault policy write mypolicy - <<EOF
path "secret/myapp/*" {
capabilities = ["read", "list"]
}
EOF
·vault policy write:这是 Vault 的命令行工具命令,用于创建或更新一个策略。
·mypolicy:这是策略的名称,你可以根据需要自定义。
·-:表示从标准输入(stdin)读取策略内容。这里使用Heredoc语法提供策略内容。
·<<EOF:表示开始一个Heredoc块,EOF是一个标记,用于定义块的结束。
·path "secret/myapp/*":定义了策略的路径匹配规则。这里表示匹配路径 /secret/myapp/ 下的所有子路径。
·capabilities:定义了允许的操作权限。
·read:允许读取指定路径下的机密信息。
·list:允许列出指定路径下的所有键(key)。
7.3 分配策略
将策略分配给用户:
<bash>
vault write auth/userpass/users/john policies="mypolicy"
为用户john分配策略mypolicy ,以便在使用 HashiCorp Vault 的 userpass 认证方式时,用户john能够根据分配的策略访问特定的资源。
8.使用动态 Secret
动态 Secret 是 Vault 的一个重要功能,它允许你动态生成临时的、具有时间限制的凭证,从而增强安全性。
8.1 生成动态凭证
使用动态 Secret 引擎生成临时凭证:
<bash>
vault read database/creds/myrole
vault read用于读取指定路径下的数据。
database:表示使用的是database引擎。
creds:表示生成凭证的路径。
myrole:这是你之前定义的角色名称,用于指定生成凭证的规则。
这条命令会根据你在myrole角色中定义的规则,动态生成临时的数据库用户名和密码。生成的凭证通常具有时间限制(默认为1小时),过期后自动失效。
8.2 使用动态凭证
使用生成的凭证连接数据库:
<bash>
mysql -u <username> -p<password> -h 127.0.0.1
9.审计与监控
审计功能用于记录所有与 Vault 交互的操作,包括用户登录、机密读取、策略变更等。
9.1 启用审计日志
启用审计日志功能:
<bash>
vault audit enable file file_path="/var/log/vault_audit.log"
vault audit enable:这是 Vault 的命令行工具命令,用于启用审计功能。
file:指定审计日志的存储方式为文件。
file_path="/var/log/vault_audit.log":指定审计日志文件的路径。这里将日志存储在 /var/log/vault_audit.log。
9.2 查看审计日志
审计日志记录了所有操作,可用于审计和排查问题:
<bash>
cat /var/log/vault_audit.log
10.常规操作
10.1 重新密封 Vault
将 Vault 重新密封:
<bash>
vault operator seal
重新密封后,Vault 将无法处理任何请求,所有数据将被加密存储,无法访问。
10.2 撤销令牌
撤销用户的访问令牌:
<bash>
vault token revoke <token>
撤销后,该令牌将失效,无法再用于访问 Vault 的任何资源。通常用于用户注销或撤销权限。
10.3 更新机密
更新存储在 Vault 中的机密信息:
<bash>
vault kv put secret/myapp/config username="newuser" password="newpassword"
将键值对(Key-Value)存储到指定路径。•如果路径/secret/myapp/config已经存在,这条命令会更新现有的键值对。