当前位置: 首页 > news >正文

【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)

示例:

# 允许 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 服务器
dnf install httpd -y

3.1.2 创建非默认网站目录和测试页面
mkdir /srv/webapp/
# 使用 echo 或 vim 创建简单测试页面
echo "Hello from My WebApp on Port 8080!" > /srv/webapp/index.html

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

curl http://localhost:8088

3.2 配置 Apache

3.2.1 编辑 Apache 主配置文件
vim /etc/httpd/conf/httpd.conf

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

Listen 8088

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

DocumentRoot "/srv/webapp"<Directory "/srv/webapp">...
</Directory>

3.2.2 启动并启用 Apache 服务

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

systemctl status httpd
systemctl enable httpdsystemctl start httpd        # 会失败

此时 start 不能成功:

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

3.3 解决防火墙问题

3.3.1 检查防火墙放行规则
firewall-cmd --list-all

发现不存在 8088 端口。

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

3.4 解决 SELinux 问题

3.4.1 检查 SELinux 端口策略
semanage port -l | grep http

发现没有 8080 端口。

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

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

systemctl start httpd
systemctl status httpd

  再次在本机上尝试,虽然有内容,但是不是设置的文件内容。

curl http://localhost:8088

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

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

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

3.4.3 检查目录的 SELinux 上下文

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

ls -ldZ /var/www/html/
ls -ldZ /srv/webapp/

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

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

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

semanage fcontext -a -t httpd_sys_content_t " /home/用户名/webapp/(/.*)?"

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

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

# 给 /srv/mywebapp 目录及其内容打上正确标签
semanage fcontext -a -e /var/www /srv/webapp# 应用这条策略规则
restorecon -Rv /srv/webapp/# 验证上下文是否已更改
ls -ldZ /srv/webapp/

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

curl http://localhost:8088

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

实验结束。


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


文章转载自:

http://3llkSuWO.mxrbm.cn
http://adcPYLGc.mxrbm.cn
http://hLzv0aO7.mxrbm.cn
http://TxakaqTr.mxrbm.cn
http://KMbdDNg9.mxrbm.cn
http://jm1luMx1.mxrbm.cn
http://HP6QrvIF.mxrbm.cn
http://Iy4TSNe8.mxrbm.cn
http://dvUcDsGy.mxrbm.cn
http://Hvi9zr04.mxrbm.cn
http://Pzb9ggca.mxrbm.cn
http://djyMQMpw.mxrbm.cn
http://o4EBbGfl.mxrbm.cn
http://0WokY5KC.mxrbm.cn
http://bj17GFEW.mxrbm.cn
http://YHOeTE2s.mxrbm.cn
http://igSRbEdv.mxrbm.cn
http://tcrrHFaW.mxrbm.cn
http://a6kZonJT.mxrbm.cn
http://4pDksFyc.mxrbm.cn
http://71vFbriF.mxrbm.cn
http://cgLiOt6U.mxrbm.cn
http://4NEq5kPM.mxrbm.cn
http://GjzUNAuN.mxrbm.cn
http://4xtpUHE2.mxrbm.cn
http://homdBIC4.mxrbm.cn
http://6zaOa4V8.mxrbm.cn
http://H9wsNiav.mxrbm.cn
http://JMUmKEhn.mxrbm.cn
http://FbYnJHCX.mxrbm.cn
http://www.dtcms.com/a/368084.html

相关文章:

  • Boost搜索引擎 网络库与前端(4)
  • 服务器硬盘“Unconfigured Bad“状态解决方案
  • 警惕!你和ChatGPT的对话,可能正在制造分布式妄想
  • 中天互联:AI 重塑制造,解锁智能生产新效能​
  • 如何制造一个AI Agent:从“人工智障”到“人工智能”的奇幻漂流
  • 鼓励员工提出建议,激发参与感——制造企业软件应用升级的密钥
  • 2025世界职校技能大赛总决赛争夺赛汽车制造与维修赛道比赛资讯
  • LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列
  • [特殊字符] AI时代依然不可或缺:精通后端开发的10个GitHub宝藏仓库
  • 【MFC】对话框节点属性:Condition(条件)
  • 【MFC 小白日记】对话框编辑器里“原型图像”到底要不要勾?3 分钟看懂!
  • 【为YOLOv11Seg添加MFC界面】详细指南
  • VBA 中使用 ADODB 操作 SQLite 插入中文乱码问题
  • Python 实现 Markdown 与 Word 高保真互转(含批量转换)
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本
  • 电商企业如何选择高性价比仓储系统?专业定制+独立部署,源码交付无忧
  • Mysql:由逗号分隔的id组成的varchar联表替换成对应文字
  • Windows环境下实现GitLab与Gitee仓库代码提交隔离
  • PXM的JAVA并发编程学习总结
  • Cursor Pair Programming:在前端项目里用 AI 快速迭代 UI 组件
  • java面试中经常会问到的集合问题有哪些(基础版)
  • 23种设计模式——桥接模式 (Bridge Pattern)详解
  • AI日报 - 2025年09月05日
  • 23ai数据库通过SQLcl生成AWR报告
  • 销量骤降、降价自救,新别克GL8能否成为上汽通用救星?
  • 如何解决 OutOfMemoryError 内存溢出 —— 原因、定位与解决方案
  • Kubernetes实战系列(4)
  • 2026第二届郑州台球展会,8月15-17日即将再次盛大举办
  • AM J BOT | 黄芪稳健骨架树构建
  • 【完整源码+数据集+部署教程】骰子点数识别图像实例分割系统源码和数据集:改进yolo11-DCNV2