SELinux(Security-Enhanced Linux)是Linux内核内置的强制访问控制(MAC)机制,通过安全上下文(Security Context)和策略规则实现对进程、文件、端口等资源的细粒度控制。其核心设计目标是最小权限原则,即仅授予进程完成任务所需的最小权限,防止未授权访问或恶意操作。
SELinux主要有两种策略类型:
unconfined_t域(宽松模式)。这种策略平衡了安全性与可用性,适用于大多数场景。安全上下文是SELinux的核心标识,格式为user:role:type:level,其中:
system_u,系统默认用户);system_r,系统角色;staff_r, staff角色);httpd_t表示Apache进程域,httpd_sys_content_t表示Web文件类型);s0,默认级别)。例如,Apache进程的安全上下文可能是system_u:system_r:httpd_t:s0,表示该进程属于httpd_t域,仅能访问标记为httpd_*类型的资源。
以下是常见的SELinux策略应用示例,涵盖文件访问、端口监听、布尔值调整等场景:
问题:Apache无法访问自定义目录/data/web,提示“Permission denied”。
原因:/data/web目录的安全上下文未设置为Web文件类型(httpd_sys_content_t)。
解决步骤:
查看当前上下文:ls -Z /data/web(输出可能为unconfined_u:object_r:user_home_t:s0,表示用户家目录类型,Apache无法访问);
修改上下文:使用semanage fcontext添加永久规则(需root权限):
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
恢复默认上下文:restorecon -Rv /data/web(将规则应用到目录及子文件);
验证:ls -Z /data/web(输出应为system_u:object_r:httpd_sys_content_t:s0,Apache可正常访问)。
问题:Nginx无法监听8080端口,提示“Address already in use”(实际端口未被占用,但SELinux限制)。
原因:8080端口的安全上下文未设置为HTTP端口类型(http_port_t)。
解决步骤:
semanage port -l | grep 8080(输出可能为空,或为tcp 8080未关联http_port_t);semanage port -a -t http_port_t -p tcp 8080(将8080端口标记为HTTP端口);semanage port -l | grep 8080(输出应为tcp 8080 http_port_t,Nginx可正常监听)。问题:Apache无法连接外部数据库(如MySQL),提示“Connection refused”(SELinux限制网络访问)。
原因:httpd_can_network_connect布尔值默认关闭(off),禁止Apache发起网络连接。
解决步骤:
getsebool -a | grep httpd_can_network_connect(输出为httpd_can_network_connect --> off);setsebool -P httpd_can_network_connect on(-P表示永久生效);getsebool -a | grep httpd_can_network_connect(输出为httpd_can_network_connect --> on,Apache可正常连接网络)。问题:自定义应用程序myapp无法读取/etc/myconfig.conf文件,提示“Permission denied”。
原因:现有SELinux策略未允许myapp_t域访问myconfig_file_t类型文件。
解决步骤:
生成策略模板:使用sepolicy generate工具创建初始策略(需root权限):
sepolicy generate --init /usr/bin/myapp
生成myapp.te(策略规则文件)、myapp.fc(文件上下文文件)、myapp.if(接口文件)。
编辑策略文件:在myapp.te中添加允许规则:
allow myapp_t myconfig_file_t:file read; # 允许myapp_t域读取myconfig_file_t类型的文件
编译并安装策略:
make -f /usr/share/selinux/devel/Makefile myapp.pp # 编译为二进制策略模块 semodule -i myapp.pp # 安装策略模块
验证:ls -Z /etc/myconfig.conf(确保文件类型为myconfig_file_t),/usr/bin/myapp可正常读取文件。
要掌握SELinux,需循序渐进学习以下知识点,涵盖基础概念、策略管理、排障技巧、高级定制等方面:
SELinux模式:Enforcing(强制模式,阻止违规操作)、Permissive(宽容模式,记录但不阻止,用于调试)、Disabled(禁用,不推荐)。
getenforce(临时)、sestatus(详细);setenforce 0(切换到Permissive)、setenforce 1(切换到Enforcing)(临时);永久修改需编辑/etc/selinux/config中的SELINUX=enforcing。安全上下文:理解user:role:type:level的含义,掌握ls -Z(查看文件/进程上下文)、ps -eZ(查看进程上下文)、restorecon(恢复默认上下文)、semanage fcontext(修改永久上下文)等命令。
策略类型:Targeted Policy(默认)、MLS Policy(高安全)的区别与应用场景。
布尔值(Booleans):SELinux的“开关”功能,用于开启/关闭特定策略(如httpd_can_network_connect允许Apache连接网络)。
getsebool -a(所有)、getsebool -a | grep <关键词>(如httpd);setsebool <布尔值名称> <on/off>(临时)、setsebool -P <布尔值名称> <on/off>(永久)。端口管理:使用semanage port管理端口的安全上下文(如添加HTTP端口8080)。
文件上下文:使用semanage fcontext修改文件/目录的永久安全上下文(如将/data/web标记为httpd_sys_content_t)。
审计日志:SELinux的拒绝事件记录在/var/log/audit/audit.log中,使用ausearch工具搜索:
ausearch -m avc -ts recent # 查看最近的AVC(访问向量缓存)拒绝事件
日志分析工具:
sealert:解析audit.log生成易读报告,并给出解决方案(如sealert -a /var/log/audit/audit.log);setroubleshoot:图形界面工具,用于分析SELinux问题(需安装setroubleshoot-server)。常见问题排查流程:
sestatus);ausearch或sealert);ls -Z、ps -eZ);策略语言:SELinux策略使用Datalog-like语言(如.te文件),核心规则包括:
allow <源类型>:<源角色> <目标类型>:<目标角色> <类> { 权限 };(允许规则,如allow httpd_t user_home_t:file read;);dontaudit <源类型>:<源角色> <目标类型>:<目标角色> <类> { 权限 };(忽略审计,用于调试);neverallow <源类型>:<源角色> <目标类型>:<目标角色> <类> { 权限 };(禁止规则,防止策略冲突)。策略开发流程:
sepolicy generate生成初始策略模板;.te文件添加允许规则;make)生成.pp文件;semodule -i <策略名称>.pp);ausearch查看拒绝事件)。参考资源:
本文作者:sea-whales
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!