SELinux Politikası 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 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 harici libselinux projesinin yalnızca bir alt kümesini kullanır. Ayrıntılar için external/selinux/README.android bakın.
    • external/selinux/libsepol :
      • chkcon : Belirli bir ikili politika (anasistem yürütülebilir dosyası) için bir güvenlik içeriğinin geçerli olup olmadığını belirleyin.
      • libsepol : İkili güvenlik politikalarını yönetmek için SELinux kütüphanesi (ana statik/paylaşılan kütüphane, hedef statik kütüphane).
    • external/selinux/checkpolicy : SELinux politika derleyicisi (anasistem yürütülebilir dosyaları: checkpolicy , checkmodule ve dispol ). 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.
Şekil 1 . SELinux yapı mantığı

sepolicy dosyası birden fazla kaynak dosyadan oluşur:

  • Düz metin policy.conf security_classes , initial_sids , *.te dosyalarını, genfs_contexts ve port_contexts bu sırayla birleştirerek oluşturulur.
  • Her dosyanın (örneğin, security_classes ) içeriği, system/sepolicy/ ve BOARDS_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 cihazda sepolicy olarak ikili formatta derlenir.
    Bu resim, Android 7.x için SELinux politika dosyasını oluşturan dosyaları gösterir.
    Ş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ından system_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.

    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:

    1. Politikaları SELinux Ortak Orta Dil (CIL) formatına dönüştürme, ö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 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.
    3. 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.
    4. İlke dosyalarını birleştirme (hem cihazdaki hem de önceden derlenmiş çözümleri açıklayın).
      1. Haritalama, platform ve satıcı politikasını birleştirin.
      2. Çıkış ikili politika dosyasını derleyin.

    Ö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 init format olan 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 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ş politika kullanılır. Burada, {partition} önceden derlenmiş politikanın mevcut olduğ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 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.

    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.