SELinux dùng security context để phân loại tài nguyên trên hệ thống (các tiến trình, file…) để kiểm soát quyền truy cập. Một security context thường có ba hoặc bốn thành phần, cung cấp thông tin về user, role, type và level của tài nguyên đó.
Ví dụ:
# ls -Z /etc/passwd
-rw-r--r-- root root system_u:object_r:passwd_exec_t:s0 /etc/passwd
Lệnh ls với option –Z cho chúng ta thêm thông tin về security context của file.
-rw-r--r-- root root là các quyền trong cơ chế DAC của Linux.
system_u:object_r:passwd_exec_t:s0 là security context của file /etc/passwd trong SELinux (user, role, type, level).
2.5. Quy trình đƣa ra quyết định của SELinux:
Khi một subject, (ví dụ, một ứng dụng), muốn truy cập vào một object (ví dụ, một file), policy enforcement server nằm trong nhân sẽ kiểm tra AccessVector Cache (AVC), nơi các quyền của subject và object được cache. Nếu quyết định không thể thực hiện dựa trên dữ liệu trong AVC, yêu cầu sẽ được chuyển đến
security server, nơi xem xét security context của ứng dụng và file trong một ma trận. Quyền sau đó được cấp hoặc từ chối.
Hình 2.4. Quy trình đưa ra quyết định của SELinux
Khi một subject cố gắng truy cập một object, máy chủ thực thi chính sách trong nhân sẽ kiểm tra trong SELinux Policy Database, là nơi mà quyền truy cập của subject và object được lưu lại. Nếu dựa vào dữ liệu trong cơ sở dữ liệu đó mà chưa thể đưa ra được quyết định, thì sẽ tiếp tục được yêu cầu đưa đến máy chủ bảo mật, để tìm kiếm ngữ cảnh bảo mật của ứng dụng và tập tin trong ma trận. Sau đó, sẽ có quyết định cho phép truy cập hay từ chối. Nếu từ chối thì thông báo từ chối truy cập sẽ được lưu lại chi tiết trong /var/log/messages. Ngữ cảnh bảo mật của subjects và objects không những được áp dụng cho các chính sách được cài đặt trước mà còn cung cấp thông tin để đưa vào ma trận của máy chủ bảo mật.
SELinux thực hiện một cơ chế MAC trong nhân Linux, có nhiệm vụ kiểm tra các hoạt động được phép sau khi cơ chế DAC được kiểm tra. SELinux có thể thực
thi các quy tắc trên các tệp tin, các tiến trình và cả hoạt động của chúng trong hệ thống Linux dựa vào chính sách đã được định nghĩa.
Trong SELinux, khái niệm objects là chỉ toàn bộ các loại tài nguyên như tập tin, thư mục, tiến trình, các thiết bị của hệ thống … Và subjects là chỉ toàn bộ các tiến trình muốn truy cập vào objects.
Hầu hết các hệ điều hành sử dụng cơ chế DAC để điều khiển sự tương tác giữa subjects với objects và giữa các subjects với nhau. Tuy nhiên, hệ thống chỉ sử dụng cơ chế bảo mật DAC vẫn còn có những hạn chế. Các quyết định có cho phép truy cập hay không của cơ chế DAC chỉ dựa vào định danh của người dùng và quyền sở hữu của người dùng đó, hoàn toàn bỏ qua các thông tin bảo mật liên quan như vai trò của người dùng, chức năng và độ tin cậy của chương trình, tính toàn vẹn và độ nhảy cảm của dữ liệu.
Nhu cầu bảo mật cao hơn luôn luôn là cần thiết. Vì thế SELinux bổ sung thêm cơ chế MAC cho nhân Linux. Cơ chế này sẽ tạo chính sách áp dụng cho tất cả các tiến trình và các tập tin trong hệ thống dựa vào quyết định trên nhãn (label) chứa một loạt các thông tin bảo mật có liên quan được gọi là context (ngữ cảnh). Sơ đồ sau mô tả quá trình để một tiến trình cụ thể được phép hay không được phép truy cập vào tập tin mong muốn:
Chế độ hoạt động của SELinux: SELinux có thể chạy ở chế độ enforcing,
kiểm soát truy cập hoặc ở chế độ permissive, chỉ theo dõi truy cập và log. Chế độ
permissive được dùng để tìm sự cố, hoặc phát triển và tối ưu chính sách SELinux.
2.6. Ngôn ngữ chính sách SELinux
2.6.1. Chính sách là gì?
Chính sách là một tập các quy tắc chỉ dẫn cho các công cụ bảo mật SELinux. Chính sách định nghĩa các type cho các object và domain cho các tiến trình, sử dụng role để giới hạn miền được phép truy cập và sử dụng định danh người dùng để chỉ định vai trò có thể truy cập được. Một type được gọi là domain khi nó được áp dụng cho một tiến trình.
Một type là một cách để nhóm các mục lại với nhau dựa trên cơ sở cần độ bảo mật giống nhau. Nếu một ứng dụng có một mục đích duy nhất hoặc tài liệu có nội dung duy nhất thì không cần thiết phải nhóm lại. Ký hiệu môt type:
user_home_t
Các loại object có sự giống nhau là bởi vì chúng có thể truy cập theo cách tương tự bởi cùng một tập các subject. Tương tự như vậy, các tiến trình có xu hướng cùng loại nếu chúng có cùng quyền truy cập với các subject khác. Trong bộ chính sách targeted[21], các chương trình chạy trong miền không bị hạn chế (unconfined_t) có khả năng thực thi với type như sbin_t.
Theo quan điểm SELinux, điều này có nghĩa là chúng tương đương với nhau về những điều khoản có thể và không thể thực hiện trên hệ thống.
Chính sách định nghĩa các quy tắc khác nhau để chỉ ra domain nào có quyền truy cập vào type nào. Chỉ những quy tắc cho phép cụ thể mới được quyền truy cập. Mặc định thì mọi hoạt động chưa được định nghĩa đều không được cho phép và được lưu lại trong /var/log/messages.
Chính sách được biên dịch sang dạng nhị phân để tải vào máy chủ bảo mật nhân và máy chủ bảo mật sẽ đưa ra quyết định, các quyết định đều được lưu vào AVC để tăng hiệu năng của hệ thống.
Chính sách có thể được quy định bởi người quản trị hoặc bằng cách thay đổi các tập tin có sẵn hay tập tin ngữ cảnh trong cây chính sách. Ví dụ, một chính sách
có thể được tải vào nhân tại thời điểm nào đó, hoặc chính sách này được nạp trong khi khởi động bởi init.
Như vậy, về cơ bản mọi hoạt động của hệ thống đều được xác định bởi chính sách và loại nhãn của tập tin.
2.6.2. Các quy tắc TE
Trong TE, một thuộc tính bảo mật (type) là ràng buộc cho từng subject và object. Mỗi type ràng buộc đến một subject gọi là domain. Object được phân chia thành các lớp đối tượng (tập tin, thư mục, tiến trình…) và các hoạt động bảo mật nhạy cảm cũng được chia thành các hướng truy cập (access vectors) và chế độ truy cập (access modes) như đọc, viết, chấp nhận…
Sự kết hợp của định danh người dùng, role và type được gọi là một ngữ cảnh bảo mật. Bất cứ khi nào một subject muốn truy cập object trong một chế độ nào đó, sẽ được kiểm tra xem có được phép của chính sách bảo mật theo ngữ cảnh bảo mật của subject và object liên quan đến truy cập đó hay không.
Khái niệm allow là quyền truy cập được cho phép trong một domain. Một quy tắc allow có cấu trúc như sau:
allow user_t bin_t : file {read execute getattr};[9]
Các tiến trình có type là user_t được phép đọc, thực thi, lấy thuộc tính của tất cả các đối tượng của lớp file (chỉ loại tài nguyên) có type là bin_t trong ngữ cảnh bảo mật.
SELinux cung cấp chuyển đổi ngữ cảnh bảo mật cho việc thay đổi ngữ cảnh bảo mật của một subject và object. Chuyển đổi ngữ cảnh bảo mật cho một subject có thể xảy ra khi một subject thực thi một chương trình. Ngữ cảnh bảo mật của một tiến trình sau khi chuyển đổi được xác định từ ngữ cảnh bảo mật của chương trình và tiến trình trước khi chuyển đổi. Chuyển đổi ngữ cảnh bảo mật của một object xuất hiện khi một object mới được tạo ra. Ngữ cảnh bảo mật của một object mới được xác định từ ngữ cảnh bảo mật của objects và các objects liên quan khác như thư mục cha của một tập tin…
- Type Enforcement Access Control: Trong SELinux, mọi truy cập đều
không cho phép bất cứ truy cập nào. Điều đó có nghĩa là không có superuser trong SELinux, khác với Linux truyền thống. Cách cung cấp truy cập là chỉ ra type của subject (gọi là domain) và object trong một allow rule.
Một allow rule có bốn thành phần:
Source type(s): domain type của tiến trình (subject) yêu cầu truy cập Target type(s): type của object được truy cập
Object class(es): class của object được phép truy cập Permission(s): loại quyền được cho phép
Ví dụ:
allow user_t bin_t : file {read execute getattr};
Ví dụ này chỉ ra cú pháp căn bản của một TE allow rule. Rule này gồm hai định danh type: type nguồn (hay domain), user_t; và type đích (object), bin_t. Định danh file là tên của một object class được định nghĩa trong policy (trong trường hợp này là biểu diễn cho một file bình thường). Các quyền chứa trong ngoặc là tập con của các quyền có thể cấp cho một đối tượng thuộc file object class. Rule trên có nghĩa là:
―Một tiến trình với domain type là user_t có thể đọc, thực thi hoặc lấy các thuộc tính của một file có type là bin_t.”
Quyền trong SELinux được liệt kê chi tiết hơn Linux thông thường (chỉ ba quyền là rwx). Trong trường hợp này, quyền getattr cho phép xem các thuộc tính như ngày tháng, và DAC của file. Đối với Linux thông thường thì có thể xem nhiều thông tin về file chỉ với quyền search trên thư mục chứa file đó, ngay cả khi không có quyền đọc file.
Thách thức lớn ở đây là liệt kê hàng nghìn quyền truy cập trên hệ thống trong khi vẫn đảm bảo chỉ có quyền cần thiết mới được cấp, giúp hệ thống được an toàn nhất có thể.
Hình 2.6. Ví dụ về một allow rule
Để hiểu rõ hơn về TE, chúng ta hãy xem xét ví dụ về chương trình passwd. Trong Linux, chương trình passwd được quyền đọc và sửa file shadow
(/etc/shadow), nơi lưu password đã mã hóa. Chương trình passwd đảm bảo người dùng bình thường chỉ đổi được password của chính họ trong khi root có thể thay đổi bất kì password của ai. Để thực hiện công việc đó, chương trình passwd phải có khả năng di chuyển và tái tạo file shadow. Trong Linux thông thường, việc này được giải quyết bằng thiết lập SUID bit. Nhờ đó, khi passwd được chạy bởi bất kì người dùng nào, nó đều chạy với quyền root (có quyền truy cập đến mọi file). Tuy nhiên, có rất nhiều chương trình có thể chạy dưới quyền root. Điều đó có nghĩa là các chương trình đó có thể chỉnh sửa được file shadow. TE sẽ đảm bảo việc chỉ chương trình passwd (hoặc các chương trình khác ,nếu được cho phép một cách rõ ràng) có thể truy cập đến file shadow, bất kể là ai chạy nó.
Trong ví dụ này, chúng ta định nghĩa hai type. Type passwd_t là domain của chương trình passwd. Type shadow_t là type của file shadow.
# ls -Z /etc/shadow
-r---- root root system_u:object_r:shadow_t shadow
# ps -aZ
joe:user_r:passwd_t 16532 pts/0 00:00:00 passwd
Lưu ý ở đây chúng ta chỉ quan tâm đến type, bỏ qua user và role trong security context. User và role được sử dụng trong RBAC.
Chúng ta xem xét rule ở hình 2-3. Mục đích của rule này là cho phép type của tiến trình passwd (passwd_t) truy cập vào type của file shadow (shadow_t). Như vậy, chương trình passwd có thể thao tác với file shadow vì nó có SUID của root (cơ chế điều khiển truy cập của Linux thông thường) và có rule allow của TE cho phép truy cập này (cơ chế điều khiển truy cập của SELinux). Nếu thiếu một trong hai thì truy cập sẽ không thực hiện được.
2.7. Vấn đề thực thi
2.7.1. Môi trường áp dụng
Hiện nay SELinux đã được tích hợp vào loạt phiên bản nhân Linux 2.6.x. Vì vậy, mọi hệ điều hành dựa trên nhân Linux 2.6.x hiện nay như: RHEL, Ubunbu, Debian, Fedora…đều hỗ trợ SELinux.
2.7.2. Cách sử dụng
2.7.2.3. Tình trạng SELinux
SELinux có 3 chế độ cơ bản: Enforcing, Permissive, và Disabled.
Enforcing: là chế độ mặc định khi cài hệ điều hành, chế độ này sẽ thực thi chính sách bảo mật SELinux trên hệ thống, tất cả các truy cập chưa định nghĩa đều không được phép và mọi hoạt động đều được lưu lại dấu vết.
Permissive: là chế độ mà SELinux hoạt động nhưng không thực thi chính sách bảo mật, chỉ cảnh báo và lưu lại dấu vết các hoạt động. Chế độ này rất hữu dụng trong trường hợp giải quyết các vấn đề cho SELinux.
Để thay đổi chế độ sử dụng SELinux, ta sửa dòng SELINUX= [chế độ] trong tập tin theo đường dẫn sau: /etc/selinux/config. Và khởi động lại hệ thống.
Câu lệnh kiểm tra tình trạng SELinux: getenforce hoặc sestatus (chi tiết hơn).
2.7.2.3. Chính sách SELinux
SELinux sử dụng mô hình đặc quyền tối thiểu. Mặc định, mọi thứ chưa được định nghĩa đều không được phép truy cập. Sau đó, một chính sách được viết để cung cấp cho mỗi thành phần của hệ thống chỉ có quyền truy cập cần thiết để hoạt động. Đây là mô tả cho chính sách strict (hạn chế). Tuy nhiên, viết một chính sách như vậy là công việc vô cùng khó khăn và khó có thể phù hợp trong nhiều trường hợp. Do đó, khi người dùng áp dụng một chính sách strict có sẵn (từ nguồn nào đó) cho hệ thống của mình thường phát sinh thêm nhiều vấn đề. Cuối cùng, thay vì giải quyết các vấn đề quản trị hệ thống thì người dùng thường vô hiệu hóa SELinux.
Chính sách SELinux cũng còn một chế độ khác để hỗ trợ thêm cho người dùng. Bộ chính sách mặc định là targeted có mục tiêu là các tiến trình hệ thống và hạn chế các tiến trình đó. Mọi tiến trình khác trên hệ thống đều hoạt động trong một miền không bị hạn chế và không bị ảnh hưởng bởi SELinux. Mục đích của targeted là để mỗi tiến trình được cài đặt và chạy khi khởi động sẽ mặc định ở trong miền bị hạn chế. Bộ chính sách targeted được thiết kế để bảo vệ các tiến trình quan trọng mà không ảnh hưởng xấu đến người dùng (đặc biệt là người dùng chưa có kinh nghiệm) và hầu hết người dùng hoàn toàn không biết rằng SELinux đang chạy.
2.8. Tính năng[22]
của SELinux
Tất cả các tiến trình và các tập tin đều được gán nhãn với một type
Mỗi type định nghĩa một miền (domain) của tiến trình và một loại của tập tin. Các tiến trình được phân tách với nhau bằng cách chạy các domain riêng biệt và các quy tắc trong chính sách SELinux sẽ định nghĩa cách để tiến trình tương tác với tập tin cũng như tương tác giữa các tiến trình với nhau. Truy cập chỉ được phép nếu tồn tại một quy tắc cụ thể trong chính sách SELinux cho phép thực hiện tiến trình đó.
Làm mịn cơ chế điều khiển truy cập
Tạo cấp bậc nhiều hơn UNIX truyền thống. Trong khi hệ thống UNIX được điều khiển theo ý định của người dùng và dựa vào định danh của người dùng và nhóm người dùng Linux để xác định quyền truy cập thì trong cơ chế SELinux, một quyết định có được phép truy cập hay không phải dựa vào tất cả thông tin sẵn có, ví dụ như người dùng SELinux, role, type...Chính sách SELinux được định nghĩa bởi người quản trị, được thực thi trên toàn hệ thống và không được thiết lập theo ý người dùng.
Giảm thiệt hại bởi các cuộc tấn công leo thang đặc quyền
Khi các tiến trình chạy trong domain, chúng được tách rời nhau, vì các quy tắc trong chính sách SELinux định nghĩa cách các tiến trình truy cập vào tập tin và truy cập vào các tiến trình khác như thế nào, nên nếu một tiến trình bị xâm phạm, thì kẻ tấn công chỉ có quyền truy cập đến các chức năng bình thường của tiến trình đó, còn với các tập tin, tiến trình vẫn được cấu hình để có quyền truy cập. Ví dụ, nếu máy chủ HTTP Apache có một tiến trình bị xâm nhập, thì kẻ tấn công không thể sử dụng tiến trình đó để đọc các tập tin trong thư mục /home của người dùng, trừ khi có một quy tắc cụ thể cho phép truy cập được thêm vào trong chính sách SELinux.
Các dịch vụ hạn chế
Cơ chế SELinux cung cấp khả năng có thể dự đoán trước để giới hạn các dịch vụ và các daemons[20]. Đồng thời, chỉ được phép truy cập khi đó là cần thiết cho hoạt động bình thường của các dịch vụ.
SELinux có thể được sử dụng để thực thi tính bảo mật và toàn vẹn của dữ