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 SELinux politikası 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 üzeri sürümlerde platform ve satıcı politikası ayrı ayrı oluşturulmuştur. SOC'ler ve OEM'ler politikanın kendi bölümlerini güncelleyebilir, kendi görüntülerini oluşturabilir ( vendor.img
ve boot.img
gibi) ve ardından bu görüntüleri platform güncellemelerinden bağımsız olarak güncelleyebilir.
Bununla birlikte, modülerleştirilmiş SELinux politika dosyaları /vendor
bölümlerinde depolandığından, init
sürecinin sistemi 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ı sistem dizinine yüklemeden önce). çekirdek).
Kaynak dosyaları
SELinux'u oluşturmanın 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çinexternal/selinux/README.android
bakın. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: SELinux politika derleyicisi (anasistem yürütülebilir dosyaları:checkpolicy
,checkmodule
vedispol
).libsepol
bağlıdır.
-
-
system/sepolicy
: Bağlamlar ve politika dosyaları dahil olmak üzere çekirdek Android SELinux politika yapılandırmaları. Başlıca sepolicy oluşturma mantığı da burada (system/sepolicy/Android.mk
).
system/sepolicy
SELinux'un Uygulanması bölümündeki dosyalar hakkında daha fazla ayrıntı için.
Android 7.0 ve öncesi
Bu bölümde SELinux politikasının Android 7.x ve önceki sürümlerde nasıl oluşturulduğu anlatılmaktadır.
SELinux politikası oluşturma
SELinux politikası, temel AOSP politikasının cihaza özel özelleştirmelerle birleştirilmesiyle oluşturulur. Birleştirilmiş politika daha sonra politika derleyicisine ve çeşitli denetleyicilere aktarılır. 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 son SELinux yapılandırmalarını oluşturmak amacıyla biri SoC'ye özgü ayarlar için, diğeri cihaza özel ayarlar için olmak üzere 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:
![Bu resim Android 7.x için SELinux derleme mantığını göstermektedir.](https://source.android.google.cn/static/docs/security/features/selinux/images/n-selinux-build-logic.png?authuser=9&hl=tr)
sepolicy
dosyası birden fazla kaynak dosyadan oluşur:
- Düz metin
policy.conf
security_classes
,initial_sids
,*.te
dosyalarını,genfs_contexts
veport_contexts
bu sırayla birleştirerek oluşturulur. - Her dosyanın (örneğin,
security_classes
) içeriği,system/sepolicy/
veBOARDS_SEPOLICY_DIRS
altında aynı adı taşıyan dosyaların birleşiminden oluşur. -
policy.conf
sözdizimi kontrolü için SELinux derleyicisine gönderilir ve cihazdasepolicy
olarak ikili formatta derlenir.Şekil 2 . SELinux politika dosyası
SELinux dosyaları
Derleme sonrasında, 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: politika dosyalarını birleştirdikten sonra ikili çıktı (
security_classes
,initial_sids
ve*.te
gibi) -
file_contexts
-
property_contexts
-
seapp_contexts
-
service_contexts
-
system/etc/mac_permissions.xml
Daha fazla ayrıntı için bkz. SELinux'u Uygulamak .
SELinux başlatma
Sistem başlatıldığında, SELinux izin veren moddadır (zorlayıcı modda değil). Başlatma işlemi aşağıdaki görevleri yerine getirir:
-
sepolicy
dosyalarını/sys/fs/selinux/load
aracılığıyla ramdisk'ten çekirdeğe yükler. - SELinux'u zorlama moduna geçirir.
- SELinux etki alanı kuralını kendisine uygulamak için
re-exec()
komutunu çalıştırır.
Önyükleme süresini kısaltmak için, init
işleminde mümkün olan en kısa sürede re-exec()
işlemini gerçekleştirin.
Android8.0 ve üzeri
Android 8.0'da SELinux politikası, 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 hizmet politikası ayrıca, belirli türleri ve nitelikleri satıcı politikası yazarlarına aktarmak için platform özel ve platform genel bölümlerine bölünmüştür. Platform genel türlerinin/özniteliklerinin, belirli bir platform sürümü için kararlı API'ler olarak muhafaza edilmesi garanti edilir. Platform eşleme dosyaları kullanılarak çeşitli sürümler için önceki platformun genel türleri/öznitelikleri ile uyumluluk garanti edilebilir.
Platformun kamu yararı
Platformun genel sepolicy'si system/sepolicy/public
altında tanımlanan her şeyi içerir. Platform, kamu politikası kapsamı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) politikası geliştiricilerinin cihaza özel ek politika yazabileceği platform tarafından dışarı aktarılan sepolitikanın bir kısmını oluşturur.
Türler, satıcı dosyalarının yazıldığı ilkenin PLATFORM_SEPOLICY_VERSION
yapı değişkeni tarafından tanımlanan sürümüne göre sürümlendirilir. Sürümlendirilmiş genel politika daha sonra satıcı politikasına ve (orijinal biçiminde) platform politikasına dahil edilir. Dolayısıyla nihai politika, özel platform politikasını, mevcut platformun kamu politikasını, cihaza özel politikayı ve cihaz politikasının yazıldığı platform sürümüne karşılık gelen sürümlü kamu politikasını içerir.
Platform özel güvenliği
Platformun özel sepolicy'si /system/sepolicy/private
altında tanımlanan her şeyi içerir. Politikanın bu bölümü, platform işlevselliği için gerekli olan yalnızca platform türlerini, izinlerini ve niteliklerini oluşturur. Bunlar vendor/device
ilkesi yazarlarına aktarılmaz. Platform dışı politika yazarları, politika uzantılarını platform özel politikasında 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 ortadan kaldırılabilir.
Platform özel haritalaması
Platform özel eşlemesi, önceki platform versiyonlarının platform kamu politikasında açığa çıkan nitelikleri mevcut platform kamu politikasında kullanılan somut türlerle eşleştiren politika bildirimlerini içerir. Bu, önceki platform genel sepolicy sürüm(ler)indeki platform genel niteliklerine 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 etmesinin beklendiği ö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 üzeri
system_ext ve ürün politikası
Android 11'de system_ext politikası ve ürün politikası eklenmiştir. Platform sepolitikası gibi, system_ext politikası ve ürün politikası da kamu politikası ve özel politikaya bölünmüştür.
Kamu politikası satıcıya aktarılır. Türler ve nitelikler kararlı API haline gelir ve satıcı politikası, genel politikadaki türlere ve niteliklere atıfta bulunabilir. Türler, PLATFORM_SEPOLICY_VERSION
göre sürümlendirilir ve sürümlendirilmiş politika, satıcı politikasına dahil edilir. Orijinal politika, system_ext ve ürün bölümlerinin her birine dahil edilmiştir.
Özel politika, system_ext ve ürün bölümlerinin işlevleri için gereken yalnızca system_ext ve yalnızca ürün türlerini, izinlerini ve niteliklerini içerir. Özel politika satıcıya görünmez, 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 belirlenen genel türlerini satıcıya aktarmalarına izin verilir. Ancak uyumluluğu sürdürme sorumluluğu her ortağın kendisine aittir. Uyumluluk için iş ortakları, önceki sürümlerin sürümlendirilmiş niteliklerini mevcut kamu politikasında kullanılan somut türlerle eşleştiren kendi eşleme dosyalarını sağlayabilirler.
- 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
yerleştirin ve ardındansystem_ext_{ver}.cil
PRODUCT_PACKAGES
öğesine ekleyin. - Ürüne yönelik 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
yerleştirin ve ardındanproduct_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. - Politikaları SELinux Ortak Orta Dil (CIL) formatına dönüştürme, ö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 kamu tarafından sağlanan politikanın versiyonlanması. Hangi parçaların platform politikasına bağlanacak özniteliklere dönüştürülmesi gerektiği konusunda birleşik genel + satıcı +
BOARD_SEPOLICY_DIRS
politikasını bilgilendirmek için üretilen genel CIL politikası 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 yalnızca kamu politikasındaki türleri satıcı politikasındaki karşılık gelen niteliklere bağlar; daha sonra gelecekteki platform sürümlerinde saklanan dosya için de temel oluşturacak ve bu platform sürümünü hedefleyen satıcı politikasıyla uyumluluğu mümkün kılacaktır.
- İlke dosyalarını birleştirme (hem cihazdaki hem de önceden derlenmiş çözümleri açıklayın).
- Haritalama, platform ve satıcı politikasını birleştirin.
- Çıkış ikili politika 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 mevcuttur 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 mevcuttur ve aynıdır.
SELinux politikası oluşturma
Android 8.0'daki SELinux politikası, /system
ve /vendor
öğelerinin birleştirilmesiyle yapılır. Bunu uygun şekilde ayarlamanın mantığı /platform/system/sepolicy/Android.mk
dosyasındadır.
Politika aşağıdaki konumlarda mevcuttur:
Konum | İçerir |
---|---|
system/sepolicy/public | Platformun sepolicy API'si |
system/sepolicy/private | Platform uygulama ayrıntıları (satıcılar göz ardı edebilir) |
system/sepolicy/vendor | Satıcıların kullanabileceği politika ve içerik dosyaları (satıcılar istenirse yok sayılabilir) |
BOARD_SEPOLICY_DIRS | Satıcı politikası |
BOARD_ODM_SEPOLICY_DIRS (Android 9 ve üzeri) | Odm politikası |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 ve üzeri) | System_ext'in sepolicy API'si |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 ve üzeri) | System_ext uygulama ayrıntıları (satıcılar göz ardı edebilir) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 ve üzeri) | Ürünün sepolicy API'si |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 ve üzeri) | Ürün uygulama ayrıntıları (satıcılar göz ardı edebilir) |
Derleme sistemi bu politikayı alır ve ilgili bölümde sistem, system_ext, ürün, satıcı ve odm politikası bileşenlerini üretir. Adımlar şunları içerir:
Önceden derlenmiş SELinux politikası
init
, SELinux'u açmadan önce, bölümlerden ( system
, system_ext
, product
, vendor
ve odm
) tüm CIL dosyalarını toplar ve bunları çekirdeğe yüklenebilecek format init
ikili politika halinde 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
konumuna yerleştirilir. giriş CIL dosyalarının. Çalışma zamanında init
, karmaları karşılaştırarak politika dosyalarından herhangi birinin güncellenip güncellenmediğini kontrol eder. Hiçbir şey değişmediyse, init
önceden derlenmiş politikayı yükler. Değilse, init
anında derlenir 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ş politika kullanılır. Burada, {partition}
önceden derlenmiş politikanın mevcut olduğu bölümü temsil eder: ya vendor
ya da odm
.
Bunlardan herhangi biri farklıysa init
, cihaz üzerindeki derleme yoluna geri döner. Daha fazla ayrıntı için system/core/init/selinux.cpp
bakın.