Назад | Перейти на главную страницу

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

Действительно, Майкл Хэмптон было правильно в том, что инструменты 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 (или устанавливают модули), работают должным образом.