SELinux
- 解释
本主题提供有关安全增强式 Linux 的基本信息。
- 原因
您想要了解 SELinux,以及如何在 SLE Micro 上配置它。
- 工作量
阅读时间大约为 40 分钟。
1 关于 SELinux #
SELinux 是作为附加的 Linux 安全解决方案开发的,它运用了 Linux 内核中的安全框架。其目的是实现更精细的安全策略,可以超越标准的自由访问控制 (DAC),即传统的所有者/组/全局和读取/写入/执行文件权限控制。
SELinux 使用附加到对象(例如文件和网络套接字)的标签,并使用它们来做出访问决策。
SELinux 的默认操作是拒绝任何访问。SELinux 仅允许 SELinux 策略中明确允许的操作。另一项提高安全性的 SELinux 功能是,SELinux 允许严格限制进程,以至于进程无法访问同一系统上其他进程的文件。
SELinux 旨在增强而不是取代现有安全解决方案。例如,即使系统使用 SELinux,也仍会应用自由访问控制 (DAC)。如果 DAC 首先拒绝访问,则不会使用 SELinux,因为访问已由另一机制阻止。
2 获取 SELinux #
通过 YaST 安装 SLE Micro 时默认会安装 SELinux,有时会将其安装为预构建映像的一部分。
如果您的系统上未安装 SELinux,请运行以下命令:
#
transactional-update setup-selinux
该命令完成后,重引导您的系统。该命令将安装 SELinux 策略(如果尚未安装),设置 enforcing
SELinux 模式并重构建 initrd
。
3 SELinux 模式 #
SELinux 可在以下三种模式之一下运行:disabled
、permissive
或 enforcing
。
使用 disabled
模式意味着不应用 SELinux 策略中的规则,因而您的系统不受保护。因此我们不建议使用 disabled
模式。
在 permissive
模式下,SELinux 处于活动状态,将加载安全策略、标记文件系统,并记录拒绝访问错误项。但是,不会实施策略,因此实际上并未拒绝访问。
在 enforced
模式下,将应用安全策略。将拒绝未受策略明确允许的每种访问。
有关在 SELinux 模式之间切换的信息,请参见第 3.1 节 “更改 SELinux 模式”。
3.1 更改 SELinux 模式 #
可以暂时或永久切换 SELinux 模式。
3.1.1 暂时更改 SELinux 模式 #
要暂时将 SELinux 设置为 permissive
或 enforcing
,请使用 setenforce
命令。
setenforce
命令的语法如下:
#
setenforceMODE_ID
其中,MODE_ID 为 0(对于 permissive
模式)或 1(对于 enforced
模式)。
请记住,无法使用 setenforce
命令禁用 SELinux。
3.1.2 永久更改 SELinux 模式 #
要对 SELinux 模式执行更改,使其在重引导系统后仍会保留,请编辑 /etc/selinux/config
配置文件。在此文件中,还可以禁用系统上的 SELinux。但不建议执行此操作。如果 SELinux 可能会给您的系统造成问题,请切换到 permissive
模式并调试系统。
在文件 /etc/selinux/config
中,将 SELINUX
的值更改为 disabled
、permissive
或 enforced
,如下所示:
SELINUX=disabled
在该文件中所做的更改将在下次重引导后应用。
disabled
模式切换后重新标记系统
如果您在系统上禁用 SELinux,然后又重新启用,请务必重新标记您的系统。如果您禁用 SELinux 并对文件系统执行更改,更改将不再反映在环境中(例如,新文件没有任何环境)。因此,需要使用 restorecon
命令、使用 autorelabel
引导参数或通过创建一个在下次引导时触发重新标记的文件,来重新标记您的系统。要创建该文件,请运行以下命令:
#
touch /etc/selinux/.autorelabel
重引导后,文件 /etc/selinux/.autorelabel
将由另一个标志文件 /etc/selinux/.relabelled
替换,以防止在后续重引导时进行重新标记。
3.1.3 校验活动的 SELinux 模式 #
要校验模式,请运行以下命令:
#
getenforce
该命令应返回 permissive
或 enforced
,具体取决于提供的 MODE_ID。
3.2 校验 SELinux 是否正常运行 #
如果您正在执行配置更改,切换到宽松模式可能很有用。在此期间,用户可能会错误地标记文件,从而在切换回强制模式时导致出现问题。
要将系统恢复为受保护状态,请执行以下步骤:
重置安全环境:
>
sudo
restorecon -R /
通过在
/etc/selinux/config
中设置SELINUX=enforcing
切换到强制模式。重引导系统并再次登录。
运行
sestatus -v
命令:该命令应返回如下所示的输出:>
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如果系统工作不正常,请检查
/var/log/audit/audit.log
中的日志文件。有关详细信息,请参考 SELinux 查错。
4 SELinux 安全环境 #
安全环境是指派给文件或进程的一系列信息。它由 SELinux 用户、角色、类型、级别和类别组成。此信息用于做出访问控制决策。
- SELinux 用户
策略中定义的身份,已根据特定的一组角色和特定的级别范围为其授权。每个 Linux 用户只会映射到一个 SELinux 用户。但是,一个 SELinux 用户可以拥有多个角色。
SELinux 不使用 Linux 在
/etc/passwd
中维护的用户帐户列表,而是使用自身的数据库和映射。按照惯例,身份名称以_u
为后缀,例如:user_u
。如果创建了新的 Linux 帐户但未为该帐户指派 SELinux 用户,则会使用默认的 SELinux 用户。默认值通常为
unconfined_u
。有关更改默认值的过程,请参见第 7.5.2 节 “semanage login
命令”。- 角色
定义可为用户授予的一组权限。角色定义了指派到此角色的用户可以访问哪些类型。按照惯例,角色名称以
_r
为后缀,例如:system_r
。- 类型
类型传达了有关特定文件和进程如何交互的信息。进程由具有具体 SELinux 类型的文件组成,它无法访问此类型之外的文件。按照惯例,类型名称以
_t
为后缀,例如:var_t
。- 级别
一个可选属性,用于指定多级别安全性中的许可级别范围。
- 类别
一个可选属性,用于为进程、文件和用户添加类别。然后用户可以访问具有相同类别的文件。
下面是 SELinux 环境的示例:
allow user_t bin_t:file {read execute gettattr};
此示例规则规定,允许环境类型为 user_t
的用户(此用户称为源对象)使用权限 read
、execute
和 getattr
,来访问环境类型为 bin_t
的类文件(目标)的对象。
5 SELinux 策略概览 #
策略是 SELinux 中的关键组件。SELinux 策略定义了规则,这些规则指定哪些对象可以访问系统上的哪些文件、目录、端口和进程。为此,需为所有这些对象定义一个安全环境。
SELinux 策略包含巨量的规则。为使其更易于管理,通常会将策略分割成多个模块。这样,管理员便可为不同的系统组件打开或关闭保护。
为系统编译策略时,您可以选择使用模块化策略或单体式策略,如果选择后者,将使用一个巨型策略来保护系统上的一切组件。我们强烈建议使用模块化策略而不是单体式策略。模块化策略要容易管理得多。
SLE Micro 随附了 targeted
SELinux 策略。
5.1 使用 SELinux 模块 #
作为管理员,您可以开启或关闭模块。如果您只想禁用 SELinux 策略的某个部分,并且不希望在关闭 SELinux 保护的情况下运行特定的服务,则此功能可能很有用。
要查看正在使用的所有 SELinux 策略模块,请运行以下命令:
semodule -l
获取要关闭的模块名称后,运行以下命令:
>
sudo
semodule -d MODULENAME
要打开策略模块,请运行以下命令:
>
sudo
semodule -e MODULENAME
5.2 为容器创建策略 #
SLE Micro 附带的某个策略在默认情况下不允许容器访问容器数据之外的文件。另一方面,它允许进行各种网络访问。通常,容器是使用绑定挂载点创建的,应该能够访问 /home
或 /var
等其他目录。您可能希望能够允许访问这些目录,或者相反,您希望即使系统上使用了 SELinux,也仅限容器访问某些端口。在这种情况下,需要创建新的策略规则来启用或禁用访问。SLE Micro 为此提供了 Udica 工具。
以下过程说明如何为容器创建自定义策略:
确保 SELinux 处于强制模式。有关细节,请参见第 3.1 节 “更改 SELinux 模式”。
使用以下参数启动容器:
#
podman run -v /home:/home:rw -v /var/:/var/:rw -p 21:21 -it sle15 bash容器使用默认策略运行,该策略不允许访问挂载点,但不限制其他端口。
您可以退出容器。
获取容器 ID:
#
podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e59f9d0f86f2 registry.opensuse.org/devel/bci/tumbleweed/containerfile/opensuse/bci/ruby:latest /bin/bash 8 minutes ago Up 8 seconds ago 0.0.0.0:21->21/tcp zen_ramanujan创建一个 JSON 文件,供 Udica 用来为容器创建自定义策略:
#
podman inspect e59f9d0f86f2 >OUTPUT_JSON_FILE例如,将 OUTPUT_JSON_FILE 替换为
container.json
。运行 Udica 以根据容器参数生成策略:
#
udica -jOUTPUT_JSON_FILECUSTOM_CONTAINER_POLICY例如:
#
udica -j container.json custom_policy根据提供的说明,运行以下命令来加载策略模块:
#
semodule -i custom_policy.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}使用
--security-opt
选项通过新策略模块运行容器,如下所示:#
podman run --security-opt label=type:custom_policy.process -v /home:/home:rw -v /var/:/var/:rw -p 21:21 -it sle15 bash
6 SELinux 布尔值 #
SELinux 布尔值支持灵活的策略管理方法。例如,使用布尔值可以在一台服务器上禁用特定策略,同时使该策略在另一台服务器上保持活动状态。换句话说,可将布尔值理解为策略规则的开关。您无需更改特定的策略,而可以将其关闭。在策略代码中,布尔值称为可调参数。由于布尔值包含在策略中,因此在加载策略后即可供使用。
对布尔值所做的更改可以是永久性的,也可以是暂时性的(保留到会话结束为止)。
使用 SELinux 提供的工具可以列出和查看细节,或更改布尔值的状态。有关细节,请参见以下几节。
6.1 使用布尔值 #
6.1.1 列出布尔值 #
可以使用 getsebool
或 semanage
命令列出当前定义的布尔值。要列出当前定义的所有布尔值及其状态,请运行以下命令:
#
getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
abrt_upload_watch_anon_write --> on
...
要获取有关特定布尔值的更多细节,可如下所示使用 semanage
命令:
#
semanage boolean -l
SELinux boolean State Default Description
abrt_anon_write (off , off) Allow abrt to anon write
abrt_handle_event (off , off) Allow abrt to handle event
abrt_upload_watch_anon_write (on , on) Allow abrt to upload watch anon write
要获取单个布尔值的状态,可使用以下命令:
#
getseboolBOOLEAN_NAME
或者,可以对 semanage boolean
输出使用 grep
命令:
#
semanage boolean -l | grepBOOLEAN_NAME
6.1.2 切换布尔值 #
setsebool
和 semanage
命令可用于切换布尔值。可以永久或暂时(保留到会话结束为止)更改布尔状态。要暂时更改布尔值,请运行以下命令:
#
setseboolBOOLEAN_NAMEBOOLEAN_VALUE
其中 BOOLEAN_VALUE 为 on
或 off
。
要永久更改布尔值,请运行以下两个命令之一:
#
setsebool -PBOOLEAN_NAMEBOOLEAN_VALUE
或者,使用 semanage
命令:
#
semanage boolean -m --BOOLEAN_VALUEBOOLEAN_NAME
其中 BOOLEAN_VALUE 为 on
或 off
。
一个布尔值可以启用或禁用多个策略规则。要查看哪些布尔值启用或禁用了哪些策略规则,请使用 sedispol
工具,它可以分析策略文件:
#
sedispol /etc/selinux/targeted/policy/policy.32
由于策略规则通常很大,我们建议通过选择 f
并指定文件名来设置输出文件。指定文件名后,按 6
。然后您可以检查该文件。
7 用于管理 SELinux 的工具 #
SLE Micro 提供了用于管理系统上的 SELinux 的工具。如果您的系统上未安装下述工具,请运行以下命令安装这些工具:
#
transactional-update pkg install policycoreutils-python-utils
安装成功后,重引导系统。
7.1 使用 Z
选项 #
安装并配置 SELinux 后,可将 -Z
用于 ls
、id
或 ps
等普通命令。使用此选项可以显示文件或进程的安全环境。例如,使用 ls
命令:
>
ls -Z /etc/shadow
system_u:object_r:shadow_t:s0 /etc/shadow
7.2 chcon
命令 #
命令名称 chcon
代表更改环境。该命令可将文件的整个安全环境更改为 CLI 中提供的值,或者可以更改环境的某些部分。或者,您可以提供某个文件作为参考。
要更改文件的整个安全环境,命令语法如下:
#
chconSECURITY_CONTEXTFILENAME
其中:
SECURITY_CONTEXT 的格式为:SELinux_USER:ROLE:TYPE:LEVEL:CATEGORY。例如,环境可能是:system_u:object_r:httpd_config_t:s0。
FILENAME 是要更改其环境的文件的路径。
要根据作为参考提供的文件设置安全环境,请如下所示运行 chcon
:
#
chcon --reference=REFERENCE_FILEFILENAME
其中:
REFERENCE_FILE 是要用作参考的文件的路径。
FILENAME 是要更改其环境的文件的路径。
或者,可以仅更改安全环境的某个部分。chcon
命令的一般语法如下:
#
chconCONTEXT_OPTIONCONTEXT_PARTFILENAME
选项和参数的含义如下:
根据环境部分,CONTEXT_OPTION 可为下列其中一项:
-u
,表示--user
表示根据提供的文件更改 SELinux 用户环境:
#
chcon -u system_u logind.conf-r
,表示--role
仅更改所提供文件的环境中的角色部分:
#
chcon -r object_r logind.conf-t
,表示--type
仅更改所提供文件的环境中的类型部分:
#
chcon -t etc_t logind.conf-l
,表示--range
仅更改安全环境的范围部分:
#
chcon -l s0 logind.conf
CONTEXT_PART 是要设置的安全环境的特定值。
FILENAME 是要更改其环境的文件的路径。
chcon
默认情况下,当您更改符号链接的安全环境时,链接目标的环境将会更改,而符号链接环境则不会更改。要强制 chcon
更改符号链接而不是链接目标的环境,请如下所示使用 --no-dereference
选项:
#
chcon --no-dereference -u system_u -t etc_t network.conf
可以使用 recursive 选项更改目录中所有文件的环境:
#
chcon --recursive system_u:object_r:httpd_config_t:s0 conf.d
7.3 getenforce
和 setenforce
命令 #
getenforce
命令返回当前的 SELinux 模式:Enforcing
、Permissive
或 Disabled
。
#
getenforce
Permissive
setenforce
命令暂时将 SELinux 模式更改为强制或宽松。无法使用此命令禁用 SELinux。请记住,更改只能保留到下次重引导为止。要永久更改状态,请按照第 3.1 节 “更改 SELinux 模式”中的说明操作。
#
setenforceMODE_ID
其中,MODE_ID 为 0(对于 permissive
模式)或 1(对于 enforced
模式)。
7.4 fixfiles
脚本 #
使用该脚本可对安全环境执行以下任务:
检查环境是否正确
更改任何错误的文件环境标签
在添加新策略后重新标记您的系统
该脚本的语法如下:
#
fixfiles [OPTIONS] ARGUMENT
其中:
OPTIONS 可为下列其中一项:
-
-l
LOGFILE 将输出保存到提供的文件
-
-o
OUTPUT_FILE 将文件环境与默认环境不同的所有文件的名称保存到提供的输出文件
-
-F
强制重置环境。
-
ARGUMENT 可为下列其中一项:
-
check
显示错误标签的先前和当前文件环境,但不执行任何更改
-
relabel
根据当前加载的策略重新标记错误的文件环境
-
restore
将错误的文件环境恢复为默认值
-
verify
列出具有错误文件环境标签的所有文件,但不执行任何更改
-
7.5 semanage
命令 #
semanage
命令可用于配置策略的各个部分,而无需从源开始重新编译策略。使用该命令可执行以下任务:
使用
boolean
参数管理布尔值。有关布尔值的细节,请参见第 6.1 节 “使用布尔值”。使用
fcontext
参数调整文件的环境使用
login
参数管理用户映射使用
user
参数管理 SELinux 用户使用
module
参数管理 SELinux 策略模块
一般命令语法如下:
#
semanageARGUMENTOPTIONS [OBJECT_NAME]
其中:
ARGUMENT 为下列其中一项:
login
、user
、fcontext
、boolean
、module
。OPTIONS 取决于提供的 ARGUMENT。通用选项中介绍了通用选项。
根据提供的 ARGUMENT,OBJECT_NAME 可为登录名、模块名、文件名或 SELinux 用户。
-a
、--add
添加提供的对象
-h
、--help
列显命令帮助
- --extract
显示用于更改系统(布尔值、文件环境等)的命令。
-l
、--list
列出所有对象。
-m
、--modify
修改提供的对象
-n
、--noheading
通过省略标题来修改列出操作的输出。
-s
、--seuser
指定 SELinux 用户。
其他选项与特定的 semanage
命令相关,已在相应章节中予以介绍。
7.5.1 semanage fcontext
命令 #
使用 semanage fcontext
命令可执行以下任务:
查询文件环境定义
添加文件的环境
添加您自己的规则
使用 semanage
fcontext
命令对文件环境执行更改后不需要修改或重新编译策略。
除了通用选项中所述的通用选项外,semanage
fcontext
命令还接受以下选项:
-e
、--equal
该选项可让您使用提供的路径环境来标记其他目录(提供的目标路径)中的文件。例如,您希望将
/home
具有的同一环境指派给另一个主目录/export/home
。如果使用此选项,则需要提供源路径和目标路径:#
semanage fcontext -a -e /home /export/home-f
、--ftype
指定文件类型。使用以下值之一:
a
- 所有文件,这也是默认值b
- 块设备c
- 字符设备d
- 目录f
- 常规文件l
- 符号链接p
- 命名管道s
- 套接字
7.5.2 semanage login
命令 #
使用 semanage login
可执行以下任务:
将 Linux 用户映射到特定的 SELinux 用户。例如,要将 Linux 用户 tux 映射到
sysadm_u
,请运行以下命令:#
semanage login -a -s sysadm_u tux
将一组 Linux 用户映射到特定的 SELinux 用户。例如,要将 writers 组的用户映射到
user_u
,请运行以下命令#
semanage login -a -s user_u %writers
然后,该组将列在
semanage login -l
的输出中(以 % 字符为前缀)。请记住,用户组应该是主组,因为将 SELinux 用户映射到补充组可能会导致不兼容的映射。
#
semanage login -m -s staff_u %writers
在特定 SELinux MLS/MCS 安全范围内映射 Linux 用户。
修改已创建的映射。为此,只需将前面命令中的
-a
选项替换为-m
即可。为新的 Linux 用户设置默认的 SELinux 用户。默认的 SELinux 用户通常是
unconfined_u
。要将值更改为staff_u
,请运行以下命令:#
semanage login -m -s staff_u __default__
7.5.3 semanage boolean
命令 #
semanage boolean
命令用于控制 SELinux 策略中的布尔值。
命令摘要如下:
semanage boolean [-h] [-n] [ --extract | --deleteall | --list [-C] | --modify ( --on | --off | -1 | -0 ) boolean ]
除了通用选项之外,还可使用以下特定于 semanage boolean
命令的选项:
- --list -C
显示在本地对布尔值所做修改的列表。
- -m --on |-1
打开提供的布尔值。
- -m --off | -0
关闭提供的布尔值。
- -D、--deleteall
删除在本地对布尔值所做的修改。
该命令的最常见用途是打开或关闭特定的布尔值。例如,要打开 authlogin_yubikey
布尔值,请运行:
#
semanage boolean -m on authlogin_yubikey
7.5.4 semanage user
命令 #
semanage user
命令控制 SELinux 用户、角色和 MLS/MCS 级别之间的映射。
除了通用选项中所述的通用选项外,semanage
use
命令还接受以下选项:
- -R [ROLES]、--roles [ROLES]
SELinux 角色列表。可将多个角色括在双引号中并用空格分隔,或者可以多次使用
-R
。
使用此命令可执行以下任务:
运行以下命令列出 SELinux 用户与角色的映射:
#
semanage user -l
更改指派给
user_u
SELinux 用户的角色:#
semanage user -m -R "system_r unconfined_r user_r"
为
admin_u
指派角色staff_r
和类别s0
:#
semanage user -a -R "staff_r -r s0 admin_u
例如,创建角色为
staff_r
的新 SELinux 用户admin_u
。您还需要使用-P
为此用户定义标记前缀:#
semanage user -a -R "staff_r" -P admin admin_u
7.5.5 semanage module
命令 #
semanage module
命令可以安装、去除、禁用或启用 SELinux 策略模块。
除了通用选项中所述的通用选项外,semanage
fcontext
命令还接受以下选项:
-d
、--disable
要禁用提供的 SELinux 策略模块,请运行以下命令:
#
semanage module --disable MODULE_NAME
-e
、--enable
要启用提供的 SELinux 策略模块,请运行以下命令:
#
semanage module --enable MODULE_NAME
7.6 sestatus
命令 #
sestatus
获取运行 SELinux 的系统的状态。
该命令的一般语法如下所示:
sestatus [OPTION]
如果不结合任何选项和参数运行该命令,它将输出以下信息:
#
sestatus
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
该命令接受以下选项:
- -b
显示系统上布尔值的状态
- -v
显示
/etc/sestatus.conf
文件中列出的文件和进程的安全环境。
8 法律声明 #
版权所有 © 2006–2024 SUSE LLC 和贡献者。保留所有权利。
根据 GNU 自由文档许可证 (GNU Free Documentation License) 版本 1.2 或(根据您的选择)版本 1.3 中的条款,在此授予您复制、分发和/或修改本文档的权限;本版权声明和许可证附带不可变部分。许可版本 1.2 的副本包含在题为“GNU Free Documentation License”的部分。
有关 SUSE 商标,请参见 https://www.suse.com/company/legal/。所有其他第三方商标分别为相应所有者的财产。商标符号(®、™ 等)代表 SUSE 及其关联公司的商标。星号 (*) 代表第三方商标。
本指南力求涵盖所有细节,但这不能确保本指南准确无误。SUSE LLC 及其关联公司、作者和译者对于可能出现的错误或由此造成的后果皆不承担责任。