Interaction with Vault Server

Vault 的 CLI 是透過 vault's HTTP API 去跟 Vault server 進行互動,也就是下圖 HTTP/S API 的部份。

而我們透過API送入 Vault server 的資料,會先經過 Barrier 進行加密處理,並把加密過後的資料存進 storage backend

以 dev mode server 來說,memory 就是 vault server 的storage backend,存在 memory 的資料在 server 重新啟動後,會消失殆盡。
如果要在生產環境部署的話,可以參考官方文件存到硬碟、資料庫或是Consul裡面,把資料存到可以永久保存的地方去,才不會導致資料在每次重開後都不見。


Secrets engine

在進行操作前,看官們可能會好奇,為什麼接下來操作的指令都帶有 secret/ 這個路徑。
如果我想要在 2/14 這個路徑下存放 iHaveAGirlfreind=true 呢?(情人節想要女友)

以剛啟動的 dev mode vault server 進行以下操作,會得到以下的錯誤(403 forbidden 想要女友也不行,哭)

$ vault kv put 2/14 iHaveAGirlfreind=true

Error making API request.

URL: GET http://127.0.0.1:8200/v1/sys/internal/ui/mounts/2/14
Code: 403. Errors:

* preflight capability check returned 403, please ensure client's policies grant access to path "2/14/"

接下來的操作使用 secret/ 這個路徑,是因為 dev mode vault server 在預設啟動的時候,就會在 secret/ 這個路徑下,啟動 kv 類型的 secrets engine。

Secrets engine?那是什麼,可以吃嗎?

Secrets engine,是 vault server 進行資料存放加密以及產生資料的一個強大功能。

如上圖,Secrets engine有好幾個種類,較常看見的可以先簡單分成兩種:

  • Secret Storage: key-value 的存放,像是加過密的 Redis。
  • Dynamic Secrets: 提供dynamic credentials,提供動態的身份驗證。
    我們可以透過跟不同的進行互動 secrets engine ,存放不同類型的資料。

在 vault server 裡,我們可以設定各個 secrets engine 的路徑
當 vault server 收到請求後,藉由 path routing,去存取到該路徑下的 secrets engine。
每一個 secrets engine,有各自的路徑跟設定,操作起來就跟 filesystem 差不多。

詳細各類型的 secrets engine 的使用方式,可以到官方網站查看。

dev mode vault server 已經幫我們建好secret/的 KV secrets engine,此一 engine 用來存放 KV 值,接下來我們就來直接操作吧 !

Writing a secret

透過以下指令,把 author=renato 以及 topic=vault 存到 secret/7days 這個路徑底下。

$ vault kv put secret/7days author=renato topic=vault

Key              Value
---              -----
created_time     2020-02-19T06:38:06.985724259Z
deletion_time    n/a
destroyed        false
version          1

Warning! 如果要存放 key-value 的話,從 file 讀取的話會更加安全,透過指令的方式存放的話,會被記錄在 history 裡面。

Getting a secret

透過以下指令,讀取 secret/7days 的內容,可以加上參數去顯示要的範圍及格式。
例如:-field=author-format=json

$ vault kv get secret/7days 

====== Metadata ======
Key              Value
---              -----
created_time     2020-02-19T06:41:37.647023263Z
deletion_time    n/a
destroyed        false
version          1

===== Data =====
Key       Value
---       -----
author    renato
topic     vault

Deleting a secret

如果 secret 不會再使用的話,也可以把他給刪掉!

$ vault kv delete secret/7days

Success! Data deleted (if it existed) at: secret/7days

Destorying a secret

如果 想要強硬的刪掉 可以用 destory !

$ vault kv destroy -versions=1 secret/7days

Success! Data written to: secret/destroy/7days

那麼這個能用在什麼地方呢?我們可能會遇到以下幾個場景:

  • 使用單一 admin 帳號要登入第三方應用程式,任何知道這個帳號的都能取得 admin 的帳號。
  • 登入 server 的 ssh key 以明文的方式儲存。
  • API key 以明文的方式儲存。
  • 跟 LDAP 連動的應用程式,其設定以明文儲存。

Vault server 會使用 256-bit AES-GCM 的方式把這些機密資料進行加密,並把加密過後的資料存進 storage backendstorage backend 不會知道所存的資料為何,這樣一來就算 storage 被駭入,也沒辦法讀取這些資料!

以上的資料如果有要使用的話,設定好相對應的權限,由應用程式直接向 vault server 進行請求,拿取所需要的機密資料,這樣一來,比起以明文儲存,會更具安全性。如下圖:

那麼,以上就是簡單針對 KV secret engine 的操作及簡單的介紹,究竟 vault server 還有什麼神秘功能呢?
讓我們下回見!

Reference

#vault







你可能感興趣的文章

迴圈loop筆記

迴圈loop筆記

[重新理解 C++]  TMP(2): variadic template parameter

[重新理解 C++] TMP(2): variadic template parameter

資料夾結構

資料夾結構






留言討論