Chuyển tới nội dung chính

SELinux và AppArmor: Cấu Hình và Sử Dụng Hệ Thống Bảo Mật

Giới Thiệu

Trong thế giới bảo mật Linux, SELinux (Security-Enhanced Linux) và AppArmor là hai hệ thống kiểm soát truy cập bắt buộc (Mandatory Access Control - MAC) hàng đầu, được thiết kế để tăng cường bảo mật bằng cách hạn chế các hoạt động mà ứng dụng và người dùng có thể thực hiện trên hệ thống. Thay vì chỉ dựa vào quyền truy cập truyền thống (User, Group, Other), MAC bổ sung một lớp bảo vệ chi tiết hơn, ngăn chặn ngay cả các tiến trình bị chiếm quyền cũng không thể thực hiện hành vi độc hại.

Bài viết này sẽ đi sâu vào cách cấu hình và sử dụng cả SELinux và AppArmor, giúp bạn hiểu rõ sự khác biệt, ưu nhược điểm của từng hệ thống và cách áp dụng chúng hiệu quả để bảo vệ môi trường Linux của mình.

📋 Thời gian: ~25 phút | Độ khó: Trung bình

Yêu Cầu

Để thực hiện theo hướng dẫn này, bạn cần:

  • Một hệ thống Linux với quyền truy cập sudo.
  • Hiểu biết cơ bản về các lệnh Linux và quản lý file.
  • Đối với SELinux: Hệ điều hành dựa trên Red Hat như Fedora, CentOS, RHEL.
  • Đối với AppArmor: Hệ điều hành dựa trên Debian như Ubuntu, Debian.

Các Bước Thực Hiện

Bước 1: Kiểm Tra Trạng Thái Hiện Tại của SELinux và AppArmor

Trước khi cấu hình, điều quan trọng là phải biết hệ thống của bạn đang sử dụng cái nào và trạng thái của chúng.

Kiểm tra SELinux: Chạy lệnh sau trên các hệ thống dựa trên Red Hat:

# Kiểm tra trạng thái tổng thể của SELinux
sestatus

Bạn sẽ thấy output tương tự:

SELinux status:                 enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allow
Memory protection checking: actual
Max kernel policy version: 33

Current mode: enforcing nghĩa là SELinux đang hoạt động và thực thi các chính sách bảo mật. permissive nghĩa là nó chỉ ghi log các vi phạm mà không ngăn chặn, còn disabled nghĩa là nó không hoạt động.

Kiểm tra AppArmor: Chạy lệnh sau trên các hệ thống dựa trên Debian/Ubuntu:

# Kiểm tra trạng thái của AppArmor và các profile đang hoạt động
sudo apparmor_status

Output sẽ hiển thị các profile đang ở chế độ enforce (thực thi) hoặc complain (chỉ ghi log vi phạm):

apparmor module is loaded.
34 profiles are loaded.
29 profiles are in enforce mode.
5 profiles are in complain mode.
0 profiles are in pending mode.
...

Bước 2: Cấu Hình Cơ Bản SELinux

SELinux hoạt động dựa trên ngữ cảnh (context) và chính sách (policy). Mỗi file, thư mục, cổng mạng và tiến trình đều có một ngữ cảnh SELinux.

2.1 Thay đổi chế độ SELinux: SELinux có ba chế độ chính:

  • enforcing: Thực thi tất cả các chính sách bảo mật.
  • permissive: Ghi log các vi phạm chính sách nhưng không ngăn chặn chúng. Hữu ích cho việc debug.
  • disabled: Vô hiệu hóa hoàn toàn SELinux.
# Đặt SELinux ở chế độ Permissive (tạm thời, không qua reboot)
sudo setenforce 0
sestatus # Kiểm tra lại, Current mode sẽ là permissive

# Đặt SELinux ở chế độ Enforcing (tạm thời)
sudo setenforce 1
sestatus # Kiểm tra lại, Current mode sẽ là enforcing

# ⚠️ Để thay đổi vĩnh viễn, bạn phải chỉnh sửa file cấu hình:
sudo vi /etc/selinux/config
# Tìm dòng SELINUX=enforcing (hoặc permissive, disabled)
# Thay đổi giá trị và lưu lại. Sau đó khởi động lại hệ thống.
# Ví dụ: SELINUX=permissive

2.2 Quản lý ngữ cảnh và boolean:

  • semanage: Công cụ mạnh mẽ để quản lý các phần của chính sách SELinux, bao gồm port, file context và boolean.
  • restorecon: Khôi phục ngữ cảnh mặc định cho file/thư mục.
  • setsebool: Bật/tắt các boolean (công tắc) trong chính sách SELinux.

Ví dụ: Cho phép dịch vụ web (Apache/Nginx) ghi vào thư mục /var/www/html: Theo mặc định, SELinux ngăn chặn dịch vụ web ghi vào các thư mục web chính. Giả sử bạn có một ứng dụng web cần ghi vào /var/www/html/uploads.

# 💡 Bước đầu tiên, hãy kiểm tra log audit nếu gặp lỗi "Permission denied"
# sudo tail -f /var/log/audit/audit.log
# Hoặc sử dụng ausearch để tìm lỗi liên quan đến httpd:
# sudo ausearch -c 'httpd' --raw | audit2allow -M myhttpd
# sudo semodule -i myhttpd.pp # Nếu bạn muốn tạo module tùy chỉnh

# ✅ Cách đơn giản hơn: Thay đổi ngữ cảnh của thư mục
# Đảm bảo thư mục uploads tồn tại
sudo mkdir -p /var/www/html/uploads

# Xem ngữ cảnh hiện tại của thư mục
ls -Zd /var/www/html/uploads

# Gán ngữ cảnh httpd_sys_rw_content_t cho thư mục uploads
# Đây là ngữ cảnh cho phép đọc/ghi cho nội dung web
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/uploads(/.*)?"

# Áp dụng ngữ cảnh mới cho thư mục
sudo restorecon -Rv /var/www/html/uploads

# Kiểm tra lại ngữ cảnh
ls -Zd /var/www/html/uploads
# Ngữ cảnh sẽ là system_u:object_r:httpd_sys_rw_content_t:s0

# 💡 Một số chức năng có thể được bật/tắt bằng boolean.
# Ví dụ: Cho phép HTTPD kết nối ra ngoài mạng (nếu cần cho proxy/API)
sudo getsebool httpd_can_network_connect # Kiểm tra trạng thái
sudo setsebool -P httpd_can_network_connect on # Bật vĩnh viễn (-P)

Bước 3: Cấu Hình Cơ Bản AppArmor

AppArmor hoạt động dựa trên các profile được định nghĩa theo đường dẫn file. Nó dễ hiểu và cấu hình hơn SELinux đối với nhiều người dùng.

3.1 Chế độ profile AppArmor:

  • enforce: Thực thi profile, ngăn chặn các hành vi không được phép và ghi log.
  • complain: Chỉ ghi log các vi phạm mà không ngăn chặn. Hữu ích cho việc phát triển profile.
  • disable: Vô hiệu hóa profile.
# Đặt một profile vào chế độ Complain (ví dụ: profile cho Nginx)
# Đầu tiên, kiểm tra xem profile có tồn tại không
ls /etc/apparmor.d/usr.sbin.nginx # Nếu không có, bạn cần cài đặt nginx hoặc tạo profile

# Đặt profile /usr/sbin/nginx vào chế độ complain
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx

# Đặt profile vào chế độ enforce
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx

# Gỡ tải (vô hiệu hóa) một profile
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx

# Để tải lại tất cả các profile sau khi chỉnh sửa
sudo systemctl reload apparmor

3.2 Tạo và chỉnh sửa profile AppArmor: AppArmor cung cấp công cụ aa-genprof để tạo profile tự động dựa trên hành vi của ứng dụng.

Ví dụ: Tạo profile cho một ứng dụng (ví dụ: curl)

# Cài đặt gói apparmor-utils nếu chưa có
sudo apt update && sudo apt install apparmor-utils

# Bắt đầu quá trình tạo profile cho curl
sudo aa-genprof curl

# ⚠️ Lệnh này sẽ yêu cầu bạn chạy ứng dụng (curl) và tương tác với nó
# để AppArmor thu thập thông tin về các hoạt động của nó.
# Sau đó, nó sẽ hỏi bạn có muốn cho phép các hành động đó hay không.
# Chọn 'S' để scan, 'A' để cho phép, 'D' để từ chối, 'F' để kết thúc.

# Sau khi hoàn tất, profile sẽ được lưu tại /etc/apparmor.d/usr.bin.curl
# Bạn có thể chỉnh sửa profile này thủ công nếu cần
sudo vi /etc/apparmor.d/usr.bin.curl

Ví dụ: Chỉnh sửa profile Nginx để cho phép ghi vào thư mục log tùy chỉnh: Giả sử Nginx của bạn cần ghi log vào /var/log/nginx-custom/access.log.

# Mở profile Nginx
sudo vi /etc/apparmor.d/usr.sbin.nginx

# Tìm phần khai báo quyền truy cập file và thêm dòng sau:
# /var/log/nginx-custom/** rwk, # Cho phép đọc, ghi, xóa trong thư mục này

# Lưu file. Sau đó tải lại profile để áp dụng thay đổi
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx

# Kiểm tra trạng thái profile
sudo apparmor_status | grep nginx

Bước 4: So Sánh và Lựa Chọn

Tính năngSELinuxAppArmor
Triết lýDựa trên nhãn (labeling), kiểm soát mọi tài nguyênDựa trên đường dẫn (path-based), kiểm soát ứng dụng
Độ phức tạpCao hơn, đường cong học tập dốcThấp hơn, dễ học và cấu hình hơn
Phạm vi kiểm soátRộng hơn, toàn diện hơn (file, process, port)Hẹp hơn, tập trung vào quyền truy cập file/thư mục của ứng dụng
Khả năng chi tiếtRất cao, có thể kiểm soát mọi khía cạnhTốt cho các ứng dụng cụ thể, nhưng kém chi tiết hơn tổng thể
Phân phối chínhRed Hat, Fedora, CentOS, RHELUbuntu, Debian, SUSE
Gỡ lỗiCần công cụ như audit2allowĐọc log đơn giản hơn (dmesg, syslog)

Khi nào nên dùng cái nào?

  • SELinux: Phù hợp với môi trường yêu cầu bảo mật cực cao, nơi bạn cần kiểm soát chi tiết đến từng tài nguyên hệ thống và có đội ngũ chuyên trách về bảo mật. Thích hợp cho các máy chủ sản xuất quan trọng.
  • AppArmor: Lý tưởng cho người dùng muốn một giải pháp MAC đơn giản, dễ triển khai và quản lý, đặc biệt trên các máy trạm hoặc máy chủ nhỏ hơn. Nó cung cấp một lớp bảo vệ tốt mà không quá phức tạp.

Troubleshooting

Vấn đề với SELinux

  • Lỗi Permission denied không rõ nguyên nhân:
    • Kiểm tra log audit: sudo tail -f /var/log/audit/audit.log hoặc sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today.
    • Sử dụng audit2allow: Nếu bạn tìm thấy nhiều lỗi AVC liên quan đến một ứng dụng cụ thể, hãy sử dụng audit2allow để tạo một module chính sách tùy chỉnh. sudo ausearch -c 'tên_tiến_trình' --raw | audit2allow -M mypolicy sau đó sudo semodule -i mypolicy.pp.
    • Kiểm tra ngữ cảnh file/thư mục: Đảm bảo file/thư mục có ngữ cảnh SELinux đúng. Sử dụng ls -Z để xem và sudo restorecon -Rv /path/to/dir để khôi phục.
  • Hệ thống không khởi động được sau khi bật SELinux:
    • Khởi động vào chế độ cứu hộ hoặc thêm selinux=0 vào dòng kernel trong GRUB để vô hiệu hóa tạm thời.
    • Sau đó, kiểm tra /etc/selinux/config và đặt SELINUX về permissive hoặc disabled, hoặc khắc phục lỗi chính sách.
    • ⚠️ Luôn bắt đầu với chế độ permissive khi cấu hình SELinux lần đầu.

Vấn đề với AppArmor

  • Ứng dụng không hoạt động hoặc bị từ chối truy cập:
    • Kiểm tra log hệ thống: Các lỗi từ chối của AppArmor thường xuất hiện trong dmesg, /var/log/syslog hoặc /var/log/kern.log. Tìm kiếm các dòng chứa apparmor="DENIED".
    • Chuyển profile sang chế độ complain: sudo aa-complain /etc/apparmor.d/tên.profile. Điều này sẽ cho phép ứng dụng chạy trong khi bạn kiểm tra các vi phạm.
    • Sử dụng aa-logprof: Đây là công cụ tương tác để phân tích log và cập nhật profile. sudo aa-logprof. Nó sẽ quét log và hỏi bạn có muốn cho phép các hành động bị từ chối hay không.
  • Cú pháp profile sai:
    • Khi chỉnh sửa profile thủ công, một lỗi cú pháp có thể khiến profile không tải được.
    • Kiểm tra profile bằng sudo apparmor_parser -C /etc/apparmor.d/tên.profile. Nếu không có lỗi, bạn có thể tải lại bằng sudo apparmor_parser -r /etc/apparmor.d/tên.profile.

Kết Luận

SELinux và AppArmor là những công cụ bảo mật mạnh mẽ, cung cấp một lớp bảo vệ bổ sung quan trọng cho hệ thống Linux của bạn. Mặc dù có những khác biệt đáng kể về triết lý và độ phức tạp, cả hai đều có thể được cấu hình để hạn chế quyền truy cập của các tiến trình, từ đó giảm thiểu bề mặt tấn công và ngăn chặn các mối đe dọa tiềm tàng.

💡 Best Practices:

  • Bắt đầu từ chế độ Permissive/Complain: Luôn luôn triển khai các chính sách mới ở chế độ ghi log trước khi chuyển sang chế độ thực thi. Điều này giúp bạn xác định và khắc phục các vấn đề mà không làm gián đoạn hệ thống.
  • Kiểm tra log thường xuyên: Thường xuyên xem xét log audit của SELinux hoặc log hệ thống của AppArmor để phát hiện các vi phẩm và tinh chỉnh chính sách.
  • Nguyên tắc quyền tối thiểu (Least Privilege): Chỉ cấp các quyền cần thiết tuyệt đối cho ứng dụng và dịch vụ. Tránh cấp quyền quá rộng rãi.
  • Hiểu rõ ứng dụng của bạn: Trước khi tạo hoặc sửa đổi chính sách, hãy hiểu rõ ứng dụng cần những quyền truy cập nào để hoạt động bình thường.
  • Tài liệu hóa: Ghi lại các thay đổi bạn thực hiện đối với chính sách để dễ dàng bảo trì và khắc phục sự cố trong tương lai.

Việc nắm vững SELinux hoặc AppArmor sẽ nâng cao đáng kể khả năng bảo mật cho môi trường Linux của bạn, giúp bạn tự tin hơn trong việc triển khai và quản lý các ứng dụng và dịch vụ quan trọng.