SELinux(Security-Enhanced Linux)是Linux内核的强制访问控制(MAC)安全模块,通过为进程、文件、端口等资源打上“标签”(如httpd_t进程类型、http_port_t端口类型),严格限制它们之间的交互,即使进程以root权限运行也无法突破策略限制。
防火墙(如firewalld、iptables)是网络层/传输层的访问控制工具,基于“白名单”机制,通过规则控制进出服务器的网络流量(如允许/拒绝特定IP、端口、协议的连接)。
简言之,防火墙是系统的“门卫”,决定“谁能进门”;SELinux是“内部安保”,决定“进门后能做什么”。
两者协同工作时,可实现“网络层-系统层”的双重防护:
--add-service=http)允许特定端口的流量进入系统,过滤掉非法IP或无关流量,降低后续安全风险。httpd_t)只能监听http_port_t类型的端口(如80、443),无法随意修改系统关键文件(如/etc/shadow);若需开放非标准端口(如82端口),需同时修改防火墙规则(firewall-cmd --add-port=82/tcp)和SELinux端口上下文(semanage port -a -t http_port_t -p tcp 82)。若需让Web服务通过非标准端口(如82端口)提供服务,需完成以下两步:
① 防火墙层面:添加82端口的访问规则(firewall-cmd --permanent --add-port=82/tcp && firewall-cmd --reload);
② SELinux层面:将82端口标记为http_port_t类型(semanage port -a -t http_port_t -p tcp 82),否则httpd_t进程仍无法使用该端口。
当配置SELinux策略限制某服务(如SSH)仅能从特定IP访问时,需确保防火墙规则与该策略一致。例如,SELinux可通过布尔值(ssh_sysadm_login)限制SSH仅允许管理员登录,而防火墙可通过--source-address参数限制访问源IP,两者结合可有效防止未经授权的SSH连接。
当两者配置冲突时(如SELinux拦截了防火墙允许的流量),需通过以下步骤排查:
① 查看SELinux审计日志(/var/log/audit/audit.log),通过grep AVC /var/log/audit/audit.log筛选出拒绝事件,获取具体拒绝原因(如“进程类型不允许访问端口类型”);
② 使用audit2why工具分析日志,自动生成策略修改建议(如“需允许httpd_t类型访问http_port_t端口”);
③ 根据建议调整SELinux策略(如使用audit2allow生成自定义模块并加载:audit2allow -M my_policy && semodule -i my_policy.pp)。
sestatus命令确认SELinux是否启用(Enforcing模式为推荐状态,Disabled模式会完全关闭SELinux功能);