[Day 05] - Vault dynamic secrets engine - Database(MySQL)


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/db1mysql/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_ttlmax_ttl
這兩個會如果定義的話,超過存活時間,也會自行刪掉產生的 credentials。

Reference

#vault





7天系列文,簡單介紹 Vault 如何使用!

留言討論