Xem lại trang này để làm quen với các khái niệm về SELinux.
Kiểm soát quyền truy cập bắt buộc
Linux tăng cường bảo mật (SELinux) là hệ thống kiểm soát truy cập (MAC) bắt buộc dành cho hệ điều hành Linux. Là một hệ thống MAC, hệ thống này khác với hệ thống của Linux hệ thống kiểm soát truy cập tuỳ ý (DAC) quen thuộc. Trong hệ thống DAC, một khái niệm quyền sở hữu là tồn tại, qua đó chủ sở hữu của một tài nguyên cụ thể kiểm soát quyền truy cập liên kết với cuộc trò chuyện đó. Điều này thường chi tiết và phù hợp lên cấp vượt cấp đặc quyền ngoài ý muốn. Tuy nhiên, hệ thống MAC tham khảo ý kiến của để có quyết định đối với tất cả các lần truy cập.
SELinux đã được triển khai trong khuôn khổ Mô-đun bảo mật Linux (LSM) khung nhận dạng nhiều đối tượng nhân hệ điều hành và các hành động nhạy cảm thực hiện trên chúng. Tại thời điểm mà mỗi hành động này sẽ xảy ra thực hiện, một hàm hook LSM được gọi để xác định xem liệu nên được cho phép dựa trên thông tin đối với hành động đó được lưu trữ ở dạng mờ đối tượng bảo mật. SELinux cung cấp phương thức triển khai cho các hook và việc quản lý các đối tượng bảo mật này, kết hợp với chính sách của chính nó để quyết định quyền truy cập.
Cùng với các biện pháp bảo mật khác của Android, cơ chế kiểm soát quyền truy cập của Android giúp hạn chế đáng kể thiệt hại tiềm ẩn của máy tính bị xâm nhập và tài khoản. Sử dụng các công cụ như quyền truy cập bắt buộc và tuỳ ý của Android các chế độ kiểm soát giúp bạn có cấu trúc để đảm bảo phần mềm của bạn chỉ chạy ở mức tối thiểu cấp đặc quyền. Điều này giúp giảm thiểu tác động của các cuộc tấn công và giảm khả năng các quá trình sai lệch sẽ ghi đè hoặc thậm chí là truyền dữ liệu.
Trong Android 4.3 trở lên, SELinux cung cấp chức năng kiểm soát truy cập (MAC) bắt buộc bao quát hơn các môi trường kiểm soát truy cập tuỳ ý (DAC) truyền thống. Cho Ví dụ, phần mềm thường phải chạy dưới dạng tài khoản người dùng gốc để ghi vào dữ liệu thô chặn các thiết bị. Trong môi trường Linux dựa trên DAC truyền thống, nếu người dùng gốc bị xâm phạm và người dùng có thể ghi vào mọi thiết bị khối thô. Tuy nhiên, Có thể dùng SELinux để gắn nhãn các thiết bị này để quy trình được chỉ định gốc chỉ có thể ghi vào những người được chỉ định trong chính sách liên kết. Trong phần này thì quy trình này không thể ghi đè dữ liệu và cài đặt hệ thống bên ngoài thiết bị khối thô cụ thể.
Xem Trường hợp sử dụng để biết thêm ví dụ về các mối đe doạ và cách giải quyết chúng bằng SELinux.
Các mức thực thi
Có thể triển khai SELinux ở nhiều chế độ:
- Được phép – Chính sách bảo mật SELinux không được thực thi mà chỉ ghi nhật ký.
- Thực thi – Chính sách bảo mật sẽ được thực thi và ghi lại. Lỗi xuất hiện dưới dạng lỗi EPERM.
Lựa chọn này mang tính nhị phân và xác định liệu chính sách của bạn có áp dụng biện pháp xử lý hay chỉ áp dụng cho phép bạn thu thập dữ liệu không thành công có thể xảy ra. Sự cho phép đặc biệt hữu ích trong trong quá trình triển khai.
Loại, thuộc tính và quy tắc
Android dựa vào thành phần Thực thi kiểu (TE) của SELinux để
. Điều này có nghĩa là tất cả các đối tượng (chẳng hạn như tệp, quy trình hoặc ổ cắm) đều có
type liên kết với các biến đó. Ví dụ: theo mặc định, một ứng dụng
sẽ có kiểu untrusted_app
. Đối với một quy trình, loại của quy trình đó cũng là
được gọi là miền của tài khoản đó. Bạn có thể chú thích một loại bằng một hoặc
nhiều thuộc tính. Các thuộc tính rất hữu ích khi tham chiếu đến nhiều loại
.
Các đối tượng được liên kết tới lớp
(ví dụ: tệp, thư mục, liên kết tượng trưng, ổ cắm) và các loại quyền truy cập khác nhau
cho mỗi lớp được biểu thị bằng quyền.
Ví dụ: quyền open
tồn tại đối với lớp này
file
Mặc dù các loại và thuộc tính thường xuyên được cập nhật như một phần của
chính sách SELinux, quyền và lớp được xác định tĩnh và
hiếm khi được cập nhật trong bản phát hành Linux mới.
Quy tắc chính sách có dạng:
allow source target:class permissions;
trong đó:
- Nguồn – Loại (hoặc thuộc tính) của chủ thể quy tắc. Ai đang yêu cầu quyền truy cập?
- Target (Mục tiêu) – Loại (hoặc thuộc tính) của đối tượng. Quyền truy cập được yêu cầu là gì?
- Lớp – Loại đối tượng (ví dụ: tệp, ổ cắm) đang được truy cập.
- Quyền – Thao tác (hoặc tập hợp các thao tác) (ví dụ: đọc, ghi) đang được thực hiện.
Ví dụ về quy tắc:
allow untrusted_app app_data_file:file { read write };
Lệnh này cho biết các ứng dụng được phép đọc và ghi tệp được gắn nhãn
app_data_file
. Ngoài ra còn có các loại khác cho ứng dụng. Cho
isolated_app
được dùng cho các dịch vụ ứng dụng có
isolatedProcess=true
trong tệp kê khai. Thay vì lặp lại
quy tắc cho cả hai loại, Android sử dụng thuộc tính có tên appdomain
cho mọi loại nội dung liên quan đến ứng dụng:
# Associate the attribute appdomain with the type untrusted_app. typeattribute untrusted_app, appdomain; # Associate the attribute appdomain with the type isolated_app. typeattribute isolated_app, appdomain; allow appdomain app_data_file:file { read write };
Khi một quy tắc được viết chỉ định tên thuộc tính, tên đó sẽ tự động mở rộng sang danh sách các miền hoặc loại liên kết với . Một số thuộc tính đáng chú ý là:
domain
- thuộc tính được liên kết với tất cả các loại quy trình,file_type
– thuộc tính liên kết với tất cả các loại tệp.
Macro
Cụ thể, có nhiều loại quyền để
cân nhắc. Ví dụ: quyền read
không đủ để mở
hoặc gọi stat
trên đó. Để đơn giản hoá định nghĩa quy tắc, Android
cung cấp một tập hợp các macro để xử lý các trường hợp phổ biến nhất. Ví dụ, để
để thêm các quyền còn thiếu như open
, quy tắc ở trên
có thể được viết lại thành:
allow appdomain app_data_file:file rw_file_perms;
Xem global_macros
và te_macros
để có thêm ví dụ về các macro hữu ích. Nên sử dụng macro bất cứ khi nào có thể
giúp giảm khả năng thất bại do từ chối trên
quyền truy cập.
Sau khi xác định một loại, bạn cần liên kết loại đó với tệp hoặc quy trình mà nó biểu thị. Xem phần Triển khai SELinux để biết thêm chi tiết về cách thực hiện việc liên kết này. Để biết thêm thông tin về quy tắc, hãy xem Sổ tay SELinux.
Bối cảnh và danh mục bảo mật
Khi gỡ lỗi các chính sách SELinux hoặc gắn nhãn tệp (qua
file_contexts
hoặc khi nhấn ls -Z
), bạn có thể
trên một ngữ cảnh bảo mật (còn được gọi là một nhãn). Cho
ví dụ:
u:r:untrusted_app:s0:c15,c256,c513,c768
. Ngữ cảnh bảo mật có định dạng như sau:
user:role:type:sensitivity[:categories]
. Bạn thường có thể bỏ qua
Các trường user
, role
và sensitivity
của một
bối cảnh (xem phần Tính cụ thể). type
được giải thích trong phần trước. categories
thuộc
Bảo mật đa cấp (MLS)
hỗ trợ trong SELinux. Kể từ Android S, các danh mục được dùng để:
- Cách ly dữ liệu ứng dụng để không cho một ứng dụng khác truy cập,
- Tách biệt dữ liệu ứng dụng giữa các người dùng thực.
Tính cụ thể
Android không sử dụng tất cả tính năng do SELinux cung cấp. Khi đọc tài liệu bên ngoài, hãy lưu ý những điểm sau:
- Phần lớn các chính sách trong AOSP được xác định bằng Ngôn ngữ chính sách hạt nhân. Có một số trường hợp ngoại lệ khi sử dụng Ngôn ngữ trung gian phổ biến (CIL).
- Không sử dụng người dùng SELinux. Người dùng duy nhất được xác định là
u
. Khi cần, người dùng thực sẽ được đại diện bằng trường danh mục trong ngữ cảnh bảo mật. - Không sử dụng vai trò SELinux và Điều khiển truy cập dựa trên vai trò (RBAC). Hai vai trò mặc định được xác định và sử dụng:
r
cho đối tượng vàobject_r
cho đối tượng. - Không sử dụng tính nhạy cảm SELinux. Luôn đặt độ nhạy
s0
mặc định. - Giá trị boolean SELinux không được sử dụng. Sau khi tạo chính sách cho một thiết bị, không phụ thuộc vào trạng thái của thiết bị. Điều này giúp đơn giản hoá kiểm tra và gỡ lỗi chính sách.