Portal:SELinux/常见问题
常见问题
openSUSE SELinux 策略经过调整,为大多数用户提供尽可能好的保护。这意味着默认情况下禁用对大多数用户来说不必要的潜在危险功能。
但是,有时需要为特定工作负载调整 SELinux 策略。这是 SELinux 的一般设计原则,这意味着鼓励在需要时调整规则。
此列表概述了常见的“问题”,可以通过用户端调整 SELinux 策略来解决。
SELinux 布尔值
SELinux 布尔值为用户提供了一种简单的方法,可以在 SELinux 策略中切换一些可选功能,而无需添加或修改策略模块。布尔值使策略编写者能够考虑并支持仅由特定用户为特定工作负载需要的场景,而不会损害所有其他用户的一般安全性。
execheap, execmod, execstack 布尔值
execheap、execmod 和 execstack 布尔值就是这个例子,因为它们允许通常很危险且普通 Linux 应用程序不需要的行为。因此,默认情况下禁用它们。但是,在某些特定的应用程序、工作负载和情况下,它们可能有用或必要。在这种情况下,用户可以评估风险并决定在他们的系统上启用布尔值。
有关更多信息,请参阅 bug 1206292。
下面列出了一些据报道可能需要这些权限的应用程序。此列表不完整,但可能有助于您排除这些或类似应用程序的故障。
Steam Proton, Bottles, WINE, Lutris 无法工作
注意(对于 steam、lutris 和 Bottles rpm):SELinux 团队为 openSUSE 中打包的 steam、lutris 和 Bottles 软件引入了一个新的依赖项,这应该可以自动修复 SELinux 启用系统上的以下问题。更改会自动安装一个名为 selinux-policy-targeted-gaming 的软件包。对于 flatpak 版本,由于我们无法向它们添加依赖项,因此仍然需要手动修复。手动安装 selinux-policy-targeted-gaming 也应该可以修复 flatpak 版本的问题。如果您遇到此解决方案的问题,请 提交错误报告。
所有必要的更改都可以在存储库中找到。
注意(对于 wine rpm):对于 wine,selinux-policy 版本 20250312 或更高版本引入了改进,这意味着可能不再需要使用 'selinuxuser_execmod',并且 wine 可能可以直接工作。如果仍然需要设置 'selinuxuser_execmod',请考虑 提交错误报告,如果 SELinux 团队有一个重现器,他们可能会进一步改进情况。
如果您在使用 WINE 以及基于 WINE 的程序(通过 flatpak 或 RPM 安装)时遇到问题,可能是因为 SELinux 阻止执行修改后的内存映射文件(execmod)。
您可以通过 检查审核日志是否包含如下 AVC:
type=AVC msg=audit(...): avc: denied { execmod } for pid=... comm="wineboot.exe"
type=AVC msg=audit(...): avc: denied { execmod } for pid=... comm="steam.exe"
...
如果您了解风险,可以使用以下命令临时允许此操作(下次启动时重置):
sudo setsebool selinuxuser_execmod 1
或者永久允许:
sudo setsebool -P selinuxuser_execmod 1
或者,也可以直接安装 RPM:
sudo zypper install selinux-policy-targeted-gaming
Team Fortress 2 缺少音频
如果您在 Team Fortress 2 中遇到音频问题,可能是因为 SELinux 阻止堆栈执行(execheap)。
您可以通过 检查审核日志是否包含如下 AVC:
type=AVC msg=audit(...): avc: denied { execheap } for pid=... comm="..."
...
如果您了解风险,可以使用以下命令临时允许此操作(下次启动时重置):
sudo setsebool selinuxuser_execheap 1
或者永久允许:
sudo setsebool -P selinuxuser_execheap 1
Android Studio 模拟器从 flatpak 无法工作
如果您在使用 flatpak 中的 Android Studio 模拟器时遇到问题,可能是因为 SELinux 阻止堆栈执行(execstack)。
您可以通过 检查审核日志是否包含如下 AVC:
type=AVC msg=audit(...): avc: denied { execstack } for pid=... comm="..."
...
如果您了解风险,可以使用以下命令临时允许此操作(下次启动时重置):
sudo setsebool selinuxuser_execstack 1
或者永久允许:
sudo setsebool -P selinuxuser_execstack 1
xen: 允许 qemu 作为守护进程运行
xen 在 xen 中用作 dom0 磁盘后端时,会通过 systemd 将 qemu 作为守护进程运行 (请参阅 xen-qemu-dom0-disk-backend.service)。
默认情况下,这不允许。要允许此操作,请启用布尔值 xen_use_qemu_for_dom0_disk_backend
sudo semanage boolean -m --on xen_use_qemu_for_dom0_disk_backend sudo restorecon -Rv /var/lib/xen/xenstore
有关更多信息,请参阅 bug 1228540。
非标准文件位置
尤其是在使用 btrfs 文件系统时,将一些数据存储在非标准位置可能令人望向。此类措施的一个原因,是优化 btrfs 性能,例如将虚拟机、容器或数据库存储在未启用写时复制的卷中。另一个常见原因,是避免某些数据包含在快照中。
对于所有文件系统,用户目录被重新定位是很常见的。例如,xdg-user-dirs-update 存在于此目的,但它不了解 SELinux。
更改这些位置的系统管理员必须注意 SELinux 文件上下文标记,以确保正常功能。应该注意的是,某些 SELinux 工具无法在 btrfs 子卷边界上正常工作,而是将它们视为单独的文件系统,并且无法标记其中的文件。有关详细信息,请参阅 Bug 1228849。
处理此问题的一种方法是创建 SELinux 文件上下文等效项。这意味着告诉 SELinux 将一个目录视为另一个目录以进行标记。
首先,我们可以创建一个等效项:
sudo semanage fcontext --add --equal "/path/to/stock/directory" "/path/to/custom/location/you/want/to/act/like/stock"
测试一下,看看会发生什么变化,而不会更改任何内容:
sudo restorecon -Rvn "/path/to/custom/location/you/want/to/act/like/stock"
应用更改:
sudo restorecon -R "/path/to/custom/location/you/want/to/act/like/stock"
管理我们创建的等效项:
sepolicy gui
或
sudo semanage fcontext --list -C
创建等效项的另一种方法是,如果已知上下文,则直接指定上下文。以下内容将 selinux_foo_t 标签设置在目录 /path/to/virtual/machine/images 及其所有内容上:
sudo semanage fcontext -a -t selinux_foo_t "/path/to/virtual/machine/images(/.*)?" sudo restorecon -Rvn /path/to/virtual/machine/images sudo restorecon -R
以下是一些修复这些问题的常见示例。
snapper 在非标准快照位置无法工作
snapper 需要其快照位置的特定类型(请参阅 openQA 测试问题 168583)。例如,当将快照添加到目录 /test 时,需要将文件上下文设置为如下所示:
semanage fcontext -a -t 'snapperd_data_t' -s system_u '/test(/.*)?' semanage fcontext -a -t '<<none>>' -s system_u '/test/[^/]*/snapshot(/.*)?'
quota 在非标准位置无法工作
quota 需要其数据库位置的特定类型(请参阅 openQA 测试问题 175338)。例如,当将数据库添加到目录 /test 时,需要将文件上下文设置为如下所示:
semanage fcontext -a -t quota_db_t /test/quota/aquota.user semanage fcontext -a -t quota_db_t /test/quota/aquota.group
rsync 在 SELinux 下无法工作
当使用 rsync 的非标准路径时(例如 /srv/rsync_test),需要为目录设置文件上下文(请参阅 openQA 测试问题 175890):
semanage fcontext -a -t rsync_data_t "/srv/rsync_test(/.*)"
samba/cifs 在 SELinux 下无法工作
当使用 samba 共享(例如在 /srv/samba 中),需要为共享设置文件上下文,因为没有默认位置(请参阅 openQA 测试问题 175839):
semanage fcontext -a -t samba_share_t "/srv/samba(/.*)"
非标准端口
当运行侦听非标准端口的服务时,系统管理员需要设置 SELinux 规则以允许该端口上的连接。
SELinux 对使用非标准端口的 Web 服务器的拒绝
当在非标准端口上运行 Web 服务器时,需要通过允许该端口来调整 SELinux 策略:
sudo semanage port -a -t http_port_t -p tcp 444
(请参阅 openQA 测试问题 168580):
SELinux 对使用非标准端口的 SSH 的拒绝
当在非标准端口上运行 SSH 服务器时,需要让 SELinux 知道正在使用该端口:
sudo semanage port -a -t ssh_port_t -p tcp 63210
仅适用于 MicroOS
/var/lib/selinux 模块删除问题
在 MicroOS 上,SELinux 工具在从删除模块的策略回滚到仍然包含该模块的策略时,可能会遇到一些问题。较新版本中将提供一个解决方法,并且正在进行适当的修复。但是,这可能会发生在旧的快照中。
此问题的症状可以在设置布尔值或重建策略时看到:
libsemanage.semanage_direct_get_module_info: Unable to open aiccu module lang ext file at /var/lib/selinux/targeted/active/modules/100/aiccu/lang_ext. (No such file or directory). semodule: Failed on list!
要修复此问题,请运行:
find /var/lib/selinux/targeted/active/modules/100 -type d -empty -delete && semodule -B
之后,您应该能够再次设置布尔值。