Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Построение политики SELinux

В этой статье рассказывается, как строится политика SELinux. Политика SELinux строится из комбинации базовой политики AOSP (платформа) и политики для конкретного устройства (поставщик). Поток сборки политики SELinux для Android 4.4 через Android 7.0 объединил все отдельные фрагменты, а затем сгенерировал монолитные файлы в корневом каталоге. Это означало, что поставщики SoC и производители ODM модифицировали boot.img (для устройств без A / B) или system.img (для устройств A / B) каждый раз при изменении политики.

В Android 8.0 и выше политика платформы и поставщика строится отдельно. SOC и OEM-производители могут обновлять свои части политики, создавать свои образы (например, vendor.img vendor.img и boot.img), а затем обновлять эти образы независимо от обновлений платформы.

Однако, поскольку модульные файлы политики SELinux хранятся в разделах /vendor , процесс init должен монтировать разделы системы и поставщика раньше, чтобы он мог читать файлы SELinux из этих разделов и объединять их с основными файлами SELinux в системном каталоге (перед загрузкой их в ядро).

Исходные файлы

Логика построения SELinux находится в этих файлах:

  • external/selinux : Внешний проект SELinux, используемый для создания утилит командной строки HOST для компиляции политики и меток SELinux.
    • external/selinux/libselinux : Android использует только часть внешнего проекта libselinux вместе с некоторыми настройками для Android. Для получения дополнительной информации см. external/selinux/README.android .
    • external/selinux/libsepol :
      • chkcon : определить, является ли контекст безопасности действительным для данной двоичной политики (исполняемого файла хоста).
      • libsepol : библиотека SELinux для управления двоичными политиками безопасности (статическая / разделяемая библиотека хоста, целевая статическая библиотека).
    • external/selinux/checkpolicy : компилятор политики SELinux (исполняемые файлы хоста: checkpolicy , checkmodule и dispol ). Зависит от libsepol .
  • system/sepolicy : основные конфигурации политики Android SELinux, включая контексты и файлы политик. Основная логика построения sepolicy также здесь ( system/sepolicy/Android.mk ).

Для более подробной информации о файлах в system/sepolicy Внедрение SELinux .

Android 7.0 и более ранние

В этом разделе описывается, как политика SELinux строится в Android 7.x и более ранних версиях.

Построение политики SELinux

Политика SELinux создается путем объединения основной политики AOSP с настройками для конкретного устройства. Объединенная политика затем передается компилятору политики и различным контролерам. Индивидуальная настройка устройства выполняется с помощью переменной BOARD_SEPOLICY_DIRS определенной в файле Boardconfig.mk конкретного Boardconfig.mk . Эта глобальная переменная сборки содержит список каталогов, в которых указывается порядок поиска дополнительных файлов политики.

Например, поставщик SoC и ODM могут каждый добавить каталог, один для настроек, специфичных для SoC, и другой для настроек, специфичных для устройства, чтобы сгенерировать окончательные конфигурации SELinux для данного устройства:

  • BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
  • BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy

Содержимое файлов file_contexts в system/sepolicy и BOARD_SEPOLICY_DIRS объединяется для создания file_contexts.bin на устройстве:

Это изображение показывает логику сборки SELinux для Android 7.x.
Рисунок 1 Логика сборки SELinux

Файл sepolicy состоит из нескольких исходных файлов:

  • policy.conf текст policy.conf генерируется путем объединения policy.conf security_classes , initial_sids , *.te , genfs_contexts и port_contexts в указанном порядке.
  • Для каждого файла (например, security_classes ) его содержимое представляет собой конкатенацию файлов с одинаковыми именами в system/sepolicy/ и BOARDS_SEPOLICY_DIRS .
  • policy.conf отправляется компилятору SELinux для проверки синтаксиса и компилируется в двоичный формат как sepolicy на устройстве.
    Это изображение показывает файлы, которые генерируют файл политики SELinux для Android 7.x.
    Рисунок 2 Файл политики SELinux

Файлы SELinux

После компиляции устройства Android под управлением 7.x и более ранних версий обычно содержат следующие файлы, связанные с SELinux:

  • selinux_version
  • sepolicy: двоичный вывод после объединения файлов политики (например, security_classes , initial_sids и *.te )
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

Для получения дополнительной информации см. Реализация SELinux .

Инициализация SELinux

Когда система загружается, SELinux находится в разрешающем режиме (а не в принудительном режиме). Процесс init выполняет следующие задачи:

  • Загружает sepolicy файлы из ramdisk в ядро ​​через /sys/fs/selinux/load .
  • Переключает SELinux в принудительный режим.
  • Запускает re-exec() для применения правила домена SELinux к себе.

Чтобы сократить время загрузки, выполните процедуру re-exec() для процесса init как можно скорее.

Android 8.0 и выше

В Android 8.0 политика SELinux разделена на компоненты платформы и поставщика, что позволяет независимым обновлениям политики платформы / поставщика при сохранении совместимости.

Разделение платформы далее делится на приватные части платформы и открытые части платформы для экспорта определенных типов и атрибутов разработчикам политики поставщиков. Публичные типы / атрибуты платформы гарантированно поддерживаются как стабильные API для данной версии платформы. Совместимость с открытыми типами / атрибутами предыдущих платформ может быть гарантирована для нескольких версий с использованием файлов сопоставления платформ.

Платформа общественной сеполицы

Платформа public sepolicy включает в себя все, что определено в system/sepolicy/public . Платформа может предполагать, что типы и атрибуты, определенные в публичной политике, являются стабильными API для данной версии платформы. Это формирует часть sepolicy, которая экспортируется платформой, на которой разработчики политики вендора (т.е. устройства) могут написать дополнительную политику для конкретного устройства.

Типы имеют версии в соответствии с версией политики, против которой записаны файлы вендора, определяемой переменной сборки PLATFORM_SEPOLICY_VERSION . Затем версионная публичная политика включается в политику поставщика и (в ее первоначальном виде) в политику платформы. Таким образом, окончательная политика включает в себя политику частной платформы, общедоступную политику текущей платформы, политику для конкретного устройства и версионную публичную политику, соответствующую версии платформы, для которой была написана политика устройства.

Платформа частная сеполиция

Платформа private sepolicy включает в себя все, что определено в /system/sepolicy/private . Эта часть политики формирует типы, разрешения и атрибуты только для платформы, необходимые для функциональности платформы. Они не экспортируются разработчикам политики vendor/device . Разработчики политик, не использующих платформу, не должны писать свои расширения политики на основе типов / атрибутов / правил, определенных в частной политике платформы. Кроме того, эти правила могут быть изменены или могут исчезнуть как часть обновления только для платформы.

Платформа частного картографирования

Частное сопоставление платформы включает в себя операторы политики, которые отображают атрибуты, представленные в публичной политике платформы предыдущих версий платформы, в конкретные типы, используемые в публичной разделительной политике текущей платформы. Это гарантирует, что политика вендора, написанная на основе общедоступных атрибутов платформы из предыдущей общедоступной версии (версий) платформы, продолжает работать. Управление версиями основано на переменной построения PLATFORM_SEPOLICY_VERSION установленной в AOSP для данной версии платформы. Для каждой предыдущей версии платформы существует отдельный файл сопоставления, от которого ожидается, что эта платформа примет политику поставщика. Для получения дополнительной информации см. Совместимость .

Построение политики SELinux

Политика SELinux в Android 8.0 создается путем объединения частей из /system и /vendor . Логика для соответствующей настройки находится в /platform/system/sepolicy/Android.mk .

Политика существует в следующих местах:

Расположение Содержит
system/sepolicy/public API-интерфейс платформы
system/sepolicy/private Детали реализации платформы (поставщики могут игнорировать)
system/sepolicy/vendor Файлы политик и контекста, которые могут использовать поставщики (поставщики могут игнорировать при желании)
BOARD_SEPOLICY_DIRS Поставщик сеполицы

Система сборки принимает эту политику и создает компоненты политики платформы и поставщика в системном разделе и в разделе поставщика соответственно. Шаги включают в себя:

  1. Преобразование политик в формат общего промежуточного языка SELinux (CIL), а именно:
    1. политика публичной платформы
    2. комбинированная частная + государственная политика
    3. политика public + vendor и BOARD_SEPOLICY_DIRS
  2. Создание версий политики, предоставляемой public как часть политики вендора. Выполнено с использованием созданной общедоступной политики CIL для информирования объединенной политики public + vendor + BOARD_SEPOLICY_DIRS о том, какие части должны быть превращены в атрибуты, которые будут связаны с политикой платформы.
  3. Создание файла сопоставления, связывающего части платформы и поставщика. Первоначально это просто связывает типы из публичной политики с соответствующими атрибутами в политике поставщика; позже он также послужит основой для файла, который будет поддерживаться в будущих версиях платформы, обеспечивая совместимость с политикой поставщика, нацеленной на эту версию платформы.
  4. Объединение файлов политики (опишите как на устройстве, так и предварительно скомпилированные решения).
    1. Объединение карт, платформы и политики поставщиков.
    2. Скомпилируйте выходной двоичный файл политики.