Hardening Linux Server Nâng Cao
Giới Thiệu
Trong môi trường công nghệ hiện đại, việc bảo vệ máy chủ Linux khỏi các mối đe dọa mạng là vô cùng quan trọng. Hardening không chỉ dừng lại ở việc cập nhật phần mềm và cấu hình tường lửa cơ bản, mà còn đòi hỏi các biện pháp nâng cao để đảm bảo an toàn tối đa cho hệ thống. Bài viết này sẽ hướng dẫn bạn các kỹ thuật hardening chuyên sâu, giúp tăng cường khả năng phòng thủ của máy chủ Linux trước các cuộc tấn công phức tạp.
📋 Thời gian: 60-90 phút | Độ khó: Nâng cao
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần có:
- Quyền truy cập root hoặc sudo trên máy chủ Linux.
- Kiến thức cơ bản về quản lý hệ thống Linux và dòng lệnh.
- Hiểu biết về khái niệm bảo mật mạng và hệ điều hành.
- Một máy chủ Linux đang hoạt động (ưu tiên phiên bản mới nhất của Ubuntu Server, CentOS/RHEL).
Các Bước Thực Hiện
Bước 1: Tăng Cường Bảo Mật Kernel với sysctl và Modprobe
Kernel là trái tim của hệ điều hành. Việc cấu hình các tham số kernel đúng cách có thể giảm thiểu đáng kể bề mặt tấn công.
Cấu hình sysctl
Chúng ta sẽ điều chỉnh các tham số sysctl để tăng cường bảo mật mạng, bộ nhớ và ngăn chặn các hành vi độc hại.
# Mở file cấu hình sysctl
sudo nano /etc/sysctl.conf
# Thêm hoặc chỉnh sửa các dòng sau vào cuối file:
# Bảo vệ chống lại SYN flood attacks
net.ipv4.tcp_syncookies = 1
# Ngăn chặn các gói tin IP bị giả mạo (spoofing)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Tắt chuyển tiếp gói tin IP (trừ khi máy chủ là router)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# Bỏ qua các yêu cầu ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Bỏ qua các yêu cầu ICMP lỗi
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Ngăn chặn các tiến trình không có quyền truy cập vào không gian địa chỉ bộ nhớ khác
kernel.yama.ptrace_scope = 1
# Giới hạn sử dụng Dentry Cache (tránh tấn công từ chối dịch vụ)
vm.vfs_cache_pressure = 50
# Vô hiệu hóa tính năng "magic SysRq key" (trừ khi cần thiết cho gỡ lỗi)
# Cẩn thận khi vô hiệu hóa, có thể hữu ích trong trường hợp khẩn cấp
kernel.sysrq = 0
# Tắt các cổng không an toàn hoặc không cần thiết
# net.ipv4.tcp_timestamps = 0 # Có thể ảnh hưởng hiệu suất, cân nhắc
# net.ipv4.tcp_sack = 0 # Có thể ảnh hưởng hiệu suất, cân nhắc
# Lưu file và áp dụng các thay đổi
sudo sysctl -p
⚠️ Cảnh báo: Một số tham số có thể ảnh hưởng đến hiệu suất hoặc chức năng của ứng dụng nhất định. Luôn kiểm tra kỹ sau khi áp dụng.
Vô hiệu hóa các Kernel Module không cần thiết
Các module kernel không sử dụng có thể là điểm yếu tiềm tàng. Vô hiệu hóa chúng là một biện pháp tốt.
# Mở file cấu hình modprobe
sudo nano /etc/modprobe.d/blacklist.conf
# Thêm các module cần vô hiệu hóa vào file:
# Ví dụ: Vô hiệu hóa các module mạng cũ hoặc không an toàn
blacklist dccp
blacklist sctp
blacklist rds
blacklist tipc
blacklist usb-storage # Nếu không cần thiết cho máy chủ
# Lưu file. Các thay đổi sẽ có hiệu lực sau khi khởi động lại.
# Để kiểm tra các module đang tải:
# lsmod | grep <module_name>
💡 Mẹo: Trước khi vô hiệu hóa, hãy đảm bảo rằng module đó thực sự không cần thiết cho hoạt động của máy chủ.
Bước 2: Triển khai AppArmor hoặc SELinux
AppArmor (trên Ubuntu, Debian) và SELinux (trên RHEL, CentOS) là các cơ chế kiểm soát truy cập bắt buộc (MAC) mạnh mẽ, cung cấp một lớp bảo mật bổ sung vượt qua quyền hạn truyền thống của Linux.
AppArmor (Dành cho Ubuntu/Debian)
AppArmor hoạt động bằng cách tải các profile bảo mật cho từng ứng dụng, giới hạn tài nguyên mà ứng dụng đó có thể truy cập.
# Cài đặt AppArmor (nếu chưa có)
sudo apt update
sudo apt install apparmor apparmor-utils
# Kiểm tra trạng thái AppArmor
sudo apparmor_status
# Đặt một profile vào chế độ enforcing (ví dụ: cho Nginx)
# Đầu tiên, tìm profile:
# ls /etc/apparmor.d/
# Ví dụ: profile cho usr.sbin.nginx
# Chuyển profile sang chế độ enforcing
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
# Để tạo một profile mới hoặc tùy chỉnh:
# Chuyển ứng dụng sang chế độ complain (ghi nhật ký vi phạm nhưng không chặn)
# sudo aa-complain /usr/sbin/nginx
# Chạy ứng dụng để tạo log các hành vi
# Sau đó, sử dụng aa-genprof để tạo profile dựa trên log
# sudo aa-genprof nginx
# Theo dõi các câu hỏi và trả lời 'a' (allow) hoặc 'd' (deny)
# Sau khi hoàn tất, chuyển profile sang chế độ enforcing
# sudo aa-enforce /etc/apparmor.d/path.to.new.profile
✅ Thành công: Việc triển khai AppArmor hiệu quả sẽ giới hạn đáng kể thiệt hại nếu một ứng dụng bị xâm nhập.
SELinux (Dành cho RHEL/CentOS)
SELinux cung cấp kiểm soát truy cập chi tiết hơn so với AppArmor, nhưng cũng phức tạp hơn.
# Kiểm tra trạng thái SELinux
sestatus
# Đảm bảo SELinux ở chế độ enforcing
# Mở file cấu hình
sudo nano /etc/selinux/config
# Đảm bảo dòng sau được đặt:
# SELINUX=enforcing
# Lưu file và khởi động lại máy chủ để áp dụng (hoặc setenforce 1 để áp dụng ngay)
# sudo setenforce 1
# Để xử lý các vấn đề SELinux:
# Cài đặt công cụ quản lý SELinux
sudo yum install policycoreutils-python-compat setroubleshoot-server
# Xem các lỗi SELinux
sudo journalctl -t setroubleshoot
# Sử dụng sealert để phân tích và đề xuất giải pháp
# sudo sealert -a /var/log/audit/audit.log
⚠️ Cảnh báo: SELinux có thể gây ra nhiều vấn đề nếu không được cấu hình đúng. Luôn kiểm tra log và sử dụng setroubleshoot để gỡ lỗi.
Bước 3: Bảo mật Hệ thống File và Quyền Hạn Nâng Cao
Kiểm soát quyền truy cập và giám sát tính toàn vẹn của hệ thống file là rất quan trọng.
Cấu hình Mount Options An toàn
Áp dụng các tùy chọn mount an toàn cho các phân vùng như /tmp, /var/tmp, /dev/shm.
# Mở file /etc/fstab
sudo nano /etc/fstab
# Thêm hoặc chỉnh sửa các dòng sau cho các phân vùng tương ứng:
# Ví dụ cho /tmp (nếu là phân vùng riêng):
# UUID=<UUID_OF_TMP_PARTITION> /tmp ext4 defaults,nodev,nosuid,noexec 0 2
# Nếu /tmp là một thư mục trong phân vùng root, bạn có thể tạo một phân vùng riêng hoặc mount tmpfs:
# tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0
# Ví dụ cho /dev/shm:
# tmpfs /dev/shm tmpfs defaults,noexec,nosuid,nodev 0 0
# Áp dụng các thay đổi mà không cần khởi động lại (nếu không phải là phân vùng root)
sudo mount -o remount,nodev,nosuid,noexec /tmp
sudo mount -o remount,nodev,nosuid,noexec /dev/shm
# Để kiểm tra các tùy chọn đã áp dụng
# mount | grep "/tmp"
# mount | grep "/dev/shm"
nodev: Ngăn chặn các thiết bị đặc biệt được sử dụng trên phân vùng.
nosuid: Ngăn chặn các bit SUID/SGID có hiệu lực trên phân vùng.
noexec: Ngăn chặn việc thực thi các file nhị phân trên phân vùng.
Kiểm tra tính toàn vẹn File với AIDE
AIDE (Advanced Intrusion Detection Environment) là một công cụ tuyệt vời để kiểm tra tính toàn vẹn của file và phát hiện thay đổi trái phép.
# Cài đặt AIDE
# Trên Debian/Ubuntu:
sudo apt install aide aide-common
# Trên CentOS/RHEL:
sudo yum install aide
# Khởi tạo cơ sở dữ liệu AIDE lần đầu (sau khi hệ thống đã được hardening)
sudo aide --init
# Đổi tên file cơ sở dữ liệu để AIDE sử dụng cho các lần kiểm tra sau
sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
# Chạy kiểm tra tính toàn vẹn (nên chạy định kỳ, ví dụ qua cron)
sudo aide --check
# Để lên lịch kiểm tra hàng ngày (ví dụ vào 3 giờ sáng):
sudo crontab -e
# Thêm dòng sau:
# 0 3 * * * /usr/bin/aide --check | mail -s "AIDE Integrity Check Report" your_email@example.com
💡 Mẹo: Gửi báo cáo AIDE đến một địa chỉ email hoặc hệ thống SIEM để giám sát liên tục.
Bước 4: Giám sát và Ghi nhật ký Nâng Cao với Auditd
Auditd là một hệ thống con trong kernel Linux cung cấp khả năng ghi nhật ký chi tiết về các sự kiện hệ thống, rất quan trọng cho việc phát hiện và phân tích sự cố bảo mật.
# Cài đặt Auditd
# Trên Debian/Ubuntu:
sudo apt install auditd audispd-plugins
# Trên CentOS/RHEL:
sudo yum install audit audit-libs
# Khởi động và kích hoạt Auditd
sudo systemctl enable auditd
sudo systemctl start auditd
# Thêm các quy tắc Auditd nâng cao
# Mở file quy tắc
sudo nano /etc/audit/rules.d/audit.rules
# Thêm các quy tắc sau (hoặc tương tự) để giám sát các sự kiện quan trọng:
# Giám sát các file cấu hình hệ thống quan trọng
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/ssh/sshd_config -p wa -k ssh_config_changes
# Giám sát việc sử dụng các lệnh SUID/SGID
-a always,exit -F arch=b64 -F perm=x -F (auid>=1000 or auid=unset) -F success=0 -F path=/usr/bin/sudo -k sudo_failed
-a always,exit -F arch=b64 -F perm=x -F (auid>=1000 or auid=unset) -F path=/usr/bin/su -k su_failed
# Giám sát việc thay đổi thời gian hệ thống
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -k time_changes
# Giám sát các sự kiện liên quan đến người dùng và nhóm
-a always,exit -F arch=b64 -S addgroup -S adduser -S delgroup -S deluser -S usermod -S groupmod -S passwd -k user_group_changes
# Giám sát việc tải kernel modules (có thể là dấu hiệu của rootkit)
-w /sbin/insmod -p x -k module_load
-w /sbin/rmmod -p x -k module_unload
-w /sbin/modprobe -p x -k module_probe
# Quy tắc không thể thay đổi sau khi áp dụng (chỉ khi khởi động lại)
-e 2
# Lưu file và tải lại các quy tắc
sudo auditctl -R /etc/audit/rules.d/audit.rules
# Xem các sự kiện đã ghi lại
# sudo ausearch -k passwd_changes
# sudo aureport -ts today
⚠️ Cảnh báo: Cấu hình Auditd quá nhiều quy tắc có thể tạo ra một lượng lớn log, ảnh hưởng đến hiệu suất và dung lượng lưu trữ. Tập trung vào các sự kiện quan trọng nhất.
Troubleshooting
- SELinux/AppArmor chặn ứng dụng hợp lệ:
- SELinux: Kiểm tra log bằng
sudo journalctl -t setroubleshoothoặcsudo ausearch -m AVC -ts today | audit2allow -M myapppolicy. Nếuaudit2allowđưa ra giải pháp, bạn có thể tạo và cài đặt policy mới. - AppArmor: Đặt profile ứng dụng về chế độ
complain(sudo aa-complain /path/to/profile), chạy ứng dụng, sau đó dùngsudo aa-logprofđể phân tích log và cập nhật profile.
- SELinux: Kiểm tra log bằng
- Máy chủ không khởi động sau khi chỉnh sửa sysctl.conf: Điều này hiếm khi xảy ra nhưng có thể do một tham số không hợp lệ. Khởi động vào chế độ cứu hộ (recovery mode), chỉnh sửa lại
/etc/sysctl.confđể loại bỏ các thay đổi gần đây. - AIDE báo cáo nhiều thay đổi không mong muốn: Đảm bảo rằng bạn đã chạy
aide --initsau khi hoàn tất các bước hardening ban đầu và trước khi có bất kỳ thay đổi hợp lệ nào khác. Nếu có thay đổi hợp lệ (ví dụ: cập nhật phần mềm), bạn cần cập nhật cơ sở dữ liu AIDE bằng cách chạysudo aide --updatevà sau đó đổi tên fileaide.db.new.gzthànhaide.db.gz. - Auditd tạo quá nhiều log: Xem lại các quy tắc trong
/etc/audit/rules.d/audit.rules. Loại bỏ hoặc tinh chỉnh các quy tắc quá rộng. Đảm bảo bạn chỉ giám sát các sự kiện thực sự quan trọng.
Kết Luận
Hardening Linux server là một quá trình liên tục và đa lớp. Bằng cách áp dụng các kỹ thuật nâng cao như tăng cường bảo mật kernel, triển khai cơ chế kiểm soát truy cập bắt buộc (AppArmor/SELinux), bảo mật hệ thống file và giám sát chi tiết với Auditd, bạn đã xây dựng một nền tảng phòng thủ mạnh mẽ hơn cho máy chủ của mình.
Best Practices:
- Cập nhật thường xuyên: Luôn giữ hệ thống và tất cả phần mềm được cập nhật lên phiên bản mới nhất.
- Sao lưu định kỳ: Đảm bảo có chiến lược sao lưu toàn diện và thường xuyên kiểm tra khả năng phục hồi.
- Nguyên tắc đặc quyền tối thiểu: Cấp cho người dùng và ứng dụng quyền hạn tối thiểu cần thiết để hoạt động.
- Giám sát liên tục: Không ngừng giám sát log và các cảnh báo bảo mật.
- Kim tra thâm nhập: Định kỳ thực hiện kiểm tra thâm nhập và quét lỗ hổng để phát hiện điểm yếu.
- Tài liệu hóa: Ghi lại tất cả các thay đổi cấu hình bảo mật để dễ dàng quản lý và gỡ lỗi.
Việc áp dụng các biện pháp này không chỉ giúp bảo vệ dữ liệu mà còn duy trì tính toàn vẹn và sẵn sàng của các dịch vụ trên máy chủ Linux của bạn.
Xem thêm: