Bu makale, SELinux ilkesinin nasıl oluşturulduğunu ele almaktadır. SELinux politikası, temel AOSP politikası (platform) ve cihaza özel politikanın (satıcı) birleşiminden oluşturulmuştur. Android 4.4'ten Android 7.0'a kadar olan SELinux ilke oluşturma akışı, tüm sepolicy parçalarını birleştirdi ve ardından kök dizinde monolitik dosyalar oluşturdu. Bu, SoC satıcılarının ve ODM üreticilerinin, politika her değiştirildiğinde boot.img
(A/B olmayan cihazlar için) veya system.img
(A/B cihazları için) değiştirdiği anlamına geliyordu.
Android 8.0 ve sonraki sürümlerde, platform ve satıcı politikası ayrı olarak oluşturulur. SOC'ler ve OEM'ler, ilkenin kendi bölümlerini güncelleyebilir, görüntülerini (örneğin, vendor.img
ve boot.img
) oluşturabilir, ardından bu görüntüleri platform güncellemelerinden bağımsız olarak güncelleyebilir.
Ancak, modülerleştirilmiş SELinux ilke dosyaları /vendor
bölümlerinde depolandığından, init
işleminin sistem ve satıcı bölümlerini daha erken bağlaması gerekir, böylece bu bölümlerden SELinux dosyalarını okuyabilir ve bunları sistem dizinindeki çekirdek SELinux dosyalarıyla birleştirebilir (bunları yüklemeden önce). çekirdek).
Kaynak dosyaları
SELinux oluşturma mantığı şu dosyalardadır:
-
external/selinux
: SELinux politikasını ve etiketlerini derlemek için HOST komut satırı yardımcı programlarını oluşturmak için kullanılan harici SELinux projesi.-
external/selinux/libselinux
: Android, bazı Android'e özgü özelleştirmelerle birlikte haricilibselinux
projesinin yalnızca bir alt kümesini kullanır. Ayrıntılar için bkz.external/selinux/README.android
. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: SELinux ilke derleyicisi (ana bilgisayar yürütülebilir dosyaları:checkpolicy
,checkmodule
vedispol
).libsepol
.
-
-
system/sepolicy
: Bağlamlar ve ilke dosyaları dahil olmak üzere Çekirdek Android SELinux ilke yapılandırmaları. Ana sepolicy oluşturma mantığı da burada (system/sepolicy/Android.mk
).
system/sepolicy
Implementing SELinux içindeki dosyalar hakkında daha fazla ayrıntı için.
Android 7.0 ve önceki sürümler
Bu bölüm, SELinux ilkesinin Android 7.x ve önceki sürümlerde nasıl oluşturulduğunu kapsar.
SELinux politikası oluşturma
SELinux ilkesi, temel AOSP ilkesinin cihaza özel özelleştirmelerle birleştirilmesiyle oluşturulur. Birleştirilmiş ilke daha sonra ilke derleyicisine ve çeşitli denetleyicilere iletilir. Cihaza özel özelleştirme, cihaza özel Boardconfig.mk
dosyasında tanımlanan BOARD_SEPOLICY_DIRS
değişkeni aracılığıyla yapılır. Bu genel yapı değişkeni, ek ilke dosyalarının aranacağı sırayı belirten bir dizin listesi içerir.
Örneğin, bir SoC satıcısı ve bir ODM, belirli bir cihaz için nihai SELinux konfigürasyonlarını oluşturmak üzere, biri SoC'ye özel ayarlar için ve diğeri cihaza özel ayarlar için bir dizin ekleyebilir:
-
BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
-
BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy
system/sepolicy
ve BOARD_SEPOLICY_DIRS
içindeki file_contexts dosyalarının içeriği, cihazda file_contexts.bin
dosyasını oluşturmak için birleştirilir:

sepolicy
dosyası birden çok kaynak dosyadan oluşur:
- Düz metin
policy.conf
,security_classes
,initial_sids
,*.te
dosyalarının,genfs_contexts
veport_contexts
bu sırayla birleştirilmesiyle oluşturulur. - Her dosya için (örneğin,
security_classes
), içeriği,system/sepolicy/
veBOARDS_SEPOLICY_DIRS
altında aynı ada sahip dosyaların birleştirilmesidir. -
policy.conf
, sözdizimi denetimi için SELinux derleyicisine gönderilir ve aygıttasepolicy
olarak ikili biçimde derlenir.Şekil 2 . SELinux ilke dosyası
SELinux dosyaları
Derlemeden sonra, 7.x ve önceki sürümleri çalıştıran Android cihazlar genellikle aşağıdaki SELinux ile ilgili dosyaları içerir:
-
selinux_version
- sepolicy: ilke dosyalarını birleştirdikten sonra ikili çıktı (örneğin,
security_classes
,initial_sids
ve*.te
) -
file_contexts
-
property_contexts
-
seapp_contexts
-
service_contexts
-
system/etc/mac_permissions.xml
Daha fazla ayrıntı için bkz. SELinux'u Uygulama .
SELinux başlatma
Sistem başlatıldığında, SELinux izinli moddadır (ve zorlama modunda değildir). Başlatma işlemi aşağıdaki görevleri gerçekleştirir:
-
sepolicy
dosyalarını ramdisk'ten/sys/fs/selinux/load
aracılığıyla çekirdeğe yükler. - SELinux'u zorlama moduna geçirir.
- SELinux etki alanı kuralını kendisine uygulamak için
re-exec()
'i çalıştırır.
Önyükleme süresini kısaltmak için, mümkün olan en kısa sürede init
işleminde re-exec()
işlemini gerçekleştirin.
Android 8.0 ve üstü
Android 8.0'da, SELinux ilkesi, uyumluluğu korurken bağımsız platform/satıcı politikası güncellemelerine izin vermek için platform ve satıcı bileşenlerine ayrılmıştır.
Platform sepolicy, belirli türleri ve nitelikleri satıcı politikası yazarlarına aktarmak için platform özel ve platform genel bölümlerine ayrılmıştır. Platform genel türlerinin/özniteliklerinin, belirli bir platform sürümü için kararlı API'ler olarak sürdürülmesi garanti edilir. Platform eşleme dosyaları kullanılarak çeşitli sürümler için önceki platform genel türleri/öznitelikleri ile uyumluluk garanti edilebilir.
Platform genel sepolicy
Platform public sepolicy, system/sepolicy/public
altında tanımlanan her şeyi içerir. Platform, genel ilke altında tanımlanan türlerin ve niteliklerin, belirli bir platform sürümü için kararlı API'ler olduğunu varsayabilir. Bu, satıcı (yani cihaz) politika geliştiricilerinin ek cihaza özel politika yazabileceği platform tarafından dışa aktarılan sepolicy'nin bir parçasını oluşturur.
Türler, PLATFORM_SEPOLICY_VERSION
yapı değişkeni tarafından tanımlanan satıcı dosyalarının yazıldığı ilkenin sürümüne göre sürümlendirilir. Versiyonlanmış kamu politikası daha sonra satıcı politikasına ve (orijinal biçiminde) platform politikasına dahil edilir. Bu nedenle, son politika özel platform politikasını, mevcut platformun genel politikasını, cihaza özel politikasını ve cihaz politikasının yazıldığı platform versiyonuna karşılık gelen versiyonlanmış kamu politikasını içerir.
Platform özel sepolicy
Platform özel sepolicy, /system/sepolicy/private
altında tanımlanan her şeyi içerir. Politikanın bu bölümü, platform işlevselliği için gereken yalnızca platform türlerini, izinleri ve öznitelikleri oluşturur. Bunlar, vendor/device
ilkesi yazarlarına aktarılmaz. Platform dışı politika yazarları, politika uzantılarını platform özel sepolicy'de tanımlanan türlere/niteliklere/kurallara göre yazmamalıdır. Ayrıca, bu kuralların değiştirilmesine izin verilir veya yalnızca çerçeve güncellemesinin bir parçası olarak kaybolabilir.
Platform özel eşlemesi
Platform özel eşlemesi, önceki platform sürümlerinin platform genel ilkesinde açığa çıkan nitelikleri, mevcut platform genel ilkesinde kullanılan somut türlerle eşleyen ilke bildirimlerini içerir. Bu, önceki platform genel sepolicy sürüm(ler)inden platform genel özniteliklerine dayalı olarak yazılan satıcı politikasının çalışmaya devam etmesini sağlar. Sürüm oluşturma, belirli bir platform sürümü için AOSP'de ayarlanan PLATFORM_SEPOLICY_VERSION
yapı değişkenini temel alır. Bu platformun satıcı politikasını kabul etmesi beklenen önceki her platform sürümü için ayrı bir eşleme dosyası mevcuttur. Daha fazla ayrıntı için Uyumluluk bölümüne bakın.
Android 11 ve üstü
system_ext ve ürün sepolicy
Android 11'de system_ext politikası ve ürün politikası eklenir. Platform sepolicy gibi, system_ext politikası ve ürün politikası, kamu politikası ve özel politika olarak ikiye ayrılır.
Kamu politikası satıcıya aktarılır. Türler ve nitelikler kararlı API haline gelir ve satıcı ilkesi, genel ilkedeki türlere ve niteliklere atıfta bulunabilir. Tipler PLATFORM_SEPOLICY_VERSION
göre versiyonlanır ve versiyonlanan politika satıcı politikasına dahil edilir. Orijinal ilke, system_ext ve ürün bölümünün her birine dahildir.
Özel ilke, yalnızca system_ext ve yalnızca ürün türlerini, izinleri ve system_ext ve ürün bölümlerinin işlevselliği için gereken öznitelikleri içerir. Özel politika satıcı tarafından görülmez, bu da bu kuralların dahili olduğunu ve değiştirilmesine izin verildiğini gösterir.
system_ext ve ürün eşleme
system_ext ve ürünün belirlenmiş genel türlerini satıcıya vermelerine izin verilir. Ancak, uyumluluğu sürdürme sorumluluğu her bir ortağın kendisine aittir. Uyumluluk için iş ortakları, önceki sürümlerin sürümlü özniteliklerini mevcut genel sepolicy'de kullanılan somut türlerle eşleyen kendi eşleme dosyalarını sağlayabilir.
- system_ext için bir eşleme dosyası yüklemek için, istenen eşleme bilgilerini içeren bir cil dosyasını
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
ve ardındansystem_ext_{ver}.cil
PRODUCT_PACKAGES
ekleyin. - Ürün için bir eşleme dosyası yüklemek için, istenen eşleme bilgilerini içeren bir cil dosyasını
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
ve ardındanproduct_{ver}.cil
PRODUCT_PACKAGES
öğesine ekleyin. redbull cihazının ürün bölümünün eşleme dosyasını ekleyen bir örneğe bakın. - Politikaları SELinux Ortak Ara Dil (CIL) formatına dönüştürmek, özellikle:
- genel platform politikası (system + system_ext + ürün)
- birleşik özel + kamu politikası
- genel + satıcı ve
BOARD_SEPOLICY_DIRS
politikası
- Satıcı politikasının bir parçası olarak public tarafından sağlanan politikanın versiyonlanması. Hangi parçaların platform ilkesine bağlanacak niteliklere dönüştürülmesi gerektiği konusunda birleşik genel + satıcı +
BOARD_SEPOLICY_DIRS
ilkesini bilgilendirmek için üretilen genel CIL ilkesi kullanılarak yapılır. - Platform ve satıcı parçalarını birbirine bağlayan bir eşleme dosyası oluşturma. Başlangıçta, bu sadece kamu politikasındaki türleri satıcı politikasındaki karşılık gelen niteliklerle ilişkilendirir; daha sonra, bu platform sürümünü hedefleyen satıcı politikasıyla uyumluluğu sağlayarak gelecekteki platform sürümlerinde tutulan dosya için temel sağlayacaktır.
- İlke dosyalarını birleştirmek (hem cihazda hem de önceden derlenmiş çözümleri açıklayın).
- Eşleme, platform ve satıcı politikasını birleştirin.
- Çıktı ikili ilke dosyasını derleyin.
- Hem
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
hem de/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
mevcuttur ve aynıdır. - Hem
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
hem de/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
mevcut değil. Veya her ikisi de vardır ve aynıdır. - Hem
/product/etc/selinux/product_sepolicy_and_mapping.sha256
hem de/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
mevcut değil. Veya her ikisi de vardır ve aynıdır.
SELinux politikası oluşturma
Android 8.0'daki SELinux ilkesi, /system
ve /vendor
öğelerinden parçaların birleştirilmesiyle yapılır. Bunu uygun şekilde ayarlamak için mantık /platform/system/sepolicy/Android.mk
.
Politika aşağıdaki konumlarda mevcuttur:
Konum | içerir |
---|---|
system/sepolicy/public | Platformun sepolicy API'si |
system/sepolicy/private | Platform uygulama ayrıntıları (satıcılar görmezden gelebilir) |
system/sepolicy/vendor | Satıcıların kullanabileceği politika ve bağlam dosyaları (istenirse satıcılar yok sayabilir) |
BOARD_SEPOLICY_DIRS | Satıcı sepolicy |
BOARD_ODM_SEPOLICY_DIRS (Android 9 ve üstü) | odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 ve üstü) | System_ext'in sepolicy API'si |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 ve üstü) | System_ext uygulama ayrıntıları (satıcılar görmezden gelebilir) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) | Ürünün sepolicy API'si |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) | Ürün uygulama ayrıntıları (satıcılar görmezden gelebilir) |
Derleme sistemi bu ilkeyi alır ve ilgili bölümde sistem, system_ext, ürün, satıcı ve odm ilkesi bileşenleri üretir. Adımlar şunları içerir:
Önceden derlenmiş SELinux ilkesi
init
, SELinux'u açmadan önce, bölümlerden ( system
, system_ext
, product
, init
ve vendor
) tüm CIL dosyalarını toplar ve odm
çekirdeğe yüklenebilecek format olan ikili politikada derler. Derleme zaman aldığından (genellikle 1-2 saniye), CIL dosyaları derleme zamanında önceden derlenir ve sha256 karmalarıyla birlikte /vendor/etc/selinux/precompiled_sepolicy
veya /odm/etc/selinux/precompiled_sepolicy
dizinine yerleştirilir. giriş CIL dosyalarının Çalışma zamanında init
, karmaları karşılaştırarak ilke dosyasından herhangi birinin güncellenip güncellenmediğini kontrol eder. Hiçbir şey değişmediyse, init
önceden derlenmiş ilkeyi yükler. Değilse, init
anında derler ve önceden derlenmiş olanın yerine onu kullanır.
Daha spesifik olarak, aşağıdaki koşulların tümü karşılanırsa önceden derlenmiş ilke kullanılır. Burada {partition}
, önceden derlenmiş ilkenin bulunduğu bölümü temsil eder: ya vendor
ya da odm
.
Bunlardan herhangi biri farklıysa, init
cihazdaki derleme yoluna geri döner. Daha fazla ayrıntı için system/core/init/selinux.cpp
bakın.