Tăng cường bảo mật Ubuntu: Sử dụng AppArmor để Sandbox ứng dụng

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Tại sao các quyền Linux tiêu chuẩn là chưa đủ

Bảo mật Linux tiêu chuẩn sử dụng Kiểm soát truy cập tùy ý (DAC). Hệ thống này dựa trên người dùng, nhóm và các quyền cơ bản (rwx). Nếu một tiến trình máy chủ web chạy dưới quyền www-data, nó có thể truy cập bất kỳ tệp nào thuộc sở hữu của người dùng đó. Điều này tạo ra một lỗ hổng lớn. Nếu kẻ tấn công khai thác lỗ hổng trong mã PHP của bạn, chúng sẽ kế thừa các quyền đó. Chúng có thể ngay lập tức thu thập các tệp cấu hình, đọc mã nguồn hoặc trích xuất dữ liệu nhạy cảm từ các thư mục tạm thời.

Vài năm trước, một cuộc tấn công brute-force SSH vào giữa đêm trên máy chủ cá nhân đã buộc tôi phải suy nghĩ lại về chiến lược của mình. Tôi nhận ra rằng việc chặn cửa trước là chưa đủ. Bạn phải đảm bảo rằng ngay cả khi kẻ xâm nhập vào được bên trong, chúng sẽ bị nhốt trong một căn phòng nhỏ trống rỗng. Đây chính là Kiểm soát truy cập bắt buộc (MAC). Trên Ubuntu, AppArmor là công cụ chính cho nhiệm vụ này.

AppArmor xác định chính xác những gì một chương trình có thể chạm vào. Nó có thể đọc /etc/passwd không? Nó có thể ghi vào /tmp không? Nó có thể mở một socket mạng không? Nếu một hành động không được cho phép rõ ràng trong profile AppArmor, kernel sẽ chặn nó. Điều này xảy ra ngay cả khi người dùng chạy tiến trình đó có toàn quyền thực hiện hành động đó.

Hiểu về các Profile và Chế độ của AppArmor

AppArmor sử dụng các profile, là các tệp văn bản thuần túy được lưu trữ trong /etc/apparmor.d/. Không giống như SELinux sử dụng các nhãn phức tạp, AppArmor dựa trên đường dẫn. Ví dụ, một profile cho Nginx sẽ nằm tại /etc/apparmor.d/usr.sbin.nginx.

Trước khi sửa đổi bất kỳ cài đặt nào, bạn phải hiểu hai chế độ chính:

  • Enforce (Thực thi): Kernel áp dụng chính sách một cách nghiêm ngặt. Bất kỳ nỗ lực trái phép nào đều bị chặn và ghi lại nhật ký.
  • Complain (Cảnh báo): Chính sách không được thực thi. Ứng dụng chạy không bị giới hạn, nhưng AppArmor ghi lại mọi hành động lẽ ra đã bị chặn. Chế độ này rất quan trọng để thử nghiệm các profile mới mà không làm hỏng các dịch vụ đang hoạt động.

Kiểm tra trạng thái bảo mật hiện tại

Hầu hết các bản cài đặt Ubuntu 22.04 hoặc 24.04 đều được bật AppArmor theo mặc định. Thông thường, bạn sẽ thấy 30 đến 50 profile đã hoạt động. Kiểm tra trạng thái của bạn bằng lệnh sau:

sudo aa-status

Lệnh này cung cấp một cái nhìn tổng thể về các profile đã tải và xác định tiến trình nào hiện đang bị giới hạn.

Thực hành: Bảo mật một ứng dụng Python tùy chỉnh

Hãy đi xa hơn các dịch vụ hệ thống lý thuyết. Chúng ta sẽ bảo mật một script Python đơn giản để xem cơ chế hoạt động thực tế. Hãy tưởng tượng một script chỉ cần đọc một tệp cấu hình và ghi thêm vào một tệp log.

1. Cài đặt bộ công cụ

Ubuntu bao gồm công cụ cốt lõi, nhưng các công cụ tạo profile nằm trong một gói bổ sung. Hãy cài đặt chúng để công việc của bạn dễ dàng hơn:

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

2. Tạo ứng dụng mục tiêu

Lưu script này vào /usr/local/bin/myapp.py:

#!/usr/bin/python3
# Một script đọc một cấu hình cụ thể và ghi vào log

with open("/data/config.txt", "r") as f:
    print(f.read())

with open("/var/log/myapp.log", "a") as log:
    log.write("Truy cập đã được ghi lại\n")

Thiết lập quyền thực thi: sudo chmod +x /usr/local/bin/myapp.py.

3. Tự động tạo Profile

Tiện ích aa-genprof giúp đơn giản hóa quá trình tạo. Nó đặt profile ở chế độ complain và theo dõi hành vi của ứng dụng.

sudo aa-genprof /usr/local/bin/myapp.py

Trong khi công cụ đang chạy, hãy mở một terminal thứ hai và thực thi script của bạn: /usr/local/bin/myapp.py. Sau đó, quay lại terminal đầu tiên và nhấn S để quét log. Tiện ích sẽ hỏi bạn muốn cho phép hay từ chối các hành động mà nó phát hiện được. Đối với script này, hãy cho phép truy cập vào trình thông dịch Python, tệp cấu hình và tệp log.

4. Tinh chỉnh Profile

Đôi khi công cụ tự động đưa ra các quyền quá rộng. Bạn có thể chỉnh sửa tệp thủ công tại /etc/apparmor.d/usr.local.bin.myapp.py. Một profile sạch sẽ trông như thế này:

#include <tunables/global>

/usr/local/bin/myapp.py {
  #include <abstractions/base>
  #include <abstractions/python>

  /usr/bin/python3.[0-9]* ix,
  /data/config.txt r,
  /var/log/myapp.log w,
}

Dưới đây là ý nghĩa của các cờ đó:

  • r: Quyền đọc.
  • w: Quyền ghi.
  • ix: Thực thi tệp và kế thừa profile bảo mật hiện tại.

Quản lý và Xử lý sự cố

Tránh chuyển thẳng một profile sang chế độ enforce. Tôi khuyên bạn nên để ở chế độ complain trong ít nhất 24 giờ. Điều này giúp bạn phát hiện các trường hợp biên như các tác vụ cron hàng tuần hoặc các script xoay vòng log (log rotation) có thể kích hoạt cảnh báo giả.

Chuyển đổi chế độ

Để chuyển sang chế độ complain để thử nghiệm:

sudo aa-complain /etc/apparmor.d/usr.local.bin.myapp.py

Khi bạn chắc chắn ứng dụng hoạt động chính xác, hãy khóa chặt nó lại:

sudo aa-enforce /etc/apparmor.d/usr.local.bin.myapp.py

Giải mã nhật ký (Log)

Việc chặn của AppArmor xảy ra ở cấp độ kernel. Ứng dụng có thể chỉ báo lỗi “Permission Denied”, ngay cả khi quyền của tệp trông có vẻ chính xác. Để tìm nguyên nhân thực sự, hãy kiểm tra log hệ thống:

sudo tail -f /var/log/syslog | grep -i apparmor

Tìm kiếm các thông báo DENIED. Nếu bạn thấy một hành động hợp lệ bị chặn, hãy chạy aa-logprof. Nó sẽ đọc các log này và nhắc bạn cập nhật các quy tắc profile một cách tự động.

Các thực hành tốt nhất cho môi trường Production

Quản lý các chính sách bảo mật không nhất thiết phải là một công việc nặng nhọc. Hãy làm theo ba quy tắc sau:

  1. Tận dụng Abstractions: Sử dụng chỉ thị #include <abstractions/base>. Đây là các đoạn mã soạn sẵn cho các thư viện hệ thống phổ biến. Chúng giúp profile của bạn không bị dài hàng trăm dòng.
  2. Tập trung vào các điểm có nguy cơ cao: Bạn không cần phải sandbox mọi tệp thực thi. Hãy ưu tiên các dịch vụ hướng ra internet như Nginx, máy chủ thư hoặc các API tùy chỉnh. Đây là những điểm xâm nhập tiềm năng nhất của kẻ tấn công.
  3. Sao lưu trước khi cập nhật: Trước khi chạy aa-logprof, hãy sao chép profile hiện có của bạn. Các công cụ tự động đôi khi gợi ý các quy tắc quá lỏng lẻo, và việc có bản sao lưu giúp bạn dễ dàng khôi phục.

Lời kết

AppArmor cung cấp một chiến lược phòng thủ chiều sâu mạnh mẽ. Bằng cách vượt qua các quyền tệp đơn giản và sandbox các ứng dụng của mình, bạn giới hạn thiệt hại mà kẻ tấn công có thể gây ra. Cần có thời gian để tinh chỉnh các profile này, nhưng sự bảo mật mang lại là hoàn toàn xứng đáng. Biết rằng máy chủ web của bạn về mặt vật lý không thể chạm vào thư mục sao lưu sẽ mang lại sự an tâm to lớn.

Share: