vault mysql_Hashicorp vault 简明配置教程
vault 是 hashicorp stack 中管理敏感信息非常重要的一款产品,它囊括了私密信息,登陆密码、SSH Key、数据库登录信息、API 认证信息等。
下面简单体验下 vault 的部署及使用。
1、consul 配置及启动
既然 vault 用来存储敏感信息,那么它的数据当然需要有地方存储,在 vault 里这样的存储引擎叫做 secret engine,secret engine 类似文件系统,敏感信息像文件系统中的目录一样存放,支持读(read)、写(write)和删除(delete)操作。
我们用 consul 作为它的存储引擎来做示范。
如下是 consul 的配置文件,我们为其启用了 ACL,它能让我们安全地访问 consul 的 ui api 等。
agent.hcl
acl = {
enabled = true,
default_policy = "deny",
enable_token_persistence = true
}
运行 consul:
consul agent -dev -ui -data-dir=consul-data -config-file=agent.hcl
对 consul 进行 bootstrap:
$ consul acl bootstrap
AccessorID: b5b09120-1745-3ede-d92b-168b91acde96
SecretID: a28ab319-a93d-d8e0-243e-a18ac9ca4671
Description: Bootstrap Token (Global Management)
Local: false
Create Time: 2019-06-20 00:16:33.135192 +0800 CST
Policies:
00000000-0000-0000-0000-000000000001 - global-management
此时可以进入 consul ui 查看信息。在 ACL 中输入以上 SecretID 即可通过认证。
2、vault 配置及启动
首先定义配置文件,注意配置文件里的 token 需要为 bootstrap 之后的 SecretID,path 会在 consul ui 的 Key/Value 里新建名为 vault 的 key:
vault.hcl
ui = true
storage "consul" {
address = "127.0.0.1:8500"
token = "a28ab319-a93d-d8e0-243e-a18ac9ca4671"
path = "vault"
}
listener "tcp" {
address = "127.0.0.1:8200"
tls_disable = 1
}
启动 vault:
vault server -config=vault.hcl
用 vault operator 初始化 vault:
export VAULT_ADDR='http://127.0.0.1:8200'
vault operator init
记录输出的五个 unseal key 和 root token。
Unseal Key 1: U/TriU7LJK2dFMLp8gDfWBBBKBvtqapdv0rDYxp4WciF
Unseal Key 2: IMhwMQK2XWal0euctG753VvwA/ibTErccdatXN1pb5UR
Unseal Key 3: Fk0FVKKOXV50eYLAaSXj20NUBFgzlA4aKI6cnajtNW2a
Unseal Key 4: +yH4EbIRvfUZ8h6zroVLb5tHT26VKQz0kJqkVQsq6rVu
Unseal Key 5: E6qb5ve6NAhhDUZ32XIFSzAzZHV+tO36VXzWZ9x3b+pC
Initial Root Token: s.izQ1g3AQuMS7zC1DplitAzKN
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated master key. Without at least 3 key to
reconstruct the master key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
当然,我们还可以在配置文件里为 vault agent 之间的 rpc 通信配置 TLS,以及配置 gossip 协议的加密来加强安全性,这个比较简单,留作以后再讲。
为 unseal 解封:
vault operator unseal
一次键入上述五个 unseal key 中的三个即可。
简单看下用 consul 作为 storage 的 secrets 情况:
vault secrets list
# Path Type Accessor Description
# ---- ---- -------- -----------
# cubbyhole/ cubbyhole cubbyhole_bc40c80c per-token private secret storage
# identity/ identity identity_c4b25bc1 identity store
# sys/ system system_723c7052 system endpoints used for control, policy and debugging
由于开启了 ui,我们也可以直接进入 vault ui 的地址:http://127.0.0.1:8200/ui 输入 vault operator init 之后的 root token 即可登录。
3、kv secret engine
查看 secrets:
$ ./vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_b5689de6 per-token private secret storage
database/ database database_1be200b6 n/a
identity/ identity identity_f6bbb598 identity store
sys/ system system_08e857d4 system endpoints used for control, policy and debugging
写入数据:
vault kv put secret/hello foo=world
不同于 dev 模式,采用 consul 作为 secret engine 需要自己创建 path 为 secret 的 kv secret engine,否则无法向 secret/ 写入数据。
$ ./vault secrets enable -path=secret -version=2 kv
Success! Enabled the kv secrets engine at: secret/
敏感信息先进行加密,然后写入后端存储(consul),敏感信息的路径以 secret/ 为前缀。
创建 policy:
cat >groupa-policy.hcl <
# Normal servers have version 1 of KV mounted by default, so will need these
# paths:
path "secret/data/groupa/" {
capabilities = ["create", "update", "delete", "list", "read"]
}
# # Dev servers have version 2 of KV mounted by default, so will need these
# # paths:
path "secret/data/groupa/*" {
capabilities = ["create", "update", "delete", "list", "read"]
}
EOF
vault policy write groupa-policy groupa-policy.hcl
注意 version=2 版本的 acl 需要在 policy 多加一个 data。
创建基于 groupa-policy 的 token:
$ vault token create -policy groupa-policy
Key Value
--- -----
token s.pix8j63L7L27QcF6YunURPNJ
token_accessor B95EtUP00lL42fpSPJB9r6ok
token_duration 768h
token_renewable true
token_policies ["default" "groupa-policy"]
identity_policies []
policies ["default" "groupa-policy"]
利用新创建的 token 写入数据:
$ VAULT_TOKEN=s.pix8j63L7L27QcF6YunURPNJ ./vault kv put secret/groupa/ccc value=bar
Key Value
--- -----
created_time 2019-06-19T07:30:40.020199Z
deletion_time n/a
destroyed false
version 1
此时可以看到,在 policy 设置了对 secret/groupa/ 的权限,写入数据成功。
让我们看下如果向 policy 之外的目录比如 secret/groupb/ 写入数据会怎样:
$ VAULT_TOKEN=s.pix8j63L7L27QcF6YunURPNJ ./vault kv put secret/groupb/ccc value=bar
Error writing data to secret/data/groupb/ccc: Error making API request.
URL: PUT http://127.0.0.1:8200/v1/secret/data/groupb/ccc
Code: 403. Errors:
* 1 error occurred:
* permission denied
可以看到 api 返回 403 错误,表示无权写入数据。
在工程上,我们可以为每个项目分配自己的目录并设置 policy,然后为各自的生成 token,可以很方便地对不同项目进行隔离。
4、enable mysql database dynamic credentials
采用动态认证的方式首先要开启 database secrets engine:
$ export VAULT_TOKEN=s.Ys2ylvoGd3twbQj5ETrb3QaQ
$ ./vault secrets enable database
Success! Enabled the database secrets engine at: database/
首先创建数据库及用户,也可以用 root 用户的用户名和密码:
CREATE DATABASE million_dollar_application;
CREATE USER 'million-dollar-application-admin'@'%' IDENTIFIED BY '123456';
-- GRANT ALL ON million_dollar_application.* TO 'million-dollar-application-admin'@'%' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'million-dollar-application-admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
-- DELTE FROM USER WHERE user="million-dollar-application-admin";
因为写入 secret 需要 vault 连接 mysql server,在向 vault 写入 secret 之前,必须保证对 mysql host 能否访问。
为 vault database secret engine 配置 mysql plugin:
vault write database/config/mysql-million-dollar-application \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(localhost:3306)/" \
allowed_roles="mysql-million-dollar-application-role" \
username="million-dollar-application-admin" \
password="123456"
在 vault 创建一个 role,它的作用是在 mysql 中创建临时用户和密码:
vault write database/roles/mysql-million-dollar-application-role \
db_name=mysql-million-dollar-application \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON *.* TO '{{name}}'@'%';" \
default_ttl="1h" \
max_ttl="24h"
Success! Data written to: database/roles/mysql-million-dollar-application-role
生成一份临时凭证:
$ ./vault read database/creds/mysql-million-dollar-application-role
Key Value
--- -----
lease_id database/creds/mysql-million-dollar-application-role/BLV5mZRHGBx36m6bG01rus8J
lease_duration 1h
lease_renewable true
password A1a-5cXijTiMqzRsu1nd
username v-root-mysql-mill-Pf4xCJ3gCL9hO8
我们可以通过读取 database/creds/mysql-million-dollar-application-role 返回多个临时凭证。
用临时的 credentials 登陆:
$ mysql -uv-root-mysql-mill-Pf4xCJ3gCL9hO8 -pA1a-5cXijTiMqzRsu1nd
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 38
Server version: 8.0.16 Homebrew
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
在创建 role 的时候通过 GRANT SELECT ON 配置了只读权限,所以生成的凭据只有 SELECT 权限,其他权限如 CREATE 和 INSERT 等操作会失败。
mysql> use million_dollar_application;
Database changed
mysql> show tables;
+--------------------------------------+
| Tables_in_million_dollar_application |
+--------------------------------------+
| user |
+--------------------------------------+
mysql> select * from user;
+------+
| name |
+------+
| test |
+------+
1 row in set (0.00 sec)
mysql> create table t(id int);
ERROR 1142 (42000): CREATE command denied to user 'v-root-my-role-H6jerljDFjHEh2vUU'@'localhost' for table 't'
mysql> insert into user values ('noname');
ERROR 1142 (42000): INSERT command denied to user 'v-root-my-role-H6jerljDFjHEh2vUU'@'localhost' for table 'user'
临时凭证一小时后失效。
5、一些思考
目前云服务是大势所趋,我们可以通过 vault operator 将 vault 部署在 kubernetes 之上来将运维管理的工作交给 operator 去做,关于 operator 相关的内容后续会讲到。
vault mysql_Hashicorp vault 简明配置教程相关推荐
- AskyBlock插件配置教程
AskyBlock插件配置教程 前言 纯净空岛服务器 插件安装 指令与权限 config.yml详解 controlpanel.yml详解 challenges.yml详解 minishop.yml详 ...
- Visual SourceSafe简明培训教程
名称 Visual SourceSafe简明培训教程 (Visual SourceSafe Training Short Course) 作者 晨光(Morning) 简介 对于采用Visual ...
- 简明docker教程
简明docker教程 一.什么是docker 二.docker与虚拟机比较 三.安装docker 四.基本概念 1.镜像 2.容器 3.数据卷 4.挂载 五.参考资料 有收获的话请加颗小星星,没有收获 ...
- 简明python教程在线-简明python教程
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. usrbinpython#hello_world.pyprinthell ...
- 简明python教程购买-自学Python买什么书?
简单地总结一下: <父与子的编程之旅> /> 如果是零基础,不懂编程,甚至计算机基础都比较薄弱的.推荐一本叫做<父与子的编程之旅>,老版本叫<与孩子一起学编程> ...
- 简明docker教程 1
<!-- TOC --> 简明docker教程 一.什么是docker 二.docker与虚拟机比较 三.安装docker 四.基本概念 1.镜像 2.容器 3.数据卷 4.挂载 五.参考 ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-代码生成器的使用
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
- 简明python教程怎么买-简明python教程在哪买!《简明python教程》 下载地址?
哪有python编程入门经典教程 给大家整理的python学习路线图,按照此教程步步的学习,肯对python有更深刻的认识.或许可以上python这个易学,精简,开源的语言.此套教程,不但有视频教程, ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能...
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
最新文章
- poj3686(最小权值完美匹配)
- Python天天练2--面向对象+异常
- linux GUI程序开发
- 并查集板子:acwing836. 合并集合
- linux一直用户身份验证失败,linux – chsh:PAM身份验证失败
- c++模板模式template
- Ubuntu LXC
- PHP 中获取文件名及路径
- iZotope Ozone 9 Advanced for Mac(臭氧9高级版)
- 远程协同TeamViewer
- 用calibre自制图文并茂且支持kindle的mobi电子书
- C++11:lambda表达式详细介绍
- 计算语言学之句法理论(1)
- 凯文·凯利写给年轻人的99条人生建议(99 Additional Bits of Unsolicited Advice)
- 【mysql】聚簇索引(聚集索引)和非聚簇索引(二级索引、辅助索引)的区别
- 怎样进行股票量化对冲策略分析?
- css3总结之: text-align: justify (两端对齐)
- ffmpeg arm linux编译,arm linux 移植 ffmpeg 库 + x264 + x265
- 这只线虫不简单!大脑被高精度还原,可动态蠕动前行
- 简单实现Android闹钟功能,Android实现简易闹钟功能