Dynamic Secrets Engine - AWS
簡單操作完 key-value 的存放後,我們來看一下 dynamic engine 的操作,此篇我們使用 AWS 來玩玩。
在操作之前,我們要先確認 vault server 裡已經有 AWS secrets engine。
可以執行 vault secrets list
進行確認,此一指令可以看到已經啟用的 secrets engine 的詳細內容。
如下:
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
cubbyhole/ cubbyhole cubbyhole_dc16024b per-token private secret storage
identity/ identity identity_394049ce identity store
secret/ kv kv_9397ee72 key/value secret storage
sys/ system system_fd0af39a system endpoints used for control, policy and debugging
從結果可以看出,在 dev mode vault server 啟動的時候,預設會生成三個 secrets engine,分別是:
cubbyhole/
: 為 cubbyhole 類型的 secrets engine,不能被刪,不能移動,不能啟動多個。identity/
: 為 identity 類型的 secrets engine,不能被刪,不能移動。secret/
: dev mode 啟動時,會預設產生的 KV secrets engine。
其中的 sys/
不是 secrets engine ,同樣不能刪除,不能移動,這個路徑跟 vault server 的系統後端有關,用來調整 vault server 的大大小小設定!
那我們就來啟用一個 AWS secrets engine 吧!
Enable a secret engine
進行 secrets engine 的啟用,預設就會增加一個 path 出來,每個 path 之間是獨立且不能互相訪問的。
執行以下的指令,可以在 aws/
的路徑下,建立一個 aws
secrets engine。
$ vault secrets enable -path=aws aws
# 如未帶 path 參數,會直接以 secrets engine 的名字建立。
# 以下指令有相同的效果:
$ vault secrets enable aws
新增完成後,執行 vault secrets list
進行確認,可以看到多了一個 aws/
的 secrets engine。
$ vault secrets list
Path Type Accessor Description
---- ---- -------- -----------
aws/ aws aws_16428af2 n/a #沒有設定 Description 的話,會顯示 n/a
cubbyhole/ cubbyhole cubbyhole_dc16024b per-token private secret storage
identity/ identity identity_394049ce identity store
secret/ kv kv_9397ee72 key/value secret storage
sys/ system system_fd0af39a system endpoints used for control, policy and debugging
AWS secrets engine
在建立完成後,aws secrets engine 需要進行驗證後,才能跟 AWS 進行連線。
此時需要到 AWS 的 IAM 進行建立一組有 IAM 管理權限_(IAMFullAccess)
_的 credentials。
讓 vault server 能跟 AWS 進行驗證。
如果權限不足的話在執行時會跳出 error,
Error putting user policy: AccessDenied: XXXXX
status code: 403, request id: 4372feb6-3c27-435c-90f0-4c9f086a25d8
Configure the AWS secrets engine
提供 vault server 的相關的 credential。
$ vault write aws/config/root \
access_key=<access_key> \
secret_key=<secret_key> \
region=us-east-1
Success! Data written to: aws/config/root
Create a role
接下來建立 role,讓 vault server 在 AWS 上建立 IAM users 時,提供 role 所設定的權限。
簡單的來說,這個 role 的權限定義有多大,他在AWS的權限就有多大!
Warning!
下方所設定的 policy ,是 AWS 的設定!不是 vault server 的!
相關的 policy 可以在 AWS官網 上查詢。
$ vault write aws/roles/my-role \
credential_type=iam_user \
policy_document=-<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"iam:GetInstanceProfile",
"iam:GetUser",
"iam:GetRole"
],
"Resource": "*"
}
]
}
EOF
Success! Data written to: aws/roles/my-role
Generate the secret
上圖的 123 步驟,就已經完成。
接下來的第四步,就是 app 跟 vault 請定一組 credential。
我們可以透過 CLI 來產生:
$ vault read aws/creds/my-role
Key Value
--- -----
lease_id aws/creds/my-role/0NNbJwHlU8JkGENsLJyAN2UD
lease_duration 768h
lease_renewable true
access_key AKIA6FNTDNMYVKWUJYUB
secret_key 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
security_token <nil>
上面所拿到的 access_key 跟 secret_key 具有 my-role
所定義的權限唷!
Revoke the secret
用完後不要的話,也可以隨時註銷!
$ vault lease revoke aws/creds/my-role/0NNbJwHlU8JkGENsLJyAN2UD
All revocation operations queued successfully!
Disable a secret engine
已經不需要 secrets engine 的話,也可以直接刪除。
當 secrets engine 被刪除的時候,裡面所有的資料以及設定也會一併被刪除唷!
$ vault secrets disable aws/
Success! Disabled the secrets engine (if it existed) at: aws/
下一篇,我們來試試看 Database 的 dynamic secrets engine 吧!