SELinux与防火墙(如firewalld)的配合逻辑
SELinux(强制访问控制)与防火墙(网络流量过滤)是Linux系统中互补的安全组件:防火墙负责“外部流量能否进入系统”(如允许/拒绝特定IP或端口的访问),SELinux负责“进入系统的流量能否被进程使用”(如限制httpd进程只能监听80/443端口)。二者结合可实现“网络层+系统层”的双重安全防护。
sestatus命令查看SELinux状态(Enforcing为强制模式,Permissive为宽容模式,Disabled为关闭)。若需启用强制模式,编辑/etc/selinux/config文件,将SELINUX=设置为enforcing,并重启系统使配置生效。sudo systemctl start firewalld && sudo systemctl enable firewalld。确保防火墙处于运行状态,作为网络流量的第一道防线。使用firewalld的--add-service或--add-port命令开放所需服务或端口,并重载配置使规则生效。例如,开放HTTP(80端口)和HTTPS(443端口)服务:
sudo firewall-cmd --permanent --add-service=http # 添加HTTP服务(对应80端口)
sudo firewall-cmd --permanent --add-service=https # 添加HTTPS服务(对应443端口)
sudo firewall-cmd --reload # 重载配置
此步骤确保外部流量能通过防火墙到达系统端口,但是否能被进程使用还需SELinux控制。
SELinux通过“上下文”(Type为核心)限制进程对端口、文件的访问。需确保进程允许使用的端口与防火墙开放的端口一致:
http_port_t,可通过semanage port -l | grep http_port_t查看其允许的端口(默认包含80、443)。http_port_t类型:sudo semanage port -a -t http_port_t -p tcp 82 # 添加82端口到http_port_t类型
此步骤使SELinux允许httpd进程使用82端口。场景示例:通过82端口访问Web服务
firewall-cmd --permanent --add-port=82/tcp开放82端口,重载配置。semanage port -a -t http_port_t -p tcp 82将82端口标记为http_port_t类型,使httpd进程可监听该端口。grep AVC /var/log/audit/audit.log筛选SELinux拒绝记录,分析拒绝原因(如端口类型不匹配、进程权限不足)。audit2allow工具根据日志生成自定义策略模块。例如,针对“httpd_t无法使用82端口”的拒绝记录,执行以下命令生成并加载策略:sudo ausearch -c 'httpd' --raw | audit2allow -M my_httpd_port # 生成策略模块
sudo semodule -i my_httpd_port.pp # 加载策略
此步骤可解决因策略限制导致的访问问题。Permissive模式仅记录拒绝操作,不阻止,调试完成后需切换回Enforcing模式以保证安全。http_port_t),避免因策略过时导致合法访问被拦截。