Mã hóa ổ đĩa Linux với LUKS và Cryptsetup: Thiết lập và tự động mở khóa bằng TPM 2.0

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Vấn đề thực tế: Nghịch lý khởi động tự động với ổ đĩa mã hóa

Quản lý các ổ đĩa mã hóa trên các node bare-metal headless hoặc edge gateway thường là một cơn ác mộng vận hành. Mã hóa volume chuẩn LUKS mang lại khả năng bảo vệ dữ liệu tĩnh (data-at-rest) rất vững chắc trước nguy cơ bị đánh cắp ổ cứng. Tuy nhiên, rắc rối thực sự bắt đầu ngay khi hệ thống tự động cập nhật bản vá kernel hoặc sự cố chớp điện bất ngờ khiến máy khởi động lại lúc 2:00 sáng.

Theo mặc định, LUKS sẽ dừng hoàn toàn ở giai đoạn initramfs. Nó đứng chờ quản trị viên nhập passphrase trực tiếp trên console. Nếu không có các giải pháp quản trị out-of-band từ xa như iDRAC hay iLO, prompt chờ đó sẽ phá vỡ quy trình tự phục hồi tự động. Một đợt cập nhật định kỳ dự kiến kéo dài 5 phút có thể nhanh chóng biến thành nhiều giờ downtime. Các sysadmin thường rơi vào thế tiến thoái lưỡng nan: chấp nhận không mã hóa ổ đĩa để máy tự reboot được, hoặc hy sinh độ sẵn sàng cao (high availability) để làm hài lòng các đợt audit bảo mật.

Phân tích nguyên nhân gốc rễ: Xung đột giữa bảo mật boot và vận hành từ xa

Để hiểu rõ điểm nghẽn này, chúng ta cần xem xét cách thức LUKS quản lý các khóa mã hóa (cryptographic keys):

  • Điểm nghẽn từ passphrase: Header của LUKS2 bảo vệ master key của ổ đĩa bằng các key slot được xử lý qua hàm dẫn xuất khóa Argon2id. Theo thiết kế, quá trình tính toán này sẽ tạm dừng chuỗi boot cho đến khi kỹ sư nhập secret thủ công.
  • Các giải pháp tình thế rủi ro: Để bỏ qua prompt nhập thủ công, các kỹ sư thường để raw keyfile ngay trong /boot hoặc truyền passphrase qua mạng TFTP không mã hóa. Nếu kẻ trộm rút ổ cứng khỏi rack, chúng sẽ lấy được cả dữ liệu đã mã hóa (ciphertext) lẫn plaintext key dùng để mở khóa.
  • Không có khả năng xác thực tính toàn vẹn: Các keyfile tĩnh không thể phát hiện việc firmware bị can thiệp. Nếu kẻ tấn công thay thế bootloader hoặc chỉnh sửa thiết lập UEFI ngoại tuyến, keyfile thông thường vẫn sẽ mở khóa volume như không có chuyện gì xảy ra.

Chúng ta cần một root of trust dựa trên phần cứng. Ổ đĩa sẽ tự động mở khóa mượt mà trên đúng bo mạch chủ hợp lệ, nhưng sẽ lập tức khóa chặt ngay khi ai đó tháo ổ đĩa ra khỏi khung máy (chassis).

So sánh các giải pháp: Cân bằng giữa bảo mật và uptime

Nhiều năm qua, các đội ngũ kỹ thuật đã thử nghiệm nhiều phương pháp để tự động mount ổ đĩa. Dưới đây là so sánh giữa các chiến lược phổ biến trong hạ tầng thực tế:

1. Lưu Keyfile dạng Plaintext trên phân vùng Boot

Đặt một key không mã hóa vào /boot chỉ mất 5 phút để cấu hình. Đáng tiếc là cách này phá hủy hoàn toàn tính bảo mật của ổ đĩa. Bất kỳ ai có quyền tiếp cận vật lý đều có thể mount ổ đĩa, trích xuất key và đọc dữ liệu khách hàng chỉ trong vài giây.

2. Mã hóa ràng buộc qua mạng (Network-Bound Disk Encryption – Clevis + Tang)

Clevis client mở khóa LUKS key qua giao thức HTTP từ một Tang server từ xa. Các node có thể boot tự động hoàn toàn miễn là chúng nằm trong VLAN nội bộ được ủy quyền. Mô hình Tang hoạt động rất tốt cho các cụm trên 500 server, nhưng nó lại tạo ra một điểm lỗi duy nhất (single point of failure) từ bên ngoài. Nếu core switch gặp sự cố hoặc tiến trình Tang daemon bị treo, các node của bạn sẽ dừng lại ở emergency rescue shell.

3. Bảo mật phần cứng: TPM 2.0 kết hợp systemd-cryptenroll

Hầu như mọi server hiện đại và máy NUC ngày nay đều tích hợp sẵn chip phần cứng TPM 2.0. Với systemd-cryptenroll, chúng ta seal (niêm phong) một LUKS2 slot chuyên dụng trực tiếp bên trong bộ đồng xử lý mật mã tích hợp này. Quá trình giải mã diễn ra hoàn toàn không cần con người can thiệp, nhưng chỉ khi các chỉ số đo lường lúc boot khớp chính xác với các thanh ghi cấu hình nền tảng (PCRs) nguyên bản.

Hướng dẫn thực hành: LUKS2 với Cryptsetup và tự động mở khóa bằng TPM 2.0

Khóa volume LUKS2 vào module TPM 2.0 mang lại sự cân bằng tối ưu nhất. Bạn vẫn giữ lại được một slot passphrase dự phòng cho kịch bản disaster recovery, trong khi server vẫn reboot mượt mà mà không cần can thiệp thủ công.

Bước 1: Phân vùng và định dạng với LUKS2

Trước tiên, hãy xác định chính xác ổ đĩa đích. Trong bài hướng dẫn này, chúng ta sẽ sử dụng một phân vùng NVMe riêng tại /dev/nvme0n1p3. Khởi tạo phân vùng với các tham số chuẩn LUKS2 hiện đại:

# Định dạng block device đích
sudo cryptsetup luksFormat --type luks2 --verify-passphrase /dev/nvme0n1p3

# Mở container đã mã hóa thủ công để kiểm tra passphrase
sudo cryptsetup open /dev/nvme0n1p3 secure_data

# Tạo filesystem ext4 trên device đã ánh xạ
sudo mkfs.ext4 -L secure_store /dev/mapper/secure_data

# Đóng mapping thử nghiệm
sudo cryptsetup close secure_data

Hãy lưu passphrase phục hồi vào một công cụ quản lý mật khẩu doanh nghiệp như Vault hoặc 1Password. Nếu sau này bản cập nhật UEFI làm thay đổi các giá trị đo lường nền tảng, bạn sẽ cần passphrase này để lấy lại quyền truy cập.

Bước 2: Đăng ký với chip TPM 2.0

Kiểm tra xem kernel đã nhận diện chip bảo mật phần cứng hay chưa:

# Kiểm tra device node của TPM 2.0 resource manager
ls -l /dev/tpmrm0
systemd-cryptenroll --tpm2-device=list

Gán một LUKS2 keyslot mới vào TPM. Chúng ta sẽ seal key vào PCR 7 – thanh ghi đo lường trạng thái Secure Boot và các chứng chỉ UEFI:

# Seal volume LUKS vào TPM 2.0 sử dụng PCR 7
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/nvme0n1p3

Cách tiếp cận này đã giúp giảm thời gian cold reboot trên các cụm server Dell PowerEdge 2 socket của chúng tôi từ 12 phút xử lý console thủ công xuống chỉ còn 45 giây hoàn toàn tự động.

Bước 3: Cấu hình tự động Mount vĩnh viễn

Lấy UUID duy nhất của phân vùng thô đã mã hóa:

sudo blkid -s UUID -o value /dev/nvme0n1p3

Thêm quy tắc ánh xạ vào /etc/crypttab. Tùy chọn tpm2-device=auto sẽ chỉ thị cho systemd yêu cầu token mở khóa trực tiếp từ TPM:

# Cú pháp /etc/crypttab
# <target-name>   <source-device>                                 <key-file>   <options>
secure_data       UUID=a8b3c4d5-e6f7-4a1b-8c2d-9e0f1a2b3c4d       none         tpm2-device=auto,discard

Tiếp theo, định nghĩa vị trí mount trong /etc/fstab:

# Khai báo trong /etc/fstab
/dev/mapper/secure_data   /mnt/secure_data   ext4   defaults,noatime   0   2

Bước 4: Cập nhật Initramfs và kiểm tra

Rebuild lại initial RAM disk để các giai đoạn boot ban đầu nạp đầy đủ các module TPM và cryptsetup cần thiết:

# Trên Debian/Ubuntu:
sudo update-initramfs -u -k all

# Trên RHEL/Rocky Linux:
# sudo dracut -f --regenerate-all

Kiểm tra cấu hình mà không cần phải khởi động lại toàn bộ máy. Hãy reload các unit của systemd và restart trực tiếp service cryptsetup:

sudo systemctl daemon-reload
sudo systemctl restart systemd-cryptsetup@secure_data.service
sudo mount -a
df -h /mnt/secure_data

Kinh nghiệm thực chiến cho môi trường tăng cường bảo mật

  • Chiến lược chọn PCR: Thanh ghi --tpm2-pcrs=7 chỉ theo dõi riêng trạng thái Secure Boot. Để khóa chặt cả kernel và các file initramfs, hãy kết hợp các thanh ghi với --tpm2-pcrs=4+7. Lưu ý rằng việc ràng buộc PCR 4 yêu cầu bạn phải enroll lại TPM token sau mỗi lần cập nhật kernel.
  • Đảm bảo an toàn cho Keyslot dự phòng: Tuyệt đối không xóa keyslot passphrase nhập tay. Xác nhận lại các slot nào đang hoạt động bằng lệnh sudo cryptsetup luksDump /dev/nvme0n1p3.
  • Thu hồi và thay thế phần cứng: Trước khi thay bo mạch chủ hoặc thanh lý server, hãy xóa sạch TPM keyslot bằng lệnh sudo systemd-cryptenroll --wipe-slot=tpm2 /dev/nvme0n1p3.
Share: