使用 Linux 系統特性實現 UKS 和 Tang 自動解鎖 LUKS 卷

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

但是,還有其他情況也值得關注:也許您的存儲設備出現故障並在保修期內被更換; 運營商會多次要求您退回原始設備。 如果設備已加密,則將其退還給硬件供應商就不用擔心了。

另一個問題是,只要您的存儲設備不在視線範圍內,就有可能在您不知情的情況下從設備複製或克隆數據。 同樣,如果設備是加密的,這就不那麼重要了。

Fedora(和其他 Linux 發行版)包括 Linux 統一密鑰配置 (LUKS) 功能以支持磁盤加密。 LUKS 易於使用,甚至可以作為選項集成到 Fedora Anaconda 安裝程序中。

然而,有一個挑戰經常阻止人們大規模部署 LUKS,尤其是對於根文件系統:每次重新啟動主機時,通常都必須手動訪問控制台並輸入 LUKS 密碼,以便系統可以開機。 .

如果您在一台筆記本電腦上運行 Fedora,這可能不是問題,畢竟,您可能每次重啟時都坐在筆記本電腦前。 但是,如果您有大量 Fedora 實例,那麼管理起來很快就會變得不切實際。

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

您可能正在管理位於遠程位置的 Fedora 系統,並且您甚至可能沒有好的或可靠的方法來訪問它們上的控制台。 在這種情況下,重新啟動主機可能會導致它們無法激活,直到您或其他人前往其位置輸入 LUKS 密碼。

本文將介紹如何實現啟用自動解鎖 LUKS 卷的解決方案(並且實現這些功能的過程也將通過自動化完成!)

耳環和唐概述

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

基本前提是 Tang 服務器位於內部/私有或其他受保護的網絡上,如果存儲設備丟失、被盜或從環境中移除,它們將無法再訪問 Tang 網絡。 服務器,因此將不再在啟動時自動解鎖。

Tang 是無狀態的,不需要身份驗證或 TLS,這意味著它非常輕量級且易於配置,並且可以在容器內運行。 在本文中,我只配置一個 Tang 服務器,但也可以在一個環境中擁有多個 Tang 服務器,並配置 Clevis 客戶端必須連接的 Tang 服務器的數量才能解鎖加密卷。 例如,您可以擁有三個 Tang 服務器,並要求 Clevis 客戶端能夠連接到三個 Tang 服務器中的至少兩個。

有關 Tang 和 Clevis 如何工作的更多信息,請參閱 GitHub 頁面:耳環長釘o 有關 Tang 和 Clevis 內部工作原理的概述,請參閱安全的自動解密 新技術和密碼學FOSDEM 談話。

Linux 系統功能概述

Linux 系統角色是一組 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”代表Network Attached Disk Encryption,這是另一個術語,指的是Clevis和Tang使用LUKS加密卷的自動解鎖。 防火牆功能可以自動執行防火牆配置,將用於在唐服務器的防火牆中打開一個端口。

演示環境概述

在我的環境中,我有一個運行 Fedora 36 的 Raspberry Pi,我將在其上安裝 Linux 系統角色並將其用作我的 Ansible 控制節點。 此外,我將使用相同的 Raspberry Pi 作為我的 Tang 服務器。 此設備配置有主機名 pi.example .com。

此外,我的環境中有四個其他系統:兩個 Fedora 36 和兩個 CentOS Stream 9 系統,分別命名為 fedora-server1.googlesyndication.com、fedora-server2.googlesyndication.com、c9s-server1.googlesyndication.com 和 c9s-server2 .example .com。 這四個系統中的每一個都有一個 LUKS 加密的根文件系統,目前每次啟動系統時都必須手動輸入 LUKS 密碼。

我將使用 nbde_server 和防火牆角色在我的 pi.googlesyndication.com 上安裝和配置 Tang,並使用 nbde_client 角色在我的其他四個系統上安裝和配置 Clevis,如果可以的話,允許他們自動解鎖加密的根文件系統連接到 pi.googlesyndication.com Tang 系統。

在 Raspberry Pi 上安裝 Linux 和 Ansible 系統功能

我將首先在 pi.googlesyndication.com 主機上安裝 linux-system-roles 包,它將充當我的 Ansible 控制節點。 這還將安裝 ansible-core 和各種其他包作為依賴項。 這些軟件包不需要安裝在我環境中的其他四個系統(稱為受管節點)上。

                      $ sudo dnf install linux-system-roles
                    

SSH 密鑰和 sudo 必須配置配置,以便控制節點主機可以連接到環境中的每個託管節點併升級到 root 權限。

Ansible 庫存文件定義

仍然在 pi.googlesyndication.com,我將創建一個 Ansible 清單文件,將我環境中的五個系統分組為兩個 Ansible 清單組。 nbde_servers 組將包含我想配置為 Tang 服務器的主機列表(在此示例中只是 pi.googlesyndication.com 主機),nbde_clients 組將包含我想配置的主機列表作為 Clevis 的客戶。 我將此庫存文件稱為inventory.yml,它包含以下內容:

                      all:
  children:
    nbde_servers:
      hosts:
        pi.googlesyndication.com:
    nbde_clients:
      hosts:
        fedora35-server1.googlesyndication.com:
        fedora35-server2.googlesyndication.com:
        c9s-server1.googlesyndication.com:
        c9s-server2.googlesyndication.com:

                    

創建 Ansible Group 變量文件

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.googlesyndication.com
                    

在 nbde_client_bindings 中,device 指定所有四個受管節點上的加密根文件系統備份設備。 encryption_password 指定配置 Clevis 所需的當前 LUKS 密碼。 在這個例子中,我使用 ansible-vault 來加密字符串,而不是把 LUKS 密碼短語放在明文中。 最後,在服務器中,指定了 Clevis 應該綁定到的 Tang 服務器列表。 在此示例中,Clevis 客戶端將配置為綁定到 pi.exampleTang .com 服務器。

創建劇本

我將創建一個名為 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
  • 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 密碼來解密 crypto_password 變量,-b 標誌指定 Ansible 應該升級到 root 權限。

播放 ansible-playbook 命令的摘要輸出,顯示成功完成的 playbook

驗證配置

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

系統啟動到 LUKS 密碼提示並在短暫暫停後繼續自動啟動

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

結論

如果您想使用 LUKS 加密保護您的靜態數據,但需要一個允許系統在無人值守的情況下啟動的解決方案,請考慮實施 Clevis 和 Tang。 Linux System Roles 可以幫助您以自動化的方式實現 Clevis 和 Tang,以及系統的許多其他方面。

相關文章