SELinux(Security-Enhanced Linux)是强制访问控制(MAC) 安全模块,通过为进程、文件、端口等资源分配安全上下文(如httpd_sys_content_t、http_port_t),实现对系统资源访问的细粒度控制——即使进程通过防火墙允许访问,SELinux仍可阻止其非法操作(如非授权进程监听端口)。
防火墙(CentOS 7+默认使用firewalld)是网络层访问控制工具,通过定义规则(如允许/拒绝特定IP、端口、协议)控制网络流量的进出,是系统的第一道防线。
SELinux与防火墙在安全体系中形成互补:
httpd进程读取/var/www/html目录下的文件,但禁止其修改系统配置文件)。httpd进程是否有权限访问对应的网页文件。当通过防火墙(如firewalld)开放新端口时,需同步配置SELinux的端口上下文,否则SELinux会阻止进程使用该端口。
操作示例:开放8080端口并允许SELinux访问
# 配置firewalld(网络层)
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
# 配置SELinux(资源层)
sudo semanage port -a -t http_port_t -p tcp 8080 # 将8080端口标记为http_port_t类型
sudo restorecon -Rv /path/to/webroot # 确保webroot目录的SELinux上下文正确
若未执行semanage命令,即使防火墙允许8080端口,httpd进程也无法绑定该端口(SELinux会拦截)。
SELinux的布尔值(Booleans) 是预定义的开关,用于快速调整SELinux对特定功能的访问控制。例如,若需允许httpd进程访问外部网络(如下载更新),需开启httpd_can_network_connect布尔值:
sudo setsebool -P httpd_can_network_connect on
该设置需与防火墙规则配合(如允许httpd进程访问外部网络的端口),否则即使布尔值开启,防火墙仍会阻止流量。
/var/log/firewalld(记录网络连接、规则匹配情况);/var/log/audit/audit.log(记录SELinux拒绝访问的详细信息,如AVC(Access Vector Cache)拒绝条目)。当出现“防火墙允许但无法访问”的问题时,需通过SELinux日志定位原因:
# 查找SELinux拒绝条目
sudo grep AVC /var/log/audit/audit.log
# 使用audit2allow生成自定义策略模块
sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp # 加载自定义策略
例如,若日志显示“httpd进程被拒绝访问/var/www/html目录”,可能是该目录的SELinux上下文不正确(应为httpd_sys_content_t),需通过chcon命令修正:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
Disabled(永久关闭),推荐使用Enforcing(强制模式)或Permissive(宽容模式,仅记录不阻止);semanage port -l查看已配置的端口上下文,通过getsebool -a查看布尔值设置,确保与业务需求一致;