利用SELinux增强Linux系统安全性
1. 安装和查看策略文档
若要查看SELinux策略文档,可通过以下方式操作:
- 在Fedora或RHEL系统中,若系统没有策略文档,可在命令行输入
yum install selinux-policy-doc
进行安装。
- 在Ubuntu系统中,在命令行输入
sudo apt-get install selinux-policy-doc
进行安装。
安装完成后,可查看策略文档了解策略规则的创建和打包方式。策略规则包与SELinux的操作模式、策略类型和各种安全上下文共同作用,通过SELinux保障Linux系统的安全。
2. 配置SELinux
SELinux默认是预配置好的,即便不进行任何配置也能使用其功能。不过,预配置的设置很难满足Linux系统所有的安全需求。
SELinux的配置和策略文件位于
/etc/selinux
目录,主要的配置文件是
/etc/selinux/config
,示例如下:
# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy.
# Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
这个主配置文件可用于设置SELinux的模式和策略类型。
2.1 设置SELinux模式
-
查看当前模式
:使用
getenforce命令查看SELinux的当前模式,使用sestatus命令查看当前模式和配置文件中设置的模式。示例如下:
# getenforce
Enforcing
# 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: actual (secure)
Max kernel policy version: 31
-
更改模式设置
:使用
setenforce newsetting命令更改模式,newsetting可以是enforcing或1(强制模式),也可以是permissive或0(宽容模式)。但不能使用该命令将SELinux设置为禁用模式。
以下是将SELinux模式立即更改为宽容模式的示例:
# setenforce 0
# getenforce
Permissive
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
需要注意的是,从禁用模式切换到强制模式时,最好修改配置文件并重启系统。通过
setenforce
命令从禁用模式切换到强制模式可能会因文件标签不正确而导致系统挂起。当从禁用模式更改后重启系统,在宽容或强制模式下,可能需要等待较长时间对文件系统进行重新标记。
若要禁用SELinux,必须编辑SELinux配置文件。重启系统会将模式恢复为配置文件中设置的模式。推荐的更改SELinux模式的方法是修改配置文件,然后重启系统。
修改
/etc/selinux/config
文件中的模式,可将
SELINUX=
行更改为以下之一:
-
SELINUX=disabled
-
SELINUX=enforcing
-
SELINUX=permissive
2.2 设置SELinux策略类型
选择的策略类型决定了SELinux是实施TE、MLS还是基本包。该类型设置直接决定了用于规定对象可访问内容的策略规则集。
默认情况下,策略类型设置为
targeted
。若要更改默认策略类型,可编辑
/etc/selinux/config
文件,将
SELINUXTYPE=
行更改为以下之一:
-
SELINUX=targeted
-
SELINUX=mls
-
SELINUX=minimum
如果将SELinux类型设置为
mls
或
minimum
,需要确保已安装相应的策略包。可通过以下命令进行检查:
- 在Fedora或RHEL系统中,使用
yum list selinux-policy-mls
或
yum list selinux-policy-minimum
命令。
- 在Ubuntu系统中,使用
sudo apt-cache policy package_name
命令。
以下是将策略类型设置为
mls
的SELinux配置文件示例:
# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
...
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy.
# Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=mls
2.3 管理SELinux安全上下文
SELinux安全上下文使SELinux能够对访问对象的主体实施策略规则。Linux系统已预先分配了安全上下文。
-
查看安全上下文
:使用
secon命令查看当前SELinux文件和进程的安全上下文。secon命令的可用选项如下表所示:
| Option | Description |
| ---- | ---- |
| -u | 显示安全上下文的用户 |
| -r | 显示安全上下文的角色 |
| -t | 显示安全上下文的类型 |
| -s | 显示安全上下文的敏感级别 |
| -c | 显示安全上下文的许可级别 |
| -m | 以MLS范围显示安全上下文的敏感和许可级别 |
如果不指定任何选项,
secon
命令将显示当前进程的安全上下文。若要查看其他进程的安全上下文,可使用
-p
选项;若要查看文件的安全上下文,可使用
-f
选项。示例如下:
# secon -urt
user: unconfined_u
role: unconfined_r
type: unconfined_t
# secon -urt -p 1
user: system_u
role: system_r
type: init_t
# secon -urt -f /etc/passwd
user: system_u
role: object_r
type: passwd_file_t
若要查看自己的安全上下文,可使用
id
命令。
2.3.1 管理用户安全上下文
每个系统用户登录ID都映射到特定的SELinux用户ID。使用
semanage login -l
命令查看系统上的映射列表。示例如下:
# semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
使用
semanage user -l
命令查看SELinux用户及其关联角色的当前显示。示例如下:
# semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
...
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
若需要添加新的SELinux用户名,可使用
semanage user -a selinux_username
命令;若要将登录ID映射到新添加的SELinux用户名,可使用
semanage login -a -s selinux_username loginID
命令。
2.3.2 管理文件安全上下文
文件标签对于维护对每个文件数据的正确访问控制至关重要。SELinux在安装时和从禁用模式切换后重启系统时会设置文件安全标签。使用
ls -Z
命令查看文件的当前标签(即安全上下文)。示例如下:
# ls -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/passwd
管理文件安全上下文标签的命令如下表所示:
| Utility | Description |
| ---- | ---- |
| chcat | 更改文件安全上下文标签的类别 |
| chcon | 更改文件的安全上下文标签 |
| fixfiles | 调用
restorecon/setfiles
实用程序 |
| restorecon | 与
setfiles
实用程序功能相同,但界面不同 |
| setfiles | 验证和/或更正安全上下文标签,可在向系统添加新策略模块时用于文件标签验证和/或重新标记文件 |
以下是使用
chcon
命令将
file.txt
文件关联的SELinux用户从
unconfined_u
更改为
system_u
的示例:
# ls -Z file.txt
-rw-rw-r--. johndoe johndoe
unconfined_u:object_r:user_home_t:s0 file.txt
# chcon -u system_u file.txt
# ls -Z file.txt
-rw-rw-r--. johndoe johndoe
system_u:object_r:user_home_t:s0 file.txt
2.3.3 管理进程安全上下文
进程是正在运行的程序。在具有SELinux的系统上,进程也会被赋予安全上下文。进程的安全上下文取决于启动它的进程。
-
由
systemd启动的进程会被赋予新的安全上下文。例如,当apache守护进程由systemd启动时,它会被分配类型(即域)httpd_t。 - 用户运行的程序或应用程序(父进程),新进程(子进程)会继承用户的安全上下文(前提是用户被允许运行该程序)。
- 进程也可以运行程序,子进程会继承其父进程的安全上下文,从而在相同的域中运行。
可使用以下命令更改程序运行的安全上下文:
-
runcon
:使用选项确定用户、角色和类型(即域)来运行程序。
-
sandbox
:在严格控制的域(即沙箱)中运行程序。
使用
runcon
可能会导致一些问题,因此需谨慎使用;而
sandbox
提供了很大的保护,可灵活地在Linux系统上测试新程序。
2.4 管理SELinux策略规则包
策略规则用于确定主体是否有权访问对象,它们被分组到包(也称为模块)中,并随SELinux一起安装。使用
semodule -l
命令查看系统上的模块,该命令会列出所有策略模块及其当前版本号。示例如下:
# semodule -l
abrt
accountsd
acct
...
xserver
zabbix
zarafa
zebra
zoneminder
zosremote
在Fedora系统上,可使用以下工具管理和创建自己的策略模块:
| Policy Tool | Description |
| ---- | ---- |
| audit2allow | 根据拒绝操作的日志生成策略允许/不审核规则 |
| audit2why | 根据拒绝操作的日志生成访问被拒绝的原因描述 |
| checkmodule | 编译策略模块 |
| checkpolicy | 编译SELinux策略 |
| load_policy | 将新策略加载到内核中 |
| semodule_expand | 扩展策略模块包 |
| semodule_link | 将策略模块包链接在一起 |
| semodule _ package | 创建策略模块包 |
以下是一个典型的用于创建本地策略规则的示例策略:
# cat /usr/share/doc/selinux-policy/example.te
policy_module(myapp,1.0.0)
########################################
#
# Declarations
#
type myapp_t;
type myapp_exec_t;
domain_type(myapp_t)
domain_entry_file(myapp_t, myapp_exec_t)
type myapp_log_t;
logging_log_file(myapp_log_t)
type myapp_tmp_t;
files_tmp_file(myapp_tmp_t)
...
allow myapp_t myapp_tmp_t:file manage_file_perms;
files_tmp_filetrans(myapp_t,myapp_tmp_t,file)
2.5 通过布尔值管理SELinux
SELinux策略规则的编写和模块的创建是一项复杂且耗时的工作,创建不正确的策略规则可能会危及Linux系统的安全。幸运的是,SELinux提供了布尔值。
布尔值是一个开关,可用于打开或关闭设置。使用布尔值开关可以在不了解策略编写的情况下更改SELinux策略规则的部分内容,并且无需重启系统。
-
查看布尔值列表
:使用
getsebool -a命令查看SELinux中当前使用的所有布尔值列表。示例如下:
# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
...
xserver_object_manager --> off
zabbix_can_network --> off
-
查看特定策略
:使用
getsebool命令并传入策略名称,查看可由布尔值修改的特定策略。示例如下:
# getsebool httpd_can_connect_ftp
httpd_can_connect_ftp --> off
-
切换策略
:使用
setsebool命令切换策略,该命令会临时更改策略规则。若需要永久更改设置,可使用-P选项。setsebool命令有六个设置:三个用于打开策略(on、1或true),三个用于关闭策略(off、0或false)。
以下是限制用户从
/home
目录执行程序的示例:
# setsebool -P allow_user_exec_content off
# getsebool allow_user_exec_content
allow_user_exec_content --> off
布尔值使修改当前SELinux策略规则变得更加容易。SELinux的命令行配置实用程序(如
getsebool
)易于使用。若需要GUI配置工具,可通过以下命令安装:
- 在Fedora系统中,使用
yum install policycoreutils-gui
命令。
- 在Ubuntu系统中,使用
sudo apt-get install policycoreutils
命令。
使用
system-config-selinux
命令打开GUI配置界面。
2.6 监控和故障排除SELinux
SELinux是监控系统的另一个工具,它会记录所有访问拒绝信息,有助于确定是否正在尝试进行攻击,这些日志文件也有助于解决SELinux问题。
2.6.1 理解SELinux日志记录
SELinux在审查特定安全上下文的策略规则时使用一个名为访问向量缓存(AVC)的缓存。当访问被拒绝(即AVC拒绝)时,拒绝消息会被记录到日志文件中。
拒绝消息的记录位置取决于
auditd
和
rsyslogd
守护进程的状态:
- 如果
auditd
守护进程正在运行,拒绝消息将记录到
/var/log/audit/audit.log
文件中。
- 如果
auditd
未运行,但
rsyslogd
守护进程正在运行,拒绝消息将记录到
/var/log/messages
文件中。
如果
auditd
和
rsyslogd
都在运行,并且系统上有
setroubleshootd
守护进程,拒绝消息将同时发送到
audit.log
和
messages
日志文件中,
setroubleshootd
守护进程会将
messages
日志文件中的拒绝信息转换为更易于理解的格式。
2.6.2 故障排除SELinux问题的一般流程
当遇到SELinux相关问题时,可以按照以下流程进行故障排除:
graph LR
A[发现系统异常或访问被拒] --> B[检查SELinux日志]
B --> C{日志位置}
C -->|auditd运行| D[/var/log/audit/audit.log]
C -->|auditd未运行但rsyslogd运行| E[/var/log/messages]
D --> F[分析AVC拒绝消息]
E --> F
F --> G{是否能确定问题原因}
G -->|是| H[根据原因解决问题]
G -->|否| I[使用audit2why分析]
I --> J[获取访问被拒原因描述]
J --> H
H --> K{问题是否解决}
K -->|是| L[完成故障排除]
K -->|否| M[进一步检查策略规则或咨询专家]
-
检查SELinux日志
:根据
auditd和rsyslogd守护进程的状态,找到相应的日志文件,查看其中的AVC拒绝消息。 - 分析AVC拒绝消息 :仔细阅读拒绝消息,尝试确定是哪个策略规则被违反,以及涉及的主体和对象。
-
使用
audit2why工具 :如果无法直接从日志中确定问题原因,可以使用audit2why命令,它会根据拒绝操作的日志生成访问被拒绝的原因描述。 - 根据原因解决问题 :根据分析结果,可能需要调整SELinux策略规则、更改文件或进程的安全上下文,或者修改布尔值设置。
- 进一步检查和咨询 :如果问题仍然存在,可能需要深入检查策略规则包,或者向SELinux专家咨询。
2.7 SELinux配置示例总结
为了更清晰地展示SELinux的配置过程,下面总结一些常见的配置示例:
| 配置需求 | 操作步骤 |
| ---- | ---- |
| 安装SELinux策略文档 |
- Fedora或RHEL系统:
yum install selinux-policy-doc
- Ubuntu系统:
sudo apt-get install selinux-policy-doc
|
| 更改SELinux模式 |
- 临时更改:
setenforce newsetting
(
newsetting
为
enforcing
/
1
或
permissive
/
0
)
- 永久更改:编辑
/etc/selinux/config
文件,将
SELINUX=
行改为
disabled
、
enforcing
或
permissive
,然后重启系统 |
| 更改SELinux策略类型 | 编辑
/etc/selinux/config
文件,将
SELINUXTYPE=
行改为
targeted
、
mls
或
minimum
,若为
mls
或
minimum
需先检查并安装相应策略包 |
| 查看用户安全上下文映射列表 |
semanage login -l
|
| 添加新的SELinux用户名并映射登录ID |
- 添加用户名:
semanage user -a selinux_username
- 映射登录ID:
semanage login -a -s selinux_username loginID
|
| 查看文件安全上下文 |
ls -Z file_path
|
| 更改文件安全上下文 |
chcon -option value file_path
(
option
如
-u
、
-r
、
-t
等) |
| 查看策略模块 |
semodule -l
|
| 临时切换布尔值策略 |
setsebool policy_name on/off
|
| 永久切换布尔值策略 |
setsebool -P policy_name on/off
|
2.8 SELinux的优势和注意事项
2.8.1 SELinux的优势
- 增强安全性 :通过精细的策略规则和安全上下文,SELinux可以有效限制进程和用户的访问权限,防止非法访问和攻击。
- 日志监控 :记录所有访问拒绝信息,有助于及时发现潜在的安全威胁,并进行故障排除。
- 灵活性 :支持多种策略类型和布尔值设置,可以根据不同的安全需求进行灵活配置。
2.8.2 注意事项
- 配置复杂性 :SELinux的配置和策略规则编写较为复杂,需要一定的专业知识和经验。在进行配置时,建议先在测试环境中进行试验,避免对生产系统造成影响。
- 性能影响 :SELinux在运行过程中会对系统性能产生一定的影响,尤其是在进行大量文件或进程的安全上下文检查时。在高负载系统中,需要权衡安全性和性能。
- 文件重新标记 :从禁用模式切换到其他模式时,系统会自动对文件系统进行重新标记,这可能需要较长时间,尤其是在文件系统较大的情况下。
3. 总结
SELinux是Linux系统中一个强大的安全增强工具,通过策略规则、安全上下文和布尔值等机制,可以有效提高系统的安全性。虽然其配置和管理具有一定的复杂性,但通过合理的配置和监控,可以充分发挥其优势,保护系统免受各种安全威胁。在实际应用中,建议根据系统的安全需求和实际情况,逐步进行SELinux的配置和优化,同时注意配置过程中的注意事项,确保系统的稳定运行。
希望本文能够帮助你更好地理解和使用SELinux,提升Linux系统的安全性。如果你在使用过程中遇到任何问题,欢迎参考相关文档或咨询专业人士。
超级会员免费看
2852

被折叠的 条评论
为什么被折叠?



