前幾天我們探討了Static Secret 與 Dynamic Secret 的差異,總而言之,核心意義在於:
應用程式不再保存一組長期存在的 DB 帳號密碼,而是需要時向 Vault 取得一組「有期限」的 Database Credentials。
因此,有別於以往傳統的流程,應用程式長期持有對應的資料庫帳號密碼,並且儲存於某處,當有需要時則利用其進行驗證,而使用 Vault 的流程則是以其當作中介層,藉由儲存於 Vault 裡的 Credentials 動態至資料庫建立對應的帳號密碼。
以下實作我以 PostgreSQL 為利,首先我們需要一組用來管理其他帳號密碼request的資料庫管理員帳號密碼:
使用PostgresSQL terminal:
sudo -u postgres psql
建立一個測試用的DB:
CREATE DATABASE vaultdemo;
建立Credentials:
CREATE ROLE vaultadmin
WITH LOGIN PASSWORD 'vaultpass'
CREATEROLE;
建置完成之後我們可以回到Vault的terminal:
vault write database/config/my-postgresql \
plugin_name=postgresql-database-plugin \
allowed_roles="my-role" \
connection_url="postgresql://{{username}}:{{password}}@localhost:5432/vaultdemo?sslmode=disable" \
username="vaultadmin" \
password="vaultpass"

當今天有人要求 my-role credential 時,要怎麼建立 Database User?
我們也需要告訴 Vault 該怎麼做:
({{name}}與 {{password}}是create_statements中支援動態產生帳密的變數。)
vault write database/roles/my-role \
db_name=my-postgresql \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';" \
default_ttl="1h" \
max_ttl="24h"
設定完成後,透過 read 指令讀取role裡的設定並建立Dynamic secret:
vault read database/creds/my-role
若你看到以下的結果代表產生出了動態密鑰!!
grantli@xxxxx:~$ vault read database/creds/my-role
Key Value
--- -----
lease_id database/creds/my-role/7d6EqRdkd7XUrlgOrfyLBN5y
lease_duration 1h
lease_renewable true
password ASXEnyC5Gmk71hgaQ-wo
username v-token-my-role-YqnSLzKjoNhoUaHtul7o-1791010041
還記得lease的概念嗎? 就好像你今天在外面租房子一樣,每份租約是被設計成附帶期限的(lease_duration)。
可以透過 look up 指令查看一下相關的資訊:
vault lease lookup database/creds/my-role/7d6EqRdkd7XUrlgOrfyLBN5y

TTL即是是動態的剩餘時間,在到期後 lease 會執行 DB credential 的撤銷邏輯,對應的帳號密碼將不再能被使用(revoke)。
而重要之處在於,透過 plugin 我們將不用手動操作 revoke 的動作,Vault 將會透過我們一開始建立的 Admin 帳號進行全權處理。
是不是相當方便呢?