1. Cài đặt và Cập nhật Hệ điều hành Linux Enterprise
Chúng ta sẽ thực hiện cài đặt bản phân phối Linux Server Edition (ví dụ: RHEL 9 hoặc AlmaLinux 9) với các gói hệ thống cốt lõi cần thiết cho môi trường production.
Mục đích là có một hệ điều hành sạch, ổn định và được cập nhật các bản vá bảo mật mới nhất trước khi tiến hành các cấu hình phức tạp.
Đảm bảo bạn đã cài đặt OS thành công với vai trò "Minimal Install" và có kết nối mạng.
1.1 Cập nhật toàn bộ hệ thống
Thực hiện đồng bộ repository và nâng cấp tất cả các gói phần mềm lên phiên bản mới nhất để đảm bảo tính toàn vẹn và bảo mật.
sudo dnf update -y --refresh
Kết quả mong đợi: Hệ thống sẽ liệt kê danh sách các gói cần cập nhật, thực hiện tải và cài đặt, cuối cùng hiển thị thông báo "Complete!" khi không còn gói nào cần nâng cấp.
1.2 Cài đặt gói công cụ hệ thống
Cài đặt các công cụ quản lý gói, biên dịch, và công cụ phân tích hệ thống cần thiết cho các bước sau.
sudo dnf install -y vim wget curl net-tools lsof sysstat audit rpm-build gnupg
Kết quả mong đợi: Các lệnh trên được cài đặt thành công, không báo lỗi thiếu dependency.
2. Cấu hình Phân vùng Đĩa với LVM và Encryption
Chúng ta sẽ cấu hình phân vùng dữ liệu sử dụng LVM (Logical Volume Manager) kết hợp với LUKS (Linux Unified Key Setup) để mã hóa dữ liệu tại nghỉ (data-at-rest).
Điều này đảm bảo nếu đĩa cứng bị đánh cắp, dữ liệu không thể đọc được mà không có khóa giải mã, đồng thời LVM giúp quản lý dung lượng linh hoạt.
2.1 Chuẩn bị thiết bị và mã hóa
Giả sử đĩa dữ liệu đích là /dev/sdb. Chúng ta sẽ tạo partition, định dạng thành LUKS và mở khóa.
sudo fdisk /dev/sdb
Kết quả mong đợi: Bạn sẽ được yêu cầu nhập và xác nhận passphrase (mật khẩu mã hóa) cho LUKS. Sau đó, thiết bị được mở và truy cập qua đường dẫn /dev/mapper/db-data-luks.
2.2 Cấu hình LVM trên thiết bị đã mã hóa
Tạo Volume Group (VG) và Logical Volume (LV) trên thiết bị đã mở khóa để chuẩn bị cho Database.
sudo pvcreate /dev/mapper/db-data-luks
sudo vgcreate vg-db /dev/mapper/db-data-luks
sudo lvcreate -l 100%FREE -n lv-db-data vg-db
Kết quả mong đợi: Thông báo thành công tạo Physical Volume, Volume Group và Logical Volume. Thiết bị mới sẽ có đường dẫn /dev/vg-db/lv-db-data.
2.3 Định dạng và Mount điểm
Định dạng Logical Volume bằng hệ thống tập tin XFS (tối ưu cho Database) và mount vào thư mục /var/lib/db.
sudo mkfs.xfs /dev/vg-db/lv-db-data
sudo mkdir -p /var/lib/db
sudo mount /dev/vg-db/lv-db-data /var/lib/db
Kết quả mong đợi: Hệ thống tập tin được tạo thành công và mount điểm sẵn sàng. Kiểm tra bằng lệnh `df -h` sẽ thấy /var/lib/db.
2.4 Cấu hình Mount tự động và Unlock tự động
Cần cấu hình /etc/crypttab để tự động mở khóa LUKS khi khởi động, và /etc/fstab để tự động mount.
Tạo file cấu hình crypttab:
cat > /etc/crypttab
Tạo file cấu hình fstab:
echo "/dev/mapper/db-data-luks /var/lib/db xfs defaults 0 0" >> /etc/fstab
Kết quả mong đợi: Khi reboot, hệ thống sẽ tự động mở khóa volume và mount vào đúng vị trí mà không cần can thiệp thủ công (giả sử keyfile đã được bảo vệ đúng cách).
3. Thiết lập SSH Key-based Authentication và Vô hiệu hóa Root
Chúng ta sẽ thay thế cơ chế đăng nhập bằng mật khẩu bằng chứng thực dựa trên khóa (SSH keys) để tăng cường bảo mật truy cập từ xa.
Đồng thời, cấm đăng nhập trực tiếp bằng tài khoản root qua SSH để ngăn chặn các cuộc tấn công brute-force vào tài khoản quản trị.
3.1 Tạo cặp khóa SSH cho quản trị viên
Tạo cặp khóa RSA 4096 bit trên máy client (máy của bạn) và sao chép công khai (public key) sang server.
ssh-keygen -t rsa -b 4096 -f ~/.ssh/db_admin_key -C "admin@db-node"
ssh-copy-id -i ~/.ssh/db_admin_key.pub admin@
Kết quả mong đợi: Khóa được tạo thành công, public key được thêm vào ~/.ssh/authorized_keys của user 'admin' trên server.
3.2 Cấu hình SSH Server (sshd_config)
Chỉnh sửa file cấu hình chính của SSHD để áp dụng các chính sách bảo mật nghiêm ngặt.
Tạo file cấu hình hoàn chỉnh cho /etc/ssh/sshd_config:
cat > /etc/ssh/sshd_config
Khởi động lại dịch vụ SSH để áp dụng cấu hình:
sudo systemctl restart sshd
Kết quả mong đợi: Dịch vụ SSH khởi động lại thành công. Bạn vẫn có thể đăng nhập bằng key (user admin), nhưng đăng nhập bằng mật khẩu hoặc user root sẽ bị từ chối.
3.3 Xác minh cấu hình SSH
Thử nghiệm từ một máy khác để đảm bảo cấu hình hoạt động đúng như thiết kế.
ssh -o PreferredAuthentications=publickey -o PasswordAuthentication=no admin@
ssh root@
Kết quả mong đợi: Lệnh đầu tiên kết nối thành công. Lệnh thứ hai bị từ chối với thông báo "Permission denied (publickey)" hoặc "Access denied for root".
4. Cấu hình SELinux/AppArmor theo chế độ Enforcing
Chúng ta sẽ kích hoạt SELinux (cho RHEL/CentOS/AlmaLinux) ở chế độ Enforcing để kiểm soát truy cập tài nguyên ở mức kernel.
Chế độ này ngăn chặn các tiến trình thực hiện các hành động không được phép, ngay cả khi chúng đã xâm nhập vào hệ thống.
4.1 Kiểm tra và bật SELinux
Đảm bảo SELinux được bật và đang ở chế độ Enforcing.
sudo setenforce 1
sudo sestatus
Kết quả mong đợi: Lệnh `sestatus` trả về "SELinux status: enabled" và "Current mode: enforcing".
4.2 Cấu hình chính sách cho Database
Thêm các quy tắc cần thiết cho Database (ví dụ: MySQL/PostgreSQL) để hoạt động trong môi trường SELinux Enforcing mà không bị chặn sai lầm.
Giả sử ta dùng MySQL (mariadb) và cần cho phép nó bind vào cổng 3306 và truy cập thư mục dữ liệu đã mount.
sudo setsebool -P mysql_connect_unpriv 1
sudo setsebool -P mysql_manage_sandboxes 1
sudo chcon -R -t mysqld_db_t /var/lib/db
Kết quả mong đợi: Các boolean được đặt thành 1 (on) và quyền truy cập vào thư mục dữ liệu được gán nhãn đúng. Database sẽ có thể khởi động và truy cập dữ liệu mà không bị SELinux chặn (denied).
4.3 Xác minh SELinux
Đảm bảo không có vi phạm chính sách (avc denied) trong log sau khi cấu hình.
sudo grep "avc: denied" /var/log/audit/audit.log | tail -n 5
Kết quả mong đợi: Không xuất hiện dòng nào liên quan đến tiến trình database hoặc thư mục /var/lib/db. Nếu có, cần dùng `ausearch` để phân tích và thêm rule tương ứng.
5. Kiểm tra Tính toàn vẹn của Gói phần mềm và Ký số
Chúng ta sẽ kiểm tra tính toàn vẹn của các gói phần mềm đã cài đặt bằng GPG signature và RPM database để đảm bảo không có gói nào bị giả mạo hoặc thay đổi trái phép.
Đây là bước quan trọng để xác nhận nguồn gốc phần mềm từ Repository chính thức.
5.1 Kiểm tra chữ ký GPG của các gói đã cài
Sử dụng lệnh rpm để kiểm tra xem các gói quan trọng (như kernel, openssl, sshd) có chữ ký hợp lệ hay không.
rpm -q --sig gpg /usr/bin/ssh /usr/bin/mysqld /usr/bin/postgres
Kết quả mong đợi: Mỗi dòng sẽ trả về "RSA/SHA256, : (KEY_ID)". Nếu thấy "NOKEY" hoặc lỗi, gói đó có thể không được ký đúng hoặc key chưa được import.
5.2 Kiểm tra tính toàn vẹn file (Verify RPM)
So sánh các file trong hệ thống với thông tin lưu trong database của RPM để phát hiện file bị thay đổi (checksum, size, permissions).
sudo rpm -Va | grep -E "^\s+[57]\s"
Kết quả mong đợi: Không có đầu ra nào (hoặc chỉ có các file hệ thống thông thường được phép thay đổi như log). Nếu có đầu ra, các file đó đã bị thay đổi nội dung hoặc quyền, cần điều tra ngay.
5.3 Cài đặt và cấu hình AIDE (Advanced Intrusion Detection Environment)
Cài đặt AIDE để tạo baseline (đường cơ sở) của toàn bộ hệ thống và tự động kiểm tra sự thay đổi định kỳ.
sudo dnf install -y aide
sudo aide --init
sudo mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
Kết quả mong đợi: File database /var/lib/aide/aide.db được tạo thành công, chứa checksum của tất cả file quan trọng. Đây là baseline để so sánh trong tương lai.
5.4 Chạy kiểm tra AIDE
Chạy lệnh kiểm tra để đảm bảo hệ thống đang ở trạng thái sạch ngay sau khi cài đặt.
sudo aide --check
Kết quả mong đợi: Thông báo "No changes found" hoặc kết quả tương tự, xác nhận hệ thống chưa bị thay đổi so với baseline vừa tạo.
Điều hướng series:
Mục lục: Series: Triển khai Database phân tán với Secret Sharing và Linux Kernel Hardening
« Phần 1: Khởi động dự án: Kiến trúc hệ thống và yêu cầu phần cứng cho Database phân tán
Phần 3: Hardening Linux Kernel: Tối ưu hóa tham số và vô hiệu hóa dịch vụ không cần thiết »