使用 Linux 系統角色實現 Clevis 和 Tang 用於自動 LUKS 卷解鎖


系統安全的關鍵方面之一是靜態加密存儲。如果沒有加密存儲,存儲設備無論何時離開您都可能面臨風險。發生這種情況的最明顯情況是存儲設備(無論是存儲設備、整個系統、服務器還是筆記本電腦)丟失或被盜。

但是,還有其他值得關注的情況。存儲設備可能在保修期內發生故障並被更換。在許多情況下,供應商會要求您退回原始設備。如果您的設備已加密,您不必擔心將其退回給硬件供應商。

另一個問題是,除非您能看到存儲設備,否則您可能會在您不知情的情況下從該設備複製或複制數據。同樣,如果設備是加密的,這一點就不那麼重要了。

Fedora(和其他 Linux 發行版)包括支持磁盤加密的 Linux 統一密鑰設置 (LUKS) 功能。 LUKS 易於使用並作為一個選項集成在 Fedora Anaconda 安裝程序中。

然而,有一個挑戰經常阻礙大型 LUKS 的實施,尤其是對於根文件系統。每次重啟主機,都需要手動進入控制台,輸入LUKS密碼來啟動系統。

如果您在筆記本電腦上運行 Fedora,這可能不是問題。畢竟,每次重新啟動時,您可能都坐在筆記本電腦前。但是,如果在這種情況下您有很多 Fedora,這很快就會變得不現實。

如果您有數百個系統,每次重新啟動時手動輸入每個系統上的 LUKS 密碼是不切實際的。

您可能正在遠程管理 Fedora 系統,甚至可能沒有一種好的或可靠的方式來訪問這些控制台。在這種情況下,重新啟動主機可能會阻止主機啟動,直到您或其他人移動到該位置並輸入 LUKS 密碼。

本文描述瞭如何實現一個解決方案,允許您解鎖自動化 LUKS 卷(實現這些功能的過程也是使用自動化執行的!)。

Clevis 和 Tang 概述

Clevis and Tang 是一種創新的解決方案,有助於解決使用加密存儲啟動系統的挑戰,而無需用戶在每次啟動時進行手動干預。從廣義上講,只要客戶端系統可以通過網絡訪問可配置數量的 Tang 服務器,安裝在客戶端系統上的 Crevis 就可以在無需用戶干預的情況下解鎖 LUKS 卷。

基本前提是,如果 Tang 服務器在內部/私有或其他安全網絡上,並且存儲設備丟失、被盜或以其他方式從環境中移除,將無法訪問 Tang 服務器。將無法訪問。它將自動解鎖。

Tang 是無狀態的,甚至不需要身份驗證或 TLS。這意味著它非常輕量級,易於配置,並且可以從容器中運行。在本文中,我們只設置了一台Tang server,但是Clevis客戶端需要連接的Tang server數量,以便在環境中部署多台Tang server並解鎖加密卷。您也可以配置。例如,您需要使用三個 Tang 服務器,並允許 Clevis 客戶端連接到三個 Tang 服務器中的至少兩個。

有關 Tang 和 Clevis 如何工作的更多信息,請參閱 GitHub 頁面。 耳環 什麼時候 大學教師或者有關 Tang 和 Clevis 內部工作原理的概述,請參閱。 自動解密的新加密和技術保護 FOSDEM 談話。

Linux系統的作用概述

Linux System Roles 是一組 Ansible 角色/集合,可幫助自動配置和管理 Fedora、CentOS Stream、RHEL 和 RHEL 衍生產品。 Linux 系統角色在 Fedora 中打包為 RPM(linux-system-roles),並且在 Ansible Galaxy 中也可用(作為角色和集合)。 要查看有關 Linux 系統角色的更多信息和包含的角色列表,請參閱。 Linux 系統角色項目頁面..

Linux 系統角色列表包括本文中使用的 nbde_client、nbde_server 和防火牆角色。 nbde_client 和 nbde_server 的角色分別側重於自動化 Clevis 和 Tang 的實施。角色名稱“nbde”代表網絡綁定磁盤加密。這是另一個術語,指的是使用 U 形夾和舌頭自動解鎖 LUKS 加密卷。防火牆角色可以自動化用於在 Don 服務器的防火牆中打開端口的防火牆設置。

演示環境概述

在我的環境中,我有一個運行 Fedora 36 的 Raspberry Pi,我安裝了 Linux 系統角色並將其用作 Ansible 控制節點。它還使用與 Tang 服務器相同的 Raspberry Pi。該設備由 pi.example.com 主機名組成。

此外,我的環境中還有其他四個系統。 fedora-server1.example.com、fedora-server2.example.com、c9s-server1。 有兩個 Fedora 36 系統和兩個名為 example.com、c9s-server2 的 CentOS Stream 9 系統。 例子.com。這四個系統中的每一個都有一個 LUKS 加密的根文件系統,目前需要您在每次啟動系統時手動輸入 LUKS 密碼。

使用 nbde_server 和 firewall 角色在 pi.example.com 系統上安裝和配置 Tang,並使用 nbde_client 角色在其他四個系統上安裝和配置 Clevis,並使用加密的根。允許文件系統自動解鎖。 .example.com 唐系統。

在 Raspberry Pi 上安裝 Linux 系統角色和 Ansible

首先,在您的 pi.example.com 主機上安裝 Linux-system-roles 包。它充當 Ansible 控制節點。這還將安裝 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:

創建 AnsibleGroup 變量文件

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

使用 mkdirgroup_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 下,device 為四個受管節點上的加密根文件系統指定支持設備。 Encryption_password 指定配置 U 形夾所需的當前 LUKS 密碼。在此示例中,我們使用 ansible-vault 加密字符串,而不是使 LUKS 密碼明文。在最後,[サーバー]指定 Clevis 應該綁定到的 Tang 服務器列表。在此示例中,Clevis 客戶端配置為綁定到 pi.example.com Tang 服務器。

創建劇本

創建一個名為 nbde.yml 的簡單 Ansible playbook,它為 nbde_servers 庫存組中的系統調用 firewall 和 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
  • group_vars /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 標誌提示輸入 Ansible Vault 密碼以解密加密的密碼變量,-b 標誌使 Ansible root. 指定需要升級。

播放 ansible-playbook 命令的摘要輸出表明 playbook 已成功完成。

檢查配置

為了驗證配置,我重新啟動了配置為 Raspberry PiTang 服務器的 Clevis 客戶端的四個託管節點中的每一個。 四個受管節點中的每一個都在 LUKS 密碼提示符處啟動和暫停。

系統在 LUKS 密碼提示下啟動,一段時間後會自動恢復啟動

然而,過了一會兒,四個系統中的每一個都在沒有輸入 LUKS 密碼的情況下繼續啟動。

結論是

如果您想使用 LUKS 加密來保護您存儲的數據,但需要一種無需干預即可啟動系統的解決方案,請考慮實施 Clevis 和 Tang。 Linux 系統角色有助於自動化 U 形夾和舌頭以及系統的許多其他方面。