

SELinux là một cơ chế bảo mật giúp kiểm soát chặt chẽ quyền truy cập giữa các tiến trình và tài nguyên trên Linux. Không chỉ dựa vào quyền đọc, ghi, thực thi thông thường, SELinux còn sử dụng policy và security context để quyết định một tiến trình được phép làm gì. Cơ chế này giúp tăng khả năng bảo vệ Linux Server, đặc biệt khi một dịch vụ bị khai thác hoặc cấu hình sai.
SELinux (Security-Enhanced Linux) là cơ chế bảo mật triển khai mô hình Mandatory Access Control (MAC) trên Linux. SELinux bổ sung một lớp kiểm soát truy cập bên cạnh hệ thống phân quyền truyền thống, cho phép giới hạn cụ thể tiến trình nào được truy cập file, thư mục, cổng mạng hoặc các tài nguyên khác.
Mỗi tiến trình và tài nguyên trong hệ thống có thể được gắn một SELinux Context. SELinux Policy sau đó sử dụng các context này để quyết định hành động nào được phép thực hiện. Theo nguyên tắc mặc định, tương tác không có rule cho phép phù hợp sẽ bị từ chối.
Ví dụ, Apache có thể được phép đọc các file website trong /var/www/html nhưng không được tự do truy cập dữ liệu của MariaDB. Nếu Apache bị khai thác, kẻ tấn công vì thế không mặc nhiên có quyền truy cập toàn bộ tài nguyên mà tài khoản hệ điều hành có thể đọc.
Đây là điểm khác biệt quan trọng giữa SELinux và cơ chế phân quyền Linux thông thường.

SELinux xác định các quyền kiểm soát truy cập đối với ứng dụng, tiến trình và tệp trên hệ thống. SELinux sử dụng các chính sách bảo mật (security policy), bao gồm tập hợp các quy tắc quy định tài nguyên nào được phép hoặc không được phép truy cập.
Khi một ứng dụng hoặc tiến trình, được gọi là subject, gửi yêu cầu truy cập đến một đối tượng (object) như tệp, SELinux sẽ kiểm tra Access Vector Cache (AVC). Đây là nơi lưu tạm các quyết định về quyền truy cập giữa subject và object.
Nếu SELinux không thể đưa ra quyết định dựa trên thông tin đã được lưu trong AVC, yêu cầu sẽ được chuyển đến Security Server. Thành phần này kiểm tra security context của ứng dụng hoặc tiến trình cũng như tệp cần truy cập. Security context được xác định dựa trên cơ sở dữ liệu chính sách của SELinux.
Sau quá trình kiểm tra, SELinux sẽ quyết định cho phép (allow) hoặc từ chối (deny) yêu cầu truy cập.
Nếu quyền truy cập bị từ chối, hệ thống sẽ ghi lại thông báo dạng avc: denied trong log, chẳng hạn tại /var/log/messages tùy bản phân phối và cấu hình logging.
Các ví dụ sau cho thấy cách SELinux giúp tăng cường bảo mật cho hệ thống:
user_u, người dùng đó mặc định không thể chạy các ứng dụng setuid như sudo và su, trừ khi hệ thống được cấu hình cho phép.named và các process khác cập nhật những zone file sử dụng cho zone transfer.../ để cố gắng truy cập file hoặc directory trên hệ thống. Khi SELinux chạy ở chế độ Enforcing, hệ thống sẽ từ chối việc httpd truy cập những file nằm ngoài phạm vi được policy cho phép. SELinux không thể ngăn chặn hoàn toàn kiểu tấn công này, nhưng có thể giảm đáng kể phạm vi ảnh hưởng.mmap, cho phép kẻ tấn công tìm cách đặt mã tùy ý vào null page.deny_ptrace kết hợp với chế độ Enforcing có thể bảo vệ hệ thống trước CVE-2019-13272, hạn chế những tình huống mà kẻ tấn công có thể lợi dụng PTRACE_TRACEME để giành quyền root.nfs_export_all_rw và nfs_export_all_ro cung cấp cơ chế giúp hạn chế các lỗi cấu hình Network File System (NFS), chẳng hạn vô tình chia sẻ các thư mục /home.SELinux có ba trạng thái thường được nhắc đến là Enforcing, Permissive và Disabled.
Mode | Cách hoạt động | Mục đích |
| Enforcing | Thực thi policy và chặn hành động vi phạm | Vận hành bình thường |
| Permissive | Không chặn nhưng vẫn ghi log vi phạm | Kiểm tra, troubleshooting |
| Disabled | Không thực thi SELinux policy | Chỉ dùng trong trường hợp đặc biệt |
Enforcing là chế độ SELinux thực thi đầy đủ policy.
Nếu một tiến trình thực hiện hành động không được policy cho phép, SELinux sẽ từ chối yêu cầu và ghi nhận sự kiện phù hợp vào log.
Đây là mode mặc định và được khuyến nghị cho quá trình vận hành thông thường.
Ở chế độ Permissive, SELinux vẫn hoạt động, gắn label và ghi lại các hành động vi phạm policy nhưng không thực sự chặn chúng.
Permissive đặc biệt hữu ích khi troubleshooting. Quản trị viên có thể quan sát những hành động nào sẽ bị SELinux từ chối mà không làm gián đoạn ứng dụng trong quá trình kiểm tra.
Disabled nghĩa là SELinux không thực thi policy.
Việc vô hiệu hóa SELinux không được khuyến nghị như một giải pháp xử lý lỗi thông thường. Khi SELinux bị disabled, hệ thống cũng không duy trì việc labeling các persistent object như khi SELinux hoạt động, khiến việc bật lại sau này có thể phức tạp hơn.
SELinux bổ sung một lớp kiểm soát bên cạnh Linux permission, giúp áp dụng mô hình defense in depth.
Ngay cả khi quyền DAC cho phép truy cập, hành động vẫn phải vượt qua kiểm tra SELinux nếu SELinux đang ở Enforcing mode.
Mỗi dịch vụ chỉ được phép truy cập những tài nguyên cần thiết theo policy.
Ví dụ, Apache có thể đọc nội dung website nhưng không tự do truy cập file database hoặc các vùng dữ liệu khác của hệ thống.

Giả sử kẻ tấn công khai thác được một lỗ hổng trên web server. Thay vì có thể sử dụng tiến trình đó để truy cập mọi file mà tài khoản hệ điều hành được phép đọc, kẻ tấn công vẫn phải đối mặt với các giới hạn của SELinux policy.
SELinux nhờ đó có thể giảm phạm vi ảnh hưởng của một dịch vụ bị compromise.
SELinux có thể kiểm soát:
Khả năng kiểm soát chi tiết này đặc biệt hữu ích đối với server production.
SELinux mang lại nhiều lợi ích bảo mật nhưng cũng khiến việc quản trị Linux phức tạp hơn.
Một trong những vấn đề người mới thường gặp là Permission denied dù đã chmod hoặc chown đúng. Nguyên nhân lúc này có thể không nằm ở Linux permission mà ở SELinux Context hoặc Policy.
SELinux cũng yêu cầu quản trị viên hiểu thêm về:
Do đó, cách xử lý phù hợp không phải là tắt SELinux ngay mà nên xác định chính xác rule hoặc context nào gây ra lỗi.
Quản trị viên Linux có thể sử dụng một số lệnh sau để kiểm tra và cấu hình SELinux:
Lệnh | Chức năng |
| sestatus | Xem trạng thái SELinux chi tiết |
| getenforce | Kiểm tra mode hiện tại |
| setenforce | Chuyển Enforcing/Permissive tạm thời |
| ls -Z | Xem SELinux Context |
| restorecon | Khôi phục context theo policy |
| semanage | Quản lý cấu hình SELinux |
| getsebool | Xem SELinux Boolean |
| setsebool | Thay đổi SELinux Boolean |
| ausearch | Tìm sự kiện trong audit log |
Việc hiểu các lệnh này giúp xử lý vấn đề SELinux hiệu quả hơn thay vì vô hiệu hóa toàn bộ lớp bảo mật.
Không. Firewall chủ yếu kiểm soát lưu lượng mạng dựa trên địa chỉ IP, port, protocol hoặc các rule mạng khác. SELinux kiểm soát quyền tương tác giữa process và tài nguyên hệ thống dựa trên policy và security context.
Hai công nghệ có thể cùng được sử dụng để xây dựng nhiều lớp bảo mật cho server.
Enforcing là chế độ SELinux thực thi policy. Những hành động không được policy cho phép sẽ bị từ chối và có thể được ghi vào log.
Permissive vẫn duy trì SELinux policy và ghi lại các hành động lẽ ra bị từ chối nhưng không thực sự chặn chúng. Mode này thường được sử dụng khi troubleshooting.
chmod 777 chỉ thay đổi quyền DAC. Nếu SELinux đang Enforcing và policy không cho phép tiến trình truy cập tài nguyên, yêu cầu vẫn có thể bị từ chối.
Do đó, tăng quyền file không phải lúc nào cũng giải quyết được lỗi.
Có thể chạy:
getenforcehoặc:
sestatus
để kiểm tra trạng thái SELinux hiện tại.
SELinux là lớp kiểm soát truy cập quan trọng giúp tăng khả năng bảo vệ Linux Server bằng cách giới hạn những gì từng tiến trình được phép thực hiện. Thay vì tắt SELinux khi gặp lỗi, quản trị viên nên kiểm tra permission, security context, AVC log và policy để xác định đúng nguyên nhân.
Kết hợp SELinux với cấu hình hệ điều hành an toàn, firewall, cập nhật bản vá và hạ tầng Cloud Server phù hợp sẽ giúp doanh nghiệp xây dựng môi trường máy chủ ổn định và bảo mật hơn. Với VNPT Cloud Server, doanh nghiệp có thể chủ động triển khai Linux Server theo nhu cầu, linh hoạt mở rộng tài nguyên và xây dựng hạ tầng phục vụ nhiều loại ứng dụng, website và hệ thống nghiệp vụ.
