So sánh các phương pháp cô lập tiến trình trên Linux
Hầu hết sự cố rò rỉ dữ liệu máy chủ bắt đầu từ một lỗ hổng thực thi mã từ xa (RCE). Cơ chế phân quyền truyền thống (DAC – Discretionary Access Control) với chmod và chown bộc lộ điểm yếu chí mạng. Khi tiến trình chạy quyền root bị chiếm quyền, hacker nắm trọn máy chủ.
Ba hướng tiếp cận phổ biến nhất hiện nay gồm có:
- SELinux (Security-Enhanced Linux): Cơ chế MAC toàn diện do NSA phát triển. SELinux gán nhãn (label) cho từng inode, tiến trình và socket. Giải pháp này chuẩn hóa trên RHEL/CentOS.
- AppArmor (Application Armor): Cơ chế MAC dựa trên đường dẫn tệp (path-based). AppArmor tích hợp sẵn theo mặc định trên Ubuntu và SUSE.
- Container Isolation (Docker/Podman): Đóng gói ứng dụng vào namespaces và cgroups riêng biệt.
Ưu và nhược điểm thực tế của từng giải pháp
1. SELinux: Bảo mật đa tầng nhưng cấu hình phức tạp
SELinux kiểm soát chặt chẽ từng syscall của kernel. Dù vậy, cơ chế gán nhãn nhị phân khiến việc debug tốn rất nhiều thời gian. Chỉ cần copy một file web qua rsync mà quên chạy restorecon -R, Nginx sẽ lập tức trả về lỗi HTTP 403 Forbidden dù quyền chmod 755 đã chuẩn chỉnh.
2. Containerization: Tiện đóng gói nhưng không thay thế bảo mật tầng Host
Docker giúp chuẩn hóa môi trường deploy nhanh chóng. Tuy nhiên, container chia sẻ chung kernel với máy chủ. Khi xuất hiện lỗ hổng escape như runC (CVE-2019-5736 hay CVE-2024-21626), kẻ tấn công vẫn thoát ra ngoài và kiểm soát host node.
3. AppArmor: Trực quan, dễ bảo trì và chi phí thấp
Khác với SELinux, AppArmor gắn quyền trực tiếp vào đường dẫn file nhị phân (ví dụ /usr/sbin/nginx). File profile sử dụng cú pháp text thuần túy. Bạn có thể đọc hiểu và chỉnh sửa cấu hình ngay mà không cần học bảng nhãn bảo mật phức tạp. Độ trễ hiệu năng thực tế của AppArmor thường dưới 1.5% CPU.
Khi nào bạn nên bật AppArmor trên Ubuntu?
Bạn nên tận dụng ngay AppArmor trong các tình huống sau:
- Bảo vệ các service mở cổng trực tiếp ra Internet: Nginx, PHP-FPM, MySQL, BIND9.
- Khóa cứng phạm vi hoạt động của service. Ngăn tiến trình đọc trộm
/etc/shadow, cấm ghi vào/tmpvà chặn spawn shell/bin/bashkhi bị dính web shell. - Cần triển khai bảo mật theo mô hình Zero-Trust trên máy chủ bare-metal mà không làm gián đoạn hệ thống production.
Các bước triển khai AppArmor thực chiến
1. Kiểm tra trạng thái và cài bộ công cụ hỗ trợ
AppArmor được kích hoạt sẵn trên Ubuntu 20.04/22.04/24.04 LTS. Hãy kiểm tra trạng thái hoạt động:
sudo aa-status
Output hiển thị số profile đang ở chế độ enforce (chặn vi phạm) và complain (chỉ ghi log cảnh báo). Cài đặt bộ công cụ sinh profile tự động:
sudo apt update && sudo apt install -y apparmor-utils apparmor-profiles
2. Nguyên tắc vàng: Chạy Complain trước khi Enforce
Tuyệt đối không bật chế độ Enforce ngay trên môi trường live. Hãy để ứng dụng chạy thử ở chế độ Complain ít nhất từ 24 đến 48 giờ để ghi nhận đầy đủ hành vi định kỳ:
- Complain mode: Hệ thống cho phép tiến trình chạy bình thường kể cả khi vi phạm, đồng thời ghi lại audit log.
- Enforce mode: Chặn đứng mọi hành vi nằm ngoài khai báo của profile.
Lệnh chuyển đổi chế độ cho một dịch vụ cụ thể:
# Chuyển sang chế độ theo dõi
sudo aa-complain /usr/sbin/mysqld
# Khóa chặt sang chế độ thực thi chặn
sudo aa-enforce /usr/sbin/mysqld
3. Tự động sinh profile mới bằng aa-genprof
Giả sử bạn cần bảo vệ một API viết bằng Go hoặc Python đặt tại /usr/local/bin/payment-api. Thay vì tự viết cấu hình từ đầu, hãy để aa-genprof học hành vi ứng dụng:
sudo aa-genprof /usr/local/bin/payment-api
Giữ terminal đó mở. Mở tiếp một cửa sổ terminal khác và thực hiện các luồng test: gửi HTTP request, đọc ghi DB, trigger ghi file log. Quay lại terminal chạy aa-genprof và nhấn S để quét log. Trình quản trị sẽ hỏi quyền cho từng tài nguyên:
(A)llow: Cho phép truy cập file hoặc socket.(D)eny: Chặn dứt khoát.(G)lob: Cho phép theo mẫu đại diện (ví dụ:/var/log/payment/*.log).
Bấm phím F (Finish) để lưu profile vào thư mục /etc/apparmor.d/.
4. Phân tích cấu trúc một file Profile chuẩn
Toàn bộ rule của AppArmor nằm trong /etc/apparmor.d/. Dưới đây là cấu hình rút gọn tiêu chuẩn bảo vệ Nginx:
#include <tunables/global>
/usr/sbin/nginx {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/ssl_certs>
# Quyền chạy binary chính
/usr/sbin/nginx mr,
# Chỉ cho phép đọc file cấu hình và SSL
/etc/nginx/** r,
/etc/ssl/certs/** r,
# Giới hạn ghi log và cache
/var/log/nginx/* w,
/var/cache/nginx/** rw,
# Chặn đứng shell execution nếu web server bị inject mã độc
deny /bin/sh mrpx,
deny /bin/bash mrpx,
deny /bin/dash mrpx,
deny /usr/bin/python* mrpx,
}
Ý nghĩa các cờ phân quyền thông dụng:
r: Quyền đọc dữ liệu.w: Quyền ghi hoặc tạo mới file.m: Nạp binary vào bộ nhớ (Memory map, bắt buộc cho thư viện.so).k: Khóa file (File locking, thường dùng cho database và file pid).px: Thực thi chương trình trong một profile AppArmor độc lập.deny: Luật cấm tường minh, luôn có độ ưu tiên cao nhất bất chấp các quy tắc allow.
5. Tải lại cấu hình vào Linux Kernel
Sau khi chỉnh sửa file cấu hình trong /etc/apparmor.d/, hãy nạp profile mới vào bộ nhớ kernel:
# Nạp lại một profile cụ thể
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
# Hoặc reload toàn bộ service AppArmor
sudo systemctl reload apparmor
6. Xử lý sự cố chặn nhầm (Troubleshooting)
Ứng dụng báo lỗi 500 Internal Server Error hoặc Permission denied dù bạn đã chmod 777? Rất có thể AppArmor vừa chặn một lời gọi hệ thống chưa được cấp phép. Kiểm tra ngay log kernel bằng lệnh:
sudo dmesg -T | grep -i apparmor
# Hoặc lọc chính xác các sự kiện bị chặn qua journalctl:
sudo journalctl -k -g "apparmor=\"DENIED\"" -n 50
Để cập nhật quyền tự động từ log mà không cần sửa file thủ công, hãy sử dụng aa-logprof:
sudo aa-logprof
Tiện ích này đọc toàn bộ log vi phạm gần nhất. Bạn chỉ việc nhấn A (Allow) để hợp thức hóa thao tác, profile sẽ tự động cập nhật và áp dụng ngay lập tức mà không cần khởi động lại dịch vụ.

