SELinux Politikasını Oluşturma

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 libselinux projesinin yalnızca bir alt kümesini kullanır. Ayrıntılar için bkz. external/selinux/README.android .
    • external/selinux/libsepol :
      • chkcon : Belirli bir ikili politika (ana bilgisayar yürütülebilir) için bir güvenlik bağlamının geçerli olup olmadığını belirleyin.
      • libsepol : İkili güvenlik ilkelerini işlemek için SELinux kitaplığı (ana bilgisayar statik/paylaşılan kitaplık, hedef statik kitaplık).
    • external/selinux/checkpolicy : SELinux ilke derleyicisi (ana bilgisayar yürütülebilir dosyaları: checkpolicy , checkmodule ve 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:

Bu görüntü, Android 7.x için SELinux oluşturma mantığını gösterir.
Şekil 1 . SELinux oluşturma mantığı

sepolicy dosyası birden çok kaynak dosyadan oluşur:

  • Düz metin policy.conf , security_classes , initial_sids , *.te dosyalarının, genfs_contexts ve port_contexts bu sırayla birleştirilmesiyle oluşturulur.
  • Her dosya için (örneğin, security_classes ), içeriği, system/sepolicy/ ve BOARDS_SEPOLICY_DIRS altında aynı ada sahip dosyaların birleştirilmesidir.
  • policy.conf , sözdizimi denetimi için SELinux derleyicisine gönderilir ve aygıtta sepolicy olarak ikili biçimde derlenir.
    Bu görüntü, Android 7.x için SELinux ilke dosyasını oluşturan dosyaları gösterir.
    Şekil 2 . SELinux ilke dosyası

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_sids ve *.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:

  • sepolicy dosyalarını ramdisk'ten /sys/fs/selinux/load aracı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}.cil ve ardından system_ext_{ver}.cil PRODUCT_PACKAGES ekleyin.
  • Ü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}.cil ve 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
    system/sepolicy/public Platformun sepolicy API'si
    system/sepolicy/private Platform uygulama ayrıntıları (satıcılar görmezden gelebilir)
    system/sepolicy/vendor Satıcıların kullanabileceği politika ve bağlam dosyaları (istenirse satıcılar yok sayabilir)
    BOARD_SEPOLICY_DIRS Satıcı sepolicy
    BOARD_ODM_SEPOLICY_DIRS (Android 9 ve üstü) odm sepolicy
    SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 ve üstü) System_ext'in sepolicy API'si
    SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 ve üstü) System_ext uygulama ayrıntıları (satıcılar görmezden gelebilir)
    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ı (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:

    1. Politikaları SELinux Ortak Ara Dil (CIL) formatına dönüştürmek, özellikle:
      1. genel platform politikası (system + system_ext + ürün)
      2. birleşik özel + kamu politikası
      3. genel + satıcı ve BOARD_SEPOLICY_DIRS politikası
    2. 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_DIRS ilkesini bilgilendirmek için üretilen genel CIL ilkesi kullanılarak yapılır.
    3. 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.
    4. İlke dosyalarını birleştirmek (hem cihazda hem de önceden derlenmiş çözümleri açıklayın).
      1. Eşleme, platform ve satıcı politikasını birleştirin.
      2. Çı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.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 vardır 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 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.