Bu sayfada, SELinux politikasının nasıl oluşturulduğu açıklanmaktadır. SELinux politikası, temel AOSP politikası (platform) ve cihaza özel politikanın (tedarikçi) birleşiminden oluşturulur. Android 4.4'ten Android 7.0'a kadar olan sürümlerdeki SELinux politikası derleme akışı, tüm sepolicy parçalarını birleştirip kök dizinde tek bir dosyadan oluşan dosyalar oluşturuyordu. Bu nedenle, politika her değiştirildiğinde SoC satıcıları ve ODM üreticileri boot.img
(A/B olmayan cihazlar için) veya system.img
(A/B cihazlar için) öğesini değiştiriyordu.
Android 8.0 ve sonraki sürümlerde platform ve tedarikçi politikası ayrı ayrı oluşturulur.
SOC'ler ve OEM'ler, politikanın kendi bölümlerini güncelleyebilir, resimlerini (ör. vendor.img
ve boot.img
) oluşturabilir, ardından bu resimleri platform güncellemelerinden bağımsız olarak güncelleyebilir.
Ancak modüler SELinux politika dosyaları /vendor
bölümlerinde depolandığından, init
işleminin sistem ve satıcı bölümlerini daha önce bağlaması gerekir. Böylece, bu bölümlerdeki SELinux dosyalarını okuyup bunları sistem dizinindeki temel SELinux dosyalarıyla birleştirebilir (çekirdeğe yüklemeden önce).
Kaynak dosyalar
SELinux'u oluşturma mantığı şu dosyalarda bulunur:
-
external/selinux
: SELinux politikası ve etiketlerini derlemek için HOST komut satırı yardımcı programları oluşturmak üzere kullanılan harici SELinux projesi.-
external/selinux/libselinux
: Android, haricilibselinux
projesinin yalnızca bir alt kümesini ve Android'e özgü bazı özelleştirmeleri kullanır. Ayrıntılı bilgi içinexternal/selinux/README.android
başlıklı makaleyi inceleyin. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: SELinux politika derleyicisi (ana makine yürütülebilir dosyaları:checkpolicy
,checkmodule
, vedispol
).libsepol
'ye bağlıdır.
-
-
system/sepolicy
: Bağlamlar ve politika dosyaları dahil olmak üzere temel Android SELinux politikası yapılandırmaları. Başlıca sepolicy derleme mantığı da burada (system/sepolicy/Android.mk
) yer alır.
system/sepolicy
SELinux'u uygulama bölümündeki dosyalar hakkında daha fazla bilgi edinin.
Android 7.x ve önceki sürümler
Bu bölümde, SELinux politikasının Android 7.x ve önceki sürümlerde nasıl oluşturulduğu açıklanmaktadır.
Android 7.x ve önceki sürümlerde derleme süreci
SELinux politikası, temel AOSP politikası ile cihaza özel özelleştirmeler birleştirilerek oluşturulur. Birleştirilen politika daha sonra politika derleyicisine ve çeşitli kontrol araçlarına iletilir. Cihaza özel özelleştirme, cihaza özel BOARD_SEPOLICY_DIRS
dosyasında tanımlanan BOARD_SEPOLICY_DIRS
değişkeni aracılığıyla yapılır.Boardconfig.mk
Bu genel derleme değişkeni, ek politika dosyalarının aranacağı sırayı belirten dizinlerin listesini içerir.
Örneğin, bir SoC satıcısı ve bir ODM, belirli bir cihaz için nihai SELinux yapılandırmalarını oluşturmak üzere her biri bir dizin ekleyebilir. Bu dizinlerden biri SoC'ye özel ayarlar, diğeri ise cihaza özel ayarlar için kullanılır:
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
oluşturmak için birleştirilir:

1. şekil. SELinux derleme mantığı.
sepolicy
dosyası birden fazla kaynak dosyasından oluşur:
- Düz metin
policy.conf
,security_classes
,initial_sids
,*.te
dosyaları,genfs_contexts
veport_contexts
bu sırayla birleştirilerek oluşturulur. - Her dosya (ör.
security_classes
) için içerik,system/sepolicy/
veBOARDS_SEPOLICY_DIRS
altında aynı ada sahip dosyaların birleştirilmesidir. policy.conf
, söz dizimi kontrolü için SELinux derleyicisine gönderilir ve cihazdasepolicy
olarak ikili biçimde derlenir.Şekil 2. SELinux politika dosyası.
SELinux dosyaları
Derleme işleminden sonra, 7.x ve önceki Android sürümlerini çalıştıran cihazlarda genellikle aşağıdaki SELinux ile ilgili dosyalar bulunur:
selinux_version
- sepolicy: politika dosyaları (ör.
security_classes
,initial_sids
ve*.te
) birleştirildikten sonraki ikili çıkış file_contexts
property_contexts
seapp_contexts
service_contexts
system/etc/mac_permissions.xml
Daha fazla bilgi için SELinux'u uygulama başlıklı makaleyi inceleyin.
SELinux'u başlatma
Sistem başlatıldığında SELinux, izin verici modda (zorunlu modda değil) olur. Başlatma işlemi aşağıdaki görevleri yerine getirir:
sepolicy
dosyayı/sys/fs/selinux/load
aracılığıyla ramdisk'ten çekirdeğe yükler.- SELinux'u zorunlu kılma moduna geçirir.
- SELinux alan kuralını kendisine uygulamak için
re-exec()
komutunu çalıştırır.
Başlatma süresini kısaltmak için re-exec()
işlemini en kısa sürede init
üzerinde gerçekleştirin.
Android 8.0 ve sonraki sürümler
Android 8.0'da SELinux politikası, uyumluluğu korurken bağımsız platform/tedarikçi politikası güncellemelerine izin vermek için platform ve tedarikçi bileşenlerine ayrılmıştır.
Platform sepolicy'si, belirli türleri ve özellikleri satıcı politikası yazarlarına aktarmak için platforma özel ve herkese açık olmak üzere ikiye ayrılır. Platformun herkese açık türlerinin/özelliklerinin, belirli bir platform sürümünde kararlı API'ler olarak korunacağı garanti edilir. Platform eşleme dosyaları kullanılarak önceki platform genel türleri/özellikleriyle uyumluluk birkaç sürüm boyunca garanti edilebilir.
Android 8.0 için derleme süreci
Android 8.0'daki SELinux politikası, /system
ve /vendor
parçalarının birleştirilmesiyle oluşturulur. Bu ayarı uygun şekilde yapma mantığı
/platform/system/sepolicy/Android.mk
bölümünde açıklanmıştır.
Politika aşağıdaki konumlarda bulunur:
Konum | İçerikler |
---|---|
system/sepolicy/public |
Platformun sepolicy API'si |
system/sepolicy/private |
Platform uygulama ayrıntıları (sağlayıcılar yoksayabilir) |
system/sepolicy/vendor |
Tedarikçilerin kullanabileceği politika ve bağlam dosyaları (Tedarikçiler isterlerse bunları yoksayabilir) |
BOARD_SEPOLICY_DIRS |
Tedarikçi sepolicy |
BOARD_ODM_SEPOLICY_DIRS (Android 9 ve sonraki sürümler) |
Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) |
System_ext'in sepolicy API'si |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) |
System_ext uygulama ayrıntıları (tedarikçiler yoksayabilir) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) |
Product's sepolicy API |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) |
Ürün uygulama ayrıntıları (sağlayıcılar bu bölümü dikkate almayabilir) |
Derleme sistemi bu politikayı alır ve ilgili bölümde system, system_ext, product, vendor ve odm politika bileşenlerini oluşturur. Şu işlemleri yapın:
- Politikaları SELinux Common Intermediate Language (CIL) biçimine dönüştürme, özellikle:
- public platform policy (system + system_ext + product)
- birleştirilmiş özel + kamu politikası
- public + vendor and
BOARD_SEPOLICY_DIRS
policy
- Herkese açık olarak sağlanan politikayı, tedarikçi politikası kapsamında sürümleme.
Üretilen kamu CIL politikasını kullanarak, hangi bölümlerin platform politikasına bağlanacak özelliklere dönüştürülmesi gerektiği konusunda birleşik kamu + satıcı +
BOARD_SEPOLICY_DIRS
politikasına bilgi vererek yapılır. - Platform ve tedarikçi parçalarını bağlayan bir eşleme dosyası oluşturma. Bu özellik ilk olarak, herkese açık politikadaki türleri satıcı politikasındaki ilgili özelliklerle bağlar. Daha sonra, gelecekteki platform sürümlerinde tutulan dosyanın temelini de sağlayarak bu platform sürümünü hedefleyen satıcı politikasıyla uyumluluğu mümkün kılar.
- Politika dosyalarını birleştirme (hem cihaz üzerinde hem de önceden derlenmiş çözümleri açıklayın).
- Harita çıkarma, platform ve satıcı politikasını birleştirin.
- Çıkış ikili politika dosyasını derleyin.
Platform public sepolicy
Platform public sepolicy,
system/sepolicy/public
altında tanımlanan her şeyi içerir. Platform, kamu politikası kapsamında tanımlanan türlerin ve özelliklerin, belirli bir platform sürümü için kararlı API'ler olduğunu varsayabilir. Bu, satıcı (yani cihaz) politikası geliştiricilerinin ek cihaza özgü politikalar yazabileceği platform tarafından dışa aktarılan sepolicy'nin bir bölümünü oluşturur.
Türler, satıcı dosyalarının yazıldığı politika sürümüne göre sürüm oluşturulur. Bu sürüm, PLATFORM_SEPOLICY_VERSION
derleme değişkeniyle tanımlanır. Sürüm oluşturulmuş kamu politikası daha sonra tedarikçi politikasına ve (orijinal biçiminde) platform politikasına dahil edilir. Bu nedenle, nihai politika; özel platform politikası, mevcut platformun herkese açık sepolicy'si, cihaza özgü politika ve cihaz politikasının yazıldığı platform sürümüne karşılık gelen sürümlendirilmiş herkese açık politikayı içerir.
Platform private sepolicy
Platform private 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 platforma ait türleri, izinleri ve özellikleri oluşturur. Bunlar vendor/device
politika yazarlarına aktarılmaz. Platform dışı politika yazıcıları, politika uzantılarını platformun özel sepolicy'sinde tanımlanan türlere/özelliklere/kurallara göre yazmamalıdır. Ayrıca, bu kurallar değiştirilebilir veya yalnızca çerçeve güncellemesinin bir parçası olarak kaybolabilir.
Platform özel eşleme
Platform özel eşlemesi, önceki platform sürümlerinin platform kamu politikasında sunulan özellikleri, mevcut platform kamu sepolicy'sinde kullanılan somut türlerle eşleyen politika ifadelerini içerir. Bu sayede, önceki platformun herkese açık sepolicy sürümlerindeki herkese açık platform özelliklerine göre yazılan tedarikçi politikası çalışmaya devam eder. Sürüm oluşturma, belirli bir platform sürümü için AOSP'de ayarlanan PLATFORM_SEPOLICY_VERSION
yapı değişkenine dayanır. Bu platformun satıcı politikasını kabul etmesi beklenen her önceki platform sürümü için ayrı bir eşleme dosyası bulunur. Daha fazla bilgi için Uyumluluk başlıklı makaleyi inceleyin.
Android 11 ve sonraki sürümler
system_ext ve product sepolicy
Android 11'de system_ext politikası ve ürün politikası eklenir. Platform politikası gibi, system_ext politikası ve ürün politikası da genel politika ve özel politika olarak ikiye ayrılır.
Herkese açık politika, tedarikçiye aktarılır. Türler ve özellikler kararlı API haline gelir ve tedarikçi politikası, herkese açık politikadaki türlere ve özelliklere atıfta bulunabilir. Türler PLATFORM_SEPOLICY_VERSION
'ye göre sürüm oluşturulur ve sürüm oluşturulan politika, tedarikçi politikasına dahil edilir. Orijinal politika, system_ext ve product bölümlerinin her birine dahil edilir.
Gizlilik politikası, system_ext ve ürün bölümlerinin işlevselliği için gerekli olan yalnızca system_ext ve yalnızca ürün türlerini, izinlerini ve özelliklerini içerir. Gizlilik politikası, satıcı tarafından görülemez. Bu nedenle, bu kuralların dahili olduğu ve değiştirilmesine izin verildiği anlaşılır.
system_ext ve ürün eşleme
system_ext ve product, belirlenen herkese açık türlerini vendor'a aktarabilir. Ancak uyumluluğu koruma sorumluluğu her iş ortağına aittir. Uyumluluk için iş ortakları, önceki sürümlerin sürüm oluşturulmuş özelliklerini mevcut herkese açık 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 üzere, istenen eşleme bilgilerini içeren bir cil dosyasını
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
konumuna yerleştirin, ardındansystem_ext_{ver}.cil
öğesiniPRODUCT_PACKAGES
öğesine ekleyin. - Ürün için bir eşleme dosyası yüklemek üzere, istenen eşleme bilgilerini içeren bir cil dosyasını
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
konumuna yerleştirin ve ardındanproduct_{ver}.cil
öğesiniPRODUCT_PACKAGES
konumuna ekleyin.
Redbull cihazının ürün bölümünün eşleme dosyasını ekleyen bir örneğe bakın.
Önceden derlenmiş SELinux politikası
init
, SELinux'u etkinleştirmeden önce bölümlerdeki (system
, system_ext
, product
, vendor
ve odm
) tüm CIL dosyalarını toplar ve bunları çekirdeğe yüklenebilecek biçim olan ikili politikaya derler.init
Derleme zaman aldığından (genellikle 1-2 saniye) CIL dosyaları derleme sırasında önceden derlenir ve giriş CIL dosyalarının sha256 karmalarıyla birlikte /vendor/etc/selinux/precompiled_sepolicy
veya /odm/etc/selinux/precompiled_sepolicy
konumuna yerleştirilir. Çalışma zamanında init
, karma değerleri karşılaştırarak politika dosyasında güncelleme yapılıp yapılmadığını kontrol eder. Hiçbir şey değişmediyse init
önceden derlenmiş politikayı yükler. Aksi takdirde, init
anında derlenir ve önceden derlenmiş olan yerine bu derleme kullanılır.
Daha net bir ifadeyle, aşağıdaki koşulların tümü karşılandığında önceden derlenmiş politika kullanılır. Burada,
{partition}
, önceden derlenmiş politikanın bulunduğu bölümü temsil eder: vendor
veya odm
.
-
Hem
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
hem de/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
var ve aynı. -
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. Ya da her ikisi de mevcut ve aynı olmalı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. Ya da her ikisi de mevcut ve aynı olmalıdır.
Bunlardan herhangi biri farklıysa init
, cihazdaki derleme yoluna geri döner. Daha fazla bilgi için
system/core/init/selinux.cpp
sayfasına bakın.