Hướng dẫn sử dụng AppArmor trên Linux: Tạo Profile bảo mật cô lập ứng dụng

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Vì sao chmod/chown truyền thống không còn đủ an toàn?

Phân quyền file (chmod, chown) là phòng tuyến cơ bản nhất trên Linux. Nhưng trong thực tế, chỉ riêng nó là chưa đủ.

Hãy hình dung kịch bản quen thuộc: Nginx hoặc một API Python bị khai thác lỗ hổng RCE (Remote Code Execution). Lúc này, hacker lập tức nắm trọn quyền của user www-data. Kẻ tấn công có thể rà soát toàn bộ thư mục /tmp, đọc trộm source code chứa database credentials hoặc thực thi các file binary độc hại từ /dev/shm.

Để cô lập tiến trình và ngăn chặn leo thang đặc quyền (privilege escalation), các kỹ sư hệ thống thường cân nhắc 3 giải pháp chính:

  • Chroot Jail / Container (Docker, Podman): Đóng gói ứng dụng vào namespace và cgroup độc lập. Cách này rất tiện nhưng container breakout vẫn có thể xảy ra nếu kernel dính lỗ hổng (như Dirty COW) hoặc lỡ tay gán cờ --privileged.
  • SELinux (Security-Enhanced Linux): Cơ chế Mandatory Access Control (MAC) dựa trên nhãn (label) cực kỳ mạnh mẽ. Tuy nhiên, cú pháp policy rất phức tạp, chỉ một thao tác di chuyển mount point cũng dễ khiến service ngừng hoạt động bí ẩn.
  • AppArmor (Application Armor): Giải pháp MAC tích hợp sẵn trên Ubuntu, Debian và openSUSE. AppArmor kiểm soát quyền hạn trực tiếp dựa trên đường dẫn file (path-based), dễ đọc, dễ debug và thân thiện hơn rất nhiều.

Khi nào bạn nên chọn AppArmor?

Nếu server đang chạy Ubuntu hoặc Debian, AppArmor là lựa chọn hàng đầu để gia cố bảo mật (server hardening) nhanh mà ít rủi ro downtime nhất.

Cụ thể, AppArmor phát huy hiệu quả tối đa khi:

  • Cần khóa chặt một tiến trình mạng (web server, custom script nhận upload file) để nó chỉ được đọc/ghi trong một vài thư mục chỉ định.
  • Muốn triệt tiêu khả năng spawn interactive shell (như /bin/sh, /bin/bash) nếu kẻ tấn công tiêm mã độc qua web shell.
  • Cần một lớp bảo vệ nhẹ cho bare-metal service mà không muốn tốn tài nguyên dựng cụm container.

Thực hành: Xây dựng AppArmor Profile từ con số 0

Bước 1: Cài đặt công cụ và kiểm tra kernel support

Hầu hết các bản phân phối Ubuntu LTS (từ 20.04 đến 24.04) đều đã bật sẵn AppArmor trong kernel. Bạn chỉ cần cài thêm bộ công cụ quản lý:

sudo apt update
sudo apt install -y apparmor-utils apparmor-profiles

# Kiểm tra trạng thái hiện tại của hệ thống
sudo aa-status

Lệnh aa-status sẽ hiển thị số lượng profile đang ở chế độ enforce (đang chặn vi phạm) và complain (chỉ ghi log cảnh báo, không chặn thực thi).

Bước 2: Tạo service Python mẫu cần bảo vệ

Để dễ hình dung, chúng ta tạo một script Python nhận nhiệm vụ xử lý file tại /opt/myapp/app.py. Script này chỉ cần 2 quyền hợp lệ: ghi log vào /var/log/myapp.log và lưu file vào /var/data/uploads/.

sudo mkdir -p /opt/myapp /var/data/uploads
sudo bash -c 'cat << "EOF" > /opt/myapp/app.py
#!/usr/bin/python3
import os

# 1. Tác vụ hợp lệ: Ghi log hoạt động
with open("/var/log/myapp.log", "a") as f:
    f.write("Service running normally.\n")

# 2. Tác vụ bất thường: Giả lập hacker cố đọc file nhạy cảm của hệ thống
try:
    with open("/etc/shadow", "r") as f:
        print("[CẢNH BÁO] Đọc trộm /etc/shadow thành công!")
except Exception as e:
    print(f"[AN TOÀN] Truy cập /etc/shadow thất bại: {e}")
EOF'

sudo chmod +x /opt/myapp/app.py

Nếu chạy thử bằng lệnh /opt/myapp/app.py với quyền root, bạn sẽ thấy script đọc được /etc/shadow dễ dàng. Bây giờ, chúng ta sẽ dùng AppArmor để chặn đứng hành vi này.

Bước 3: Viết custom profile với whitelist rõ ràng

Tên file profile trong thư mục /etc/apparmor.d/ sẽ quy đổi dấu gạch chéo / của đường dẫn thành dấu chấm .. Hãy tạo file /etc/apparmor.d/opt.myapp.app.py:

sudo bash -c 'cat << "EOF" > /etc/apparmor.d/opt.myapp.app.py
#include <tunables/global>

/opt/myapp/app.py {
  #include <abstractions/base>
  #include <abstractions/python>

  # Cho phép thực thi thông dịch Python kế thừa profile
  /usr/bin/python3* ix,

  # Quyền đọc source code và đọc/ghi thư mục dữ liệu
  /opt/myapp/ r,
  /opt/myapp/** r,
  /var/data/uploads/ rw,
  /var/data/uploads/** rw,
  /var/log/myapp.log rwk,

  # Chặn tuyệt đối quyền thực thi shell phụ và truy cập file nhạy cảm
  deny /bin/** mrwklx,
  deny /usr/bin/** mrwklx,
  deny /etc/shadow* mrwklx,
  deny /etc/passwd* mrwklx,
}
EOF'

Một số ký hiệu quyền cốt lõi cần nhớ:

  • r (Read): Đọc nội dung file hoặc liệt kê thư mục.
  • w (Write): Tạo mới hoặc ghi đè file.
  • k (Locking): Cho phép ứng dụng khóa file (file lock) khi xử lý luồng.
  • ix (Inherit Execute): Thực thi tiến trình con dưới chính profile này.
  • deny: Từ chối dứt khoát quyền truy cập, luôn được ưu tiên xử lý trước các rule cho phép.

Bước 4: Nạp Profile và quan sát qua Complain Mode

Quy tắc sống còn trên production: Không bao giờ bật enforce ngay lập tức. Hãy để profile chạy ở chế độ complain ít nhất vài ngày để ghi nhận toàn bộ hành vi thực tế:

# Nạp profile mới vào kernel
sudo apparmor_parser -r /etc/apparmor.d/opt.myapp.app.py

# Đưa profile về chế độ theo dõi (complain)
sudo aa-complain /opt/myapp/app.py

Trong thực tế triển khai, ứng dụng thường gọi thêm nhiều file thư viện chia sẻ (.so) hoặc file cấu hình ẩn mà developer có thể bỏ sót lúc viết code. Nếu bật enforce ngay, service sẽ bị lỗi Permission Denied ngay lập tức. Chế độ complain giúp ứng dụng vẫn chạy bình thường, đồng thời cảnh báo mọi vi phạm vào system log để bạn bổ sung quyền.

Bước 5: Audit log và kích hoạt Enforce Mode

Sau khi chạy thử toàn bộ luồng nghiệp vụ của ứng dụng, bạn kiểm tra log AppArmor được ghi lại:

# Lọc log vi phạm của AppArmor từ systemd journal
sudo journalctl -fx | grep -i apparmor

# Dùng trợ lý tương tác tự động quét log và cập nhật rule còn thiếu
sudo aa-logprof

# Khi đã chắc chắn không còn thiếu rule hợp lệ, chuyển sang chặn thực sự
sudo aa-enforce /opt/myapp/app.py

Bây giờ, hãy thử chạy lại script sudo /opt/myapp/app.py. Kết quả hiển thị:

[AN TOÀN] Truy cập /etc/shadow thất bại: [Errno 13] Permission denied: '/etc/shadow'

Dù chạy với quyền root, tiến trình vẫn bị kernel từ chối truy cập /etc/shadow vì hành vi này không nằm trong whitelist của profile.

Share: