2 giờ sáng, chuông PagerDuty réo inh ỏi. Cụm database chính bỗng dưng biến mất khỏi hệ thống giám sát sau đợt tự động cập nhật kernel. Thử SSH vào thì nhận về lỗi Connection timed out. Bật remote console qua IPMI lên xem, đập vào mắt là dòng chữ quen thuộc: dracut: Please enter passphrase for disk. Không có ai trực tiếp gõ passphrase, server cứ thế nằm im suốt 45 phút.
Thực tế khi kiểm tra hạ tầng ở nhiều bên, mình thấy hai lỗi phổ biến. Một là phó mặc dữ liệu dạng plain text vì sợ kẹt khi khởi động lại. Hai là lưu thẳng mật khẩu vào file /etc/crypttab. Cả hai lựa chọn này đều làm mất đi hoàn toàn giá trị của việc mã hóa ổ đĩa.
So sánh 3 cách mở khóa LUKS khi server reboot
Để vừa bảo vệ dữ liệu khi tắt máy (data-at-rest), vừa giúp máy tự khởi động lại trơn tru, quản trị viên thường có ba phương án sau:
- Cách 1: Nhập passphrase thủ công qua IPMI hoặc Dropbear SSH
Mỗi lần reboot, bạn phải mở console hoặc SSH vào môi trường initramfs rồi gõ pass bằng tay. - Cách 2: Đọc file key trực tiếp từ USB hoặc phân vùng /boot
Hệ thống tự đọc khóa giải mã từ một file lưu sẵn trên máy để mở phân vùng LUKS. - Cách 3: Mở khóa qua mạng (NBDE) với bộ đôi Clevis và Tang
Client chỉ giải mã được ổ cứng khi kết nối thành công tới Tang server nội bộ qua giao thức mạng tin cậy. Nếu kẻ gian rút ổ đĩa mang ra khỏi datacenter, chúng chỉ nhận lại một mớ dữ liệu vô nghĩa.
Ưu và nhược điểm của từng phương án
1. Nhập Passphrase thủ công
- Ưu điểm: Độc lập tuyệt đối. Bạn không cần phụ thuộc vào bất kỳ hạ tầng mạng hay máy chủ trung gian nào.
- Nhược điểm: Tốn nhiều công vận hành. Nếu server reboot định kỳ lúc nửa đêm hoặc tự khởi động lại sau sự cố điện, toàn bộ dịch vụ phụ thuộc sẽ bị downtime kéo dài chờ người trực gõ phím.
2. Lưu key file cục bộ trên máy
- Ưu điểm: Quá trình boot diễn ra tức thì, không lo mạng chập chờn.
- Nhược điểm: Tạo cảm giác an toàn ảo. Bất cứ ai chạm được vào máy chủ vật lý hoặc clone file image trên đám mây đều đọc được key file trong nháy mắt. Mã hóa khi đó coi như vô ích.
3. Dùng Network-Bound Disk Encryption (Clevis + Tang)
- Ưu điểm: Tự động hoàn toàn trong mạng LAN nội bộ. Tang server sử dụng giao thức bắt tay ECDH (Elliptic-curve Diffie-Hellman), hoàn toàn không lưu private key của client. Ngay cả khi Tang server bị hack, kẻ tấn công cũng không thu thập được danh sách khóa để mở ổ đĩa.
- Nhược điểm: Đòi hỏi hệ thống mạng giai đoạn early boot phải hoạt động chuẩn xác. Bạn cũng cần ít nhất 2 máy chủ Tang để tránh lỗi điểm nghẽn đơn lẻ (single point of failure).
Khi nào nên triển khai giải pháp này?
Mô hình Clevis kết hợp Tang (NBDE) cực kỳ phù hợp cho server thuê chỗ (Colocation), phòng máy On-Premise hoặc cụm homelab gia đình. Server tự do khởi động lại khi còn nằm trong mạng LAN an toàn. Nhưng nếu có người tháo ổ cứng hay bê nguyên case máy ra ngoài, dữ liệu bên trong vẫn được khóa chặt.
Hướng dẫn cấu hình thực tế trên Ubuntu / Debian
Môi trường lab mẫu
- Tang Server: IP
192.168.10.50(chạy Ubuntu Server 22.04/24.04) - Target Client: IP
192.168.10.100(cần bảo vệ phân vùng/dev/sdb1)
Bước 1: Thiết lập Tang Server
Dịch vụ Tang tiêu tốn chưa đến 50MB RAM. Bạn có thể cài đặt dễ dàng lên một máy chủ phụ hoặc container nội bộ:
sudo apt update
sudo apt install -y tang
sudo systemctl enable --now tangd.socket
Dịch vụ chạy ngầm thông qua socket systemd và lắng nghe cổng TCP 80. Hãy kiểm tra phản hồi từ Tang bằng lệnh curl:
curl -s http://localhost/adv | head -n 5
Màn hình xuất hiện chuỗi JSON chứa thông tin khóa công khai nghĩa là Tang server đã hoạt động tốt.
Bước 2: Tạo phân vùng mã hóa LUKS2 trên Client
Đăng nhập vào máy client. Khởi tạo phân vùng mã hóa mới và đặt một mật khẩu quản trị dự phòng:
# Format phân vùng theo chuẩn LUKS2
sudo cryptsetup luksFormat --type luks2 /dev/sdb1
# Mở phân vùng để format filesystem ext4
sudo cryptsetup open /dev/sdb1 secure_data
sudo mkfs.ext4 /dev/mapper/secure_data
sudo cryptsetup close secure_data
Lưu ý: Luôn lưu passphrase này vào trình quản lý mật khẩu của team (như Bitwarden hay Vault) để dùng khi cần cứu hộ khẩn cấp.
Bước 3: Cài Clevis và liên kết phân vùng với Tang Server
Cài đặt các gói công cụ cần thiết trên máy client:
sudo apt update
sudo apt install -y clevis clevis-luks clevis-initramfs
Tiến hành liên kết (bind) phân vùng /dev/sdb1 với Tang server:
sudo clevis luks bind -d /dev/sdb1 tang '{"url":"http://192.168.10.50"}'
Hệ thống sẽ hiển thị mã vân tay (fingerprint) của Tang và hỏi xác nhận. Gõ y rồi nhập passphrase quản trị bạn đã tạo ở Bước 2. Clevis sẽ tạo một key slot mới trong header của LUKS mà không ghi đè mật khẩu cũ.
Kiểm tra lại cấu trúc key slot:
sudo cryptsetup luksDump /dev/sdb1
Nếu thấy mục Token hiển thị clevis kèm theo URL của Tang server là bạn đã liên kết thành công.
Bước 4: Cấu hình mount tự động qua /etc/crypttab
Tìm mã UUID của phân vùng mã hóa gốc:
sudo blkid -s UUID -o value /dev/sdb1
Giả sử UUID nhận được là 12345678-abcd-1234-abcd-1234567890ab. Thêm dòng sau vào file /etc/crypttab. Tham số _netdev báo cho systemd biết cần chờ mạng online mới giải mã:
secure_data UUID=12345678-abcd-1234-abcd-1234567890ab none luks,_netdev
Tiếp tục tạo thư mục và khai báo đường dẫn mount vào /etc/fstab:
sudo mkdir -p /mnt/data
echo "/dev/mapper/secure_data /mnt/data ext4 defaults,_netdev 0 2" | sudo tee -a /etc/fstab
Bước 5: Cập nhật initramfs và reboot thử nghiệm
Build lại initramfs để nạp đầy đủ hook mạng của Clevis:
sudo update-initramfs -u -k all
Bây giờ, hãy khởi động lại client để kiểm tra thành quả:
sudo reboot
Theo dõi quá trình khởi động qua IPMI hoặc console. Máy sẽ tự nhận IP qua DHCP, gửi yêu cầu handshake tới Tang server tại 192.168.10.50, giải mã phân vùng và mount thẳng vào /mnt/data chỉ trong vòng 3 đến 5 giây mà không cần chạm tay vào bàn phím.
Kinh nghiệm thực chiến khi vận hành
- Khi Tang Server mất kết nối: Clevis sẽ gửi gói tin thử lại nhiều lần trước khi timeout. Hết thời gian chờ, hệ thống tự động quay về màn hình hỏi passphrase thủ công. Dữ liệu của bạn không bao giờ rơi vào trạng thái bế tắc.
- Cấu hình dự phòng High Availability (HA): Trong môi trường production, đừng phụ thuộc vào một Tang server duy nhất. Bạn có thể dùng thuật toán Shamir Secret Sharing (SSS) của Clevis để bind đồng thời vào 2 Tang server đặt ở 2 switch khác nhau:
sudo clevis luks bind -d /dev/sdb1 sss '{"t":1,"pins":{"tang":[{"url":"http://192.168.10.50"},{"url":"http://192.168.10.51"}]}}'
Với tham số "t":1, chỉ cần 1 trong 2 máy chủ Tang phản hồi là ổ cứng sẽ tự động mở khóa thành công.

