Akemi

Linux软件防火墙-selinux

2026/02/11

没有selinux的linux使用自主访问控制,即自己给自己权限,如果某个具有root权限的程序被攻破,那么攻击者就可以为所欲为

有selinux的linux引入了强制访问控制,即使一个程序以root权限运行,它的行为也必须也必须遵守selinux策略规则,他只能访问策略明确允许他访问的文件、端口和资源

selinux是一个极其强大的安全层,虽然在初期可能因为其复杂性给管理员带来调整,但理解其概念和工作原理后,能极大提升系统的整体安全性,生产环境推荐在充分测试后,使其保持在enforcing模式

selinux介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
1.查看文件的安全上下文
ls -Z /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd

2.查看进程安全上下文
ps -Z -C sshd
LABEL PID TTY TIME CMD
system_u:system_r:sshd_t:s0-s0:c0.c1023 924 ? 00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 3897703 ? 00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3897707 ? 00:00:00 sshd

# 安全上下文的格式
user:role:type[:sensitivity[:category]]

user: selinux用户,如system_u,表示系统用户
role: 角色,如object_r代表文件角色,system_r表示进程角色
type: 类型,最常用最重要的部分,selinux的访问控制主要基于进程的type和文件的type是否匹配策略规则
sensitivity: 可选,敏感度,控制信息机密级别,s0最低,s1-s15逐渐升高
category: 可选,类别,用于细粒度访问控制

大部分情况下只需要关注type字段

# selinux的三种模式
1.Enforcing
强制模式,默认的安全模式,会强制执行,拒绝并记录到日志中

2.Permissive
宽容模式,不会强制执行,但会记录到日志中,主要用于故障排除和策略调试

3.disabled
禁用模式,selinux完全关闭

# selinux的策略
策略指的是一套预定义的规则,告诉selinux哪个进程的type可以访问哪个文件夹的type等。主流Linux发行版都读自带了一套非常完善且严格的预定义策略
1.targeted 目标策略(默认策略)
为与选定的系统服务如httpd ftpd等提供保护,实现安全性和可用性的平衡

2.MLS 多级安全策略
非常复杂和严格,常用于政府、军事等保密性要求高的环境

如何处理selinux引起的问题思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1.检查日志
查看/var/log/audit/audit/log或使用sealert工具
sealert -a /var/log/audit/audit.log

2.临时解决(使用宽容模式分析)
如果问题紧急,可以临时将模式改为permissive,重现问题然后分析日志,找到原因后再改回enforcing

3.永久解决方案
(1)修复文件安全上下文
如果文件被放错了地方或上下文不正确,使用chcon命令临时修改
或使用restorecon命令恢复为默认上下文

(2)恢复默认上下文
restorecon -Rv file

(3)修改布尔值
selinux有很多0 1的开关,可以动态调整,比如允许apache允许家目录

(4)查看布尔值状态
getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off

(5)修改布尔值
setsebool -P httpd_enable_homedirs on

(6)自定义策略模块,一般开发搞

selinux工作模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看当前工作模式
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: 33

# 临时调整工作模式,只能在enforcing和permissive模式之间切换
setenforce 0/1

# 永久修改
/etc/selinux/config
SELINUX=enforcing/permissive/disabled

sed -i 's/^SELINUX=.*/SELINUX=permissive' /etc/selinux/config

#
当从disabled切换为enforcing或permissive时,所有文件都会在第一次重启后重新打标签,但可能会花费很长时间
如果配置文件.autorelabel不存在,系统可能无法正常启动
(所以在进行root密码破解的时候,在修改完密码之后,需要在根目录创建
.autorelabel文件

selinux安全上下文设置

文件/进程安全上下文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 查看文件的安全上下文
ls -Z /var/www/html/
unconfined_u:object_r:httpd_sys_content_t:s0 index.html

# 查看目录安全上下文
ls -Z /var/www/html/ -d
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

# 查看进程的安全上下文
ps -ef -Z | grep nginx
system_u:system_r:spc_t:s0 1001 669148 669121 0 Jan08 ? 00:00:34 /usr/bin/nginx-prometheus-exporter --web.listen-address=:9102 --nginx.scrape-uri=http://192.168.10.100/nginx-status

# 查看系统预定义的文件类型规则semanage fcontext -l
semanage fcontext -l | grep /var/www
/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/var/www(/.*)?/logs(/.*)? all files system_u:object_r:httpd_log_t:s0
/var/www/[^/]*/cgi-bin(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0

/var/www(/.*)? 所有文件及子目录
/var/www(/.*)?/logs(/.*)? 将log目录特别拿出来定义另外的安全上下文

# 修改文件安全上下文
1.chcon 临时修改
chcon 用于临时修改上下文,适合测试场景
chcon [选项] 目标上下文 文件/目录
-t 仅修改type字段(最常用
-u 修改user字段
-r 修改role字段
-R 递归修改目录及子文件

chcon -t httpd_log_t /var/www/test/access.log

2.semanage fcontext + restorecon 永久修改安全上下文
semanage fcontext会将文件、目录的上下文规则写入selinux配置文件
/etc/selinux/targeted/context/files/file_contexts.local
restorecon根据文件中的规则,刷新配置

# 针对特定文件添加安全上下文规则,并应用
semanage fcontext -a -t httpd_sys_content_t "/var/www/html/test.html
restorecon -Rv /var/www/html/test.html

端口的安全上下文

如果进程使用了非默认的端口,比如nginx使用了8080,mysql使用了3307端口,需要手动将端口类型改为进程可以访问的类型http_port_t,否则selinux会阻断进程绑定端口

1
2
3
4
5
6
7
8
9
查看端口安全上下文
semanage port -l | grep mysql
mysqld_port_t tcp 1186, 3306, 63132-63164
mysqlmanagerd_port_t tcp 2273

配置端口安全上下文
semanage port -a -t <端口类型> -p 协议 端口号-端口范围 # 添加
semanage port -m -t <端口类型> -p 协议 端口号-端口范围 # 覆盖原类型
semanage port -d -t <端口类型> -p 协议 端口号-端口范围 # 删除

selinux的布尔值

selinux的布尔值是动态调整selinux策略的开关,无需修改核心配置文件,通过开启和关闭就可以临时或永久调整进程访问权限

在不关闭selinux不修改安全上下文的前提下,快速设备特殊业务场景,避免因策略过严,导致服务异常

selinux布尔值操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看布尔值,大部分的布尔值都是关闭状态
getsebool -a
semanage boolean -l

# 配置布尔值
setsebool httpd_can_connect_ftp=on # 临时修改
setsebool -P httpd_can_connect_ftp=on # 永久修改
setsebool -P httpd_can_connect_ftp=on httpd_use_nfs=on

注意点:
- 最小权限原则
- 重启服务生效
- 拒绝禁用selinux,遇到问题优先调整布尔值、上下文
- 避免频繁修改,-P会写入配置文件,频繁修改可能导致配置冗余

selinux日志查看工具ausearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# c查看阻断记录
grep 'type=AVC' /var/log/audit/audit.log

ausearch -m avc # 只查看AVC类型的记录

# 时间筛选
ausearch -m avc -ts recent # 最近10分钟
ausearch -m avc -ts 14:00 # 今天14点后
ausearch -m avc -ts "09:00:00" # 今天9点之后
ausearch -m avc -ts 09:00 -te 17:00 # 今天9点到17点

# 按进程名筛选
# 查看所有因httpd导致的avc阻断
ausearch -m avc -c httpd # -c指定进程名
CATALOG
  1. 1. selinux介绍
    1. 1.1. 如何处理selinux引起的问题思路
    2. 1.2. selinux工作模式
  2. 2. selinux安全上下文设置
    1. 2.1. 文件/进程安全上下文
    2. 2.2. 端口的安全上下文
  3. 3. selinux的布尔值
  4. 4. selinux日志查看工具ausearch