跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

39 配置 SELinux 编辑源文件

在本章中,你将学习如何在 openSUSE Leap 上设置和管理 SELinux。以下主题将被涵盖

  • 为什么使用 SELinux?

  • 理解 SELinux

  • 设置 SELinux

  • 管理 SELinux

39.1 为什么使用 SELinux? 编辑源文件

SELinux 是作为 Linux 内核安全框架中的一个附加 Linux 安全解决方案开发的。其目的是允许更细粒度的安全策略,超越标准的自主访问控制 (DAC),传统的 owner/group/world 文件权限以及 read/write/execute 权限。

一个例子解释了为什么需要像 SELinux(或其对应物 AppArmor)这样的解决方案

有一天早上,我发现我的服务器被黑了。该服务器运行着完全打补丁的 openSUSE Leap 安装。服务器上配置了防火墙,并且该服务器没有提供任何不必要的服务。进一步分析表明,黑客是通过 Apache 虚拟主机中运行的一个易受攻击的 PHP 脚本进入的。入侵者设法获得了 shell 访问权限,使用了 Apache Web 服务器使用的 wwwrun 帐户。作为这个 wwwrun 用户,入侵者在 /var/tmp/tmp 目录中创建了几个脚本,这些脚本是发起针对多个服务器的分布式拒绝服务攻击的僵尸网络的一部分。

关于这次攻击有趣的是,它发生在服务器上,而服务器本身并没有什么问题。所有文件权限都设置正确,但入侵者仍然设法进入了系统。这个例子表明,在某些情况下,需要额外的安全措施。

SELinux 使用附加到对象(例如文件和网络套接字)上的标签,并将其用于访问控制决策。

39.1.1 支持状态 编辑源文件

SELinux 框架在 openSUSE Leap 15.6 上受支持。 openSUSE Leap 提供你需要在服务器上使用 SELinux 的所有二进制文件和库。

不包含策略,你必须构建自己的策略。不支持第三方策略。有关安装 openSUSE 策略以进行测试的信息,请参阅 第 39.3 节,“安装 SELinux 包”第 39.4 节,“安装 SELinux 策略”

39.1.2 理解 SELinux 组件 编辑源文件

在开始配置 SELinux 之前,你应该了解 SELinux 的组织方式。三个组件起作用

  • Linux 内核中的安全框架

  • SELinux 库和二进制文件

  • SELinux 策略

openSUSE Leap 的默认内核支持 SELinux 和管理它所需的工具。管理员在 SELinux 方面最重要的工作是管理策略。

在 SELinux 策略中,安全标签应用于 Linux 服务器上的不同对象。这些对象通常是用户、端口、进程和文件。使用这些安全标签,创建规则来定义服务器上允许和不允许的内容。默认情况下,SELinux 拒绝所有内容,通过创建适当的规则,你可以允许严格必要的访问。因此,应该为你想在系统上使用的所有程序存在规则。

或者,你可以配置系统的某些部分以在未受限制的模式下运行,这意味着特定的端口、程序、用户、文件和目录不受 SELinux 保护。如果想使用 SELinux 保护一些基本服务,此模式很有用。这会使你的系统保护不完整,最好将 SELinux 应用于整个系统。

为了确保系统的适当保护,你需要一个 SELinux 策略。这必须是一个定制的策略,其中所有文件都提供标签,所有服务和用户也具有安全标签,以表达服务器上的哪个用户和进程可以访问哪些文件和目录。开发这样的策略是一项巨大的工作。

一个可免费获得的 SELinux 策略可能适用于你的服务器,但它可能不如定制策略提供相同的保护。SUSE 不支持第三方策略。

39.2 SELinux 策略概述 编辑源文件

策略是 SELinux 中的关键组件。你的 SELinux 策略定义了规则,指定哪些对象可以访问系统上的哪些文件、目录、端口和进程。为此,为这些定义了安全上下文。在应用了策略以标记文件系统的 SELinux 系统上,你可以使用 ls -Z 命令查看该目录中文件的安全上下文。 示例 39.1:“使用 ls -Z 设置安全上下文” 显示了 openSUSE Leap 系统上带有 SELinux 标记文件系统的 / 目录中目录的安全上下文设置。

示例 39.1: 使用 ls -Z 设置安全上下文
> ls -Z /
system_u:object_r:bin_t bin
system_u:object_r:boot_t boot
system_u:object_r:device_t dev
system_u:object_r:etc_t etc
system_u:object_r:home_root_t home
system_u:object_r:lib_t lib
system_u:object_r:lib_t lib64
system_u:object_r:lost_found_t lost+found
system_u:object_r:mnt_t media
system_u:object_r:mnt_t mnt
system_u:object_r:usr_t opt
system_u:object_r:proc_t proc
system_u:object_r:default_t root
system_u:object_r:bin_t sbin
system_u:object_r:security_t selinux
system_u:object_r:var_t srv
system_u:object_r:sysfs_t sys
system_u:object_r:tmp_t tmp
system_u:object_r:usr_t usr
system_u:object_r:var_t var

安全上下文中最重要的行是上下文类型。这是安全上下文的一部分,通常以 _t 结尾。它告诉 SELinux 对象允许哪种类型的访问。在策略中,指定规则以定义哪个类型的用户或哪个类型的角色具有访问哪个类型的上下文的权限。例如,这可以通过使用如下规则来实现

allow user_t bin_t:file {read execute gettattr};

这个示例规则说明,具有上下文类型 user_t(该用户称为源对象)的用户允许使用 readexecutegetattr 权限访问类为“file”且上下文类型为 bin_t(目标)的对象。

SELinux 策略包含大量的规则。为了使其更易于管理,策略通常分为模块。这允许管理员为系统的不同部分打开或关闭保护。

在为你的系统编译策略时,你可以选择使用模块化策略,或使用单体策略,其中一个庞大的策略用于保护系统上的所有内容。强烈建议使用模块化策略,而不是单体策略。模块化策略更易于管理。

39.3 安装 SELinux 包 编辑源文件

从命令行,安装以下包

> sudo zypper in restorecond policycoreutils setools-console

这不会安装策略。有关安装 openSUSE 策略以进行测试的信息,请参阅 第 39.4 节,“安装 SELinux 策略”

39.4 安装 SELinux 策略 编辑源文件

策略是 SELinux 的一个基本组件。 openSUSE Leap 15.6 包含默认策略,你必须构建一个针对你的安装定制的策略。SELinux 策略应针对你的特定需求进行定制。如需帮助,请联系 SUSE 咨询服务。我们建议 slemicro 适用于正在寻找具有完整 SELinux 支持(包括受支持的策略)的容器化或虚拟化主机的客户和合作伙伴。

为了 测试 目的,你可以从 https://download.opensuse.org/repositories/security:/SELinux_legacy/ 获取策略。这为 openSUSE Leap 提供了包含多个附加包(包括策略)的仓库。

  1. 复制与你的 openSUSE Leap 版本匹配的仓库链接,并使用 Zypper 添加它

    > sudo zypper ar -f \
    https://download.opensuse.org/repositories/security:/SELinux_legacy/15.6/ \
    SELinux-Legacy
  2. 安装以下包

    > sudo zypper in selinux-policy-targeted selinux-policy-devel

39.5 将 SELinux 置于 permissive 模式 编辑源文件

在 permissive 模式下,SELinux 不会保护你的系统,但它仍然会记录发生的所有事情。使用此模式进行测试和配置你的系统。

/etc/selinux/config 中,SELinux 默认设置为 permissive 模式。

要启用系统上的 SELinux,请修改 GRUB 2 启动加载程序。在 /etc/default/grub 中,搜索行 GRUB_CMDLINE_LINUX_DEFAULT=。添加以下两个参数

security=selinux selinux=1

第一个参数告诉内核使用 SELinux 而不是 AppArmor。第二个参数启用 SELinux。添加参数后,使用以下命令重新构建你的 GRUB 2 配置

grub2-mkconfig -o /boot/grub2/grub.cfg

现在你可以重新启动。此时,你拥有一个功能正常的 SELinux 系统,并且可以进一步配置它。在当前状态下,SELinux 不会限制任何活动并记录如果它处于 enforcing 模式下应该执行的所有活动。查看日志文件以了解哪些活动不允许。

39.6 将 SELinux 置于 enforcing 模式 编辑源文件

当系统以 permissive 模式运行 SELinux 时,用户和进程可能会错误地标记各种文件系统对象。这可能会在切换到 enforcing 模式时导致问题,因为 SELinux 依赖于文件系统对象的正确标签。

在切换到 enforcing 模式之前,请确保首先重置安全上下文(扩展属性)

> sudo restorecon -R /

现在你可以将 SELinux 置于 enforcing 模式。为此,编辑 /etc/selinux/config 并设置 SELINUX=enforcing

重新启动你的服务器,看看它是否仍然像你期望的那样启动,以及你是否仍然可以登录。

登录后,运行 sestatus -v 命令。它应该给你类似于 示例 39.2:“验证 SELinux 是否正常工作” 的输出。

示例 39.2: 验证 SELinux 是否正常工作
> sudo sestatus -v
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     requested(insecure)
Max kernel policy version:      33

Process contexts:
Current context:                unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
Init context:                   system_u:system_r:init_t:s0
/usr/sbin/sshd                  system_u:system_r:sshd_t:s0-s0:c0.c1023

File contexts:
Controlling terminal:           unconfined_u:object_r:user_tty_device_t:s0
/etc/passwd                     system_u:object_r:passwd_file_t:s0
/etc/shadow                     system_u:object_r:shadow_t:s0
/bin/bash                       system_u:object_r:shell_exec_t:s0 \
                                -> system_u:object_r:shell_exec_t:s0
/bin/login                      system_u:object_r:login_exec_t:s0
/bin/sh                         system_u:object_r:bin_t:s0 \
                                -> system_u:object_r:shell_exec_t:s0
/sbin/agetty                    system_u:object_r:bin_t:s0 \
                                -> system_u:object_r:getty_exec_t:s0
/sbin/init                      system_u:object_r:bin_t:s0 -> \
                                system_u:object_r:init_exec_t:s0
/usr/sbin/sshd                  system_u:object_r:sshd_exec_t:s0

如果你无法在 enforcing 模式下正确启动服务器,请切换回 permissive 模式。使用 less /var/log/audit/audit.log 检查日志文件。有关更多详细信息,请参阅 第 39.9 节,“故障排除”

39.7 配置 SELinux 编辑源文件

在开始调整你的服务器之前,请验证 SELinux 安装。你已经使用 sestatus -v 命令查看当前模式、进程和文件上下文。接下来,运行

> sudo semanage boolean -l

它列出了所有可用的布尔开关,并同时验证你可以访问策略。 示例 39.3,“获取布尔列表并验证策略访问” 显示了此命令的部分输出。

示例 39.3: 获取布尔列表并验证策略访问
> sudo semanage boolean -l
SELinux boolean                          Description
ftp_home_dir                   -> off   ftp_home_dir
mozilla_read_content           -> off   mozilla_read_content
spamassassin_can_network       -> off   spamassassin_can_network
httpd_can_network_relay        -> off   httpd_can_network_relay
openvpn_enable_homedirs        -> off   openvpn_enable_homedirs
gpg_agent_env_file             -> off   gpg_agent_env_file
allow_httpd_awstats_script_anon_write -> off   allow_httpd_awstats_script_anon_write
httpd_can_network_connect_db   -> off   httpd_can_network_connect_db
allow_ftpd_full_access         -> off   allow_ftpd_full_access
samba_domain_controller        -> off   samba_domain_controller
httpd_enable_cgi               -> off   httpd_enable_cgi
virt_use_nfs                   -> off   virt_use_nfs

另一个输出有用信息的命令是

> sudo semanage fcontext -l

它显示了策略提供的默认文件上下文设置(请参阅 示例 39.4:“获取文件上下文信息”,了解此命令的部分输出)。

示例 39.4: 获取文件上下文信息
> sudo semanage fcontext -l
/var/run/usb(/.*)?                                 all files          system_u:object_r:hotplug_var_run_t
/var/run/utmp                                      regular file       system_u:object_r:initrc_var_run_t
/var/run/vbe.*                                     regular file       system_u:object_r:hald_var_run_t
/var/run/vmnat.*                                   socket             system_u:object_r:vmware_var_run_t
/var/run/vmware.*                                  all files          system_u:object_r:vmware_var_run_t
/var/run/watchdog\.pid                             regular file       system_u:object_r:watchdog_var_run_t
/var/run/winbindd(/.*)?                            all files          system_u:object_r:winbind_var_run_t
/var/run/wnn-unix(/.*)                             all files          system_u:object_r:canna_var_run_t
/var/run/wpa_supplicant(/.*)?                      all files          system_u:object_r:NetworkManager_var_run_t
/var/run/wpa_supplicant-global                     socket             system_u:object_r:NetworkManager_var_run_t
/var/run/xdmctl(/.*)?                              all files          system_u:object_r:xdm_var_run_t
/var/run/yiff-[0-9]+\.pid                          regular file       system_u:object_r:soundd_var_run_t

39.8 管理 SELinux 编辑源文件

SELinux 的基本配置现在已生效,可以对其进行配置以保护您的服务器。在 SELinux 中,使用一组额外的规则来定义哪个进程或用户可以访问哪些文件、目录或端口。为此,SELinux 会将上下文应用于每个文件、目录、进程和端口。此上下文是一个安全标签,定义了应该如何处理此文件、目录、进程或端口。这些上下文标签由 SELinux 策略使用,该策略定义了应该如何处理这些上下文标签。默认情况下,该策略会阻止所有非默认访问,这意味着作为管理员,您需要启用服务器上所有非默认功能。

39.8.1 查看安全上下文 编辑源文件

如前所述,可以标记文件、目录和端口。在每个标签中,使用不同的上下文。为了能够执行日常管理工作,您最感兴趣的是类型上下文。作为管理员,您使用类型上下文。许多命令允许您使用 -Z 选项来列出当前的上下文设置。在 示例 39.5:“根目录中目录的默认上下文” 中,您可以查看根目录中目录的上下文设置。

示例 39.5: 根目录中目录的默认上下文
> sudo ls -Z
dr-xr-xr-x. root root system_u:object_r:bin_t:s0       bin
dr-xr-xr-x. root root system_u:object_r:boot_t:s0      boot
drwxr-xr-x. root root system_u:object_r:cgroup_t:s0    cgroup
drwxr-xr-x+ root root unconfined_u:object_r:default_t:s0 data
drwxr-xr-x. root root system_u:object_r:device_t:s0    dev
drwxr-xr-x. root root system_u:object_r:etc_t:s0       etc
drwxr-xr-x. root root system_u:object_r:home_root_t:s0 home
dr-xr-xr-x. root root system_u:object_r:lib_t:s0       lib
dr-xr-xr-x. root root system_u:object_r:lib_t:s0       lib64
drwx------. root root system_u:object_r:lost_found_t:s0 lost+found
drwxr-xr-x. root root system_u:object_r:mnt_t:s0       media
drwxr-xr-x. root root system_u:object_r:autofs_t:s0    misc
drwxr-xr-x. root root system_u:object_r:mnt_t:s0       mnt
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 mnt2
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 mounts
drwxr-xr-x. root root system_u:object_r:autofs_t:s0    net
drwxr-xr-x. root root system_u:object_r:usr_t:s0       opt
dr-xr-xr-x. root root system_u:object_r:proc_t:s0      proc
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 repo
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 root
dr-xr-xr-x. root root system_u:object_r:bin_t:s0       sbin
drwxr-xr-x. root root system_u:object_r:security_t:s0  selinux
drwxr-xr-x. root root system_u:object_r:var_t:s0       srv
-rw-r--r--. root root unconfined_u:object_r:swapfile_t:s0 swapfile
drwxr-xr-x. root root system_u:object_r:sysfs_t:s0     sys
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       tmp
-rw-r--r--. root root unconfined_u:object_r:etc_runtime_t:s0 tmp2.tar
-rw-r--r--. root root unconfined_u:object_r:etc_runtime_t:s0 tmp.tar
drwxr-xr-x. root root system_u:object_r:usr_t:s0       usr
drwxr-xr-x. root root system_u:object_r:var_t:s0       var

在上面的列表中,您可以查看所有目录的完整上下文。它由用户、角色和类型组成。s0 设置指示多级安全环境中的安全级别。这些环境在此处不做讨论。在这种环境中,请确保设置 s0。上下文类型定义了允许在目录中进行哪种类型的活动。例如,比较 /root 目录,它具有 admin_home_t 上下文类型,以及 /home 目录,它具有 home_root_t 上下文类型。在 SELinux 策略中,为这些上下文类型定义了不同类型的访问权限。

安全标签不仅与文件相关联,还与端口和进程等其他项目相关联。在 示例 39.6:“使用 ps Zaux 显示进程的 SELinux 设置” 中,例如,您可以查看服务器上进程的上下文设置。

示例 39.6: 使用 ps Zaux 显示进程的 SELinux 设置
> sudo ps Zaux
LABEL                           USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
system_u:system_r:init_t        root         1  0.0  0.0  10640   808 ?        Ss   05:31   0:00 init [5]
system_u:system_r:kernel_t      root         2  0.0  0.0      0     0 ?        S    05:31   0:00 [kthreadd]
system_u:system_r:kernel_t      root         3  0.0  0.0      0     0 ?        S    05:31   0:00 [ksoftirqd/0]
system_u:system_r:kernel_t      root         6  0.0  0.0      0     0 ?        S    05:31   0:00 [migration/0]
system_u:system_r:kernel_t      root         7  0.0  0.0      0     0 ?        S    05:31   0:00 [watchdog/0]
system_u:system_r:sysadm_t      root      2344  0.0  0.0  27640   852 ?        Ss   05:32   0:00 /usr/sbin/mcelog --daemon --config-file /etc/mcelog/mcelog.conf
system_u:system_r:sshd_t        root      3245  0.0  0.0  69300  1492 ?        Ss   05:32   0:00 /usr/sbin/sshd -o PidFile=/var/run/sshd.init.pid
system_u:system_r:cupsd_t       root      3265  0.0  0.0  68176  2852 ?        Ss   05:32   0:00 /usr/sbin/cupsd
system_u:system_r:nscd_t        root      3267  0.0  0.0 772876  1380 ?        Ssl  05:32   0:00 /usr/sbin/nscd
system_u:system_r:postfix_master_t root   3334  0.0  0.0  38320  2424 ?        Ss   05:32   0:00 /usr/lib/postfix/master
system_u:system_r:postfix_qmgr_t postfix  3358  0.0  0.0  40216  2252 ?        S    05:32   0:00 qmgr -l -t fifo -u
system_u:system_r:crond_t       root      3415  0.0  0.0  14900   800 ?        Ss   05:32   0:00 /usr/sbin/cron
system_u:system_r:fsdaemon_t    root      3437  0.0  0.0  16468  1040 ?        S    05:32   0:00 /usr/sbin/smartd
system_u:system_r:sysadm_t      root      3441  0.0  0.0  66916  2152 ?        Ss   05:32   0:00 login -- root
system_u:system_r:sysadm_t      root      3442  0.0  0.0   4596   800 tty2     Ss+  05:32   0:00 /sbin/mingetty tty2

39.8.2 选择 SELinux 模式 编辑源文件

在 SELinux 中,可以使用三种不同的模式

强制

这是默认模式。SELinux 根据策略中的规则保护您的服务器,并且 SELinux 会将所有活动记录到审核日志中。

宽容

此模式对于故障排除很有用。如果设置为宽容,SELinux 不会保护您的服务器,但它仍然会将所有内容记录到日志文件中。

禁用

在这种模式下,SELinux 被关闭,并且不进行任何记录。文件系统标签不会从文件系统中删除。

您已经阅读了如何在启动时使用 enforcing 启动参数从 GRUB 2 设置当前的 SELinux 模式。

39.8.3 修改 SELinux 上下文类型 编辑源文件

管理员工作的重要部分是在文件上设置上下文类型,以确保 SELinux 的正常工作。

如果在特定目录中创建文件,则默认情况下它会继承父目录的上下文类型。如果将文件从一个位置移动到另一个位置,它将保留在旧位置中拥有的上下文类型。

要设置文件的上下文类型,可以使用 semanage fcontext 命令。使用此命令,您将新的上下文类型写入策略,但它不会立即更改实际的上下文类型。要应用策略中的上下文类型,您需要在之后运行 restorecon 命令。

在使用 semanage fcontext 时面临的挑战是找出您需要的上下文。您可以使用

> sudo semanage fcontext -l

列出策略中的所有上下文,但由于列表比较长,因此可能很难从列表中找到您实际需要的上下文(参见 示例 39.7:“查看默认文件上下文”)。

示例 39.7: 查看默认文件上下文
> sudo semanage fcontext -l | less
SELinux fcontext                                   type               Context

/                                                  directory          system_u:object_r:root_t:s0
/.*                                                all files          system_u:object_r:default_t:s0
/[^/]+                                             regular file       system_u:object_r:etc_runtime_t:s0
/\.autofsck                                        regular file       system_u:object_r:etc_runtime_t:s0
/\.autorelabel                                     regular file       system_u:object_r:etc_runtime_t:s0
/\.journal                                         all files          X:>>None>>
/\.suspended                                       regular file       system_u:object_r:etc_runtime_t:s0
/a?quota\.(user|group)                             regular file       system_u:object_r:quota_db_t:s0
/afs                                               directory          system_u:object_r:mnt_t:s0
/bin                                               directory          system_u:object_r:bin_t:s0
/bin/.*                                            all files          system_u:object_r:bin_t:s0

有三种方法可以找到适用于您的服务的上下文设置

  • 安装该服务并查看使用的默认上下文设置。这是最简单和推荐的选项。

  • 查阅特定服务的 man 手册。某些服务具有以 _selinux 结尾的 man 手册,其中包含找到正确的上下文设置所需的所有信息。

    找到正确的上下文设置后,使用 semanage fcontext 应用它。此命令将上下文类型作为第一个参数,后跟要应用上下文设置的目录或文件名。要将上下文应用于目录中已存在的所有内容,您需要将正则表达式 (/.*)? 添加到目录名称中。这意味着:可选地,匹配一个斜杠后跟任何字符。 semanage man 手册的示例部分包含 semanage 的一些有用的用法示例。有关正则表达式的更多信息,请参阅例如 https://regexper.cn/ 处的教程。

  • 显示系统中可用的所有上下文类型的列表

    > sudo seinfo -t

    由于该命令本身会输出大量信息,因此应将其与 grep 或类似的命令结合使用进行筛选。

39.8.4 应用文件上下文 编辑源文件

为了帮助您正确应用 SELinux 上下文,以下过程演示了如何使用 semanage fcontextrestorecon 设置上下文。您会注意到,在第一次尝试时,具有非默认文档根目录的 Web 服务器无法正常工作。更改 SELinux 上下文后,它就可以正常工作了

  1. 创建 /web 目录,然后切换到它

    > sudo mkdir /web  && cd /web
  2. 使用文本编辑器创建文件 /web/index.html,其中包含文本欢迎来到我的网站。

  3. 使用编辑器打开文件 /etc/apache2/default-server.conf,并将 DocumentRoot 行更改为 DocumentRoot /web

  4. 启动 Apache Web 服务器

    > sudo systemctl start apache2
  5. 打开到本地 Web 服务器的会话

    > w3m localhost

    您收到 连接被拒绝 消息。按 Enter,然后按 q 退出 w3m。

  6. 找到默认 Apache DocumentRoot 的当前上下文类型,即 /srv/www/htdocs。它应设置为 httpd_sys_content_t

    > sudo ls -Z /srv/www
  7. 设置策略中的新上下文并按 Enter

    > sudo semanage fcontext -a -f "" -t httpd_sys_content_t '/web(/.*) ?'
  8. 应用新的上下文类型

    > sudo restorecon /web
  9. 显示目录 /web 中的文件的上下文。您可以看到新的上下文类型已正确设置为 /web 目录,但未设置为其内容。

    > sudo ls -Z /web
  10. 递归地将新的上下文应用于 /web 目录。现在已正确设置类型上下文。

    > sudo restorecon -R /web
  11. 重新启动 Web 服务器

    > sudo systemctl restart apache2

    现在应该能够访问 /web 目录的内容。

39.8.5 配置 SELinux 策略 编辑源文件

更改策略行为的最简单方法是使用布尔值。这些是启用/禁用开关,您可以使用它们来更改策略中的设置。要找到可用的布尔值,请运行

> sudo semanage boolean -l

它显示一个长长的布尔值列表,以及每个布尔值对您所做的内容的简短描述。找到要设置的布尔值后,可以使用 setsebool -P,后跟要更改的布尔值的名称。始终在使用 setsebool 时使用 -P 选项非常重要。此选项将设置写入磁盘上的策略文件,这是确保在重新启动后自动应用布尔值的唯一方法。

以下过程提供了一个更改布尔值设置的示例

  1. 列出与 FTP 服务器相关的布尔值。

    > sudo semanage boolean -l | grep ftp
  2. 关闭布尔值

    > sudo setsebool allow_ftpd_anon_write off

    更改所需的时间不多。然后验证布尔值是否确实已关闭

    > sudo semanage boolean -l|grep ftpd_anon
  3. 重新启动您的服务器。

  4. 再次检查以查看 allow_ftpd_anon_write 布尔值是否仍然打开。由于它尚未写入策略,您会注意到它已关闭。

  5. 切换布尔值并将设置写入策略

    > sudo setsebool -P allow_ftpd_anon_write

39.8.6 使用 SELinux 模块 编辑源文件

默认情况下,SELinux 使用模块化策略。这意味着实现 SELinux 功能的策略不是一个巨大的策略,而是由许多较小的模块组成。每个模块涵盖 SELinux 配置的特定部分。引入 SELinux 模块的概念是为了让第三方供应商更容易使他们的服务与 SELinux 兼容。要概述 SELinux 模块,可以使用 semodule -l 命令。此命令列出 SELinux 当前使用的所有模块及其版本号。

作为管理员,您可以打开或关闭模块。这对于仅禁用 SELinux 的一部分而不是全部以运行没有 SELinux 保护的服务很有用。尤其是在 openSUSE Leap 中,由于尚未完全支持 SELinux 策略,因此关闭所有您不需要的模块可能是有意义的,以便您可以专注于真正需要 SELinux 保护的服务。要关闭 SELinux 模块,请使用

> sudo semodule -d MODULENAME

要再次打开它,可以使用

> sudo semodule -e modulename

39.9 故障排除 编辑源文件

默认情况下,如果 SELinux 是导致某些事情无法正常工作的原因,则会将一条日志消息发送到 /var/log/audit/audit.log 文件。也就是说,如果 auditd 服务正在运行。如果您看到空的 /var/log/audit,请使用以下命令启动 auditd 服务

> sudo systemctl start auditd

并将其启用在系统的目标中,使用

> sudo systemctl enable auditd

您可以在下面看到 /var/log/audit/audit.log 内容的示例

示例 39.8: /var/log/audit/audit.log 中的示例行
type=DAEMON_START msg=audit(1348173810.874:6248): auditd start, ver=1.7.7 format=raw kernel=6.4.0-150600.9-default auid=0 pid=4235 subj=system_u:system_r:auditd_t res=success
type=AVC msg=audit(1348173901.081:292): avc:  denied  { write } for  pid=3426 comm="smartd" name="smartmontools" dev=sda6 ino=581743 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:293): avc:  denied  { remove_name } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:294): avc:  denied  { unlink } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:295): avc:  denied  { rename } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582373 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:296): avc:  denied  { add_name } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state~" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=dir
type=AVC msg=audit(1348173901.081:297): avc:  denied  { create } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:298): avc:  denied  { write open } for  pid=3426 comm="smartd" name="smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.081:299): avc:  denied  { getattr } for  pid=3426 comm="smartd" path="/var/lib/smartmontools/smartd.WDC_WD2500BEKT_75PVMT0-WD_WXC1A21E0454.ata.state" dev=sda6 ino=582390 scontext=system_u:system_r:fsdaemon_t tcontext=system_u:object_r:var_lib_t tclass=file
type=AVC msg=audit(1348173901.309:300): avc:  denied  { append } for  pid=1316

乍一看,audit.log 中的行有点难以阅读。但是,仔细检查后,它们并不难理解。每行都可以分解为几个部分。例如,最后一行中的部分是

type=AVC:

每条 SELinux 相关的审核日志行都以类型标识 type=AVC 开头

msg=audit(1348173901.309:300):

这是时间戳,不幸的是,它以纪元时间编写,即自 1970 年 1 月 1 日以来经过的秒数。您可以使用 date -d 在纪元时间表示法中的小数点之前的部分来找出事件发生的时间

> date -d @1348173901
Thu Sep 20 16:45:01 EDT 2012
avc: denied { append }:

被拒绝的具体操作。在这种情况下,系统拒绝将数据附加到文件。在浏览审核日志文件时,您可以看到其他系统操作,例如写入打开、getattr 等。

for pid=1316:

发起操作的命令或进程的进程 ID

comm="rsyslogd":

与该 PID 关联的特定命令

name="smartmontools":

动作主体的名称

dev=sda6 ino=582296:

涉及文件的块设备和 inode 号

scontext=system_u:system_r:syslogd_t:

源上下文,即动作发起者的上下文

tclass=file:

主体的一个类别标识

与其自己解析 audit.log 中的事件不同,还有另一种方法。您可以使用 audit2allow 命令,该命令有助于分析 /var/log/audit/audit.log 中的晦涩日志消息。audit2allow 故障排除会话始终由三个不同的命令组成。首先,您将使用 audit2allow -w -a 以更易读的方式呈现审计信息。默认情况下,audit2allow -w -a 适用于 audit.log 文件。如果您想分析 audit.log 文件中的特定消息,请将其复制到临时文件并使用

> sudo audit2allow -w -i FILENAME
示例 39.9: 分析审计消息
> sudo audit2allow -w -i testfile
type=AVC msg=audit(1348173901.309:300): avc:  denied  { append } for  pid=1316
comm="rsyslogd" name="acpid" dev=sda6 ino=582296
scontext=system_u:system_r:syslogd_t tcontext=system_u:object_r:apmd_log_t tclass=file
这是由

缺少类型强制 (TE) 允许规则引起的。

要生成一个可加载的模块以允许此访问,请运行

> sudo audit2allow

要找出哪个特定的规则拒绝了访问,您可以使用 audit2allow -a 来显示从记录到 audit.log 文件中的所有事件中强制执行的规则,或者使用 audit2allow -i FILENAME 来显示存储在特定文件中的消息的规则

示例 39.10: 查看哪些行拒绝访问
> sudo audit2allow -i testfile
#============= syslogd_t ==============
allow syslogd_t apmd_log_t:file append;

要创建一个名为 mymodule 的 SELinux 模块,您可以加载该模块以允许先前拒绝的访问,请运行

> sudo audit2allow -a -R -M mymodule

如果您想对记录到 audit.log 的所有事件执行此操作,请使用 -a -M 命令参数。对于存储在特定文件中的特定消息,请使用 -i -M,如下例所示

示例 39.11: 创建允许先前拒绝的操作的策略模块
> sudo audit2allow -i testfile -M example
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i example.pp

audit2allow 命令所示,您现在可以使用 semodule -i 命令运行此模块,后跟 audit2allow 为您创建的模块的名称(上述示例中的 example.pp)。

打印此页面