使用 Stratis 的網路綁定磁碟加密
在一個有許多加密磁碟的環境中,解鎖所有的磁碟是一項困難的任務。 網路綁定磁碟加密 (NBDE)有助於自動解鎖 Stratis 卷的過程。這是在大型環境中的一個關鍵要求。Stratis 2.1 版本增加了對加密的支持,這在《Stratis 加密入門》一文中介紹過。Stratis 2.3 版本最近在使用加密的 Stratis 池時引入了對網路綁定磁碟加密(NBDE)的支持,這是本文的主題。
Stratis 網站 將 Stratis 描述為一個「易於使用的 Linux 本地存儲管理」。短視頻《使用 Stratis 管理存儲》對基礎知識進行了快速演示。該視頻是在 Red Hat Enterprise Linux 8 系統上錄製的,然而,視頻中顯示的概念也適用於 Fedora Linux 中的 Stratis。
先決條件
本文假設你熟悉 Stratis,也熟悉 Stratis 池加密。如果你不熟悉這些主題,請參考這篇 文章 和前面提到的 Stratis 概述視頻。
NBDE 需要 Stratis 2.3 或更高版本。本文中的例子使用的是 Fedora Linux 34 的預發布版本。Fedora Linux 34 的最終版本將包含 Stratis 2.3。
網路綁定磁碟加密(NBDE)概述
加密存儲的主要挑戰之一是有一個安全的方法在系統重啟後再次解鎖存儲。在大型環境中,手動輸入加密口令並不能很好地擴展。NBDE 解決了這一問題,允許以自動方式解鎖加密存儲。
在更高層次上,NBDE 需要環境中的 Tang 伺服器。客戶端系統(使用 Clevis Pin)只要能與 Tang 伺服器建立網路連接,就可以自動解密存儲。如果網路沒有連接到 Tang 伺服器,則必須手動解密存儲。
這背後的想法是,Tang 伺服器只能在內部網路上使用,因此,如果加密設備丟失或被盜,它將不再能夠訪問內部網路連接到 Tang 伺服器,因此不會被自動解密。
關於 Tang 和 Clevis 的更多信息,請參見手冊頁(man tang
、man clevis
)、Tang 的 GitHub 頁面 和 Clevis 的 GitHub 頁面。
設置 Tang 伺服器
本例使用另一個 Fedora Linux 系統作為 Tang 伺服器,主機名為 tang-server
。首先安裝 tang
包。
dnf install tang
然後用 systemctl
啟用並啟動 tangd.socket
。
systemctl enable tangd.socket --now
Tang 使用的是 TCP 80 埠,所以你也需要在防火牆中打開該埠。
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=80/tcp
最後,運行 tang-show-keys
來顯示輸出簽名密鑰指紋。你以後會需要這個。
# tang-show-keys
l3fZGUCmnvKQF_OA6VZF9jf8z2s
創建加密的 Stratis 池
上一篇關於 Stratis 加密的文章詳細介紹了如何設置加密的 Stratis 池,所以本文不會深入介紹。
第一步是捕獲一個將用於解密 Stratis 池的密鑰。即使使用 NBDE,也需要設置這個,因為在 NBDE 伺服器無法到達的情況下,可以用它來手動解鎖池。使用以下命令捕獲 pool1
密鑰。
# stratis key set --capture-key pool1key
Enter key data followed by the return key:
然後我將使用 /dev/vdb
設備創建一個加密的 Stratis 池(使用剛才創建的 pool1key
),命名為 pool1
。
# stratis pool create --key-desc pool1key pool1 /dev/vdb。
接下來,在這個 Stratis 池中創建一個名為 filesystem1
的文件系統,創建一個掛載點,掛載文件系統,並在其中創建一個測試文件:
# stratis filesystem create pool1 filesystem1
# mkdir /filesystem1
# mount /dev/stratis/pool1/filesystem1 /filesystem1
# cd /filesystem1
# echo "this is a test file" > testfile
將 Stratis 池綁定到 Tang 伺服器上
此時,我們已經創建了加密的 Stratis 池,並在池中創建了一個文件系統。下一步是將你的 Stratis 池綁定到剛剛設置的 Tang 伺服器上。使用 stratis pool bind nbde
命令進行。
當你進行 Tang 綁定時,需要向該命令傳遞幾個參數:
- 池名(在本例中,
pool1
) - 鑰匙描述符名稱(本例中為
pool1key
) - Tang 伺服器名稱(在本例中,
http://tang-server
)
記得之前在 Tang 伺服器上,運行了 tang-show-keys
,顯示 Tang 輸出的簽名密鑰指紋是 l3fZGUCmnvKQF_OA6VZF9jf8z2s
。除了前面的參數外,還需要用參數 -thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s
傳遞這個指紋,或者用 -trust-url
參數跳過對指紋的驗證。
使用 -thumbprint
參數更安全。例如:
# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint l3fZGUCmnvKQF_OA6VZF9jf8z2s
用 NBDE 解鎖 Stratis 池
接下來重啟主機,並驗證你可以用 NBDE 解鎖 Stratis 池,而不需要使用密鑰口令。重啟主機後,該池不再可用:
# stratis pool list
Name Total Physical Properties
要使用 NBDE 解鎖池,請運行以下命令:
# stratis pool unlock clevis
注意,你不需要使用密鑰口令。這個命令可以在系統啟動時自動運行。
此時,Stratis 池已經可以使用了:
# stratis pool list
Name Total Physical Properties
pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
你可以掛載文件系統,訪問之前創建的文件:
# mount /dev/stratis/pool1/filesystem1 /filesystem1/
# cat /filesystem1/testfile
this is a test file
輪換 Tang 伺服器密鑰
最好定期輪換 Tang 伺服器密鑰,並更新 Stratis 客戶伺服器以使用新的 Tang 密鑰。
要生成新的 Tang 密鑰,首先登錄到 Tang 伺服器,查看 /var/db/tang
目錄的當前狀態。然後,運行 tang-show-keys
命令:
# ls -al /var/db/tang
total 8
drwx------. 1 tang tang 124 Mar 15 15:51 .
drwxr-xr-x. 1 root root 16 Mar 15 15:48 ..
-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
# tang-show-keys
l3fZGUCmnvKQF_OA6VZF9jf8z2s
要生成新的密鑰,運行 tangd-keygen
並將其指向 /var/db/tang
目錄:
# /usr/libexec/tangd-keygen /var/db/tang
如果你再看看 /var/db/tang
目錄,你會看到兩個新文件:
# ls -al /var/db/tang
total 16
drwx------. 1 tang tang 248 Mar 22 10:41 .
drwxr-xr-x. 1 root root 16 Mar 15 15:48 ..
-rw-r--r--. 1 tang tang 361 Mar 15 15:51 hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
-rw-r--r--. 1 root root 354 Mar 22 10:41 iyG5HcF01zaPjaGY6L_3WaslJ_E.jwk
-rw-r--r--. 1 root root 349 Mar 22 10:41 jHxerkqARY1Ww_H_8YjQVZ5OHao.jwk
-rw-r--r--. 1 tang tang 367 Mar 15 15:51 l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
如果你運行 tang-show-keys
,就會顯示出 Tang 所公布的密鑰:
# tang-show-keys
l3fZGUCmnvKQF_OA6VZF9jf8z2s
iyG5HcF01zaPjaGY6L_3WaslJ_E
你可以通過將兩個原始文件改名為以句號開頭的隱藏文件,來防止舊的密鑰(以 l3fZ
開頭)被公布。通過這種方法,舊的密鑰將不再被公布,但是它仍然可以被任何沒有更新為使用新密鑰的現有客戶端使用。一旦所有的客戶端都更新使用了新密鑰,這些舊密鑰文件就可以刪除了。
# cd /var/db/tang
# mv hbjJEDXy8G8wynMPqiq8F47nJwo.jwk .hbjJEDXy8G8wynMPqiq8F47nJwo.jwk
# mv l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk .l3fZGUCmnvKQF_OA6VZF9jf8z2s.jwk
此時,如果再運行 tang-show-keys
,Tang 只公布新鑰匙:
# tang-show-keys
iyG5HcF01zaPjaGY6L_3WaslJ_E
下一步,切換到你的 Stratis 系統並更新它以使用新的 Tang 密鑰。當文件系統在線時, Stratis 支持這樣做。
首先,解除對池的綁定:
# stratis pool unbind pool1
接下來,用創建加密池時使用的原始口令設置密鑰:
# stratis key set --capture-key pool1key
Enter key data followed by the return key:
最後,用更新後的密鑰指紋將 Stratis 池綁定到 Tang 伺服器上:
# stratis pool bind nbde pool1 pool1key http://tang-server --thumbprint iyG5HcF01zaPjaGY6L_3WaslJ_E
Stratis 系統現在配置為使用更新的 Tang 密鑰。一旦使用舊的 Tang 密鑰的任何其他客戶系統被更新,在 Tang 伺服器上的 /var/db/tang
目錄中被重命名為隱藏文件的兩個原始密鑰文件就可以被備份和刪除了。
如果 Tang 伺服器不可用怎麼辦?
接下來,關閉 Tang 伺服器,模擬它不可用,然後重啟 Stratis 系統。
重啟後,Stratis 池又不可用了:
# stratis pool list
Name Total Physical Properties
如果你試圖用 NBDE 解鎖,會因為 Tang 伺服器不可用而失敗:
# stratis pool unlock clevis
Execution failed:
An iterative command generated one or more errors: The operation 'unlock' on a resource of type pool failed. The following errors occurred:
Partial action "unlock" failed for pool with UUID 4d62f840f2bb4ec9ab53a44b49da3f48: Cryptsetup error: Failed with error: Error: Command failed: cmd: "clevis" "luks" "unlock" "-d" "/dev/vdb" "-n" "stratis-1-private-42142fedcb4c47cea2e2b873c08fcf63-crypt", exit reason: 1 stdout: stderr: /dev/vdb could not be opened.
此時,在 Tang 伺服器無法到達的情況下,解鎖池的唯一選擇就是使用原密鑰口令:
# stratis key set --capture-key pool1key
Enter key data followed by the return key:
然後你可以使用鑰匙解鎖池:
# stratis pool unlock keyring
接下來,驗證池是否成功解鎖:
# stratis pool list
Name Total Physical Properties
pool1 4.98 GiB / 583.65 MiB / 4.41 GiB ~Ca, Cr
via: https://fedoramagazine.org/network-bound-disk-encryption-with-stratis/
作者:briansmith 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive