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


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

但是,還有其他值得關注的情況。存儲設備可能出現故障並在保修期內更換。供應商通常要求退回原始設備。如果您的設備已加密,則無需將其退回給硬件供應商。

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

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

然而,有一個挑戰經常阻礙 LUKS 的大規模實施,尤其是對於根文件系統。每次重新啟動主機時,我都必須手動訪問控制台並輸入 LUKS 密碼才能啟動系統。 .

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

如果你有數百個系統,每次重啟後手動輸入每個系統的 LUKS 密碼是不切實際的

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

本文介紹瞭如何實現允許自動 LUKS 卷解鎖的解決方案(實現這些功能的過程也是使用自動化完成的!)

Clevis 和 Tang 概述

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

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

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

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

Linux 系統角色總結

Linux System Roles 是一組 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 加密卷的另一個術語。 Firewall 角色可以自動化用於在 Don 服務器的防火牆中打開端口的防火牆設置。

演示環境概述

在我的環境中,我有一個運行 Fedora 36 的 Raspberry Pi,我在其上安裝了 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 密碼。

在具有 nbde_server 和防火牆角色的 pi.example.com 系統上安裝和配置 Tang,在具有 nbde_client 角色的其他四個系統上安裝和配置 Clevis,並創建加密的根文件允許系統自動解鎖。 .example.com 唐系統。

在 Raspberry Pi 上安裝 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 密碼。在這個例子中,我們使用 ansible-vault 來加密字符串,而不是使 LUKS 密碼明文。在最後,[サーバー],指定 Clevis 將綁定到的 Tang 服務器列表。在此示例中,Clevis 客戶端配置為綁定到 pi.example.com Tang 服務器。

創建劇本

創建一個名為 nbde.yml 的簡單 Ansible playbook,它調用 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
  • 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 標誌要求提供 ensible vault 密碼來解密 encryption_password 變量,-b 標誌告訴 Ansible 驗證它是 root。指定權限必須被提升。

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

檢查配置

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

系統將引導至 LUKS 密碼提示,短暫暫停後,系統將自動恢復引導。

然而,在短暫的延遲之後,四個系統中的每一個都繼續啟動,我不必輸入我的 LUKS 密碼。

結論是

如果您想使用 LUKS 加密來保護靜態數據,但想要一個允許您在無需干預的情況下啟動系統的解決方案,請考慮實施 Clevis 和 Tang。 Linux 系統角色有助於自動化 Clevis 和 Tang 以及系統的許多其他方面。