Mã hóa ổ đĩa VPS với LUKS trên Ubuntu 24.04

SSH vào VPS mới cài, mọi thứ đều clean. Nhưng nếu ai đó tháo vật lý ổ NVMe của bạn khỏi datacenter và gắn vào máy đọc, toàn bộ dữ liệu, database, log, SSH key, file cấu hình, đều lộ. LUKS (Linux Unified Key Setup) là lớp mã hóa riêng biệt ngăn chặn kịch bản đó: nó mã hóa toàn bộ phân vùng ở tầng khối, và nếu không có passphrase, dữ liệu chỉ là nhiễu trắng. Bài này sẽ hướng dẫn bạn mã hóa một ổ đĩa phụ (hoặc ổ OS) trên VPS Linux Ubuntu 24.04 với LUKS, bao gồm unlock thủ công qua SSH và thiết lập tự động dùng keyfile tích hợp initramfs.
Yêu cầu trước khi bắt đầu
- Một VPS Ubuntu 24.04 với quyền root (hoặc sudo).
- Một ổ đĩa phụ (vd
/dev/vdb) chưa có dữ liệu quan trọng, LUKS sẽ format toàn bộ ổ này. - SSH client để kết nối và luôn giữ một phiên SSH mở khi làm việc với mã hóa (đề phòng sai lệch).
- Kiến thức cơ bản về phân vùng (fdisk/lsblk) và systemd.
Vì sao nên mã hóa ổ đĩa VPS ngay từ đầu?
Trên môi trường VPS, bạn không kiểm soát hạ tầng vật lý. Ổ NVMe đặt tại datacenter, nếu bị tháo, bị trả về nhà cung cấp, hoặc bị chụp ảnh forensics khi thanh lý, dữ liệu vẫn an toàn nếu đã mã hóa. LUKS không bảo vệ khỏi attacker đã có shell root (vì ổ đã được unlock và gắn vào kernel đang chạy), nhưng nó là lá chắn cuối cùng khi kẻ tấn công có quyền truy cập vật lý vào ổ. Đây là yêu cầu bắt buộc cho VPS lưu dữ liệu nhạy cảm (log user, backup database, certificate private key).
Một lưu ý: nếu bạn thuê VPS Việt Nam và muốn toàn quyền kiểm soát bảo mật ở tầng thấp nhất, LUKS là công cụ chính xác. Tuy nhiên, unlock khi boot cần có IPMI/serial console, thứ mà nhiều VPS giá rẻ không cung cấp. Bài này sẽ dạy bạn cách unlock qua SSH trong initramfs, giải quyết triệt để hạn chế đó.
Bước 1, Cài đặt cryptsetup và chuẩn bị ổ đĩa
Đầu tiên, cập nhật package và cài cryptsetup, bộ công cụ dm-crypt frontend cho LUKS.
sudo apt update && sudo apt install -y cryptsetup
Xác định tên ổ đĩa cần mã hóa. Dùng lsblk để xem danh sách. Trong bài này giả sử ổ phụ là /dev/vdb. Nếu ổ đã có phân vùng (vdb1, vdb2) và dữ liệu, bạn cần backup trước, LUKS sẽ format toàn bộ.
lsblk
# Output mẫu:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# vda 253:0 0 20G 0 disk
# vdb 253:16 0 50G 0 disk
Nếu ổ /dev/vdb đã có partition table, xóa sạch:
sudo wipefs -a /dev/vdb
Bước 2, Tạo phân vùng mã hóa LUKS
Chạy lệnh cryptsetup luksFormat trên ổ trần (không partition). Bạn sẽ được hỏi nhập passphrase, hãy nhập passphrase mạnh, dài ít nhất 12 ký tự, có ký tự đặc biệt.
sudo cryptsetup luksFormat /dev/vdb
Lệnh này tạo header LUKS ở đầu ổ. Để xác nhận, gõ YES (viết hoa). Sau đó nhập passphrase hai lần.
Kiểm tra header vừa tạo:
sudo cryptsetup luksDump /dev/vdb
Output sẽ hiện cipher (aes-xts-plain64), hash (sha256), và số lượng key slot. Mặc định slot 0 được dùng cho passphrase bạn vừa nhập.
Bước 3, Mở (unlock) và tạo filesystem
Mở ổ mã hóa và map nó thành một device mapper (vd cryptvol):
sudo cryptsetup open /dev/vdb cryptvol
Sau lệnh này, kernel thấy một thiết bị mới tại /dev/mapper/cryptvol. Định dạng nó bằng ext4 và mount thử:
sudo mkfs.ext4 /dev/mapper/cryptvol
sudo mkdir /mnt/encrypted
sudo mount /dev/mapper/cryptvol /mnt/encrypted
Verify mount thành công:
df -h | grep cryptvol
# /dev/mapper/cryptvol 50G 24K 50G 1% /mnt/encrypted
Bước 4, Cấu hình tự động unlock với keyfile (optional, nâng cao)
Nếu bạn muốn ổ tự động mount khi VPS khởi động (không cần nhập passphrase thủ công), bạn cần keyfile được lưu trên một phân vùng không mã hóa (thường là /boot) và tích hợp vào initramfs.
Tạo keyfile ngẫu nhiên 2048 byte:
sudo dd if=/dev/urandom of=/root/keyfile bs=2048 count=1
sudo chmod 600 /root/keyfile
Thêm keyfile vào LUKS slot 1 (slot 0 giữ passphrase chính để dự phòng):
sudo cryptsetup luksAddKey /dev/vdb /root/keyfile
Bạn sẽ được yêu cầu nhập passphrase hiện tại (slot 0) để xác thực trước khi thêm key mới.
Sửa file /etc/crypttab để khai báo ổ mã hóa này với keyfile:
# /etc/crypttab
cryptvol /dev/vdb /root/keyfile luks
Sau đó cập nhật initramfs để keyfile được copy vào bên trong ramdisk:
echo "KEYFILE_PATTERN=\"/root/keyfile\"" | sudo tee -a /etc/cryptsetup-initramfs.conf
sudo update-initramfs -u -k all
Cuối cùng, thêm dòng mount vào /etc/fstab:
/dev/mapper/cryptvol /mnt/encrypted ext4 defaults 0 2
Bước 5, Luồng unlock thủ công qua SSH (khi không dùng keyfile)
Nếu bạn chọn không dùng keyfile (an toàn hơn vì passphrase không lưu trên disk), mỗi lần reboot bạn phải unlock thủ công. Trên VPS không có console vật lý, bạn làm thế nào để nhập passphrase?
Ubuntu 24.04 hỗ trợ dropbear-initramfs, một SSH server nhẹ trong initramfs, cho phép bạn SSH vào VPS sớm trong quá trình boot, trước khi ổ root được gắn. Cài đặt:
sudo apt install -y dropbear-initramfs
Tạo public key cho dropbear bằng cách copy SSH public key của bạn (máy local) vào authorized_keys của dropbear:
sudo mkdir -p /etc/dropbear-initramfs
sudo cp ~/.ssh/authorized_keys /etc/dropbear-initramfs/authorized_keys
Cập nhật initramfs lần nữa để dropbear được tích hợp:
sudo update-initramfs -u
Reboot VPS. Sau khi BIOS và kernel load, bạn sẽ thấy trong console initramfs thông báo đang chờ unlock. Lúc này từ máy local, SSH vào VPS (port 22 vẫn hoạt động, dropbear thay thế openssh tạm thời). Sau khi đăng nhập, bạn gõ lệnh:
cryptsetup unlock /dev/vdb
# Nhập passphrase khi được hỏi
Sau đó initramfs tiếp tục boot và mount filesystem. Bạn sẽ thấy VPS boot hoàn tất và SSH lại (lúc này là openssh-server).
Bảng tham số quan trọng
| Thành phần | Giá trị mẫu | Ghi chú |
|---|---|---|
| Device disk | /dev/vdb | Ổ đĩa trần, không partition |
| Mapper name | cryptvol | Tên thiết bị sau unlock |
| Keyfile lưu tại | /root/keyfile | Quyền 0600, owner root |
| SSH server initramfs | dropbear | Port 22, auth bằng SSH key |
| File config unlock | /etc/crypttab | Khai báo mapping LUKS |
Xử lý lỗi thường gặp
Không unlock được sau reboot, device busy
Nguyên nhân: initramfs không có dropbear hoặc keyfile không đúng. Kiểm tra bằng cryptsetup luksDump /dev/vdb sau khi boot từ live rescue. Nếu keyfile bị hỏng, dùng passphrase slot 0 để thêm lại.
Dropbear không accept SSH key
Authorized keys của dropbear đọc từ /etc/dropbear-initramfs/authorized_keys. Đảm bảo key ở định dạng OpenSSH, mỗi dòng một key, không có comment dài.
Không tìm thấy ổ sau unlock, hệ thống treo
Kiểm tra /etc/crypttab và /etc/fstab xem kernel có trùng tên không. Dùng lsblk để xác nhận device name trước khi viết config. Nếu tên ổ thay đổi giữa các lần boot (vd /dev/vdb thành /dev/sdb), dùng UUID thay thế:
sudo blkid /dev/vdb | grep UUID
# Lấy UUID của LUKS partition
# /etc/crypttab: cryptvol UUID=xxxx-xxx-xxx /root/keyfile luks
Câu hỏi thường gặp
LUKS có làm chậm ổ NVMe trên VPS không?
Với CPU hỗ trợ AES-NI (hầu hết VPS Intel/AMD từ 2012 trở đi), overhead của LUKS ở chế độ xts-plain64 chỉ khoảng 1-3% cho sequential read/write. Trên VPS NVMe, bạn hầu như không thấy khác biệt trong workload thực tế (database, web server).
Tôi có thể thay passphrase sau khi đã tạo keyfile không?
Có. Dùng cryptsetup luksChangeKey /dev/vdb -S 0 để thay passphrase slot 0. Sau đó thêm lại keyfile vào slot 1 nếu cần. Không cần tạo lại LUKS header.
Mã hóa ổ OS (root) trên VPS có được không?
Được, nhưng yêu cầu VPS có hỗ trợ serial console/IPMI hoặc dropbear-initramfs đã cài trước khi mã hóa ổ root. Đây là thao tác nâng cao, cần boot từ rescue mode để set up. Bài viết này hướng dẫn cho ổ phụ (data volume) để dễ rollback.
LUKS và dm-crypt có khác gì nhau?
dm-crypt là module kernel cung cấp mã hóa ở tầng device mapper. LUKS là định dạng header chuẩn (có passphrase slot, UUID, cipher metadata) nằm phía trên dm-crypt. Bạn dùng LUKS vì nó portable và chuẩn hóa, dm-crypt thuần chỉ là khối cipher không header.
Bài viết liên quan
- Cấu hình iptables cơ bản cho VPS Ubuntu 24.04
- 10 cách tăng cường bảo mật VPS Linux chống tấn công
- Cấu hình fail2ban chống brute-force SSH trên Ubuntu 24.04
- Tối ưu Linux và NVMe cho workload I/O cao trên VPS


