系統安全的關鍵方面之一是靜態加密存儲。如果沒有加密存儲,您的存儲設備每次離開您時都可能遭到破壞。發生這種情況最明顯的情況是當存儲設備(無論是存儲設備、整個系統、服務器還是筆記本電腦)丟失或被盜時。
但是,還有其他情況值得關注。存儲設備可能發生故障並在保修期內更換。供應商通常要求退回原始設備。如果您的設備已加密,請不要擔心並將其退還給您的硬件供應商。
另一個問題是,除非存儲設備可見,否則數據可能會在您不知情的情況下從設備中復製或複製。同樣,如果您的設備已加密,這就不那麼重要了。
Fedora(和其他 Linux 發行版)包含支持磁盤加密的 Linux 統一密鑰設置 (LUKS) 功能。 LUKS 易於使用並作為選項集成在 Fedora Anaconda 安裝程序中。
然而,有一項挑戰經常會阻止 LUKS 的大規模實施,尤其是對於根文件系統。每次重啟主機時,我經常需要手動訪問控制台並輸入 LUKS 密碼才能啟動系統。
如果您在筆記本電腦上運行 Fedora,這可能不是問題。畢竟,每次重啟時您都坐在筆記本電腦前。但是,如果您在這種情況下經常使用 Fedora,這很快就會變得不切實際。
您可能正在遠程管理 Fedora 系統,但您可能沒有一種好的甚至可靠的方式來訪問它們的控制台。在這種情況下,重啟主機可能會阻止它啟動,直到您或其他人前往該位置並輸入 LUKS 密碼。
本文介紹如何實施允許自動 LUKS 卷解鎖的解決方案(實施這些功能的過程也是使用自動化完成的!)
U 形夾和唐的概述
Clevis and Tang 是一種創新解決方案,有助於解決使用加密存儲啟動系統的挑戰,而無需用戶在每次啟動時進行手動干預。在高層次上,安裝在客戶端系統上的 Clevis 可以在無需用戶干預的情況下解鎖 LUKS 卷,只要客戶端系統可以通過網絡訪問可配置數量的 Tang 服務器。
基本前提是,如果 Tang 服務器位於內部/專用網絡或其他安全網絡上,並且存儲設備丟失、被盜或以其他方式從環境中移除,它們將無法通過網絡訪問 Tang 服務器。可用,因此不再可用。開機自動解鎖。
Tang 是無狀態的,不需要身份驗證甚至 TLS。這意味著它非常輕量級,易於配置,並且可以從容器中運行。在本文中,我們只設置了一台Tang服務器,但是你的環境中可以有多個Tang服務器,這樣Clevis客戶端需要連接才能解鎖加密卷,你也可以配置數量。例如,您可以擁有三個 Tang 服務器,並要求 Clevis 客戶端可以連接到三個 Tang 服務器中的至少兩個。
有關 Tang 和 Clevis 如何工作的更多信息,請參閱我們的 GitHub 頁面。 耳環 和 鉗,或了解 Tang 和 Clevis 的內部運作概況。 安全自動解密的新加密技術 FOSDEM 的故事。
Linux系統角色總結
Linux 系統角色是一組 Ansible 角色/集合,有助於自動化配置和管理 Fedora、CentOS 流、RHEL 和 RHEL 衍生產品。 Linux 系統角色在 Fedora 中打包為 RPM(linux-system-roles),在 Ansible Galaxy 中也可用(作為角色和集合)。 要查看有關 Linux 系統角色的詳細信息和包含的角色列表,請參閱: Linux 系統角色項目頁面.
Linux 系統角色列表包括本文中使用的 nbde_client、nbde_server 和防火牆角色。 nbde_client 和 nbde_server 角色分別專注於自動化 Clevis 和 Tang 實現。角色名稱“nbde”代表網絡綁定磁盤加密,這是使用 Clevis 和 Tang 自動解鎖 LUKS 加密卷的另一個術語。防火牆角色可以自動配置防火牆,並用於在 Don 服務器的防火牆中打開端口。
演示環境概覽
在我的環境中,我有一個運行 Fedora 36 的樹莓派,我在上面安裝了 Linux 系統角色並將其用作 Ansible 控制節點。它還使用與 Tang 服務器相同的 Raspberry Pi。此設備配置有 pi.example.com 的主機名。
此外,我的環境中還有四個其他系統:兩個 Fedora 36 系統和 fedora-server1.example.com、fedora-server2.example.com、c9s-server1.example.com 和 c9s-server2。命名兩個 CentOS Stream 9系統。 example.com. 這四個系統中的每一個都有一個 LUKS 加密的根文件系統,目前每次啟動系統時都必須手動輸入 LUKS 密碼。
在 pi.example.com 系統上安裝並配置 Tang,角色為 nbde_server 和 firewall,在其他四個系統上安裝配置 Clevis,角色為 nbde_client,並創建一個加密的根文件 允許系統自動解鎖。 .example.com唐系統。
在樹莓派上安裝 Linux 系統角色和 Ansible
首先,在將充當 Ansible 控制節點的 pi.example.com 主機上安裝 linux-system-roles 包。這還將安裝 ansible-core 和一些其他包作為依賴項。這些包不需要安裝在我環境中的其他四個系統(稱為受管節點)上。
$ sudo dnf install linux-system-roles
必須配置 SSH 密鑰和 sudo,以便控制節點主機可以連接到環境中的每個受管節點並提升到 root 權限。
定義 Ansible 清單文件
仍然在 pi.example.com 主機上,創建一個 Ansible 清單文件,將您環境中的五個系統分組為兩個 Ansible 清單組。 nbde_servers 組包含要配置為 Tang 服務器的主機列表(本例中只有 pi.example.com 主機),nbde_clients 組包含要配置為 Clevis 客戶端的主機列表。此清單文件名為 inventory.yml 並包含:
all: children: nbde_servers: hosts: pi.example.com: nbde_clients: hosts: fedora35-server1.example.com: fedora35-server2.example.com: c9s-server1.example.com: c9s-server2.example.com:
創建 Ansible 組變量文件
設置 Ansible 變量以指定 Linux 系統角色應實現的配置。每個角色都有一個 README.md 文件,其中包含有關如何使用每個角色的重要信息,包括可用角色變量列表。 nbde_server、nbde_client 和防火牆角色 README.md 文件位於此處:
- /usr/share/doc/linux-system-roles/nbde_server/README.md
- /usr/share/doc/linux-system-roles/nbde_client/README.md
- /usr/share/doc/linux-system-roles/firewall/README.md
使用 mkdir group_vars 命令創建 group_vars 目錄。在此目錄中創建 nbde_servers.yml 和 nbde_clients.yml 文件。這些文件定義了必須分別在 nbde_servers 和 nbde_clients 清單組中列出的系統上設置的變量。
nbde_servers.yml 文件包含以下內容並告訴防火牆角色打開 TCP 端口 80,這是 Tang 使用的默認端口。
firewall: - port: ['80/tcp'] state: enabled
nbde_clients.yml 文件包含:
nbde_client_bindings: - device: /dev/vda2 encryption_password: !vault | $ANSIBLE_VAULT;1.1;AES256 62666465373138636165326639633... servers: - https://pi.example.com
nbde_client_bindings 下的設備指定用於加密四個託管節點的根文件系統的支持設備。 encryption_password 指定配置 Clevis 所需的當前 LUKS 密碼。在這個例子中,我們沒有以明文形式輸入 LUKS 密碼,而是使用 ansible-vault 來加密字符串。最後,[サーバー], 指定 Clevis 將綁定到的 Tang 服務器列表。在此示例中,Clevis 客戶端配置為綁定到 pi.example.com Tang 服務器。
創建腳本
創建一個名為 nbde.yml 的簡單 Ansible 劇本,它調用 nbde_servers 清單組中系統上的防火牆和 nbde_server 角色,以及 nbde_clients 組中系統上的 nbde_client 角色。
- name: Open firewall for Tang hosts: nbde_servers roles: - linux-system-roles.firewall - name: Deploy NBDE Tang server hosts: nbde_servers roles: - linux-system-roles.nbde_server - name: Deploy NBDE Clevis clients hosts: nbde_clients roles: - linux-system-roles.nbde_client
此時我已經創建了以下文件和目錄:
- 股票.yml
- nbde.yml
- 組變量/nbde_clients.yml
- group_vars/nbde_servers.yml
運行腳本
可以使用以下命令運行 nbde.yml 劇本:
$ ansible-playbook nbde.yml -i inventory.yml --ask-vault-pass -b
-i 標誌指定要使用的清單文件,–ask-vault-pass 標誌提示您輸入 ensible vault 密碼以解密 encryption_password 變量,-b 標誌告訴 Ansible 以 root 身份驗證。指定權限必須被提升。

檢查配置
為了驗證配置,我將配置為 Clevis 客戶端的四個受管節點中的每一個都重新啟動到 Raspberry Pi Tang 服務器。 四個受管節點中的每一個都將啟動並在 LUKS 密碼提示時暫停。

然而,在短暫的延遲之後,四個系統中的每一個都在我輸入 LUKS 密碼的情況下繼續啟動。
結論是
如果您想使用 LUKS 加密來保護靜態數據,但想要一個無需干預即可啟動系統的解決方案,請考慮實施 Clevis 和 Tang。 Linux 系統角色有助於以自動化方式實現 Clevis 和 Tang 以及系統的許多其他方面。