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 harici
libselinuxprojesinin 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,
checkmoduleve
dispol).
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,
*.tedosyalarının,
genfs_contextsve
port_contextsbu sırayla birleştirilmesiyle oluşturulur.
- Her dosya için (örneğin,
security_classes), içeriği,
system/sepolicy/ve
BOARDS_SEPOLICY_DIRSaltında aynı ada sahip dosyaların birleştirilmesidir.
-
policy.conf, sözdizimi denetimi için SELinux derleyicisine gönderilir ve aygıtta
sepolicyolarak ikili biçimde derlenir.
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_sidsve
*.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:
-
sepolicydosyalarını ramdisk'ten
/sys/fs/selinux/loadaracı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}.cilve ardından
system_ext_{ver}.cil
PRODUCT_PACKAGESekleyin.
- Ü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}.cilve ardından
product_{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.
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|
| ||Platformun sepolicy API'si|
| ||Platform uygulama ayrıntıları (satıcılar görmezden gelebilir)|
| ||Satıcıların kullanabileceği politika ve bağlam dosyaları (istenirse satıcılar yok sayabilir)|
| ||Satıcı sepolicy|
| ||odm sepolicy|
| ||System_ext'in sepolicy API'si|
| ||System_ext uygulama ayrıntıları (satıcılar görmezden gelebilir)|
| ||Ürünün sepolicy API'si|
| ||Ü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:
- 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_DIRSpolitikası
- 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_DIRSilkesini 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.
Ö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 .
- Hem
/system/etc/selinux/plat_sepolicy_and_mapping.sha256hem de
/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256mevcuttur ve aynıdır.
- Hem
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256hem de
/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256mevcut değil. Veya her ikisi de vardır ve aynıdır.
- Hem
/product/etc/selinux/product_sepolicy_and_mapping.sha256hem de
/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256mevcut değil. Veya her ikisi de vardır ve aynıdır.
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.