Мы устанавливаем 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
, управляют ли эти команды в настоящее время работает ядро? Поэтому их не видно во вновь установленной системе? Или, может, здесь что-то еще происходит? Я бы предположил, что выполнение этих команд поместит / изменит файл в файловой системе, который будет прочитан (недавно установленным) ядром при загрузке, чтобы установить политику и контексты.
Действительно, Майкл Хэмптон было правильно в том, что инструменты SELinux работают с файловой системой. Мы не можем найти основную причину, по которой определения / модули политики SELinux не устанавливаются во время установки пакета Kickstart, но мы реализовали обходной путь:
В нашем ISO-образе Kickstart мы по-прежнему помещаем все эти дополнительные пакеты, которые нам нужны, в репозиторий пакетов, а не перечисляем пакеты в %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 (или устанавливают модули), работают должным образом.