Nỗi ám ảnh “Permission Denied” và thói quen tai hại
2 giờ sáng, server báo lỗi 500. Bạn kiểm tra log và thấy dòng chữ Permission Denied đáng ghét, mặc dù đã chmod 777 hay chown đúng user. Trong cơn bế tắc, phản xạ tự nhiên của nhiều sysadmin là chạy ngay lệnh setenforce 0. Tiện thì có tiện, nhưng hành động này chẳng khác nào bạn tháo luôn cánh cửa bảo vệ ngôi nhà chỉ vì cái chìa khóa hơi khó vặn.
SELinux (Security-Enhanced Linux) thực chất là một “vệ sĩ” tận tâm nhưng hơi khó tính. Thay vì tắt nó đi, việc tự tạo Custom Policies giúp bạn vừa vận hành ứng dụng mượt mà, vừa giữ cho dữ liệu nhạy cảm an toàn. Theo báo cáo từ Red Hat, SELinux có khả năng chặn đứng đến 90% các cuộc tấn công leo thang đặc quyền ngay cả khi hacker đã chiếm được quyền root của một tiến trình.
So sánh các cách xử lý xung đột SELinux
Khi ứng dụng bị SELinux chặn, chúng ta thường đứng trước 3 lựa chọn. Hãy xem tại sao Custom Policy lại là hướng đi của dân chuyên nghiệp.
1. Chế độ Permissive (setenforce 0)
- Thực tế: Đây là cách “đầu hàng”. Ứng dụng chạy được ngay nhưng lớp bảo mật sâu nhất bị vô hiệu hóa.
- Rủi ro: Nếu web server dính lỗi Remote Code Execution (RCE), hacker có thể duyệt toàn bộ file hệ thống mà không gặp rào cản nào.
2. Sử dụng SELinux Booleans
- Thực tế: Rất an toàn và dễ dùng qua lệnh
setsebool. - Hạn chế: Chỉ giải quyết được các kịch bản phổ thông như cho phép Apache gửi mail hay kết nối DB. Với các ứng dụng tự viết (In-house app), các Boolean này thường không đủ.
3. Tạo Custom Policy (Giải pháp triệt để)
- Thực tế: Áp dụng nguyên tắc Least Privilege (Quyền hạn tối thiểu). Ứng dụng chỉ được làm đúng những gì bạn cho phép.
- Đánh giá: Tốn thêm 5-10 phút cấu hình nhưng đổi lại sự an tâm tuyệt đối trên Production.
Kịch bản thực tế: Khi ứng dụng cần “vượt rào”
Giả sử bạn có một app Python cần ghi log vào thư mục /opt/myapp/logs thay vì /var/log. Mặc định, SELinux sẽ chặn đứng hành vi này vì coi đó là hoạt động bất thường. Việc tạo Custom Policy lúc này là cách duy nhất để bạn ra lệnh cho hệ điều hành: “Chỉ cho phép tiến trình Python này ghi vào đúng thư mục kia, các chỗ khác vẫn cấm!”.
Trước khi can thiệp vào hệ thống, hãy đảm bảo tài khoản quản trị của bạn có mật khẩu đủ mạnh. Mình thường dùng Password Generator tại Toolcraft.app để tạo chuỗi 32 ký tự ngẫu nhiên. Công cụ này chạy 100% trên trình duyệt, đảm bảo mật khẩu không bao giờ bị gửi qua Internet.
Quy trình 5 bước triển khai Custom Policy
Hãy cùng xử lý một service tên là myapp đang bị SELinux chặn quyền đọc file cấu hình.
Bước 1: Thu thập bằng chứng ở chế độ Permissive
Đừng tắt hẳn SELinux. Hãy đưa nó về chế độ “ghi chép” để thu thập log vi phạm mà không làm gián đoạn ứng dụng.
# Chuyển sang Permissive
sudo setenforce 0
# Xác nhận trạng thái Current mode: permissive
sestatus
Bước 2: Tái hiện hành vi
Hãy chạy ứng dụng và thực hiện toàn bộ các tính năng (đọc file, kết nối mạng, ghi log). SELinux sẽ âm thầm ghi lại mọi hành động bị chặn vào /var/log/audit/audit.log.
Bước 3: Phân tích log bằng audit2allow
Công cụ audit2allow sẽ quét log và tự động soạn thảo chính sách bảo mật cho bạn.
# Cài đặt bộ công cụ quản trị
sudo yum install policycoreutils-python-utils -y
# Xem trước các quyền mà ứng dụng đang thiếu
sudo grep "myapp" /var/log/audit/audit.log | audit2allow -m myapp_custom
Nếu các quyền hiển thị trông hợp lý, hãy tiến hành đóng gói module:
sudo grep "myapp" /var/log/audit/audit.log | audit2allow -M myapp_custom
Kết quả bạn nhận được là file myapp_custom.pp (Policy Package) đã sẵn sàng để sử dụng.
Bước 4: Kích hoạt Policy mới
Nạp chính sách vừa tạo vào nhân Linux bằng lệnh sau:
sudo semodule -i myapp_custom.pp
Bước 5: Siết chặt bảo mật
Đừng quên đưa hệ thống trở lại trạng thái bảo vệ nghiêm ngặt nhất.
sudo setenforce 1
# Kiểm tra lại ứng dụng để đảm bảo mọi thứ đã mượt mà
Mẹo nhỏ: Sửa lỗi nhanh bằng File Context
Nhiều khi lỗi không nằm ở Policy mà do file bị dán nhãn sai. Ví dụ, nếu bạn chuyển thư mục web của Nginx sang một ổ đĩa mới, hãy dùng lệnh sau để gán lại nhãn chuẩn:
# Gán nhãn cho thư mục mới
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
# Áp dụng thay đổi ngay lập tức
sudo restorecon -Rv /data/www
Lời kết
Làm chủ SELinux Custom Policies giúp bạn tách biệt khỏi đám đông sysadmin chỉ biết gõ setenforce 0. Bảo mật là một quá trình lớp lang, từ việc tạo mật khẩu admin cực mạnh đến việc siết chặt quyền truy cập từng tiến trình. Chúc bạn xây dựng được những hệ thống Linux vững như bàn thạch!

