SELinux politikası oluşturma

Bu sayfada, SELinux politikasının nasıl oluşturulduğu açıklanmaktadır. SELinux politikası, temel AOSP politikası (platform) ve cihaza özel politika (tedarikçi) kombinasyonundan 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 dosya 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 satıcı politikası ayrı ayrı oluşturulur. SoC'ler ve OEM'ler, politikanın kendi bölümlerini güncelleyebilir, görüntülerini (ör. 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üler SELinux politika dosyaları /vendor bölümlerinde depolandığından, init işleminin system ve vendor bölümlerini daha önce bağlaması gerekir. Böylece, bu bölümlerdeki SELinux dosyalarını okuyabilir ve bunları system 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ını oluşturmak üzere kullanılan harici SELinux projesi.
    • external/selinux/libselinux: Android, harici libselinux projesinin yalnızca bir alt kümesini ve Android'e özel bazı özelleştirmeleri kullanır. Ayrıntılı bilgi için external/selinux/README.android başlıklı makaleyi inceleyin.
    • external/selinux/libsepol:
      • chkcon: Bir güvenlik bağlamının belirli bir ikili politika (ana makine yürütülebilir dosyası) için geçerli olup olmadığını belirleyin.
      • libsepol: İkili güvenlik politikalarını (ana makine statik/paylaşılan kitaplığı, hedef statik kitaplığı) değiştirmek için kullanılan SELinux kitaplığı.
    • external/selinux/checkpolicy: SELinux politika derleyicisi (ana makine yürütülebilir dosyaları: checkpolicy, checkmodule, ve dispol). libsepol'ye bağlıdır.
  • system/sepolicy: Bağlamlar ve politika dosyaları dahil olmak üzere temel Android SELinux politika yapılandırmaları. Temel sepolicy derleme mantığı da burada yer alır (system/sepolicy/Android.mk).

system/sepolicy içindeki dosyalar hakkında daha fazla bilgi için Anahtar dosyaları 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ü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 denetleyicilere 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:

Android 7.x için SELinux derleme mantığı

Şekil 1. 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 ve port_contexts birleştirilerek oluşturulur.
  • Her dosya (ör. security_classes) için içerik, system/sepolicy/ ve BOARDS_SEPOLICY_DIRS altında aynı ada sahip dosyaların birleştirilmesidir.
  • policy.conf, söz dizimi kontrolü için SELinux derleyicisine gönderilir ve cihazda sepolicy olarak ikili biçimde derlenir.

    Android 7.x için SELinux politika dosyasını oluşturan dosyalar
    Ş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ı (security_classes, initial_sids ve *.te gibi) 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 başlatma

Sistem başlatıldığında SELinux izinli 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.

Önyükleme 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 ve 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. Bunu uygun şekilde ayarlama mantığı /platform/system/sepolicy/Android.bp bölümünde açıklanmıştır.

Politika aşağıdaki konumlarda geçerlidir:

Konum İçerikler
system/sepolicy/public Platform sepolicy API'si
system/sepolicy/private Platform uygulama ayrıntıları (sağlayıcılar yoksayabilir)
system/sepolicy/vendor Tedarikçilerin kullanabileceği (yoksayabileceği) politika ve bağlam dosyaları
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 sepolicy API
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) system_ext uygulama ayrıntıları (sağlayıcılar yoksayabilir)
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) Product sepolicy API
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 ve sonraki sürümler) Ürün uygulama ayrıntıları (tedarikçiler bu bölümü göz ardı edebilir)

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:

  1. Politikaları SELinux Common Intermediate Language (CIL) biçimine dönüştürün. Özellikle:
    • Herkese açık platform politikası (system, system_ext, product)
    • Birleştirilmiş özel ve kamu politikası
    • Herkese açık, satıcı ve BOARD_SEPOLICY_DIRS politikası
  2. Tedarikçi politikası kapsamında kamu tarafından sağlanan politikanın sürümünü oluşturun. Üretilen herkese açık CIL politikasını kullanarak, herkese açık ve satıcı BOARD_SEPOLICY_DIRS politikasının hangi bölümlerinin platform politikasına bağlı özelliklere dönüştürülmesi gerektiği konusunda birleşik herkese açık ve satıcı politikasını bilgilendirin.
  3. Platform ve tedarikçi parçalarını birbirine bağlayan bir eşleme dosyası oluşturun. Bu işlem, başlangıçta yalnızca genel politikadaki türleri satıcı politikasındaki ilgili özelliklerle bağlar. Daha sonra, gelecekteki platform sürümlerinde tutulan dosyanın temelini de oluşturarak bu platform sürümünü hedefleyen satıcı politikasıyla uyumluluğu sağlar.
  4. Politika dosyalarını birleştirin (hem cihaz üzerinde hem de önceden derlenmiş çözümleri açıklayın).
    1. Harita çıkarma, platform ve tedarikçi politikasını birleştirin.
    2. Çı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ü politika 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ını, mevcut platformun herkese açık politika dosyasını, cihaza özgü politikayı 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 tedarikçiye ve cihaz politikası yazarlarına aktarılmaz. Platform dışı politika yazarları, politika uzantılarını platformun özel sepolicy'sinde tanımlanan türlere, özelliklere ve 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 kaybolabilirler.

Platform özel eşleme

Platform özel eşlemesi, önceki platform sürümlerinin platform kamu politikasında kullanıma 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 platformun herkese açık özelliklerine göre yazılmış olan sağlayıcı politikasının çalışmaya devam etmesi sağlanır. 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 Politika uyumluluğu başlıklı makaleyi inceleyin.

Android 11 ve sonraki sürümler

Bu bölümde, Android 11 ve sonraki sürümlerde SELinux politikasının nasıl oluşturulduğu açıklanmaktadır.

system_ext ve product sepolicy

Android 11'de system_ext politikası ve product politikası eklenir. Platform sepolicy'de olduğu gibi, system_ext politikası ve product politikası da kamu politikası 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 satıcı 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 product bölüm işlevselliği için gereken yalnızca system_ext ve yalnızca product türlerini, izinlerini ve özelliklerini içerir. Gizlilik politikası, satıcı tarafından görülemez. Bu nedenle, bu kurallar dahili olup değiştirilebilir.

system_ext ve ürün eşleme

system_ext ve product, belirlenen herkese açık türlerini vendor'a aktarabilir. Ancak her iş ortağı uyumluluğu korumakla yükümlüdür. 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 ve ardından system_ext_{ver}.cil öğesini PRODUCT_PACKAGES'e ekleyin.
  • product 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ından product_{ver}.cil öğesini PRODUCT_PACKAGES'e ekleyin.

Redbull cihazının product 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 spesifik olarak, 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ü (vendor veya odm) temsil eder.

  • Hem /system/etc/selinux/plat_sepolicy_and_mapping.sha256 hem de /{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256 var ve aynı.
  • /system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256 ve /{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256 mevcut değil. Veya her ikisi de mevcut ve aynı olmalıdır.
  • /product/etc/selinux/product_sepolicy_and_mapping.sha256 ve /{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256 mevcut değil. Veya 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 sayfasına bakın.