Loại bỏ yêu cầu mật khẩu lúc nửa đêm: Tự động mở khóa LUKS bằng TPM 2.0

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Cơn ác mộng khởi động lại lúc 2 giờ sáng

Tôi đã trải qua quá nhiều đêm lúc 2:15 sáng phải dán mắt vào bảng điều khiển iDRAC từ xa, chờ đợi một máy chủ hoạt động trở lại. Một bản vá kernel định kỳ yêu cầu khởi động lại, và rồi mọi thứ dừng lại. Màn hình treo ở một dòng thông báo quen thuộc và khó chịu: Vui lòng nhập mật khẩu cho ổ đĩa.... Trên một chiếc laptop cá nhân, đây chỉ là một sự phiền tối nhỏ. Nhưng trên một tủ rack gồm 50 node được mã hóa, đó là một thảm họa về vận hành. Bạn đơn giản là không thể luôn túc trực để nhập mật khẩu 32 ký tự cho mọi cỗ máy sau mỗi lần mất điện thoáng qua.

Đó là lúc Trusted Platform Module (TPM) phát huy vai trò trong hệ thống bảo mật máy chủ Linux của bạn. Hầu hết các bo mạch chủ hiện đại, từ máy chủ Dell PowerEdge đến các dòng ThinkPad, đều tích hợp chip TPM 2.0. Thay vì phải ghi nhớ một khóa hoặc dán nó lên tờ giấy note, chúng ta sẽ “niêm phong” (seal) khóa đó trực tiếp vào phần cứng TPM. Ổ đĩa sẽ chỉ mở khóa nếu trạng thái hệ thống không bị can thiệp. Đây là sự cân bằng hoàn hảo giữa mã hóa cấp độ cao và sự tiện lợi trong vận hành.

Khi lần đầu thiết lập phân vùng này, tôi đã sử dụng công cụ tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator để tạo một chuỗi có độ hỗn loạn (entropy) cao. Vì công cụ đó chạy hoàn toàn trên trình duyệt, khóa không bao giờ bị truyền qua mạng. Tôi giữ chuỗi đó làm bản sao lưu dự phòng khẩn cấp. Tuy nhiên, đối với các hoạt động hàng ngày, tôi muốn phần cứng tự xử lý các công việc nặng nhọc này.

Hiểu về PCR: Những người gác cổng bảo mật

TPM không chỉ cung cấp khóa cho bất kỳ ai yêu cầu. Nó sử dụng PCR (Platform Configuration Registers) để đo lường tính toàn vẹn của hệ thống. Hãy coi đây là những bản chụp mã hóa về trạng thái phần cứng và phần mềm của bạn. Các thanh ghi phổ biến bao gồm:

  • PCR 0: Mã nguồn BIOS và UEFI cốt lõi.
  • PCR 1: Cấu hình bo mạch chủ và chipset.
  • PCR 7: Chính sách và chứng chỉ Secure Boot.

Nếu kẻ tấn công rút ổ NVMe của bạn và cắm vào một máy khác, các giá trị PCR sẽ thay đổi. TPM sẽ phát hiện sự sai lệch này và từ chối cung cấp khóa. Đối với hầu hết các môi trường production, liên kết với PCR 7 là lựa chọn tối ưu. Nó đảm bảo máy vẫn ở trạng thái Secure Boot đáng tin cậy mà không quá nhạy cảm đến mức một bản cập nhật firmware nhỏ cũng khiến bạn bị khóa vĩnh viễn.

Cài đặt: Chuẩn bị bộ công cụ

Chúng ta sử dụng một framework tên là Clevis để kết nối LUKS (Linux Unified Key Setup) với TPM. Bạn cũng sẽ cần tpm2-tools để tương tác với phần cứng. Các hướng dẫn này giả định bạn đang chạy Ubuntu 22.04+, Fedora hoặc RHEL 9.

Bắt đầu bằng việc cài đặt các gói cần thiết:

# Dành cho Ubuntu/Debian
sudo apt update
sudo apt install tpm2-tools clevis clevis-tpm2 clevis-luks clevis-dracut -y

# Dành cho RHEL/CentOS/Fedora
sudo dnf install tpm2-tools clevis clevis-luks clevis-dracut -y

Trước khi tiếp tục, hãy xác nhận rằng kernel Linux có thể giao tiếp với chip của bạn:

tpm2_pcrread sha256:7

Nếu lệnh trả về một chuỗi hex 64 ký tự, bạn đã sẵn sàng. Nếu bạn thấy lỗi “Device not found”, hãy vào BIOS. Đảm bảo TPM (đôi khi được gắn nhãn là PTT hoặc fTPM) đã được thiết lập phiên bản 2.0 và được kích hoạt.

Cấu hình: Liên kết LUKS với phần cứng

Các phân vùng LUKS hiện đại có nhiều “slot” (khe) cho các khóa. Thông thường, Slot 0 giữ mật khẩu thủ công của bạn. Chúng ta sẽ sử dụng Clevis để chiếm một slot thứ hai với một khóa được niêm phong bởi TPM.

Bước 1: Xác định phân vùng mục tiêu

Xác định phân vùng được mã hóa của bạn bằng lệnh lsblk:

lsblk -f

Tìm nhãn crypto_LUKS. Trong hướng dẫn này, chúng tôi giả định phân vùng của bạn là /dev/nvme0n1p3.

Bước 2: Niêm phong khóa

Lệnh này tạo ra một bí mật mới, niêm phong nó dựa trên PCR 7 và lưu trữ siêu dữ liệu (metadata) trong tiêu đề LUKS. Nó liên kết dữ liệu với trạng thái Secure Boot cụ thể trên bo mạch chủ của bạn một cách hiệu quả.

sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 '{"pcr_ids":"7"}'

Lưu ý: Bạn sẽ được yêu cầu nhập mật khẩu hiện tại. Clevis cần mật khẩu này để ủy quyền tạo khe cắm khóa mới. Hãy sử dụng mật khẩu có độ hỗn loạn cao mà bạn đã tạo trong quá trình thiết lập ban đầu.

Bước 3: Xây dựng lại Image khởi động

Hệ thống phải tải Clevis trong giai đoạn đầu của quá trình khởi động, rất lâu trước khi hệ thống tệp gốc (root filesystem) được gắn kết. Để làm điều này, chúng ta phải xây dựng lại đĩa RAM khởi tạo (initramfs).

Trên hệ thống Ubuntu/Debian:

sudo update-initramfs -u

Trên hệ thống RHEL/Fedora:

sudo dracut -f

Tôi luôn kiểm tra để đảm bảo module clevis được bao gồm trong log quá trình xây dựng. Nếu thiếu nó, quá trình khởi động vẫn sẽ dừng lại ở yêu cầu mật khẩu, làm mất đi mục đích của việc thiết lập này.

Kiểm tra tính tự động

Đã đến lúc kiểm tra. Hãy khởi động lại máy. Nếu cấu hình chính xác, bạn sẽ thấy menu GRUB, sau đó là một khoảng dừng ngắn khoảng một giây. Thay vì yêu cầu mật khẩu, hệ thống sẽ tiến thẳng đến màn hình đăng nhập. Cảm giác giống như phép màu, nhưng thực chất đó là sự tin cậy dựa trên phần cứng.

Xác minh các Slot

Để xem thay đổi trong tiêu đề LUKS của bạn, hãy chạy:

sudo cryptsetup luksDump /dev/nvme0n1p3

Bây giờ bạn sẽ thấy hai slot đang hoạt động. Slot 0 là bản sao lưu thủ công của bạn. Một slot khác—thường là Slot 1—sẽ hiển thị một phần “Tokens” đáng kể. Siêu dữ liệu này cho hệ thống biết cách sử dụng Clevis để giao tiếp với TPM.

Khôi phục: Chuyện gì xảy ra nếu thất bại?

Nếu bạn cập nhật BIOS hoặc tắt Secure Boot, giá trị PCR 7 sẽ thay đổi. TPM sẽ ngay lập tức nhận thấy sự khác biệt và từ chối cung cấp khóa. Đây là cách hệ thống hoạt động đúng như thiết kế.

Khi điều này xảy ra, quá trình khởi động sẽ đơn giản quay trở lại yêu cầu mật khẩu thủ công. Hãy nhập mật khẩu dự phòng của bạn, đăng nhập và sau đó làm mới liên kết:

# Xóa liên kết cũ đã bị hỏng
sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1

Tự động hóa giải mã ổ đĩa không phải là cắt giảm các tiêu chuẩn bảo mật. Đó là về việc xây dựng cơ sở hạ tầng bền bỉ, có khả năng tự phục hồi sau khi khởi động lại mà không cần sự can thiệp của con người. Bằng cách ủy thác bí mật cho TPM, bạn đảm bảo dữ liệu chỉ có thể truy cập được trên chính phần cứng đó, giúp bạn cuối cùng cũng có thể ngon giấc trong những lần máy chủ khởi động lại lúc 2 giờ sáng.

Share: