Khái niệm SELinux

Xem lại trang này để làm quen với các khái niệm SELinux.

Kiểm soát truy cập bắt buộc

Linux nâng cao 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, nó khác với hệ thống kiểm soát truy cập tùy ý (DAC) quen thuộc của Linux. Trong hệ thống DAC, tồn tại khái niệm quyền sở hữu, theo đó chủ sở hữu của một tài nguyên cụ thể sẽ kiểm soát các quyền truy cập liên quan đến nó. Điều này nói chung là thô sơ và có thể bị leo thang đặc quyền ngoài ý muốn. Tuy nhiên, hệ thống MAC sẽ tham vấn cơ quan trung ương để đưa ra quyết định đối với tất cả các nỗ lực truy cập.

SELinux đã được triển khai như một phần của khung Mô-đun bảo mật Linux (LSM), nhận dạng các đối tượng hạt nhân khác nhau và các hành động nhạy cảm được thực hiện trên chúng. Tại thời điểm mà mỗi hành động này sẽ được thực hiện, hàm móc LSM sẽ được gọi để xác định xem hành động đó có được phép hay không dựa trên thông tin được lưu trữ trong một đối tượng bảo mật không rõ ràng. SELinux cung cấp cách triển khai cho các hook này và quản lý các đối tượng bảo mật này, kết hợp với chính sách riêng của nó để xác định các quyết định truy cập.

Cùng với các biện pháp bảo mật khác của Android, chính sách kiểm soát truy cập của Android hạn chế đáng kể thiệt hại tiềm ẩn đối với các máy và tài khoản bị xâm phạm. Việc sử dụng các công cụ như kiểm soát quyền truy cập tùy ý và bắt buộc của Android sẽ mang lại cho bạn cấu trúc để đảm bảo phần mềm của bạn chỉ chạy ở cấp đặc quyền tối thiểu. Điều này giảm thiểu tác động của các cuộc tấn công và giảm khả năng xảy ra lỗi khi ghi đè hoặc thậm chí truyền dữ liệu.

Trong Android 4.3 trở lên, SELinux cung cấp phạm vi kiểm soát truy cập bắt buộc (MAC) trên các môi trường kiểm soát truy cập tùy ý (DAC) truyền thống. Ví dụ: phần mềm thường phải chạy dưới dạng tài khoản người dùng root để ghi vào các thiết bị khối thô. Trong môi trường Linux dựa trên DAC truyền thống, nếu người dùng root bị xâm phạm thì người dùng đó có thể ghi vào mọi thiết bị khối thô. Tuy nhiên, SELinux có thể được sử dụng để gắn nhãn cho các thiết bị này để quá trình được gán đặc quyền gốc chỉ có thể ghi vào những thiết bị được chỉ định trong chính sách liên quan. Bằng cách này, quy trình 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 Các trường hợp sử dụng để biết thêm ví dụ về các mối đe dọa và cách giải quyết chúng bằng SELinux.

Mức độ thực thi

SELinux có thể được triển khai ở nhiều chế độ khác nhau:

  • Cho phép - Chính sách bảo mật SELinux không được thực thi, chỉ được ghi lại.
  • Thực thi - Chính sách bảo mật đượ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ó thực hiện hành động hay chỉ cho phép bạn thu thập những thất bại tiềm ẩn. Permissive đặc biệt hữu ích trong quá trình thực hiện.

Các loại, thuộc tính và quy tắc

Android dựa vào thành phần Thực thi loại (TE) của SELinux cho chính sách của mình. Nó có nghĩa là tất cả các đối tượng (chẳng hạn như tệp, tiến trình hoặc ổ cắm) đều có một loại được liên kết với chúng. Ví dụ: theo mặc định, một ứng dụng sẽ có loại untrusted_app . Đối với một tiến trình, loại của nó còn được gọi là miền của 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 để đề cập đến nhiều loại cùng một lúc.

Các đối tượng được ánh xạ tới các 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 file lớp . Mặc dù các loại và thuộc tính được cập nhật thường xuyên như một phần của chính sách Android SELinux, các quyền và lớp được xác định tĩnh và hiếm khi được cập nhật như một phần của bản phát hành Linux mới.

Một quy tắc chính sách có dạng: allow source target : class permissions ; Ở đâu:

  • Nguồn - Loại (hoặc thuộc tính) của chủ đề của quy tắc. Ai đang yêu cầu quyền truy cập?
  • 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.

Một ví dụ về một quy tắc là:

allow untrusted_app app_data_file:file { read write };

Điều này nói lên rằng các ứng dụng được phép đọc và ghi các tệp có nhãn app_data_file . Có tồn tại các loại ứng dụng khác. Đối với các trường hợp, isolated_app được sử dụng cho các dịch vụ ứng dụng có isolatedProcess=true trong tệp kê khai của chúng. 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 tất cả các loại bao gồm ứ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 một tên thuộc tính, tên đó sẽ tự động được mở rộng thành danh sách các miền hoặc loại được liên kết với thuộc tính đó. 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 được liên kết với tất cả các loại tệp.

Macro

Đối với quyền truy cập tập tin nói riêng, có nhiều loại quyền cần xem xét. Chẳng hạn, quyền read không đủ để mở tệp hoặc gọi stat trên đó. Để đơn giản hóa việc định nghĩa quy tắc, Android cung cấp một bộ macro để xử lý các trường hợp phổ biến nhất. Ví dụ: để bao gồm các quyền bị 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 các tệp global_macroste_macros để biết 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 xảy ra lỗi do bị từ chối các quyền liên quan.

Khi một loại được xác định, nó cần được liên kết với tệp hoặc quy trình mà nó đại diện. Xem Triển khai SELinux để biết thêm chi tiết về cách thực hiện liên kết này. Để biết thêm thông tin về các quy tắc, hãy xem SELinux Notebook .

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 (thông qua file_contexts hoặc khi ing ls -Z ), bạn có thể gặp một bối cảnh bảo mật (còn được gọi là nhãn ). Ví dụ: u:r:untrusted_app:s0:c15,c256,c513,c768 . Bối cảnh bảo mật có định dạng: user:role:type:sensitivity[:categories] . Bạn thường có thể bỏ qua các trường user , rolesensitivity của một ngữ cảnh (xem Tính đặc hiệu ). Trường type được giải thích trong phần trước. categories là một phần của hỗ trợ Bảo mật đa cấp (MLS) trong SELinux. Kể từ Android S, các danh mục được sử dụng để:

  • Cô lập dữ liệu ứng dụng khỏi sự truy cập của ứng dụng khác,
  • Cô lập dữ liệu ứng dụng từ người dùng thực này sang người dùng khác.

Tính đặc hiệu

Android không sử dụng tất cả các tính năng do SELinux cung cấp. Khi đọc tài liệu bên ngoài, hãy ghi nhớ 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 chung (CIL).
  • Người dùng SELinux không được sử dụng. Người dùng duy nhất được xác định là u . Khi cần thiết, người dùng vật lý được thể hiện bằng trường danh mục của bối cảnh bảo mật.
  • Vai trò SELinux và Kiểm soát truy cập dựa trên vai trò (RBAC) không được sử dụng. Hai vai trò mặc định được xác định và sử dụng: r cho chủ thể và object_r cho đối tượng.
  • Độ nhạy SELinux không được sử dụng. Độ nhạy s0 mặc định luôn được đặt.
  • Boolean SELinux không được sử dụng. Khi chính sách được xây dựng cho một thiết bị, nó 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 hóa việc kiểm tra và gỡ lỗi các chính sách.