Bu sayfada, SELinux politikasının nasıl oluşturulduğu ele alınmaktadır. SELinux politikası, temel AOSP politikasının (platform) ve cihaza özgü politikanın (tedarikçi) bir kombinasyonundan oluşur. Android 4.4 ile Android 7.0 arasındaki SELinux politika derleme akışı, tüm sepolicy parçalarını birleştirip kök dizinde monolitik dosyalar oluşturuyordu. Bu, SoC tedarikçileri 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) dosyasını değiştirmesi anlamına geliyordu.
Android 8.0 ve sonraki sürümlerde platform ve tedarikçi politikası ayrı olarak oluşturulur.
SOC'ler ve OEM'ler, politikanın kendi bölümlerini güncelleyebilir, resimlerini (ör. vendor.img
ve boot.img
) oluşturabilir ve 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 tedarikçi bölümlerini daha önce monte etmesi gerekir. Böylece, bu bölümlerdeki SELinux dosyalarını okuyabilir ve bunları çekirdek SELinux dosyalarıyla birleştirebilir (çekirdeğe yüklemeden önce).
Kaynak dosyalar
SELinux'u oluşturma mantığı şu dosyalarda bulunur:
-
external/selinux
: SELinux politikasını ve etiketlerini derlemek için HOST komut satırı yardımcı programlarını oluşturmak amacıyla 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
'e bağlıdır.
-
-
system/sepolicy
: Bağlamlar ve politika dosyaları dahil olmak üzere temel Android SELinux politika yapılandırmaları. Ana sepolicy derleme mantığı da buradadır (system/sepolicy/Android.mk
).
Dosyalar hakkında daha fazla bilgi için system/sepolicy
SELinux'u uygulama başlıklı makaleyi inceleyin.
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ümler için derleme işlemi
SELinux politikası, temel AOSP politikası cihaza özgü özelleştirmelerle birleştirilerek oluşturulur. Birleştirilen politika daha sonra politika derleyiciye ve çeşitli kontrolörlere 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 derleme değişkeni, ek politika dosyalarının aranacağı sırayı belirten dizinlerin listesini içerir.
Örneğin, bir SoC tedarikçisi ve bir ODM, belirli bir cihaz için nihai SELinux yapılandırmalarını oluşturmak üzere her biri bir dizin (biri SoC'ye özgü ayarlar, diğeri cihaza özgü ayarlar için) 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
oluşturmak için birleştirilir:

Şekil 1. SELinux derleme mantığı.
sepolicy
dosyası birden fazla kaynak dosyadan oluşur:
- Düz metin
policy.conf
,security_classes
,initial_sids
,*.te
dosyaları,genfs_contexts
veport_contexts
sırasıyla birleştirilerek oluşturulur. - Her dosya (
security_classes
gibi) için içerik,system/sepolicy/
veBOARDS_SEPOLICY_DIRS
altındaki aynı ada sahip dosyaların bir araya getirilmesidir. policy.conf
, söz dizimi kontrolü için SELinux derleyicisine gönderilir ve cihazdasepolicy
olarak ikili biçime derlenir.Şekil 2. SELinux politika dosyası.
SELinux dosyaları
Derleme işleminden sonra, 7.x ve önceki sürümleri çalıştıran Android cihazlar genellikle SELinux ile ilgili aşağıdaki dosyaları içerir:
selinux_version
- sepolicy: Politika dosyalarının birleştirilmesinden sonra ikili çıkış (ör.
security_classes
,initial_sids
ve*.te
) 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 başlatma
Sistem açıldığında SELinux izin verici moddadır (zorunlu modda değil). init işlemi aşağıdaki görevleri gerçekleştirir:
/sys/fs/selinux/load
üzerinden ramdisk'tensepolicy
dosyayı çekirdek içine yükler.- SELinux'u yaptırım moduna geçirir.
- SELinux alan kuralını kendisine uygulamak için
re-exec()
'yi çalıştırır.
Açılış süresini kısaltmak için re-exec()
üzerinde init
işlemini en kısa sürede 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 firma politikası güncellemelerine izin vermek için platform ve tedarikçi firma bileşenlerine ayrılmıştır.
Platform sepolicy, belirli türleri ve özellikleri tedarikçi firma politika yazarlarına aktarmak için platform özel ve platform herkese açık bölümlere ayrılır. Platformun herkese açık türlerinin/özelliklerinin, belirli bir platform sürümü için kararlı API'ler olarak korunacağı garanti edilir. Platform eşleme dosyaları kullanılarak önceki platformun herkese açık türleri/özellikleri ile uyumluluk, çeşitli sürümler için garanti edilebilir.
Android 8.0 için derleme işlemi
Android 8.0'daki SELinux politikası, /system
ve /vendor
'deki parçaların birleştirilmesiyle oluşturulur. Bu ayarı doğru şekilde yapma mantığı
/platform/system/sepolicy/Android.mk
bölümündedir.
Politika aşağıdaki konumlarda bulunur:
Konum | İçerikler |
---|---|
system/sepolicy/public |
Platformun sepolicy API'si |
system/sepolicy/private |
Platform uygulama ayrıntıları (tedarikçi firmalar yoksayabilir) |
system/sepolicy/vendor |
Tedarikçi firmaların kullanabileceği politika ve bağlam dosyaları (tedarikçi firmalar dilerse bu dosyaları yoksayabilir) |
BOARD_SEPOLICY_DIRS |
Tedarikçi firma güvenlik politikası |
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çi firmalar yoksayabilir) |
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ı (tedarikçi firmalar yoksayabilir) |
Derleme sistemi bu politikayı alır ve ilgili bölümde system, system_ext, product, vendor ve odm politika bileşenlerini oluşturur. Adımlar şunlardır:
- Politikaları SELinux Common Intermediate Language (CIL) biçimine dönüştürme, özellikle:
- herkese açık platform politikası (system + system_ext + product)
- birleştirilmiş özel ve herkese açık politika
- public + vendor and
BOARD_SEPOLICY_DIRS
policy
- Tedarikçi firma politikasının bir parçası olarak herkese açık olarak sağlanan politikanın sürümünü belirleme.
Oluşturulan herkese açık CIL politikası kullanılarak yapılır. Bu politika, birleşik herkese açık + satıcı +
BOARD_SEPOLICY_DIRS
politikasına hangi bölümlerin platform politikasına bağlanacak özelliklere dönüştürülmesi gerektiği konusunda bilgi verir. - Platformu ve tedarikçi firma parçalarını birbirine bağlayan bir eşleme dosyası oluşturma. Bu, başlangıçta yalnızca herkese açık politikadaki türleri tedarikçi politikasındaki ilgili özelliklerle bağlar. Daha sonra, gelecekteki platform sürümlerinde tutulacak dosyanın temelini de sağlayarak bu platform sürümünü hedefleyen tedarikçi politikasıyla uyumluluğu sağlar.
- Politika dosyalarını birleştirme (hem cihaz üzerinde hem de önceden derlenmiş çözümleri açıklayın).
- Harita çıkarma, platform ve tedarikçi politikasını birleştirin.
- Çıkış ikili politika dosyasını derleyin.
Platform herkese açık güvenlik politikası
Platformun herkese açık güvenlik politikası,
system/sepolicy/public
altında tanımlanan her şeyi içerir. Platform, herkese açık politika kapsamında tanımlanan türlerin ve özelliklerin belirli bir platform sürümü için kararlı API'ler olduğunu varsayabilir. Bu, platform tarafından dışa aktarılan sepolicy'nin bir bölümünü oluşturur. Bu bölümde, satıcı (yani cihaz) politikası geliştiricileri cihaza özgü ek politikalar yazabilir.
Türlerin sürümü, tedarikçi firma dosyalarının yazıldığı politikanın sürümüne göre belirlenir. Bu sürüm, PLATFORM_SEPOLICY_VERSION
make değişkeni tarafından tanımlanır. Sürüm numaralı herkese açık politika daha sonra tedarikçi firma politikasına ve (orijinal biçiminde) platform politikasına dahil edilir. Bu nedenle nihai politika; özel platform politikasını, mevcut platformun herkese açık güvenlik politikasını, cihaza özgü politikayı ve cihaz politikasının yazıldığı platform sürümüne karşılık gelen sürümlü herkese açık politikayı içerir.
Platform özel güvenlik politikası
Platform özel güvenlik politikası,
/system/sepolicy/private
altında tanımlanan her şeyi içerir. Politikanın bu kısmı, platform işlevselliği için gereken yalnızca platform türlerini, izinlerini ve özelliklerini oluşturur. Bunlar vendor/device
politika yazarlarına aktarılmaz. Platform dışındaki politika yazarları, politika uzantılarını platform özel sepolicy'sinde tanımlanan türlere/özelliklere/kurallara göre yazmamalıdır. Ayrıca, bu kuralların değiştirilmesine izin verilir veya yalnızca çerçeve güncellemesi kapsamında kaldırılabilir.
Platform gizli eşleme
Platform özel eşlemesi, önceki platform sürümlerinin platform herkese açık politikasında bulunan özellikleri mevcut platform herkese açık politikasında kullanılan somut türlerle eşleyen politika beyanları içerir. Bu sayede, önceki platform herkese açık sepolicy sürümlerindeki platform herkese açık özelliklerine göre yazılmış tedarikçi politikası çalışmaya devam eder. Sürümlendirme, belirli bir platform sürümü için AOSP'de ayarlanan PLATFORM_SEPOLICY_VERSION
yapı değişkenine dayanır. Bu platformun tedarikçi politikasını kabul etmesi beklenen her önceki platform sürümü için ayrı bir eşleme dosyası vardır. Daha fazla bilgi için Uyumluluk bölümüne bakın.
Android 11 ve sonraki sürümler
system_ext ve ürün sepolicy
Android 11'de system_ext politikası ve ürün politikası eklendi. platform_sepolicy gibi system_ext politikası ve ürün politikası da herkese açık politika ve özel politika olarak 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ürleri ve özellikleri referans alabilir. Türler PLATFORM_SEPOLICY_VERSION
'e göre sürümlenir ve sürümlenmiş politika tedarikçi politikasına dahil edilir. Orijinal politika, system_ext ve ürün bölümlerinin her birine dahil edilir.
Gizli politika, system_ext ve ürün bölümlerinin işlevselliği için gereken yalnızca system_ext ve yalnızca ürün türlerini, izinlerini ve özelliklerini içerir. Gizli politika, tedarikçi firma tarafından görülemez. Bu, bu kuralların şirket içi olduğunu ve değiştirilmesine izin verildiğini gösterir.
system_ext ve ürün eşleme
system_ext ve product'in, belirtilen herkese açık türlerini tedarikçiye dışa aktarmasına izin verilir. Ancak uyumluluğu koruma sorumluluğu her iş ortağına aittir. İş ortakları, uyumluluk için önceki sürümlerin sürümlü özelliklerini mevcut herkese açık güvenlik politikasında kullanılan somut türlerle eşleyen kendi eşleme dosyalarını sağlayabilir.
- system_ext için bir eşleme dosyası yüklemek isterseniz
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
içine istenen eşleme bilgilerini içeren bir cil dosyası yerleştirin ve ardındansystem_ext_{ver}.cil
dosyasınıPRODUCT_PACKAGES
içine ekleyin. - Ürün için bir eşleme dosyası yüklemek isterseniz
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
içine istenen eşleme bilgilerini içeren bir cil dosyası yerleştirin ve ardındanproduct_{ver}.cil
dosyasınıPRODUCT_PACKAGES
içine ekleyin.
Redbull cihazının ürün bölümünün eşleme dosyasını ekleyen ö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üklenebilir biçimdeki ikili politikaya derleyebilir.init
Derleme işlemi zaman aldığından (genellikle 1-2 saniye) CIL dosyaları derleme zamanı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. init
, çalışma zamanında karma oluşturma işlemlerini 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. Aksi takdirde init
anında derlenir ve önceden derlenmiş olanın yerine kullanılır.
Daha ayrıntılı olarak belirtmek gerekirse, aşağıdaki koşulların tümü karşılanıyorsa ö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
vardır 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. 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
, cihaz üzerinde derleme yoluna geri döner. Daha fazla bilgi için
system/core/init/selinux.cpp
bölümüne bakın.