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.