[Day 04] - Vault dynamic secrets engine - AWS


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 吧!

Reference

#vault







你可能感興趣的文章

【隨堂筆記】網路概論與Web網頁應用基礎

【隨堂筆記】網路概論與Web網頁應用基礎

BERT Pretrained Model

BERT Pretrained Model

Python Table Manners - 文件

Python Table Manners - 文件






留言討論