Giới thiệu
Nếu bạn từng làm việc với một bản phân phối Linux dựa trên Red Hat như Fedora, CentOS hoặc RHEL, chắc hẳn bạn đã gặp SELinux. Đó là cái "thứ" thường cản trở một dịch vụ hoặc cấu hình mới, khiến nhiều người quyết định vô hiệu hóa nó bằng lệnh setenforce 0. Nhưng nếu tôi nói với bạn rằng SELinux không phải là kẻ thù, mà là một người bảo vệ mạnh mẽ có thể nâng cao đáng kể bảo mật hệ thống của bạn?
Bài viết này sẽ giúp bạn làm rõ Security-Enhanced Linux (SELinux), giải thích nó là gì, cách hoạt động, tại sao nó quan trọng và cách làm chủ những lệnh cơ bản của nó.
SELinux là gì?
SELinux là một mô-đun bảo mật của kernel Linux cung cấp cơ chế Kiểm Soát Truy Cập Bắt Buộc (MAC). Để hiểu tại sao điều này quan trọng, hãy so sánh nó với mô hình bảo mật Linux truyền thống: Kiểm Soát Truy Cập Tùy Chọn (DAC).
DAC (Kiểm Soát Truy Cập Tùy Chọn)
Đây là mô hình bạn quen thuộc. Quyền truy cập như rwx (đọc, ghi, thực thi) cho chủ sở hữu tệp, nhóm và người khác. Từ khóa chính là "tùy chọn"—chủ sở hữu tệp có thể quyết định ai được truy cập. Người dùng root có quyền quyết định cuối cùng và có thể bỏ qua hầu hết các quy tắc DAC.
MAC (Kiểm Soát Truy Cập Bắt Buộc)
Đây là nơi SELinux tỏa sáng. Chính sách bảo mật của hệ thống, được định nghĩa bởi quản trị viên, nghiêm ngặt quản lý tất cả quyền truy cập. Nó là "bắt buộc" vì ngay cả người dùng root cũng không thể bỏ qua các quy tắc này. Nếu một chính sách nói rằng một quy trình của máy chủ web (httpd_t) không thể ghi vào thư mục chính của bạn (user_home_t), thì không quan trọng nếu quyền DAC cho phép điều đó—truy cập sẽ bị từ chối.
Mô hình MAC này rất quan trọng vì nó giúp giới hạn thiệt hại. Nếu một dịch vụ như máy chủ web bị xâm phạm, SELinux ngăn chặn kẻ tấn công sử dụng quy trình đã bị xâm phạm để truy cập vào các phần khác của hệ thống mà nó không có quyền truy cập, như dữ liệu người dùng hoặc tệp cấu hình hệ thống.
Khái Niệm Cốt Lõi: Bối Cảnh Bảo Mật
Trái tim của SELinux là bối cảnh bảo mật (hoặc nhãn). Mỗi tệp, thư mục và quy trình trên một hệ thống có hỗ trợ SELinux đều có một bối cảnh bảo mật. Một bối cảnh bảo mật là một chuỗi gồm bốn thành phần:
user:role:type:level
Đối với hầu hết người dùng và các trường hợp sử dụng đơn giản, thành phần quan trọng nhất là loại. Chính sách SELinux sử dụng các loại này để định nghĩa các quy tắc như "một quy trình loại httpd_t chỉ có thể truy cập các tệp loại httpd_sys_content_t."
Ví dụ
Bạn có thể xem bối cảnh bảo mật của một tệp hoặc quy trình bằng cách sử dụng tùy chọn -Z với nhiều lệnh thông thường:
Xem bối cảnh bảo mật của một tệp
$ ls -lZ /var/www/html/index.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
Xem bối cảnh bảo mật của một quy trình
$ ps auxZ | grep httpd system_u:system_r:httpd_t:s0-s0:c0.c1023 apache 1234 /usr/sbin/httpd
Trong ví dụ tệp, loại là httpd_sys_content_t. Trong ví dụ quy trình, loại là httpd_t. Chính sách SELinux có các quy tắc rõ ràng cho phép quy trình httpd_t đọc các tệp có loại httpd_sys_content_t.
Các Lệnh và Khái Niệm Cơ Bản của SELinux
1. Kiểm Tra Trạng Thái và Chế Độ SELinux
Điều đầu tiên cần làm khi khắc phục sự cố là kiểm tra xem SELinux đang chạy và ở chế độ nào.
getenforce: Lệnh này trả về chế độ hiện tại: Enforcing, Permissive hoặc Disabled.
Enforcing: SELinux tích cực thực thi chính sách, từ chối và ghi lại tất cả các vi phạm. Đây là chế độ mặc định và an toàn nhất.Permissive: SELinux ghi lại các vi phạm chính sách nhưng không chặn chúng. Đây là một chế độ tuyệt vời cho khắc phục sự cố vì bạn có thể xác định những gì bị chặn mà không làm hỏng chức năng.Disabled: SELinux được tắt hoàn toàn. Điều này thường không được khuyến nghị.
sestatus: Cung cấp một cái nhìn tổng quan chi tiết hơn, bao gồm loại chính sách đã tải và trạng thái từ tệp cấu hình.
Để thay đổi chế độ một cách nhanh chóng, sử dụng setenforce \[0|1\]:
setenforce 0: Thay đổi sang chế độ permissive.setenforce 1: Thay đổi sang chế độ enforcing.
Để thay đổi vĩnh viễn, hãy chỉnh sửa tệp /etc/selinux/config và sửa đổi biến SELINUX. Một lần khởi động lại hệ thống là cần thiết để thay đổi này có hiệu lực.
2. Quản Lý Bối Cảnh Tệp
Một vấn đề thường gặp với SELinux là bối cảnh tệp không chính xác. Điều này thường xảy ra khi bạn di chuyển tệp đến một vị trí mới.
chcon: Lệnh này thay đổi bối cảnh bảo mật của một tệp hoặc thư mục. Ví dụ, để thay đổi loại của một tệp thành httpd_sys_content_t:
chcon -t httpd_sys_content_t /srv/web/my-app/index.html
⚠️ Thay đổi này không bền vững và sẽ bị mất khi hệ thống gán lại nhãn tệp.
semanage fcontext: Đây là cách ưa thích để quản lý bối cảnh tệp vĩnh viễn. Nó định nghĩa một quy tắc mà hệ thống sẽ sử dụng để tự động gán nhãn cho các tệp trong một vị trí cụ thể.
Thêm một quy tắc vĩnh viễn cho thư mục máy chủ web của bạn
semanage fcontext -a -t httpd_sys_content_t "/srv/web/my-app(/.*)?"
Cờ -a thêm quy tắc.
Câu lệnh /.* ở cuối có nghĩa là quy tắc áp dụng cho thư mục và mọi thứ bên trong nó.
restorecon: Sau khi định nghĩa một quy tắc vĩnh viễn với semanage fcontext, bạn cần áp dụng nó cho các tệp trên đĩa. restorecon sẽ kiểm tra các tệp và khôi phục chúng về bối cảnh mặc định dựa trên quy tắc chính sách.
Áp dụng quy tắc mới cho thư mục
restorecon -Rv /srv/web/my-app/
3. Quản Lý SELinux Booleans
SELinux booleans là các công tắc bật/tắt cho phép bạn thay đổi hành vi chính sách mà không cần viết hoặc biên dịch các quy tắc chính sách mới. Chúng là cách thuận tiện để bật hoặc tắt các tính năng cụ thể, như cho phép một máy chủ web thực hiện các kết nối mạng.
getsebool -a: Liệt kê tất cả các booleans và trạng thái hiện tại của chúng.
setsebool: Thay đổi giá trị của một boolean.
Cho phép quy trình httpd thực hiện các kết nối mạng
setsebool httpd_can_network_connect on
Đây là một thay đổi tạm thời. Để làm cho nó bền vững qua các lần khởi động lại, hãy sử dụng cờ -P:
setsebool -P httpd_can_network_connect on
4. Kiểm Tra và Khắc Phục Sự Cố
Khi một điều gì đó bị SELinux chặn, nơi đầu tiên để tìm kiếm là nhật ký kiểm tra. Các từ chối của SELinux được ghi lại dưới dạng thông điệp AVC (Access Vector Cache).
audit.log: Trên hầu hết các hệ thống, các thông điệp từ chối được tìm thấy trong /var/log/audit/audit.log. Bạn có thể lọc các thông điệp "bị từ chối" bằng grep.
grep "denied" /var/log/audit/audit.log
sealert: Gói setroubleshoot-server cung cấp sealert, có thể dịch các thông điệp AVC khó hiểu thành các giải thích dễ đọc và thậm chí gợi ý một cách khắc phục.
Cờ -a phân tích tất cả các cảnh báo
sealert -a /var/log/audit/audit.log
audit2allow: Đây là một công cụ mạnh mẽ nhưng có thể nguy hiểm. Nó phân tích các thông điệp từ chối và tạo một quy tắc chính sách mới để cho phép hành động bị từ chối.
Phân tích một từ chối cụ thể từ nhật ký và xuất ra một quy tắc chính sách đề xuất
cat /var/log/audit/audit.log | grep "denied" | audit2allow -w
Sử dụng cực kỳ cẩn thận! Chỉ sử dụng điều này nếu bạn chắc chắn rằng hành động bị từ chối nên được cho phép.
Các Trường Hợp Sử Dụng Thường Gặp
Hosting Một Website Từ Thư Mục Không Chuẩn
Nếu bạn muốn phục vụ nội dung web từ /srv/mywebsite, bạn sẽ cần thay đổi bối cảnh tệp và thiết lập một quy tắc bền vững như đã mô tả trong phần "Quản Lý Bối Cảnh Tệp".
Chạy Một Dịch Vụ Trên Một Cổng Tùy Chỉnh
SELinux có các bối cảnh cụ thể cho các cổng. Nếu bạn thay đổi cổng mặc định của một dịch vụ (ví dụ, chạy sshd trên cổng 2222), bạn sẽ cần thêm một quy tắc để cho phép điều này.
Thêm một quy tắc bối cảnh cổng cho sshd
semanage port -a -t ssh_port_t -p tcp 2222
Tự động hóa các tác vụ bằng một kịch bản: Nếu một kịch bản cần truy cập một tài nguyên mà bối cảnh quy trình mặc định của nó không cho phép, bạn có thể cần thay đổi bối cảnh của nó hoặc tạo một mô-đun chính sách tùy chỉnh. Một ví dụ phổ biến là một kịch bản sao lưu cần ghi vào một thư mục mới.
5. Cú Pháp Chung của semanage và Các Tùy Chọn Thường Gặp
Cú pháp chung là sudo semanage <object> -<action> [options].
object: Loại đối tượng SELinux mà bạn muốn quản lý. Các loại phổ biến nhất là fcontext, port, boolean, user và login.-a, --add: Thêm một bản ghi mới.-d, --delete: Xóa một bản ghi.-m, --modify: Chỉnh sửa một bản ghi hiện có.-l, --list: Liệt kê tất cả các bản ghi của một loại cụ thể.-C, --locallist: Sử dụng với -l để chỉ liệt kê các tùy chỉnh cục bộ mà bạn đã thực hiện, rất hữu ích để xem những gì bạn đã thay đổi từ chính sách mặc định.-n, --noheading: Không in tiêu đề khi liệt kê các đối tượng.
Kết Luận
SELinux có thể cảm thấy phức tạp và đáng sợ lúc đầu, nhưng hiểu các khái niệm cốt lõi của nó—MAC và bối cảnh bảo mật—là chìa khóa để khai thác sức mạnh của nó. Bằng cách học cách kiểm tra trạng thái, quản lý bối cảnh tệp, sử dụng booleans và đọc nhật ký kiểm tra, bạn có thể khắc phục sự cố và cấu hình SELinux để nâng cao an ninh hệ thống của bạn mà không cần phải tắt nó đi.
Đừng để "thuế bảo mật" của SELinux làm bạn nản lòng. Hãy coi nó như một công cụ, không phải là một phiền toái, và bạn sẽ xây dựng được những hệ thống mạnh mẽ và an toàn ngay từ đầu.