Команды управления 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 (или устанавливают модули), работают как положено.