Trang này trình bày cách xây dựng chính sách SELinux. Chính sách SELinux được xây dựng dựa trên sự kết hợp giữa chính sách AOSP cốt lõi (nền tảng) và chính sách dành riêng cho thiết bị (nhà cung cấp). Quy trình tạo chính sách SELinux cho Android 4.4 đến Android 7.0 đã hợp nhất tất cả các mảnh sepolicy, sau đó tạo ra các tệp nguyên khối trong thư mục gốc. Điều này có nghĩa là các nhà cung cấp SoC và nhà sản xuất ODM đã sửa đổi boot.img (đối với các thiết bị không phải A/B) hoặc system.img (đối với các thiết bị A/B) mỗi khi chính sách được sửa đổi.
Trong Android 8.0 trở lên, chính sách của nền tảng và nhà cung cấp được xây dựng riêng biệt.
SoC và OEM có thể cập nhật các phần chính sách của họ, tạo hình ảnh (chẳng hạn như vendor.img và boot.img), sau đó cập nhật những hình ảnh đó mà không phụ thuộc vào các bản cập nhật nền tảng.
Tuy nhiên, vì các tệp chính sách SELinux theo mô-đun được lưu trữ trên các phân vùng /vendor, nên quy trình init phải gắn các phân vùng system và nhà cung cấp trước đó để có thể đọc các tệp SELinux từ các phân vùng đó và hợp nhất chúng với các tệp SELinux cốt lõi trong thư mục system (trước khi tải chúng vào nhân).
Tệp nguồn
Logic để tạo SELinux nằm trong các tệp sau:
-
external/selinux: Dự án SELinux bên ngoài, dùng để tạo các tiện ích dòng lệnh HOST nhằm biên dịch chính sách và nhãn SELinux.-
external/selinux/libselinux: Android chỉ sử dụng một phần của dự ánlibselinuxbên ngoài cùng với một số chế độ tuỳ chỉnh dành riêng cho Android. Để biết thông tin chi tiết, hãy xemexternal/selinux/README.android. -
external/selinux/libsepol: -
external/selinux/checkpolicy: Trình biên dịch chính sách SELinux (các tệp thực thi trên máy chủ:checkpolicy,checkmodulevàdispol). Phụ thuộc vàolibsepol.
-
-
system/sepolicy: Cấu hình chính sách SELinux của Android, bao gồm cả bối cảnh và tệp chính sách. Logic chính của bản dựng sepolicy cũng nằm ở đây (system/sepolicy/Android.mk).
Để biết thêm thông tin về các tệp trong system/sepolicy, hãy xem phần Các tệp chính.
Android 7.x trở xuống
Phần này trình bày cách xây dựng chính sách SELinux trong Android 7.x trở xuống.
Quy trình xây dựng cho Android 7.x trở xuống
Chính sách SELinux được tạo bằng cách kết hợp chính sách AOSP cốt lõi với các chế độ tuỳ chỉnh dành riêng cho thiết bị. Sau đó, chính sách kết hợp sẽ được chuyển đến trình biên dịch chính sách và nhiều trình kiểm tra. Bạn có thể tuỳ chỉnh theo từng thiết bị thông qua biến BOARD_SEPOLICY_DIRS được xác định trong tệp Boardconfig.mk dành riêng cho thiết bị. Biến bản dựng chung này chứa danh sách các thư mục chỉ định thứ tự tìm kiếm các tệp chính sách bổ sung.
Ví dụ: mỗi nhà cung cấp SoC và ODM có thể thêm một thư mục, một cho các chế độ cài đặt dành riêng cho SoC và một cho các chế độ cài đặt dành riêng cho thiết bị, để tạo cấu hình SELinux cuối cùng cho một thiết bị nhất định:
BOARD_SEPOLICY_DIRS += device/SoC/common/sepolicyBOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
Nội dung của các tệp file_contexts trong system/sepolicy và BOARD_SEPOLICY_DIRS được nối để tạo file_contexts.bin trên thiết bị:

Hình 1. Logic bản dựng SELinux.
Tệp sepolicy bao gồm nhiều tệp nguồn:
- Văn bản thuần
policy.confđược tạo bằng cách nối các tệpsecurity_classes,initial_sids,*.te,genfs_contextsvàport_contextstheo thứ tự đó. - Đối với mỗi tệp (chẳng hạn như
security_classes), nội dung của tệp là sự kết hợp của các tệp có cùng tên trongsystem/sepolicy/vàBOARDS_SEPOLICY_DIRS. policy.confđược gửi đến trình biên dịch SELinux để kiểm tra cú pháp và được biên dịch thành định dạng nhị phân dưới dạngsepolicytrên thiết bị.
Hình 2. Tệp chính sách SELinux.
Tệp SELinux
Sau khi biên dịch, các thiết bị Android chạy phiên bản 7.x trở xuống thường chứa các tệp liên quan đến SELinux sau đây:
selinux_versionsepolicy: Đầu ra nhị phân sau khi kết hợp các tệp chính sách (chẳng hạn nhưsecurity_classes,initial_sidsvà*.te)file_contextsproperty_contextsseapp_contextsservice_contextssystem/etc/mac_permissions.xml
Để biết thêm thông tin, hãy xem bài viết Triển khai SELinux.
Khởi chạy SELinux
Khi hệ thống khởi động, SELinux ở chế độ cho phép (chứ không phải ở chế độ thực thi). Quy trình khởi động thực hiện các tác vụ sau:
- Tải các tệp
sepolicytừ ramdisk vào nhân thông qua/sys/fs/selinux/load. - Chuyển SELinux sang chế độ thực thi.
- Chạy
re-exec()để áp dụng quy tắc miền SELinux cho chính nó.
Để rút ngắn thời gian khởi động, hãy thực hiện quy trình re-exec() trên init càng sớm càng tốt.
Android 8.0 trở lên
Trong Android 8.0, chính sách SELinux được chia thành các thành phần nền tảng và nhà cung cấp để cho phép các bản cập nhật chính sách nền tảng và nhà cung cấp độc lập trong khi vẫn duy trì khả năng tương thích.
Nền tảng sepolicy được chia thành các phần riêng tư và công khai của nền tảng để xuất các loại và thuộc tính cụ thể cho người viết chính sách của nhà cung cấp. Chúng tôi đảm bảo các loại/thuộc tính công khai của nền tảng sẽ được duy trì dưới dạng API ổn định cho một phiên bản nền tảng nhất định. Bạn có thể đảm bảo khả năng tương thích với các loại/thuộc tính công khai của nền tảng trước đó cho một số phiên bản bằng cách sử dụng các tệp ánh xạ nền tảng.
Quy trình xây dựng cho Android 8.0
Chính sách SELinux trong Android 8.0 được tạo bằng cách kết hợp các phần từ /system và /vendor. Logic để thiết lập chế độ này một cách thích hợp nằm trong
/platform/system/sepolicy/Android.bp.
Chính sách này có ở những nơi sau:
| Vị trí | Chứa |
|---|---|
system/sepolicy/public |
Platform sepolicy API |
system/sepolicy/private |
Thông tin chi tiết về việc triển khai nền tảng (nhà cung cấp có thể bỏ qua) |
system/sepolicy/vendor |
Các tệp chính sách và bối cảnh mà nhà cung cấp có thể sử dụng (nhà cung cấp có thể bỏ qua) |
BOARD_SEPOLICY_DIRS |
Vendor sepolicy |
BOARD_ODM_SEPOLICY_DIRS (Android 9 trở lên) |
sepolicy ODM |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 trở lên) |
API system_ext sepolicy |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 trở lên) |
Thông tin chi tiết về việc triển khai system_ext (nhà cung cấp có thể bỏ qua) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 trở lên) |
Product sepolicy API |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 trở lên) |
Thông tin chi tiết về việc triển khai sản phẩm (nhà cung cấp có thể bỏ qua) |
Hệ thống bản dựng sẽ lấy chính sách này và tạo ra các thành phần chính sách system, system_ext, product, vendor và odm trên phân vùng tương ứng. Các bước bao gồm:
- Chuyển đổi các chính sách sang định dạng Ngôn ngữ trung gian chung (CIL) của SELinux, cụ thể là:
- Chính sách của nền tảng công khai (
system,system_ext,product) - Kết hợp chính sách riêng tư và chính sách công khai
- Chính sách về
BOARD_SEPOLICY_DIRS, nhà cung cấp và cộng đồng
- Chính sách của nền tảng công khai (
- Đưa ra phiên bản chính sách do công chúng cung cấp trong chính sách của nhà cung cấp.
Sử dụng chính sách CIL công khai đã tạo để thông báo cho chính sách công khai và chính sách kết hợp của nhà cung cấp và
BOARD_SEPOLICY_DIRSvề những phần phải được chuyển thành các thuộc tính được liên kết với chính sách nền tảng. - Tạo một tệp ánh xạ liên kết các phần của nền tảng và nhà cung cấp. Ban đầu, việc này chỉ liên kết các loại từ chính sách công khai với các thuộc tính tương ứng trong chính sách của nhà cung cấp; sau này, việc này cũng cung cấp cơ sở cho tệp được duy trì trong các phiên bản nền tảng trong tương lai, cho phép khả năng tương thích với chính sách của nhà cung cấp nhắm đến phiên bản nền tảng này.
- Kết hợp các tệp chính sách (mô tả cả giải pháp trên thiết bị và giải pháp được biên dịch trước).
- Kết hợp chính sách về việc lập bản đồ, nền tảng và nhà cung cấp.
- Biên dịch tệp chính sách nhị phân đầu ra.
Platform public sepolicy
sepolicy công khai của nền tảng bao gồm mọi thứ được xác định trong
system/sepolicy/public. Nền tảng có thể giả định các loại và thuộc tính được xác định theo chính sách công khai là các API ổn định cho một phiên bản nền tảng nhất định. Đây là một phần của sepolicy do nền tảng xuất ra, trong đó nhà phát triển chính sách của nhà cung cấp (tức là thiết bị) có thể viết thêm chính sách dành riêng cho thiết bị.
Các loại được lập phiên bản theo phiên bản của chính sách mà các tệp nhà cung cấp được ghi vào, do biến bản dựng PLATFORM_SEPOLICY_VERSION xác định. Sau đó, chính sách công khai có phiên bản sẽ được đưa vào chính sách của nhà cung cấp và (ở dạng ban đầu) trong chính sách của nền tảng. Do đó, chính sách cuối cùng bao gồm chính sách nền tảng riêng tư, sepolicy công khai của nền tảng hiện tại, chính sách dành riêng cho thiết bị và chính sách công khai theo phiên bản tương ứng với phiên bản nền tảng mà chính sách thiết bị được viết dựa trên đó.
Platform private sepolicy
Chính sách bảo mật riêng tư của nền tảng bao gồm mọi thứ được xác định trong
/system/sepolicy/private. Phần này của chính sách chỉ bao gồm các loại, quyền và thuộc tính dành riêng cho nền tảng cần thiết cho chức năng của nền tảng. Các thông tin này không được xuất sang trình ghi chính sách của nhà cung cấp và thiết bị. Người viết chính sách không thuộc nền tảng không được viết các tiện ích chính sách dựa trên các loại, thuộc tính và quy tắc được xác định trong sepolicy riêng tư của nền tảng. Ngoài ra, bạn có thể sửa đổi các quy tắc này hoặc chúng có thể biến mất trong quá trình cập nhật chỉ khung.
Ánh xạ riêng tư theo nền tảng
Hoạt động ánh xạ riêng tư của nền tảng bao gồm các tuyên bố về chính sách ánh xạ các thuộc tính được hiển thị trong chính sách công khai của nền tảng của các phiên bản nền tảng trước đó với các loại cụ thể được dùng trong sepolicy công khai của nền tảng hiện tại. Điều này đảm bảo chính sách của nhà cung cấp được viết dựa trên các thuộc tính công khai của nền tảng từ các phiên bản sepolicy công khai của nền tảng trước đó vẫn tiếp tục hoạt động. Việc tạo phiên bản dựa trên biến PLATFORM_SEPOLICY_VERSION được thiết lập trong AOSP cho một phiên bản nền tảng nhất định. Có một tệp ánh xạ riêng cho từng phiên bản nền tảng trước mà nền tảng này dự kiến sẽ chấp nhận chính sách của nhà cung cấp. Để biết thêm thông tin, hãy xem phần Khả năng tương thích với chính sách.
Android 11 trở lên
Phần này trình bày cách xây dựng chính sách SELinux trong Android 11 trở lên.
system_ext và sepolicy của sản phẩm
Trong Android 11, chính sách system_ext và chính sách product được thêm vào. Giống như chính sách sepolicy của nền tảng, chính sách system_ext và chính sách product được chia thành chính sách công khai và chính sách riêng tư.
Chính sách công khai được xuất sang nhà cung cấp. Các loại và thuộc tính sẽ trở thành API ổn định, đồng thời chính sách của nhà cung cấp có thể tham chiếu đến các loại và thuộc tính trong chính sách công khai. Các loại được lập phiên bản theo PLATFORM_SEPOLICY_VERSION và chính sách được lập phiên bản sẽ được đưa vào chính sách của nhà cung cấp. Chính sách ban đầu được đưa vào mỗi phân vùng system_ext và product.
Chính sách riêng tư chỉ chứa các loại system_ext và product, các quyền và thuộc tính cần thiết cho chức năng phân vùng system_ext và product.
Chính sách riêng tư không hiển thị cho nhà cung cấp, ngụ ý rằng những quy tắc này là nội bộ và được phép sửa đổi.
system_ext và ánh xạ sản phẩm
system_ext và product được phép xuất các loại công khai được chỉ định của chúng sang nhà cung cấp. Tuy nhiên, mỗi đối tác đều có trách nhiệm duy trì khả năng tương thích. Để đảm bảo khả năng tương thích, các đối tác có thể cung cấp tệp ánh xạ riêng. Tệp này sẽ ánh xạ các thuộc tính theo phiên bản của các phiên bản trước với các loại cụ thể được dùng trong sepolicy công khai hiện tại:
- Để cài đặt tệp ánh xạ cho
system_ext, hãy đặt một tệp CIL chứa thông tin ánh xạ mong muốn vào{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, rồi thêmsystem_ext_{ver}.cilvàoPRODUCT_PACKAGES. - Để cài đặt tệp ánh xạ cho
product, hãy đặt một tệp CIL chứa thông tin ánh xạ mong muốn vào{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil, rồi thêmproduct_{ver}.cilvàoPRODUCT_PACKAGES.
Tham khảo ví dụ thêm tệp ánh xạ của phân vùng product trên thiết bị Redbull.
Chính sách SELinux được biên dịch trước
Trước khi init bật SELinux, init sẽ thu thập tất cả các tệp CIL từ các phân vùng (system, system_ext, product, vendor và odm) rồi biên dịch các tệp đó thành chính sách nhị phân, là định dạng có thể được tải vào kernel. Vì quá trình biên dịch mất thời gian (thường là 1-2 giây), nên các tệp CIL sẽ được biên dịch trước tại thời điểm tạo và được đặt ở /vendor/etc/selinux/precompiled_sepolicy hoặc /odm/etc/selinux/precompiled_sepolicy, cùng với các hàm băm sha256 của tệp CIL đầu vào. Trong thời gian chạy, init sẽ kiểm tra xem có tệp chính sách nào đã được cập nhật hay không bằng cách so sánh các hàm băm. Nếu không có gì thay đổi, init sẽ tải chính sách được biên dịch trước. Nếu không, init sẽ biên dịch ngay lập tức và sử dụng phiên bản đó thay vì phiên bản được biên dịch trước.
Cụ thể hơn, chính sách được biên dịch trước sẽ được dùng nếu tất cả các điều kiện sau đây đều được đáp ứng. Ở đây, {partition} đại diện cho phân vùng nơi có chính sách được biên dịch trước: vendor hoặc odm.
- Cả
/system/etc/selinux/plat_sepolicy_and_mapping.sha256và/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256đều tồn tại và giống hệt nhau. - Cả
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256và/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256đều không tồn tại. Hoặc cả hai đều tồn tại và giống hệt nhau. - Cả
/product/etc/selinux/product_sepolicy_and_mapping.sha256và/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256đều không tồn tại. Hoặc cả hai đều tồn tại và giống hệt nhau.
Nếu có bất kỳ thông tin nào khác biệt, init sẽ quay lại đường dẫn biên dịch trên thiết bị. Hãy xem
system/core/init/selinux.cpp để biết thêm thông tin chi tiết.