Команды управления SELinux работают на ядре или файловой системе?

Мы устанавливаем RPM в систему CentOS 7 с помощью Anaconda + Kickstart, которая выполняет chroot в среду целевой системы и устанавливает все RPM, которые мы указали в нашем файле конфигурации Kickstart. В некоторых из этих RPM %pre или же %post скриптлеты запускают команды SELinux semodule, semanage а также restorecon установить нашу необходимую политику SELinux.

При обычной установке этих RPM (т. Е. В уже установленной системе) скриптлеты выполняются должным образом и настраивают политику SELinux в системе. Но когда мы устанавливаем эти RPM через Anaconda, команды выполняются успешно, но ни одна из политик SELinux фактически не вступает в силу в установленной системе после перезагрузки: ни один из модулей, установленных через semodule установлены, и ни одно из сопоставлений контекста не настроено через semanage на месте.

Например, у нас есть модуль mymodule.pp который мы устанавливаем в нашем %post сценарий через semodule -i mymodule.pp и определение сопоставления контекста файла, которое мы устанавливаем как semanage fcontext -a -t mysqld_db_t '/storage/export(/.*)?'; эти команды "успешно" во время установки Anaconda, но после перезагрузки в реальной системе ни одна из политик не действует.


Так что возникает вопрос: когда я управляю политикой SELinux в моей системе, используя, например, semodule, semanage а также restorecon эти команды управляют работающим в данный момент ядром? Вот почему их не видно в недавно установленной системе? Или я мог бы здесь что-то еще делать? Я бы подумал, что выполнение этих команд поместит / изменит файл в файловой системе, который будет прочитан (недавно установленным) ядром при загрузке, чтобы установить политику и контексты.

1 ответ

Действительно, Майкл Хэмптон был прав в том, что инструменты SELinux работают на файловой системе. Мы не можем найти основную причину, по которой определения / модули политики SELinux не устанавливаются во время установки пакета Kickstart, но мы применили обходное решение:

В нашем Kickstart ISO мы по-прежнему помещаем все эти дополнительные пакеты, которые нам нужны, в репозиторий пакетов, но не перечисляем пакеты в %packages раздел ks.cfgмы устанавливаем их в %post раздел, например:

additional_pkgs=(
MariaDB-10.3.13-centos73-x86_64-client.rpm
MariaDB-10.3.13-centos73-x86_64-server.rpm
MariaDB-10.3.13-centos73-x86_64-shared.rpm
galera-25.3.25-1.rhel7.el7.centos.x86_64.rpm
rh-nginx114-1.14-6.el7.x86_64.rpm
rh-nginx114-nginx-1.14.1-1.el7.x86_64.rpm
rh-nginx114-runtime-1.14-6.el7.x86_64.rpm
)
for ((i=0; i < "${#additional_pkgs[@]}"; i++)); do
    additional_pkgs[i]="/mnt/install/repo/Packages/${additional_pkgs[i]}"
done
rpm --root /mnt/sysimage --install "${additional_pkgs[@]}"

К сожалению, побочным эффектом является то, что мы должны указать полный номер версии, а не просто имя пакета, но мы, возможно, сможем реализовать довольно простое решение для этого, когда возникнет такая необходимость.

Теперь, с этим обходным путем, наши RPM-пакеты %post скриптлеты, которые задают определения политики SELinux (или устанавливают модули), работают как положено.

Другие вопросы по тегам