Trang này trình bày cách xây dựng chính sách SELinux. Chính sách SELinux được tạo từ 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 xây dựng 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 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 thiết bị không phải A/B) hoặc system.img
(đối với 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 của chính sách, tạo hình ảnh (chẳng hạn như vendor.img
và boot.img
), sau đó cập nhật các hình ảnh đó độc lập với 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 được mô-đun hoá đượ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 hệ thống và phân vùng nhà cung cấp sớm hơn để có thể đọc các tệp SELinux từ các phân vùng đó và hợp nhất các tệp đó với các tệp SELinux cốt lõi trong thư mục hệ thống (trước khi tải các tệp đó 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 tập hợp con của dự ánlibselinux
bên ngoài cùng với một số 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 (tệp thực thi lưu trữ:checkpolicy
,checkmodule
, vàdispol
). Tuỳ thuộc vàolibsepol
.
-
-
system/sepolicy
: Cấu hình chính sách SELinux của Android, bao gồm cả ngữ cảnh và tệp chính sách. Logic xây dựng chính của chính sách bảo mật cũng có tại đây (system/sepolicy/Android.mk
).
Để biết thêm thông tin chi tiết về các tệp trong system/sepolicy
, hãy xem phần Triển khai SELinux.
Android 7.x trở xuống
Phần này trình bày cách tạo chính sách SELinux trong Android 7.x trở về trước.
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 tuỳ chỉnh dành riêng cho thiết bị. Sau đó, chính sách kết hợp sẽ được truyề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 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 toàn cục 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ụ: nhà cung cấp SoC và ODM có thể thêm một thư mục, một thư mục dành cho chế độ cài đặt dành riêng cho SoC và một thư mục khác dành cho 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/sepolicy
BOARD_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 với nhau để 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 tuý
policy.conf
được tạo bằng cách nối các tệpsecurity_classes
,initial_sids
,*.te
,genfs_contexts
vàport_contexts
theo thứ tự đó. - Đối với mỗi tệp (chẳng hạn như
security_classes
), nội dung của tệp đó là chuỗi 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à biên dịch thành định dạng nhị phân dưới dạngsepolicy
trê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:
selinux_version
- sepolicy: đầ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_sids
và*.te
) file_contexts
property_contexts
seapp_contexts
service_contexts
system/etc/mac_permissions.xml
Để biết thêm thông tin, hãy xem phần Triển khai SELinux.
Khởi động SELinux
Khi hệ thống khởi động, SELinux sẽ ở chế độ cho phép (chứ không phải ở chế độ thực thi). Quy trình khởi tạo thực hiện các nhiệm vụ sau:
- Tải tệp
sepolicy
từ 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 re-exec()
trên quy trình 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ập nhật chính sách nền tảng/nhà cung cấp độc lập trong khi vẫn duy trì khả năng tương thích.
Chính sách bảo mật của nền tảng đượ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 trình ghi chính sách của nhà cung cấp. Các loại/thuộc tính công khai của nền tảng được đảm bảo đượ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 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 điều này một cách thích hợp nằm trong
/platform/system/sepolicy/Android.mk
.
Chính sách có ở những vị trí sau:
Vị trí | Chứa |
---|---|
system/sepolicy/public |
API sepolicy của nền tảng |
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 |
Tệp chính sách và ngữ cảnh mà nhà cung cấp có thể sử dụng (nhà cung cấp có thể bỏ qua nếu muốn) |
BOARD_SEPOLICY_DIRS |
Chính sách bảo mật của nhà cung cấp |
BOARD_ODM_SEPOLICY_DIRS (Android 9 trở lên) |
Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 trở lên) |
API sepolicy của System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 trở lên) |
Thông tin chi tiết về cách triển khai System_ext (nhà cung cấp có thể bỏ qua) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 trở lên) |
API chính sách bảo mật của sản phẩm |
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 xây dựng sẽ lấy chính sách này và tạo các thành phần chính sách system, system_ext, product, nhà cung cấp và odm trên phân vùng tương ứng. Các bước bao gồm:
- Chuyển đổi chính sách sang định dạng Ngôn ngữ trung gian chung (CIL) của SELinux, cụ thể:
- chính sách nền tảng công khai (system + system_ext + product)
- chính sách kết hợp chính sách công khai và riêng tư
- chính sách công + nhà cung cấp và
BOARD_SEPOLICY_DIRS
- Phân phối 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.
Thực hiện bằng cách 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 + nhà cung cấp +
BOARD_SEPOLICY_DIRS
kết hợp về những phần phải được chuyển thành thuộc tính sẽ được liên kết với chính sách nền tảng. - Tạo tệp ánh xạ liên kết nền tảng và các phần của nhà cung cấp. Ban đầu, việc này chỉ liên kết các loại trong 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 đó, việc này cũng sẽ 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 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 liên kết, nền tảng và nhà cung cấp.
- Biên dịch tệp chính sách nhị phân đầu ra.
Chính sách bảo mật công khai của nền tảng
Chính sách bảo mật công khai của nền tảng bao gồm mọi nội dung đượ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 tạo phiên bản theo phiên bản của chính sách mà các tệp của nhà cung cấp được ghi theo, 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ư, chính sách bảo mật 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 có 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.
Chính sách bảo mật riêng tư của nền tảng
Chính sách bảo mật riêng tư của nền tảng bao gồm mọi nội dung được xác định trong
/system/sepolicy/private
. Phần này của chính sách tạo thành các loại, quyền và thuộc tính chỉ dành cho nền tảng cần thiết cho chức năng của nền tảng. Các giá trị này không được xuất sang trình ghi chính sách vendor/device
. Người viết chính sách không phải nền tảng không được viết phần mở rộng chính sách dựa trên các loại/thuộc tính/quy tắc được xác định trong chính sách bảo mật riêng tư của nền tảng. Hơn nữa, bạn được phép sửa đổi hoặc xoá các quy tắc này trong bản cập nhật chỉ dành cho khung.
Ánh xạ riêng tư trên nền tảng
Việc liên kết riêng tư của nền tảng bao gồm các tuyên bố chính sách liên kết 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 sử dụng trong chính sách bảo mật 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 chính sách bảo mật công khai của nền tảng trước đó vẫn hoạt động. Việc tạo phiên bản dựa trên biến bản dựng PLATFORM_SEPOLICY_VERSION
được đặt 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 mỗi 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.
Android 11 trở lên
system_ext và chính sách bảo mật sản phẩm
Trong Android 11, chính sách system_ext và chính sách sản phẩm được thêm vào. Giống như sepolicy của nền tảng, chính sách system_ext và chính sách sản phẩm đượ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 trở thành API ổn định và 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 phân phiên bản theo PLATFORM_SEPOLICY_VERSION
và chính sách phân phiên bản được đưa vào chính sách của nhà cung cấp. Chính sách ban đầu được đưa vào từng phân vùng system_ext và phân vùng sản phẩm.
Chính sách riêng tư chứa các loại, quyền và thuộc tính chỉ dành cho system_ext và chỉ dành cho sản phẩm cần thiết cho chức năng của các phân vùng system_ext và sản phẩm. Chính sách riêng tư không hiển thị với nhà cung cấp, ngụ ý rằng các quy tắc này là nội bộ và được phép sửa đổi.
ánh xạ system_ext và 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, trách nhiệm duy trì khả năng tương thích là của từng đối tác. Để đả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 để ánh xạ các thuộc tính có phiên bản của các phiên bản trước với các loại cụ thể được sử dụng trong chính sách bảo mật công khai hiện tại.
- Để cài đặt tệp ánh xạ cho system_ext, hãy đặ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
, sau đó thêmsystem_ext_{ver}.cil
vàoPRODUCT_PACKAGES
. - Để cài đặt tệp ánh xạ cho sản phẩm, hãy đặt tệp cil chứa
thông tin ánh xạ mong muốn vào
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, sau đó thêmproduct_{ver}.cil
vàoPRODUCT_PACKAGES
.
Tham khảo ví dụ thêm tệp ánh xạ của phân vùng sản phẩm của 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ả 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 tệp nhị phân, định dạng có thể tải vào hạt nhân. 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 được biên dịch trước tại thời điểm tạo bản dựng và được đặt tại /vendor/etc/selinux/precompiled_sepolicy
hoặc /odm/etc/selinux/precompiled_sepolicy
, cùng với hàm băm sha256 của các 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 nhanh và sử dụng mã đó thay vì mã được biên dịch trước.
Cụ thể hơn, chính sách được biên dịch trước sẽ được sử dụng nếu đáp ứng tất cả các điều kiện sau. Ở đây, {partition}
đại diện cho phân vùng chứa chính sách được biên dịch trước: vendor
hoặc odm
.
-
Cả
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
và/{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.sha256
và/{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.sha256
và/{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ỳ đường dẫn nào khác, 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.