Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Các khái niệm về 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

Security Enhanced Linux (SELinux), là một hệ thống kiểm soát truy cập (MAC) bắt buộc 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ể kiểm soát các quyền truy cập liên quan đến nó. Điều này nói chung là chi tiết thô và có thể bị leo thang đặc quyền ngoài ý muốn. Tuy nhiên, hệ thống MAC tham khảo ý kiến ​​của cơ quan trung ương để đưa ra quyết định về tất cả các nỗ lực truy cập.

SELinux đã được triển khai như một phần của khuôn khổ Mô-đun Bảo mật Linux (LSM), khuôn khổ này 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, một hàm hook LSM được gọi để xác định xem hành động có được phép hay không dựa trên thông tin về nó được lưu trữ trong một đối tượng bảo mật không rõ ràng. SELinux cung cấp một triển khai cho các móc 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 giúp hạn chế đáng kể thiệt hại có thể xảy ra do 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 truy cập bắt buộc và tùy ý của Android cung cấp cho bạn một cấu trúc để đảm bảo phần mềm của bạn chỉ chạy ở mức đặ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 ghi đè các quy trình sai hoặc thậm chí truyền dữ liệu.

Trong Android 4.3 trở lên, SELinux cung cấp một ô kiểm soát truy cập (MAC) bắt buộc 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 gốc để 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 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 với SELinux.

Mức độ thực thi

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

  • Permissive - Chính sách bảo mật của 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 là nhị phân và xác định liệu chính sách của bạn có hành động hay chỉ cho phép bạn thu thập các lỗ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, quy trình hoặc ổ cắm) có một kiểu liên kết với chúng. Ví dụ: theo mặc định, một ứng dụng sẽ có kiểu là untrusted_app . Đối với một quy trình, kiểu của nó còn được gọi là miền của nó. Có thể chú thích một loại với một hoặc nhiều thuộc tính . Các thuộc tính hữu ích để tham chiếu đế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 kiểu 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 cho 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 SELinux của Android, 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.

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 đối tượng 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àm gì?
  • Lớp - Loại đối tượng (ví dụ: tệp, ổ cắm) đang được truy cập.
  • Quyền - Hoạt động (hoặc tập hợp các hoạt động) (ví dụ: đọc, ghi) đang được thực hiện.

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

allow untrusted_app app_data_file:file { read write };

Điều này nói rằng các ứng dụng được phép đọc và ghi các tệp có nhãn app_data_file . Có 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 ứng dụng 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 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 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 nói riêng, có nhiều loại quyền cần xem xét. Ví dụ: quyền read không đủ để mở tệp hoặc stat gọi trên đó. Để đơn giản hóa đị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ụ: để bao gồm các quyền còn thiếu, chẳng hạn 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. Macro nên được sử dụng bất cứ khi nào có thể để giúp giảm khả năng bị lỗi do từ chối các quyền liên quan.

Khi một kiểu được xác định, nó cần được liên kết với tệp hoặc quá 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 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 các tệp gắn nhãn (thông qua file_contexts hoặc khi chạy ls -Z ), bạn có thể gặp một ngữ 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 user , role và các trường sensitivity của ngữ cảnh (xem Tính cụ thể ). 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ách ly dữ liệu ứng dụng khỏi quyền 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 thực 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ố ngoại lệ đối với việc sử dụng Ngôn ngữ Trung cấp 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 thực được đại diện bằng cách sử dụng trường danh mục của ngữ 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 định nghĩa và sử dụng: r cho các chủ thể và object_r cho các đối tượng.
  • SELinux nhạy cảm không được sử dụng. Độ nhạy s0 mặc định luôn được đặt.
  • SELinux boolean không được sử dụng. Khi chính sách được xây dựng cho một thiết bị, chính sách đó 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.