Kernel hardening là một trong những giải pháp bảo mật hàng đầu giúp tăng cường an toàn cho máy chủ Linux. Trong bối cảnh các cuộc tấn công mạng ngày càng tinh vi, bảo vệ nhân hệ điều hành (kernel) đóng vai trò then chốt trong việc ngăn chặn các lỗ hổng bảo mật và giảm thiểu rủi ro bị xâm nhập trái phép.
Kernel hardening bao gồm nhiều kỹ thuật như kiểm soát truy cập, giảm bề mặt tấn công, sử dụng các bản vá bảo mật và áp dụng các mô-đun bảo vệ nâng cao. Nhờ đó, máy chủ Linux trở nên vững chắc hơn trước các mối đe dọa từ bên ngoài lẫn bên trong.
Bài viết này sẽ hướng dẫn bạn cách kernel hardening hiệu quả để bảo vệ máy chủ Linux, đồng thời giới thiệu các công cụ và phương pháp thực tiễn giúp nâng cao mức độ an toàn hệ thống. Nếu bạn đang quản trị máy chủ Linux, kernel hardening là bước không thể bỏ qua để đảm bảo dữ liệu và dịch vụ luôn được bảo vệ tối ưu.

Thư mục /proc
Trước khi đi vào điều chỉnh các tham số kernel, hãy để tôi giải thích về thư mục /proc để bạn hiểu những tham số này đến từ đâu.
Nếu bạn xem bên trong thư mục /proc, bạn sẽ thấy rất nhiều thư mục được đặt tên theo số, cùng một số tệp và thư mục thông thường.
Các thư mục được đánh số tương ứng với ID tiến trình (PID) của các tiến trình đang chạy.
Bên trong mỗi thư mục có số, bạn sẽ tìm thấy các tệp và thư mục con chứa chi tiết về tiến trình đó. Tuy nhiên, không phải tất cả các tệp trong các thư mục này đều dễ hiểu trừ khi bạn quen thuộc với lập trình hệ điều hành.
Thay vào đó, chúng ta thường dùng các lệnh như ps và top để lấy thông tin tiến trình từ thư mục /proc và hiển thị dưới dạng dễ đọc hơn.
Các tệp và thư mục còn lại với tên thông thường chứa các thông tin về hoạt động của kernel. Ví dụ, thư mục sys chứa các tham số kernel có thể được điều chỉnh để tăng cường bảo mật kernel.
Nếu bạn vào thư mục /proc/sys/net/ipv4/, bạn sẽ thấy nhiều tham số liên quan đến mạng IPv4. Mỗi tệp trong thư mục này đại diện cho một tham số và chứa giá trị của nó.
Giờ khi bạn đã biết cơ bản về thư mục /proc, chúng ta hãy bắt đầu tăng cường bảo mật cho Linux kernel.
Công cụ sysctl
Cách cũ để thay đổi giá trị tham số là echo giá trị mới vào tệp tham số đó.
Cách này đã lỗi thời và không hoạt động trực tiếp với sudo, buộc phải dùng lệnh bash -c để thực thi, ví dụ như sau:
sudo bash -c "echo '1' > /proc/sys/net/ipv4/icmp_echo_ignore_all"
Tuy nhiên, đây không phải cách làm được khuyến nghị. Thay vào đó, nên dùng công cụ sysctl hiện đại hơn.
Lệnh sau sẽ liệt kê tất cả các tham số cùng giá trị của chúng:
sudo sysctl -a
Bạn cũng có thể kiểm tra giá trị của một tham số cụ thể như sau:
sudo sysctl net.ipv4.icmp_echo_ignore_all
Hai lệnh này giúp bạn xác minh xem các giá trị mới đã được áp dụng chưa sau khi thay đổi.
Nếu bạn muốn thay đổi giá trị tham số tạm thời, có thể dùng tùy chọn -w để đặt giá trị mới như sau:
sudo sysctl -w net.ipv4.icmp_echo_ignore_all=1
Giá trị này chỉ tồn tại cho đến khi bạn khởi động lại máy chủ.
Đôi khi cách này hữu ích, nhưng trong hướng dẫn này chúng ta muốn thay đổi vĩnh viễn.
Tăng cường bảo mật cho Linux Kernel
Phần tiếp theo, chúng ta sẽ chỉnh sửa các tham số kernel bằng cách thêm chúng vào cuối tệp /etc/sysctl.conf cùng với giá trị mới, đảm bảo thay đổi là vĩnh viễn.
Sau khi thêm xong, chỉ cần khởi động lại máy chủ để giá trị mới có hiệu lực.
Lọc đường dẫn ngược (Reverse Path Filtering)
Tấn công giả mạo xảy ra khi kẻ tấn công giả danh ai đó hoặc một thực thể đáng tin cậy.
Điều này có thể xảy ra ở nhiều cấp độ, bao gồm cả cấp độ mạng như giả mạo địa chỉ IP, nơi kẻ tấn công gửi gói mạng với địa chỉ IP giả mạo.
Chiến thuật này có thể dùng cho tấn công DoS hoặc lừa kiểm soát truy cập.
Hai tham số dưới đây giúp ngăn chặn tấn công giả mạo:
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
Chúng điều khiển tính năng lọc đường dẫn ngược (RP filter), một tính năng bảo mật giúp chống giả mạo địa chỉ IP. Khi bật, server kiểm tra xem có thể tới địa chỉ nguồn của gói tin đến không. Nếu không thể, gói tin sẽ bị loại bỏ.
Mặc định, các tham số này được đặt là 2, nghĩa là chế độ lỏng lẻo (loose mode). Đặt thành 1 áp dụng chế độ nghiêm ngặt (strict mode) cho lọc đường dẫn ngược, tăng cường bảo mật hơn.
Bảo vệ chống tấn công SYN Flood
Một dạng tấn công DoS là gửi rất nhiều gói SYN đến server mà không hoàn tất ba bước bắt tay TCP, gọi là tấn công SYN flood.
Điều này làm server có nhiều kết nối nửa mở, tiêu tốn tài nguyên và ngăn server nhận kết nối hợp lệ mới.
Trong trường hợp nghiêm trọng, server có thể bị treo, không phản hồi và không truy cập được.
TCP SYN cookies giúp giảm thiểu tấn công SYN flood bằng cách quản lý kết nối nửa mở mà không tiêu tốn nhiều tài nguyên server.
Tham số dưới đây bật tính năng TCP SYN cookies:
net.ipv4.tcp_syncookies = 1
Dù không bảo vệ quá nhiều, tôi vẫn khuyến nghị bật nó.
Có hai tham số nữa để tối ưu cách server xử lý kết nối mới:
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 3
Tham số đầu tiên kiểm soát kích thước hàng đợi yêu cầu SYN đến. Mặc định thường là 256, hơi thấp. Tăng backlog giúp server xử lý nhiều kết nối nửa mở hơn, chịu được lưu lượng cao hơn.
Với hầu hết hệ thống, nên đặt từ 4096 đến 16384 trừ khi máy có bộ nhớ rất lớn.
Tham số thứ hai quy định số lần server gửi lại gói SYN-ACK nếu không nhận được ACK từ client trong tấn công SYN flood.
Mặc định là 5 lần, nghĩa là server giữ tài nguyên lâu hơn cho client không phản hồi. Giảm xuống 2 hoặc 3 giúp giải phóng tài nguyên nhanh hơn bằng cách giới hạn số lần thử lại.
Bạn có thể xem hướng dẫn của tôi về ngăn chặn tấn công SYN flood bằng quy tắc firewall và Fail2ban.
Vô hiệu hóa ICMP Redirects
ICMP redirects là thông báo router gửi cho server để báo nó nên dùng đường đi khác tốt hơn để tới đích cụ thể.
Ví dụ, nếu server gửi traffic tới một router mà router biết đường đi hiệu quả hơn đến đích đó, router sẽ gửi ICMP redirect để cập nhật bảng định tuyến của server.
Tuy nhiên, các gói ICMP, kể cả ICMP redirect rất dễ bị giả mạo. Kẻ tấn công có thể tạo gói redirect giả để đánh lừa server gửi traffic qua đường đi độc hại hoặc sai lệch.
8 tham số dưới đây sẽ vô hiệu hóa việc gửi và nhận ICMP redirects:
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
Trong môi trường bảo mật cao, ICMP redirects nên bị vô hiệu hóa, đặc biệt trên hệ thống không làm router.
Vô hiệu hóa Source Routing
Source routing là tính năng mà người gửi gói tự xác định lộ trình gói đi qua mạng thay vì để router chọn đường tốt nhất.
Tính năng này đôi khi hữu ích nhưng cũng gây rủi ro bảo mật lớn vì kẻ tấn công có thể lợi dụng để gửi gói qua đường đi độc hại hoặc bỏ qua biện pháp an ninh.
Bốn tham số dưới đây vô hiệu hóa việc chấp nhận gói source route:
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
Vô hiệu hóa source routing là thực hành bảo mật phổ biến, nhất là trên server mà lưu lượng mạng cần đi theo đường tin cậy.
Vô hiệu hóa chuyển tiếp gói (Packet Forwarding)
Chuyển tiếp gói cho phép hệ thống truyền gói mạng từ giao diện mạng này sang giao diện khác.
Trừ khi server của bạn đóng vai trò router hoặc VPN, nên vô hiệu hóa chuyển tiếp gói.
Các tham số sau vô hiệu hóa chuyển tiếp gói:
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
Việc này giúp ngăn server bị lợi dụng làm cổng mạng cho lưu lượng trái phép.
Bảo vệ kết nối TCP (trạng thái TIME-WAIT)
Khi một kết nối TCP đóng lại, nó chuyển sang trạng thái TIME-WAIT nhằm ngăn các gói cũ hoặc trùng lặp ảnh hưởng đến kết nối mới.
Tham số này giúp chống lại tấn công TIME-WAIT Assassination:
net.ipv4.tcp_rfc1337 = 1
Khi bật, server đóng kết nối TCP an toàn hơn, đảm bảo các kết nối ở trạng thái TIME-WAIT không bị chiếm đoạt.
Điều này ngăn mất dữ liệu hoặc lỗi kết nối do kẻ tấn công lợi dụng lỗ hổng này.
Tuy nhiên tài liệu kernel có thể gây nhầm lẫn về tham số này và còn tranh luận về việc có nên bật hay không nên thử nghiệm trước trong môi trường thử nghiệm.
Tăng cường bảo mật cho BPF JIT Compiler
Berkeley Packet Filter (BPF) là framework trong kernel Linux dùng để lọc gói mạng, theo dõi và giám sát hiệu năng.
Trình dịch Just-In-Time (JIT) tăng tốc BPF bằng cách biên dịch chương trình thành mã máy lúc chạy thay vì giải thích từng dòng.
Tham số này bật thêm tính năng bảo mật cho BPF JIT compiler:
net.core.bpf_jit_harden = 2
Khi bật sẽ giảm thiểu tấn công JIT Spraying bằng cách che giấu các hằng số nhạy cảm trong chương trình BPF như giá trị cố định hoặc địa chỉ bộ nhớ.
JIT Spraying là kỹ thuật kẻ xấu lợi dụng trình dịch JIT để chèn mã độc vào bộ nhớ điều khiển mã máy thực thi.
Việc che giấu giúp kẻ tấn công khó đoán hoặc khai thác hơn.
Tiếp theo thêm tham số:
kernel.unprivileged_bpf_disabled = 1
Ngăn người dùng không có quyền root tải và chạy chương trình BPF cũng như giới hạn truy cập BPF JIT compiler chỉ dành cho root.
Giới hạn core dumps
Core dump là file kernel Linux tạo ra khi chương trình bị lỗi crash. Nó chứa dữ liệu bộ nhớ chương trình, thanh ghi và ngăn xếp cuộc gọi tại thời điểm lỗi.
Dù hữu ích cho debug, core dump có thể tiết lộ dữ liệu nhạy cảm như mật khẩu hoặc khóa mã hóa.
Mặc định core dump lưu tại /var/lib/systemd/coredump và nén bằng zstd. Nó được tạo ra bởi lỗi như segmentation faults hoặc lệnh bất hợp pháp và phân tích bằng công cụ như gdb.
Tuy nhiên core dump là rủi ro bảo mật đặc biệt với chương trình quyền cao. Nếu kẻ xấu chiếm được core dump có thể lấy dữ liệu nhạy cảm.
Do vậy nên vô hiệu hóa core dump trừ khi thực sự cần debug (thực tế tôi chưa từng cần).
Hai tham số hỗ trợ:
kernel.core_pattern = |/bin/false
fs.suid_dumpable = 0
kernel.core_pattern = |/bin/false chuyển hướng mọi cố gắng tạo core dump sang lệnh false, tức bỏ qua nó. Dù vậy một số tiến trình đặc quyền vẫn có thể bỏ qua hạn chế này.
Thêm fs.suid_dumpable = 0 đảm bảo không tạo core dump cho tiến trình quyền cao, tăng cường bảo vệ thêm.
Vô hiệu hóa Magic Keys
Magic Keys là tổ hợp phím đặc biệt cho phép thực hiện thao tác debug và điều khiển hệ thống ngay cả khi server bị treo do lỗi kernel panic.
Để vô hiệu hóa Magic Keys thêm tham số:
kernel.sysrq = 0
Vô hiệu hóa Magic Keys ngăn chặn việc lạm dụng hoặc khai thác các tính năng debug này.
Giới hạn truy cập nhật ký kernel
Mặc định mọi người dùng trên server đều có thể chạy lệnh dmesg để xem nhật ký kernel chứa thông tin nhạy cảm.
Để giới hạn truy cập lệnh này thêm tham số:
kernel.dmesg_restrict = 1
Chỉ người dùng root mới xem được nhật ký kernel.
Giới hạn truy cập ptrace
Hàm gọi hệ thống ptrace() cho phép tiến trình quan sát và điều khiển tiến trình khác đang chạy.
Tính năng này có thể bị kẻ xấu lợi dụng nếu ứng dụng bị xâm nhập, cho phép họ chiếm quyền điều khiển các tiến trình khác như phiên SSH.
Để giảm nguy cơ này dùng tham số kernel.yama.ptrace_scope để giới hạn dùng ptrace. Ý nghĩa các giá trị:
0: Quyền ptrace truyền thống – tiến trình có thể đính kèm bất kỳ tiến trình nào dưới cùng user.1: Giới hạn ptrace – chỉ đính kèm được với con cháu hoặc tiến trình được phép.2: Chỉ admin – chỉ tiến trình có quyền CAP_SYS_PTRACE mới dùng ptrace.3: Không cho đính kèm – không tiến trình nào dùng ptrace đính kèm khác được.
Để an toàn nhất nên đặt 3, hoàn toàn chặn ptrace đính kèm tiến trình khác.
Phần lớn server Linux nên áp dụng trừ khi cần ptrace cho debug hoặc quản trị đặc biệt.
Dùng tham số:
kernel.yama.ptrace_scope = 3
Đảm bảo không tiến trình nào thao túng hoặc theo dõi tiến trình khác được.
Giới hạn User Namespaces
User namespaces là tính năng kernel tạo vùng riêng biệt cho người dùng tăng cường bảo mật sandboxing.
Dù dành cho người dùng không đặc quyền, tính năng này có thể làm lộ kernel với nguy cơ leo thang quyền hạn.
Tham số giới hạn chỉ root mới dùng được user namespaces:
kernel.unprivileged_userns_clone = 0
Ngăn người dùng không đặc quyền tạo user namespaces.
Kiểm soát Swapping
Giống core dumps, swapping sao chép bộ nhớ ra đĩa chứa dữ liệu nhạy cảm tiềm năng.
Để giảm rủi ro này, ta yêu cầu kernel swap chỉ khi thật cần thiết bằng tham số:
vm.swappiness = 1
Đảm bảo server chỉ swap khi không còn lựa chọn khác.
Hạn chế tạo file
Để tăng cường an toàn, ta giới hạn tạo một số loại file trong thư mục nguy hiểm tiềm năng.
Trước hết ngăn tạo FIFO (named pipes) và file thường ở vị trí rủi ro bằng tham số:
fs.protected_regular = 2
fs.protected_fifos = 2
Giúp giảm nguy cơ kẻ tấn công lợi dụng loại file này trong thư mục không an toàn.
Tiếp theo bảo vệ hard links và symbolic links (symlink) bằng tham số:
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
Tham số đầu ngăn người dùng không đủ quyền tạo hard link tới file; tham số thứ hai xử lý symlink an toàn tránh lỗi TOCTOU (time-of-check to time-of-use).
Tổng hợp lại tăng lớp bảo vệ chống lỗ hổng hệ thống file nhất định.
Random hóa bố cục vùng nhớ (ASLR)
ASLR (Address Space Layout Randomization) là kỹ thuật bảo mật làm ngẫu nhiên bố cục vùng nhớ quan trọng trong tiến trình như buffer, heap và stack.
Điều này khiến kẻ tấn công khó đoán vị trí dữ liệu quan trọng để khai thác lỗi bộ nhớ thành công. Dù ghi được bộ nhớ cũng không biết chính xác vị trí cần tấn công vì bố cục thay đổi liên tục.
Để bật ASLR thêm tham số:
kernel.randomize_va_space = 2
Đảm bảo kernel ngẫu nhiên bố cục vùng nhớ tất cả tiến trình.
Kết luận
Tăng cường bảo mật Linux kernel là bước quan trọng giúp bảo vệ hệ thống khỏi các tấn công mạng và lỗ hổng nguy hiểm. Việc hiểu rõ thư mục /proc cùng cách sử dụng công cụ sysctl giúp quản trị viên dễ dàng điều chỉnh các tham số kernel một cách hiệu quả và bền vững.
Các biện pháp như bật Reverse Path Filtering, bảo vệ SYN Flood, vô hiệu hóa ICMP Redirects, source routing và packet forwarding đóng vai trò then chốt trong việc ngăn chặn tấn công giả mạo và DoS.
Ngoài ra, hạn chế core dumps, Magic Keys, truy cập ptrace và user namespaces cũng góp phần giảm thiểu rủi ro bảo mật. Bật tính năng bảo vệ TCP TIME-WAIT, tăng cường BPF JIT compiler và kích hoạt ASLR giúp hệ thống trở nên an toàn hơn trước các kỹ thuật tấn công tinh vi.
Việc cập nhật và duy trì các cấu hình này trong file /etc/sysctl.conf đảm bảo các thay đổi có hiệu lực lâu dài, nâng cao sự ổn định và bảo mật cho server Linux. Áp dụng đúng các bước này sẽ giúp bạn xây dựng môi trường mạng an toàn, giảm thiểu nguy cơ bị xâm nhập và bảo vệ dữ liệu quan trọng hiệu quả.









