Vô hiệu hóa Module Kernel và Dịch vụ thừa
Tắt các Module Kernel không an toàn
Để giảm bề mặt tấn công (attack surface), cần vô hiệu hóa các module kernel không được sử dụng bởi Database phân tán như module Bluetooth, mạng không dây, hoặc module USB không cần thiết.
Thao tác này ngăn chặn kernel từ động tải các driver khi có thiết bị mới cắm vào, giúp hệ thống chỉ chạy những gì thực sự cần thiết cho việc xử lý dữ liệu.
Tạo file blacklist cho các module không cần thiết tại đường dẫn /etc/modprobe.d/blacklist.conf. Nội dung file:
blacklist bluetooth
blacklist btusb
blacklist btrtl
blacklist btmtk
blacklist btmrvl
blacklist btintel
blacklist btbcm
blacklist btqca
blacklist btbcm
blacklist btusb
blacklist cfg80211
blacklist mac80211
blacklist usb_storage
blacklist floppy
blacklist parport
blacklist ppp
blacklist ppp_generic
blacklist slhc
blacklist lp
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_soc_core
blacklist snd_soc_skl
blacklist snd_soc_sst
blacklist snd_sof
blacklist snd_sof_intel_hda_common
blacklist snd_sof_intel_hda
blacklist snd_sof_intel_hda_mlink
blacklist snd_sof_intel_hda_link
blacklist snd_sof_pci
blacklist snd_sof_intel_hda
blacklist snd_sof_intel_hda_mlink
blacklist snd_sof_intel_hda_link
blacklist snd_sof_pci
blacklist snd_sof_intel_hda
blacklist snd_sof_intel_hda_mlink
blacklist snd_sof_intel_hda_link
blacklist snd_sof_pci
Kết quả mong đợi: Khi chạy lệnh lsmod hoặc modprobe -r bluetooth, các module này sẽ không được tải hoặc bị từ chối tải.
Tắt các dịch vụ hệ thống không cần thiết
Database phân tán không cần các dịch vụ như CUPS (in ấn), Avahi (mDNS), hoặc NetworkManager (nếu cấu hình mạng tĩnh). Việc tắt chúng giảm thiểu điểm bị khai thác.
Sử dụng systemd để mask và disable các dịch vụ này, đảm bảo chúng không thể khởi động ngay cả khi có lệnh gọi.
Thực thi lệnh mask và disable cho các dịch vụ sau:
systemctl mask cups.socket cups.service
systemctl mask avahi-daemon.socket avahi-daemon.service
systemctl mask bluetooth.service
systemctl mask fprintd.service
systemctl mask ModemManager.service
systemctl mask NetworkManager.service
systemctl disable cups.socket cups.service avahi-daemon.socket avahi-daemon.service bluetooth.service fprintd.service ModemManager.service NetworkManager.service
Kết quả mong đợi: Chạy lệnh systemctl list-units --type=service --state=inactive sẽ không hiển thị các dịch vụ trên, và trạng thái của chúng là masked.
Verify kết quả phần 1
Để xác nhận các module đã bị chặn, thực hiện lệnh:
grep -E "blacklist" /etc/modprobe.d/blacklist.conf | wc -l
Để xác nhận dịch vụ đã bị tắt, thực hiện:
systemctl status cups.socket | grep "masked"
Kết quả trả về phải chứa từ "masked" hoặc số lượng dòng blacklist lớn hơn 0.
Cấu hình sysctl chống tấn công mạng
Ngăn chặn SYN Flood và IP Spoofing
Database phân tán hoạt động trên mạng nội bộ nhưng vẫn cần bảo vệ khỏi các cuộc tấn công từ chối dịch vụ (DoS) và giả mạo địa chỉ IP.
Cấu hình sysctl giúp kernel lọc các gói tin bất thường ngay tại tầng mạng, tiết kiệm tài nguyên CPU cho tiến trình Database.
Tạo file cấu hình mạng bảo mật tại đường dẫn /etc/sysctl.d/99-security.conf. Nội dung file hoàn chỉnh:
# Ngăn chặn IP Spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.eth0.rp_filter = 1
net.ipv4.conf.eth1.rp_filter = 1
# Vô hiệu hóa ICMP Redirect
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Bảo vệ chống SYN Flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# Vô hiệu hóa Source Quench (bị lợi dụng cho DoS)
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.icmp_ratelimit = 100
# Ẩn thông tin kernel từ mạng
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# Ngăn chặn phân tích TCP Timestamp
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_moderate_rcvbuf = 1
Kết quả mong đợi: Sau khi áp dụng, các gói tin ICMP không hợp lệ sẽ bị drop ngay lập tức, và kết nối TCP sẽ yêu cầu cookie trước khi mở connection, ngăn chặn việc tràn bảng connection.
Áp dụng cấu hình sysctl
Sau khi tạo file, cần tải cấu hình vào kernel ngay lập tức để có hiệu lực mà không cần reboot.
Thực thi lệnh:
sysctl --system
Kiểm tra lại giá trị của một tham số quan trọng:
sysctl net.ipv4.tcp_syncookies
Kết quả mong đợi: Lệnh trả về net.ipv4.tcp_syncookies = 1.
Verify kết quả phần 2
Để kiểm tra toàn bộ các tham số bảo mật đã được áp dụng:
sysctl -a | grep -E "rp_filter|syncookies|accept_redirects"
Kết quả phải trả về giá trị 1 cho rp_filter và syncookies, và 0 cho accept_redirects.
Áp dụng chính sách AppArmor/SELinux cho Database
Cấu hình AppArmor (Cho Ubuntu/Debian)
AppArmor giới hạn quyền truy cập của tiến trình Database vào các file và socket cụ thể, ngăn chặn ransomware hoặc mã độc leo thang đặc quyền (privilege escalation).
Chúng ta sẽ tạo một profile tùy chỉnh (custom profile) thay vì dùng profile mặc định để kiểm soát chặt chẽ hơn.
Tạo file profile cho Database (ví dụ PostgreSQL hoặc MySQL) tại /etc/apparmor.d/usr.sbin.postgres. Nội dung:
#include
/usr/lib/postgresql/*/bin/postgres {
# Cho phép truy cập vào thư mục dữ liệu
/var/lib/postgresql/data/** rw,
/var/lib/postgresql/data/lock/* rw,
/var/lib/postgresql/data/base/** rw,
# Cho phép ghi log
/var/log/postgresql/** rw,
/var/log/** rw,
# Cho phép socket mạng
network inet tcp stream,
network inet6 tcp stream,
# Cho phép đọc các file config cần thiết
/etc/postgresql/** r,
/etc/ssl/** r,
# Cho phép truy cập vào các thư viện hệ thống
/lib/** rm,
/lib64/** rm,
/usr/lib/** rm,
# Cho phép truy cập vào /proc và /sys (cần cho hoạt động)
/proc/** r,
/sys/kernel/security/** r,
# Chặn truy cập vào thư mục nhạy cảm khác
deny /home/**,
deny /root/**,
deny /tmp/** rw,
}
/usr/lib/postgresql/*/bin/postgres-writer {
profile postgres-writer,
# Kế thừa các quyền từ profile chính nếu cần
# Thêm các quyền đặc biệt cho writer nếu có
}
Kết quả mong đợi: AppArmor sẽ chặn mọi truy cập ngoài các đường dẫn được liệt kê. Nếu Database cố truy cập file ngoài danh sách, hành động sẽ bị từ chối và log vào /var/log/kern.log.
Áp dụng chính sách SELinux (Cho RHEL/CentOS/AlmaLinux)
Nếu hệ thống chạy SELinux, cần tạo policy module tùy chỉnh hoặc đánh nhãn (label) chính xác cho thư mục dữ liệu Database.
Thay vì tạo module phức tạp, cách nhanh nhất và an toàn cho DB là sử dụng semanage fcontext và restorecon.
Đánh nhãn thư mục dữ liệu Database (ví dụ thư mục /var/lib/mysql) với nhãn mysqld_db_t:
semanage fcontext -a -t mysqld_db_t "/var/lib/mysql(/.*)?"
restorecon -Rv /var/lib/mysql
Kết quả mong đợi: SELinux sẽ chỉ cho phép tiến trình mysqld truy cập vào thư mục này. Các tiến trình khác cố truy cập sẽ bị từ chối (AVC denied).
Verify kết quả phần 3
Đối với AppArmor:
aa-status | grep postgres
Kết quả phải hiển thị trạng thái enforce.
Đối với SELinux:
ls -Z /var/lib/mysql
Kết quả phải hiển thị nhãn mysqld_db_t (hoặc tương ứng) thay vì default_t.
Cấu hình Auditd ghi log hoạt động nhạy cảm
Tùy chỉnh rule ghi log Audit
Auditd giúp ghi lại mọi hoạt động truy cập file nhạy cảm, thay đổi cấu hình hệ thống, hoặc chạy lệnh đặc quyền của user Database.
Cần cấu hình để ghi log khi có ai cố sửa file cấu hình DB hoặc truy cập file chứa khóa mã hóa (TDE keys).
Sửa file cấu hình audit tại /etc/audit/audit.rules để thêm các rule sau:
# Ghi log khi file cấu hình DB bị sửa
-w /etc/postgresql -p wa -k db_config
-w /var/lib/postgresql/data -p wa -k db_data_access
# Ghi log khi file khóa mã hóa bị truy cập
-w /etc/ssl/private -p wa -k encryption_keys_access
-w /var/lib/db-secrets -p wa -k secret_sharing_access
# Ghi log các lệnh thay đổi đặc quyền (sudo, su)
-a always,exit -F arch=b64 -S setuid -S setgid -S capset -F auid!=4294967295 -k privileged_exec
# Ghi log khi có file bị xóa
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid!=4294967295 -k delete_files
Kết quả mong đợi: Khi một tiến trình cố truy cập hoặc sửa đổi các đường dẫn trên, auditd sẽ ghi log chi tiết vào /var/log/audit/audit.log.
Bật và cấu hình lưu trữ log Audit
Đảm bảo auditd đang chạy và cấu hình để log không bị ghi đè quá nhanh, đồng thời kích hoạt chế độ "fail" nếu auditd bị tắt.
Chỉnh sửa file /etc/audit/auditd.conf:
# Kích hoạt fail mode (bật khóa audit khi bị tắt)
fail_action = kexec
# Kích hoạt phân vùng riêng cho audit log (nếu có)
# log_file = /var/log/audit/audit.log
# Kích thước log tối đa (MB)
max_log_file = 100
# Số lượng file log
num_logs = 5
# Kích hoạt ghi log ngay khi có sự kiện
flush = INCREMENTAL_ASYNC
# Giảm độ trễ ghi log
max_log_file_action = ROTATE
Kết quả mong đợi: Auditd sẽ tự động xoay vòng log (rotate) và không để mất dữ liệu log quan trọng khi ổ đĩa đầy.
Verify kết quả phần 4
Kiểm tra các rule đã được load vào kernel:
auditctl -l
Thử truy cập file nhạy cảm (ví dụ: cat /etc/ssl/private/xxx.key) và kiểm tra log:
ausearch -k encryption_keys_access -i
Kết quả phải trả về dòng log chi tiết về tiến trình vừa truy cập.
Tối ưu hóa tham số mạng và bộ nhớ đệm
Tối ưu hóa mạng cho thông lượng cao
Database phân tán yêu cầu độ trễ thấp (low latency) và thông lượng cao (high throughput) giữa các node.
Cần điều chỉnh kích thước buffer mạng và số lượng socket để tránh nghẽn cổ chai (bottleneck) khi trao đổi dữ liệu lớn.
Bổ sung các tham số vào file /etc/sysctl.d/99-security.conf (hoặc tạo file mới /etc/sysctl.d/99-performance.conf):
# Tăng kích thước buffer mạng
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# Tăng số lượng file descriptor tối đa (cần cho nhiều connection)
fs.file-max = 2097152
# Tăng số lượng socket listen backlog
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
# Tối ưu hóa TCP Window Scaling
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.ipv4.tcp_congestion_control = bbr
# Giảm thời gian giữ connection chết
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 5
Kết quả mong đợi: Kết nối TCP giữa các node sẽ duy trì ổn định hơn với băng thông lớn hơn, giảm thiểu packet loss do buffer tràn.
Tối ưu hóa bộ nhớ đệm (Page Cache và Swap)
Database cần tận dụng RAM để cache dữ liệu. Cần cấu hình kernel để ưu tiên RAM cho cache và hạn chế sử dụng swap (đĩa) gây chậm.
Bổ sung các tham số vào file /etc/sysctl.d/99-performance.conf:
# Giảm thiểu việc sử dụng Swap
vm.swappiness = 10
# Giữ lại một lượng RAM nhất định cho các tiến trình (không dành cho cache)
vm.min_free_kbytes = 1048576
# Tối ưu hóa VM cho I/O
vm.dirty_ratio = 20
vm.dirty_background_ratio = 10
vm.dirty_expire_centisecs = 30000
vm.dirty_writeback_centisecs = 500
# Tăng kích thước cache cho file
vm.vfs_cache_pressure = 50
# Giảm overhead của Transparent Huge Pages (THP) cho Database
transparent_hugepage = never
Kết quả mong đợi: Hệ thống sẽ ưu tiên lưu dữ liệu vào RAM, chỉ sử dụng swap khi RAM thực sự cạn kiệt, và THP được tắt để tránh gây latency cho các truy vấn nhỏ.
Áp dụng và Verify kết quả phần 5
Áp dụng tất cả các tham số performance:
sysctl --system
Kiểm tra tham số quan trọng:
sysctl vm.swappiness
sysctl net.ipv4.tcp_congestion_control
Kết quả mong đợi: vm.swappiness = 10 và tcp_congestion_control = bbr (hoặc cubic nếu kernel cũ không hỗ trợ BBR).
Kiểm tra file descriptor limit của tiến trình Database (cần chỉnh trong systemd service file nếu cần):
ulimit -n
Kết quả phải lớn hơn 65536 (tùy vào cấu hình file-max đã set).
Đ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 2: Cài đặt và cấu hình nền tảng Linux cho các node Database
Phần 4: Triển khai cơ chế Secret Sharing (Shamir's Secret Sharing) cho quản lý khóa »