Secure Ubuntu server bằng AppArmor: chặn tiến trình vượt quyền thực tế
Một server Ubuntu bị xâm nhập hiếm khi “nổ tung” ngay lập tức. Thường hơn: attacker lấy được quyền trong một tiến trình nhỏ—web app, cron job, worker, service nội bộ—rồi tìm cách đọc file nhạy cảm, ghi shell, gọi binary hệ thống, mở kết nối lạ, leo thang quyền. Vấn đề: Linux permission truyền thống chỉ kiểm soát theo user/group. Nếu tiến trình chạy dưới user có quyền đọc file nào đó, nó đọc được. Nếu nó gọi được /bin/bash, nó gọi. Nếu nó ghi được thư mục, nó thả payload.
AppArmor giải quyết bằng Mandatory Access Control: không chỉ hỏi “user này được làm gì?”, mà hỏi thêm “tiến trình này, trong profile này, được chạm vào tài nguyên nào?”. Kể cả process chạy đúng user, đúng quyền Unix, AppArmor vẫn có thể chặn.
Kết quả: exploit thành công ở tầng ứng dụng → thiệt hại bị khoanh vùng.
AppArmor là gì, khác gì chmod/firewall?
AppArmor là cơ chế MAC trên Linux, mặc định có sẵn trên Ubuntu. Nó gắn policy vào chương trình theo path, ví dụ:
– chmod/chown → quyền theo file/user.
– ufw/iptables → network.
– systemd hardening → sandbox service-level.
– AppArmor → policy chi tiết theo tiến trình.
Điểm mạnh: dễ đọc hơn SELinux, tích hợp tốt Ubuntu, triển khai nhanh, log rõ.
Vì sao cần AppArmor trên server thực tế?
Giả sử bạn có web app chạy dưới user www-data. App bị RCE. Attacker chạy được code trong process app.
Nếu process có quyền filesystem tương ứng, hành vi thành công.
Với AppArmor profile chặt:
– app chỉ đọc /var/www/app/**;
– chỉ ghi /var/www/app/storage/**;
– không đọc /etc/** trừ file cần thiết;
– không execute /bin/bash, /usr/bin/curl, /usr/bin/nc;
– không dùng capability nguy hiểm;
– network bị giới hạn.
RCE vẫn nguy hiểm, nhưng attacker bị nhốt trong hộp nhỏ hơn.
Kiểm tra AppArmor trên Ubuntu
Ubuntu thường bật sẵn AppArmor.
sudo aa-status
Kết quả cần chú ý:
apparmor module is loaded.
profiles are loaded.
profiles are in enforce mode.
profiles are in complain mode.
Ý nghĩa:
– enforce → vi phạm bị chặn.
– complain → chỉ log, không chặn. Dùng khi học policy.
– unconfined → process chưa bị profile quản.
– profile → policy nào chặn.
– operation → hành động.
– name → file/tài nguyên.
– requested_mask → quyền process muốn.
– denied_mask → quyền bị từ chối.
Nếu hợp lệ, thêm rule:
/etc/ssl/openssl.cnf r,
Nếu đáng ngờ, giữ deny.
Có thể dùng:
sudo aa-logprof
Công cụ sẽ đọc log, gợi ý rule. Nhưng đừng bấm allow mù. Mỗi allow là mở thêm bề mặt tấn công.
Sai lầm thường gặp
Cho quá rộng
Rule nguy hiểm:
/** rwklx,
Nó gần như phá giá trị profile.
Tốt hơn:
/opt/myapp/** r,
/var/lib/myapp/** rwk,
Dùng complain mãi
Complain chỉ log. Không chặn. Production cần enforce sau giai đoạn học.
– aa-status → AppArmor bật.
– Service không chạy root.
– Profile riêng cho binary chính.
– Complain trước, enforce sau.
– Chỉ allow path cần thiết.
– Deny shell/tool tải payload nếu không cần.
– Giới hạn capability.
– Kết hợp systemd sandbox.
– Monitor log denial.
– Review profile sau mỗi deploy lớn.
Kết luận thực tế
AppArmor không làm server “bất tử”. Nó không sửa bug SQL injection, không vá dependency lỗi, không thay authentication yếu. Nhưng nó làm một việc cực giá trị: giảm hậu quả khi bug bị khai thác.
Trong mô hình phòng thủ hiện đại, câu hỏi không phải “có bị RCE không?”, mà là: nếu bị RCE, process đó làm được gì? Với AppArmor, câu trả lời có thể chuyển từ “đọc secret, gọi shell, tải payload, pivot” thành “bị chặn, log lại, thiệt hại giới hạn”.
Bắt đầu từ một service quan trọng nhất. Viết profile nhỏ. Chạy complain. Quan sát. Enforce. Lặp lại. Sau vài vòng, Ubuntu server của bạn không chỉ “được cấu hình”, mà thật sự có khả năng chặn tiến trình vượt quyền trong tình huống thực tế.