Cập nhật Kernel và loại bỏ dịch vụ thừa
1. Nâng cấp Kernel lên phiên bản mới nhất
Chúng ta cần đảm bảo Kernel đang chạy là phiên bản mới nhất để nhận các bản vá bảo mật (security patches) từ nhà sản xuất.
Trên hệ thống Debian/Ubuntu, hãy chạy lệnh cập nhật repository và nâng cấp toàn bộ hệ thống.
apt update && apt upgrade -y
Trên hệ thống RHEL/CentOS/AlmaLinux, sử dụng công cụ dnf.
dnf update -y
Kiểm tra xem Kernel mới đã được cài đặt chưa bằng lệnh uname.
uname -r
Kết quả mong đợi: Phiên bản Kernel hiển thị là cao hơn phiên bản hiện tại hoặc đã được cập nhật theo lịch trình bảo trì. Nếu Kernel mới được cài đặt, bạn cần restart server để áp dụng.
2. Xác định và tắt các dịch vụ không cần thiết
Mỗi dịch vụ đang chạy (daemon) đều là một điểm tấn công tiềm năng (attack surface). Chúng ta sẽ tắt các dịch vụ không liên quan đến Database như FTP, CUPS, Bluetooth.
Liệt kê các dịch vụ đang chạy để xác định mục tiêu cần tắt.
systemctl list-units --type=service --state=running --no-pager
Tắt và vô hiệu hóa các dịch vụ không cần thiết. Ví dụ tắt CUPS (In ấn) và Avahi (mDNS discovery).
systemctl stop cups
systemctl disable cups
systemctl stop avahi-daemon
systemctl disable avahi-daemon
Để áp dụng cho toàn bộ hệ thống, bạn có thể tạo file config để tắt tự động các dịch vụ không cần thiết trong tương lai.
Kết quả mong đợi: Các dịch vụ không còn xuất hiện trong danh sách running. Khi restart server, chúng sẽ không tự động khởi động lại.
Verify: Chạy lệnh kiểm tra lại trạng thái.
systemctl status cups
systemctl status avahi-daemon
Cấu hình Sysctl để tối ưu bảo mật mạng và bộ nhớ
1. Tạo file cấu hình Sysctl riêng biệt
Thay vì chỉnh sửa trực tiếp file /etc/sysctl.conf gốc, chúng ta tạo một file mới trong thư mục /etc/sysctl.d/ để dễ quản lý và tránh bị ghi đè khi update package.
Tạo file /etc/sysctl.d/99-database-security.conf với nội dung bảo mật chặt chẽ.
cat > /etc/sysctl.d/99-database-security.conf
Áp dụng ngay các thay đổi vào Kernel đang chạy mà không cần restart.
sysctl --system
Kết quả mong đợi: Hệ thống báo "ok" hoặc không có lỗi, các thông số đã được tải vào RAM.
Verify: Kiểm tra một vài tham số quan trọng.
sysctl net.ipv4.tcp_syncookies
sysctl kernel.kptr_restrict
Áp dụng AppArmor hoặc SELinux để kiểm soát truy cập
1. Lựa chọn và kích hoạt cơ chế Mandatory Access Control (MAC)
Chúng ta sẽ sử dụng AppArmor (trên Ubuntu/Debian) hoặc SELinux (trên RHEL/CentOS) để giới hạn quyền truy cập của tiến trình Database. Dù bạn đang chạy MySQL, PostgreSQL hay Oracle, nguyên tắc là chỉ cho phép truy cập vào các thư mục cần thiết.
Tùy chọn A: Nếu hệ thống của bạn là Ubuntu/Debian, hãy cài đặt và kích hoạt AppArmor.
apt install apparmor apparmor-utils -y
systemctl enable apparmor
systemctl start apparmor
Tùy chọn B: Nếu hệ thống của bạn là RHEL/CentOS/AlmaLinux, hãy đảm bảo SELinux đang ở chế độ Enforcing.
setenforce 1
sestatus
Kết quả mong đợi: AppArmor hoặc SELinux đang ở trạng thái Active/Enforcing.
2. Cấu hình Profile cho Database (Ví dụ PostgreSQL)
Giả sử bạn sẽ cài đặt PostgreSQL sau. Chúng ta cần tạo một profile AppArmor để chỉ cho phép postgres truy cập thư mục dữ liệu, log và socket, chặn mọi thứ khác.
Tạo file profile /etc/apparmor.d/usr.lib.postgresql.postgres.
cat > /etc/apparmor.d/usr.lib.postgresql.postgres
Đẩy profile vào AppArmor để kích hoạt.
apparmor_parser -r /etc/apparmor.d/usr.lib.postgresql.postgres
Kết quả mong đợi: Không có lỗi cú pháp. Nếu có lỗi, AppArmor sẽ báo chi tiết dòng bị sai.
Verify: Kiểm tra trạng thái profile.
aa-status
Đối với SELinux, bạn sử dụng lệnh allow để tạo rule hoặc sử dụng utility restorecon để đặt lại context đúng cho thư mục dữ liệu sau khi cài đặt DB.
chcon -R -t postgresql_db_t /var/lib/pgsql
restorecon -R -v /var/lib/pgsql
Tùy chỉnh giới hạn tài nguyên (ulimit) cho user database
1. Tạo user database chuyên biệt
Không bao giờ chạy Database với quyền root. Tạo một user mới chỉ dành riêng cho Database.
useradd -r -s /bin/false -m -d /var/lib/dbdata dbuser
usermod -aG dbgroup dbuser
Kết quả mong đợi: User dbuser được tạo, không có shell (không thể login trực tiếp), home directory tại /var/lib/dbdata.
2. Cấu hình giới hạn tài nguyên trong PAM
Chúng ta cần tăng giới hạn file descriptors (nofile) và số tiến trình (nproc) để Database không bị sập khi tải cao. Cấu hình này nằm trong /etc/security/limits.conf hoặc /etc/security/limits.d/.
Tạo file /etc/security/limits.d/dbuser-limits.conf.
cat > /etc/security/limits.d/dbuser-limits.conf
Cần đảm bảo PAM module limits được gọi trong file /etc/pam.d/common-session (Debian) hoặc /etc/pam.d/system-auth (RHEL).
Kiểm tra file /etc/pam.d/common-session (hoặc system-auth) đảm bảo có dòng sau:
session required pam_limits.so
Kết quả mong đợi: File config được tạo, PAM module đã được cấu hình.
3. Cấu hình giới hạn trong systemd (Quan trọng nhất)
Trên các hệ thống hiện đại dùng systemd, ulimit trong limits.conf có thể bị bỏ qua nếu service chạy dưới systemd. Chúng ta phải cấu hình trực tiếp trong file service unit hoặc override file.
Tạo file override cho service database (ví dụ postgresql.service hoặc mysql.service).
systemctl edit postgresql
# Khi mở editor, thêm nội dung sau vào:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
LimitMEMLOCK=infinity
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/postgresql /var/log/postgresql
NoNewPrivileges=true
Lưu lại và reload daemon systemd.
systemctl daemon-reload
Kết quả mong đợi: Cấu hình service đã được cập nhật.
Verify: Kiểm tra các giới hạn của service đang chạy.
systemctl show postgresql | grep Limit
Hãy đảm bảo các giá trị LimitNOFILE, LimitNPROC, LimitMEMLOCK hiện lên đúng như cấu hình (65535 hoặc infinity).
Điều hướng series:
Mục lục: Series: Triển khai Database An toàn với TDE, Audit và Linux Kernel Hardening
« Phần 1: Chuẩn bị môi trường và yêu cầu hệ thống
Phần 3: Cài đặt Database và cấu hình bảo mật ban đầu »