【Linux】网络安全管理:SELinux 和 防火墙联合使用 | Redhat

本专栏文章持续更新 ,新增内容使用蓝色表示。

往期相关内容

【Linux】权限管理详解(三):SELinux安全性管理 | Redhat-CSDN博客

【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat_linux netfilter-CSDN博客

补充内容

SELinux 策略通过标记网络端口严格过滤网络流量,例如, 22/TCP 端口具有 ssh_port_t 标签;HTTP 端口 80/TCP 和 443/TCP 具有 http_port_t 标签。当某个进程希望侦听端口时,SELinux 将检查进程标签和端口标签是否对应。

补充:标准端口非标准端口。标准端口是Linux内部定义好的,比如 TCP 22,SSH 82,HTTP 80,HTTP 443,MySQL 3306等等。但是生产上一般不适用标准端口,所以需要添加非标准端口。

端口标签管理

操作 命令格式
添加端口标签 semanage port -a -t <类型> -p <协议> <端口号>
修改端口标签 semanage port -m -t <类型> -p <协议> <端口号>
删除端口标签 semanage port -d -p <协议> <端口号>
查询所有端口 semanage port -l
查询特定端口 semanage port -l | grep <端口号>
查看自定义修改 semanage 对象类型 -l -C

参数解释:

  • -a : Add,添加

  • -m : Modify,修改

  • -d : Delete,删除

  • -l : List,列出

  • -t : Type,指定 SELinux 类型 (如 http_port_t, ssh_port_t)

  • -p : Protocol,指定协议 (tcp 或 udp)

示例:

bash 复制代码
# 允许 Apache(httpd) 监听 TCP 8080 端口
semanage port -a -t http_port_t -p tcp 8080

# 将 TCP 2222 端口改为 ssh 服务类型
semanage port -m -t ssh_port_t -p tcp 2222

# 删除 TCP 8080 端口的 SELinux 标签
semanage port -d -p tcp 8080

# 列出所有端口标签,并可配合 grep 过滤
semanage port -l | grep http

# 查询指定端口被标记为何种类型
semanage port -l | grep 8080

# 列出用户自定义的端口策略修改
semanage port -l -C

【实验】Web 服务器非标准配置访问

1. 环境准备

操作系统:RHEL 8 或 9,或者社区分支 CentOS Stream / Rocky Linux / AlmaLinux。

软件:Apache HTTP Server (httpd)、firewalld、policycoreutils-python-utils(提供 semanage 命令)。

预设状态:SELinux 处于 Enforcing 模式,防火墙开启。

2. 实验场景与任务

你作为系统管理员,需要部署一个新的静态网站。出于安全和管理考虑,你决定:

将网站文件放在非默认目录 /srv/webapp/ 下,而不是默认的 /var/www/html/。

:推荐使用目录 /home/用户名/webapp 完成实验,后续步骤中的 /srv/webapp/ 都替换为 /home/用户名/webapp 即可,原因在【解决 SELinux 端口问题】处有解释。

让 Apache 监听在非标准端口 8088 上,而不是默认的 80 端口。

任务是完成配置,并确保外部用户可以通过浏览器访问 http://<服务器IP>:8088。

3. 实验步骤

3.1 基础准备与环境搭建

注意 :以下命令均以root 用户身份运行。

3.1.1 安装 Apache Web 服务器
bash 复制代码
dnf install httpd -y
3.1.2 创建非默认网站目录和测试页面
bash 复制代码
mkdir /srv/webapp/
# 使用 echo 或 vim 创建简单测试页面
echo "Hello from My WebApp on Port 8080!" > /srv/webapp/index.html

此时尝试本机访问访问会失败(连接被拒绝)。

bash 复制代码
curl http://localhost:8088

3.2 配置 Apache

3.2.1 编辑 Apache 主配置文件
bash 复制代码
vim /etc/httpd/conf/httpd.conf

1)找到 Listen 将后面的端口从默认的 80,改为 8088。

bash 复制代码
Listen 8088

2)找到 DocumentRoot "/var/www/html" 和与之对应的 <Directory "/var/www/html"> 块,改为目标目录。

bash 复制代码
DocumentRoot "/srv/webapp"

<Directory "/srv/webapp">
    ...
</Directory>
3.2.2 启动并启用 Apache 服务

此时检查 httpd 状态,发现未启用,尝试启动并启用 Apache 服务。

bash 复制代码
systemctl status httpd
systemctl enable httpd

systemctl start httpd        # 会失败

此时 start 不能成功:

根据提示使用命令journalctl -xeu httpd.service 查看日志信息,从错误提示中可以发现 Apache(httpd 进程) 没有被 SELinux 允许绑定到 8088 端口,所以未能成功开启,所以等到解决完SELinux的端口问题之后,再尝试启动。

3.3 解决防火墙问题

3.3.1 检查防火墙放行规则
bash 复制代码
firewall-cmd --list-all

发现不存在 8088 端口。

3.3.2 放行 TCP 8088端口
bash 复制代码
firewall-cmd --permanent --add-port=8088/tcp
firewall-cmd --reload
# 验证端口是否已添加
firewall-cmd --list-all

3.4 解决 SELinux 问题

3.4.1 检查 SELinux 端口策略
bash 复制代码
semanage port -l | grep http

发现没有 8080 端口。

3.4.2 添加端口 8080 到 HTTP 端口列表中
bash 复制代码
semanage port -a -t http_port_t -p tcp 8088
# 再次验证
semanage port -l | grep http

再次尝试启动 httpd,可以成功。

bash 复制代码
systemctl start httpd
systemctl status httpd

再次在本机上尝试,虽然有内容("Test Page for the HTTP Server on ......"),但是不是设置的文件内容("Hello from My WebApp on Port 8080!")。

bash 复制代码
curl http://localhost:8088

这是因为被默认测试页拦截了,禁用一下即可:

bash 复制代码
# 重命名该文件使其失效
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak
 
# 然后重启 Apache
systemctl restart httpd

再次访问,结果为设置的测试页面,只不过状态码是 403 禁止访问,权限不足。

3.4.3 检查目录的 SELinux 上下文

比较默认目录和目标目录上下文区别。

bash 复制代码
ls -ldZ /var/www/html/
ls -ldZ /srv/webapp/

发现 /var/www/html/ 的上下文包含 httpd_sys_content_t,而 /srv/mywebapp/ 的上下文是var_t。

3.4.4 修正网站目录的 SELinux 上下文

打标签正常是使用以下方式:

bash 复制代码
semanage fcontext -a -t httpd_sys_content_t " /home/用户名/webapp/(/.*)?"

但是由于根 (/) 目录下的某些路径有其默认的、受保护的 SELinux 上下文策略,所以此种方式有时会失败或无效。

此处采用 semanage fcontext 的 -e (equal) 选项,让 /srv/mywebapp 及其所有子文件和子目录,都使用与 /var/www 完全相同的 SELinux 上下文类型规则。

bash 复制代码
# 给 /srv/mywebapp 目录及其内容打上正确标签
semanage fcontext -a -e /var/www /srv/webapp

# 应用这条策略规则
restorecon -Rv /srv/webapp/

# 验证上下文是否已更改
ls -ldZ /srv/webapp/

再次在本机上尝试,结果成功。

bash 复制代码
curl http://localhost:8088

另一台主机通过浏览器访问 http://<IP>:8080,也同样成功。

实验结束。


如有问题或建议,欢迎在评论区中留言~

相关推荐
小猿姐4 小时前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
AlfredZhao7 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346613 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪14 小时前
linux 拷贝文件或目录到指定的位置
linux
阿里云云原生1 天前
深入内核:拆解 OpenTelemetry eBPF 探针如何优雅地“透视”多语言微服务?
云原生
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux