一、SELinux基础介绍
SELinux(Security‑Enhanced Linux)安全增强Linux,属于强制访问控制MAC。
传统Linux权限为自主访问控制DAC:仅管控用户/组权限,无法防止被入侵程序滥用文件。
MAC由系统策略强制管控,进程仅能访问策略允许的资源,未定义的操作全部拒绝,提升系统安全。
SELinux三种工作模式
| 模式 | 说明 |
|---|---|
Enforcing(强制) | 加载并执行安全策略,违规操作直接拒绝,RHEL默认模式 |
Permissive(宽容) | 加载策略,不拒绝操作,只记录违规日志,用于调试排错 |
Disabled(关闭) | SELinux完全关闭,不加载策略、不记录日志,生产环境不建议使用 |
注意:
setenforce只能临时切换Enforcing/Permissive,重启失效;selinux=0内核参数直接完全关闭SELinux。
模式相关命令
# 查看当前SELinux模式
getenforce
# 临时切换模式,1=Enforcing,0=Permissive
setenforce 1
setenforce 0
永久修改SELinux模式
编辑配置文件 /etc/selinux/config
SELINUX=enforcing # enforcing / permissive / disabled
SELINUXTYPE=targeted # 默认targeted,保护指定进程
修改后需要重启系统生效。
二、SELinux上下文(标签)
系统中进程、文件、目录、端口都带有SELinux上下文标签;策略根据标签判断是否允许访问。
上下文格式示例:
unconfined_u:object_r:httpd_sys_content_t:s0
user:SELinux用户role:角色type:类型,targeted策略主要依靠type做权限判断,大多以_t结尾level:安全级别
示例:httpd进程标签
httpd_t;网站静态文件标签httpd_sys_content_t;httpd策略允许httpd_t读取httpd_sys_content_t类型文件。
查看上下文,使用 -Z 参数
ps axZ # 查看进程SELinux上下文
ls -Z # 查看文件/目录上下文
ls -Zd # 只看目录本身上下文,不看内部文件
文件上下文继承规则
- 复制文件cp:生成新inode,继承目标目录的SELinux上下文。
- 同分区移动mv:保留原文件SELinux上下文,不会继承目标目录。
修改SELinux上下文
chcon:临时修改上下文,不会写入策略库;执行restorecon或者系统重新标记会被覆盖,适合临时测试。
chcon -t httpd_sys_content_t /virtual
semanage fcontext:写入SELinux策略库,永久定义路径默认标签,搭配restorecon生效,生产环境标准用法。
语法:semanage fcontext -a -t 类型 '路径(/.*)?'
(/.*)?正则:匹配目录本身,也匹配目录下面所有子文件子目录。
# 添加自定义上下文策略
semanage fcontext -a -t httpd_sys_content_t '/dir1(/.*)?'
# 将策略应用到实际文件目录
restorecon -RFvv /dir1
# 查看本地自定义策略
semanage fcontext -l -C
软件包依赖:
- semanage 需要:
policycoreutils-python-utils- restorecon 需要:
policycoreutils
三、SELinux布尔值 boolean
布尔值是SELinux策略内置开关,可以开启/关闭部分可选策略规则,不需要修改策略源码。
常用命令
# 查看全部布尔值状态
getsebool -a
# 查看httpd相关布尔值
semanage boolean -l | grep httpd
# 临时修改布尔值,重启失效
setsebool httpd_enable_homedirs on
# -P 参数:持久化写入磁盘,重启依旧生效
setsebool -P httpd_enable_homedirs on
# 查看本地修改过的布尔值
semanage boolean -l -C
示例:
httpd_enable_homedirs=on允许httpd访问用户家目录网页。
四、SELinux端口标签
SELinux会给网络端口打上类型标签,服务只能绑定策略允许的端口;非标准端口需要手动标记,否则服务启动失败。
常用命令
# 查看全部端口标签
semanage port -l
# 过滤查看http相关端口
semanage port -l | grep http
# 添加端口标签
semanage port -a -t http_port_t -p tcp 82
# 修改已有端口标签
semanage port -m -t http_port_t -p tcp 82
# 删除端口标签
semanage port -d -t gopher_port_t -p tcp 71
# 查看本地自定义端口规则
semanage port -l -C
示例:httpd要监听82端口,需要将82端口标记为
http_port_t类型。
五、SELinux故障排查
SELinux拒绝访问会在/var/log/audit/audit.log记录AVC审计日志。
需要安装排错工具包:
yum install -y setroubleshoot-server
排错工具
ausearch:检索audit审计日志
# 查看最近AVC拒绝事件
ausearch -m AVC -ts recent
sealert:解析SELinux告警,给出修复建议
# 分析全部审计日志
sealert -a /var/log/audit/audit.log
# 根据日志给出的UUID查看单条告警详情
sealert -l UUID
常见报错修复方案
- 文件标签错误:优先使用
semanage fcontext+restorecon -Rv 目录 - 策略开关未打开:使用
setsebool -P开启对应布尔值 - 端口绑定失败:使用
semanage port给端口打上对应服务端口标签 - 临时调试:
setenforce 0切换宽容模式验证是否是SELinux导致故障,不要生产环境永久关闭。
六、排错流程总结
- 现象出现,先确认是否SELinux问题:
setenforce 0复现测试。 - 查看审计日志
ausearch -m AVC -ts recent,或者用sealert解析日志。 - 根据告警提示修复:修改文件上下文 / 开启布尔值 / 修改端口标签。
- 修复完成,恢复SELinux强制模式
setenforce 1,验证业务。
注意:SELinux只管控安全标签,不会替代普通文件权限、防火墙规则,排查故障需要同时检查文件rwx权限与firewalld。

1453

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



