Database secrets engine
簡單的玩了一下 AWS secrets engine,接下來來玩一下 database 的 secrets engine!
與前篇相同,我們得先在建立一個 database secrets engine,放到 mysql/
路徑下。
$ vault secrets enable -path=mysql database
之後需要建立一台 mysql server ,並且設定一個有所需權限的帳號。(當然直接用 root 最快XD)
跟前一篇類似,這一個帳號是用來讓 vault server 進行登入的,而這個帳號需要可以建立user
,並針對user提權
。
所需要的帳號權限可以參考下方指令:
-- 在 mysql 執行以下指令。
CREATE DATABASE coderbridge;
CREATE USER 'vault'@'%' IDENTIFIED BY 'vault';
-- 提供 vault 能賦予 user coderbridge DB 權限的權限。(也太饒舌)
GRANT ALL PRIVILEGES ON coderbridge.* TO 'vault'@'%' WITH GRANT OPTION;
-- 提供 vault 能夠建立 user 的權限。
GRANT CREATE USER, RELOAD ON *.* to 'vault'@'%';
接下來,開始針對 database secrets engine 來做相關設定,可以參考官方的文件進行修改。
連線資訊
這邊我們進行操作的是 mysql ,所以在 plugin_name 我們使用了 mysql-rds-database-plugin
的套件。
針對 mysql 的 plugin 有四種,是針對不同版本的 mysql 推出的,在之後產生 credentials 可能會遇到密碼太長的問題,可以更換使用的 plugin 嘗試。
我們把設定寫在 mysql/config/database
這個路徑下。
$ vault write mysql/config/database \
plugin_name="mysql-rds-database-plugin" \
connection_url="{{username}}:{{password}}@tcp(mysql-ip:3306)/" \
allowed_roles="my-role" \
username="vault" \
password="vault"
mysql/config/<db_name>
的解釋如下:
mysql/
是 secrets engine。config/<db_name>
是設定 vault server 對 db 的連線資訊。其中<db_name>
可以自行定義。- 如果有
mysql/config/db1
跟mysql/config/db2
,兩個的連線資訊是獨立的喔!就像兩個檔案一樣。
Create a role
接下來要設定 role ,讓 vault server 去生成 credential,並給予權限。
$ vault write mysql/roles/my-role \
db_name=database \
creation_statements="CREATE USER '{{name}}'@'%' IDENTIFIED BY '{{password}}';GRANT SELECT ON coderbridge.* TO '{{name}}'@'%';" \
default_ttl="1h" \
max_ttl="24h"
db_name
: 注意 db_name
要跟設定連線資訊那邊一致。上面我們設定為 database
。
creation_statements
: 定義的權限,與 aws 的 polixy 類似,可以自行做一些權限上的調整!
default_ttl
: 定義預設 credential 存活時間。若有某個 credential 超過 1 小時沒有使用,就會刪除該credential。
max_ttl
: 定義 credential 的最大存活時間。若有某個 credential 有持續使用,超過 24 小時才會刪除該credential。
Generate the secret
建立完成後,就能拿到具有 my-role
所定義的權限的 username 跟 password 啦!
$ vault read mysql/creds/my-role
Key Value
--- -----
lease_id mysql/creds/my-role/bBqBT59uEYjqHxw6gcbsp4MV
lease_duration 1h
lease_renewable true
password A1a-I9B6aLVo5ShC6oMs
username v-my-r-Y0rjJiMC3
實際上使用這組帳號密碼去操作 MySQL 的話,權限會跟 my-role
定義的一樣大。
如上面所設定的,只能進行 SELECT 的操作,使用 INSERT 的話,會被擋下來的。
ERROR 1142 (42000): INSERT command denied to user 'v-my-r-Y0rjJiMC3'@'localhost' for table 'table1'
Revoke the secret
使用完畢後,也能進行 credentials 的註銷!
$ vault lease revoke mysql/creds/my-role/bBqBT59uEYjqHxw6gcbsp4MV
All revocation operations queued successfully!
上方我們有兩個 TTL:default_ttl
跟max_ttl
。
這兩個會如果定義的話,超過存活時間,也會自行刪掉產生的 credentials。