RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线

  |   0 评论   |   0 浏览

RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线

图片

大家好,欢迎回到RHCE9学习笔记系列。在上一篇文章中,我们学习了网络配置与管理,掌握了如何为系统分配IP地址、配置路由和排查网络故障。今天,我们将迈出安全加固的关键一步:防火墙与SELinux。这两者共同构成了RHEL系统的基础安全防线,合理配置它们能有效抵御网络攻击,保护系统资源。

1. Linux防火墙基础

Linux内核本身并不直接提供防火墙功能,但内核中的Netfilter模块提供了包过滤、连接跟踪等能力。我们通过用户空间工具(如iptables或firewalld)向 Netfilter 添加规则,从而决定哪些流量放行、哪些拒绝。

1.1 iptables(传统防火墙工具)

iptables是经典的防火墙配置工具,直接操作 Netfilter 的规则表(filter、nat、mangle 等)和链(INPUT、OUTPUT、FORWARD)。它的配置方式直接但略显复杂。

常用操作示例

查看当前规则(filter表)iptables -L# 清空所有规则iptables -F# 设置默认策略(拒绝所有进入流量)iptables -P INPUT DROP# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许SSH(22端口)从特定网段访问iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT# 删除某条规则(需指定完整匹配)iptables -D INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT

虽然iptables功能强大,但它的规则是静态的,每次修改都需要重新加载全部规则,且配置语法相对底层。现代 RHEL 系统推荐使用firewalld。

2. firewalld – 动态防火墙管理器

firewalld是一个守护进程,它提供了动态管理 Netfilter 规则的接口,支持运行时配置(立即生效)和永久配置(重启后保留),并且引入了区域(zone)的概念,使防火墙配置更加人性化。

2.1 区域(zone)的概念

区域是对网络信任级别的抽象。每块网卡可以绑定到一个区域,该区域内的所有规则都会应用到这块网卡上。RHEL 预定义了多个区域:

区域信任级别默认规则
trusted最高接受所有流量
home / work中等接受部分服务(如ssh、dhcpv6-client、cockpit)
public只接受预定义的服务,默认拒绝其他(默认区域)
dmz较低只接受SSH
block / drop拒绝所有流量(block会返回icmp拒绝消息,drop静默丢弃)

查看当前默认区域和已绑定网卡:

# 查看默认区域firewall-cmd --get-default-zone# 查看所有区域及绑定的网卡firewall-cmd --list-all-zones# 查看当前活动区域及配置firewall-cmd --list-all

2.2 基本操作

firewall-cmd是firewalld的命令行工具。不加--permanent时,操作立即生效但重启后丢失;加--permanent则写入配置文件,需要--reload生效。

# 永久添加 HTTP 服务(立即生效并写入配置)firewall-cmd --add-service=http --permanentfirewall-cmd --reload# 临时添加 HTTPS 服务(立即生效,重启后失效)firewall-cmd --add-service=https# 删除服务firewall-cmd --remove-service=http --permanentfirewall-cmd --reload# 添加端口(如8080)firewall-cmd --add-port=8080/tcp --permanentfirewall-cmd --reload# 查看当前所有配置firewall-cmd --list-all

2.3 添加富规则(rich rule)

富规则提供了更精细的控制,比如基于源地址、时间、日志等条件。语法较为复杂,但功能强大。

# 拒绝来自 192.168.1.100 的 SSH 访问firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.100 service name=ssh reject' --permanent# 允许来自 10.0.0.0/8 的 HTTP 访问,并记录日志firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 service name=http accept log prefix="HTTP_ALLOW" level=info' --permanentfirewall-cmd --reload

2.4 区域管理

# 查看某块网卡所属区域firewall-cmd --get-zone-of-interface=ens160# 将网卡移动到其他区域(如 dmz)firewall-cmd --change-interface=ens160 --zone=dmz --permanentfirewall-cmd --reload

2.5 常用场景

场景1:Web服务器放行HTTP/HTTPS

firewall-cmd --add-service=http --add-service=https --permanentfirewall-cmd --reload

场景2:自定义端口放行(如Tomcat 8080)

firewall-cmd --add-port=8080/tcp --permanentfirewall-cmd --reload

场景3:只允许特定IP访问SSH

firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.10 service name=ssh accept' --permanentfirewall-cmd --remove-service=ssh --permanent # 移除原有SSH规则(否则所有人都能访问)firewall-cmd --reload

场景4:开启IP转发(用作路由器)

# 临时开启echo 1 > /proc/sys/net/ipv4/ip_forward# 永久开启(编辑 /etc/sysctl.conf)echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p# 防火墙开启伪装(MASQUERADE)firewall-cmd --add-masquerade --permanentfirewall-cmd --reload

3. SELinux – 增强型安全子系统

SELinux(Security-Enhanced Linux)是 Linux 内核中的强制访问控制(MAC)机制,它提供比传统自主访问控制(DAC)更精细的安全策略。简单来说,即使进程以 root 身份运行,SELinux 也可以限制它只能访问特定的资源。

3.1 DAC vs MAC

DAC(自主访问控制):传统的 Unix 权限模型,由文件所有者决定谁可以访问。root 用户拥有最高权限,可以访问任何文件。

MAC(强制访问控制):SELinux 在 DAC 之上增加了额外的安全策略。每个进程和文件都被赋予一个安全上下文(context),只有策略允许的访问才会被放行。即使是 root,违反策略也会被拒绝。

这种设计可以有效防止利用漏洞提升权限后对整个系统的破坏。

3.2 SELinux 工作模式

SELinux 有三种模式:

模式说明
Enforcing强制模式,策略生效,违反策略的操作会被拒绝并记录日志
Permissive宽容模式,策略不生效,但违反策略的行为会记录日志(用于调试)
Disabled完全关闭

查看当前模式:

getenforce

临时切换模式:

setenforce 0 # 切换为 Permissivesetenforce 1 # 切换为 Enforcing

永久修改:编辑/etc/selinux/config,将SELINUX=enforcing改为disabled或permissive,然后重启系统。生产环境不建议关闭 SELinux,而是学会如何正确配置。

3.3 安全上下文(Security Context)

每个进程、文件、目录、端口等都有安全上下文,格式为user:role:type:level(MLS 等级可选)。其中type是最常用的部分。

查看文件上下文:

ls -Z # 查看当前目录下文件的安全上下文ps -Z # 查看进程的安全上下文

例如,Apache 的网页目录通常需要httpd_sys_content_t类型才能被 Web 服务读取:

$ ls -Z /var/www/html/-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html

如果我们将网页放在自定义目录/web,就需要手动设置正确的上下文。

3.4 管理安全上下文

查看文件上下文规则

# 查看 /web 目录的默认上下文规则(当前未设置)semanage fcontext -l | grep /web

添加自定义上下文规则

# 将 /web 及其子目录的上下文设为 httpd_sys_content_tsemanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'# 应用上下文更改(刷新)restorecon -Rv /web

恢复上下文

restorecon -Rv /path/to/dir # 恢复目录下所有文件为默认上下文

3.5 管理端口安全

SELinux 也限制了服务可以绑定的端口。例如,如果想让 Apache 监听 8080 端口,需要将 8080 添加到http_port_t类型中。

# 查看 http 相关的端口类型semanage port -l | grep http# 添加 8080 端口到 http_port_tsemanage port -a -t http_port_t -p tcp 8080# 验证semanage port -l | grep http_port_t

3.6 管理布尔值(Booleans)

布尔值是 SELinux 策略中的开关,用于开启或关闭某些特定的权限。例如,允许 httpd 访问用户家目录:

# 查看所有与 httpd 相关的布尔值semanage boolean -l | grep httpd# 临时开启(立即生效,重启后恢复)setsebool httpd_enable_homedirs on# 永久开启(写入策略文件)setsebool -P httpd_enable_homedirs on

3.7 查看与调试 SELinux 违规

当某个操作被 SELinux 拒绝时,通常会在/var/log/audit/audit.log(如果 auditd 运行)或/var/log/messages中记录。可以使用ausearch或journalctl查看:

# 查看最近违反 SELinux 策略的日志ausearch -m avc -ts recent# 或使用 sealert(需要安装 setroubleshoot)获取友好提示sealert -a /var/log/audit/audit.log

sealert往往会给出解决建议,比如“是否允许此访问?请执行semanage fcontext ...”等,极大地方便了调试。

3.8 实用 SELinux 命令汇总

命令作用
<span leaf="">getenforce</span>查看当前模式
<span leaf="">setenforce 0/1</span>临时切换模式
<span leaf="">ls -Z</span>查看文件安全上下文
<span leaf="">ps -Z</span>查看进程安全上下文
<span leaf="">semanage fcontext -l</span>列出文件上下文规则
<span leaf="">semanage fcontext -a -t type '/path(/.*)?'</span>添加文件上下文规则
<span leaf="">restorecon -Rv /path</span>恢复文件上下文
<span leaf="">semanage port -l</span>查看端口类型
<span leaf="">semanage port -a -t type -p tcp PORT</span>添加端口到类型
<span leaf="">semanage boolean -l</span>查看布尔值状态
<span leaf="">setsebool -P boolean on</span>永久开启布尔值
<span leaf="">ausearch -m avc</span>查看SELinux拒绝日志

4. 综合实战:搭建一个安全的 Web 服务

假设我们想要在自定义目录/web下提供 HTTP 服务,使用 8080 端口,并且希望只有特定 IP 可以访问。

4.1 准备环境

# 安装 Apachednf install httpd -y# 创建自定义网页目录mkdir /webecho "<h1>Hello from custom web</h1>" > /web/index.html

4.2 配置防火墙

# 放行 8080 端口firewall-cmd --add-port=8080/tcp --permanent# 只允许 192.168.50.0/24 访问(可选)firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.50.0/24 port port=8080 protocol=tcp accept' --permanent# 允许其他服务(如ssh)保持不变firewall-cmd --reload

4.3 修改 Apache 配置

编辑/etc/httpd/conf/httpd.conf,修改监听端口和 DocumentRoot:

Listen 8080DocumentRoot "/web"

4.4 配置 SELinux

# 为 /web 目录设置正确的上下文semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'restorecon -Rv /web# 允许 Apache 绑定 8080 端口semanage port -a -t http_port_t -p tcp 8080

4.5 启动服务并验证

systemctl start httpdsystemctl enable httpd# 验证端口监听ss -tuln | grep 8080# 本地访问测试curl http://localhost:8080# 从远程访问测试curl http://server-ip:8080

如果一切正常,你应该能看到网页内容。如果遇到权限问题,检查 SELinux 日志并按照提示解决。

总结

本篇我们系统学习了:

防火墙基础:Netfilter 内核模块与 iptables 工具。

firewalld:动态防火墙管理,区域概念,服务/端口/富规则的使用。

SELinux:强制访问控制原理,工作模式,安全上下文,端口管理,布尔值,调试方法。

综合实战:将防火墙与 SELinux 结合,安全部署 Web 服务。

防火墙和 SELinux 是 Linux 安全体系的两大支柱。掌握它们的配置与调试方法,你就能为系统筑起坚实的安全防线。在实际工作中,建议始终将 SELinux 保持为Enforcing模式,遇到问题时通过日志分析解决,而不是简单关闭它。

下一篇,我们将深入文件系统与存储管理,学习分区、格式化、逻辑卷、挂载等核心内容。敬请期待!


练习建议:

在自己的虚拟机中,尝试为 Nginx 或 Apache 配置自定义端口,并用semanage和firewall-cmd放行该端口。

将 SELinux 临时设为permissive,执行一个被拒绝的操作,观察日志;再切回enforcing,用sealert分析并修复问题。

编写一个脚本,自动配置防火墙:只允许 SSH 来自特定 IP,开放 80 和 443 端口给所有人。

尝试使用semanage fcontext为一个自定义目录设置正确的 Web 上下文,并验证网页是否能正常访问。


标题:RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/26/1774504755282.html