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 backend
,storage backend
不會知道所存的資料為何,這樣一來就算 storage 被駭入,也沒辦法讀取這些資料!
以上的資料如果有要使用的話,設定好相對應的權限,由應用程式直接向 vault server 進行請求,拿取所需要的機密資料,這樣一來,比起以明文儲存,會更具安全性。如下圖:
那麼,以上就是簡單針對 KV secret engine 的操作及簡單的介紹,究竟 vault server 還有什麼神秘功能呢?
讓我們下回見!