我们使用 Anaconda + Kickstart 将 RPM 安装到 CentOS 7 系统中,这会chroot
进入目标系统的环境并安装我们在 Kickstart 配置文件中指定的所有 RPM。在其中一些 RPM 中,%pre
或%post
脚本正在运行 SELinux 命令semodule
,semanage
并restorecon
设置我们所需的 SELinux 策略。
正常安装这些 RPM 时(即在已安装的系统中),脚本会按预期执行并在系统上设置 SELinux 策略。但是,当我们通过 Anaconda 安装这些 RPM 时,命令成功执行,但在重新启动后,安装的系统中没有任何 SELinux 策略真正生效:通过安装的所有模块均未semodule
安装,通过配置的所有上下文映射semanage
均未到位。
例如,我们有一个通过mymodule.pp
它在脚本中安装的模块和一个设置为的文件上下文映射定义;这些命令在 Anaconda 安装期间“成功”,但重新启动进入实际系统后,所有策略均未实施。%post
semodule -i mymodule.pp
semanage fcontext -a -t mysqld_db_t '/storage/export(/.*)?'
因此,这引出了我的问题:当我使用例如和来管理我的系统的 SELinux 策略时semodule
,这些命令是否管理semanage
restorecon
当前正在运行的内核?这就是为什么它们在新安装的系统中不可见的原因吗?或者我这里可能还有其他原因?我本以为运行这些命令会在文件系统中放置/更改一个文件,该文件将在启动时由(新安装的)内核读取以设置策略和上下文。
答案1
确实,迈克尔·汉普顿是正确的SELinux 工具在文件系统上运行。我们找不到 Kickstart 软件包安装过程中 SELinux 策略定义/模块未安装的根本原因,但我们实施了一种解决方法:
在我们的 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[@]}"
不幸的副作用是我们必须指定完整的版本号而不是仅仅指定软件包名称,但是当需要时我们可能可以实现一个相当简单的解决方案。
现在,通过此解决方法,设置 SELinux 策略定义(或安装模块)的 RPM 包%post
脚本可以按预期工作。