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

深入理解 SELinux:通过 Nginx 和 SSH 服务配置实践安全上下文与端口策略

目录

一、引言

二、实验环境说明

三、实验 1:Nginx 服务安全上下文配置

3.1 实验目标

3.2 操作步骤

1. 开启 SELinux 并重启系统

2. 安装 Nginx 并创建自定义目录

3. 配置 Nginx 指向自定义目录

4. 分析 SELinux 上下文冲突

5. 修改上下文为合法类型

6. 验证配置

四、实验 2:Nginx 自定义端口的 SELinux 配置

4.1 实验目标

4.2 操作步骤

1. 修改 Nginx 监听端口

2. 查看 SELinux 允许的 HTTP 端口

3. 添加新端口到 HTTP 端口类型

4. 验证端口策略

五、实验 3:SSH 服务端口修改的 SELinux 配置

5.1 实验目标

5.2 操作步骤

1. 修改 SSH 配置文件

2. 查看 SSH 端口策略

3. 添加新端口到 SSH 端口类型

4. 验证并重启服务

六、SELinux 配置核心要点总结

6.1 安全上下文管理

6.2 端口策略管理

七、总结


一、引言

SELinux(Security-Enhanced Linux)作为 Linux 系统中重要的安全增强机制,通过强制访问控制(MAC)对系统资源的访问进行细粒度管控。本文将通过三个实际实验,演示如何在 SELinux 环境下配置 Nginx 服务的安全上下文、自定义端口以及 SSH 服务的端口修改,帮助读者掌握 SELinux 的核心配置方法。

二、实验环境说明

  • 系统版本:CentOS/RHEL 9
  • SELinux 模式:Enforcing(强制模式)
  • 服务:Nginx 1.16+、OpenSSH 7.4+

三、实验 1:Nginx 服务安全上下文配置

3.1 实验目标

解决 Nginx 访问自定义网页目录时因 SELinux 上下文不匹配导致的 403 权限问题。

3.2 操作步骤

1. 开启 SELinux 并重启系统
[root@server ~]# vim /etc/selinux/config# 修改SELINUX=enforcing[root@server ~]# reboot

 

2. 安装 Nginx 并创建自定义目录
[root@server ~]# yum install nginx -y[root@server ~]# mkdir -p /www/aa # 新建网页存储目录

 

#创建index.html文件并写入内容
[root@server ~]# vim /www/aa/index.html 

3. 配置 Nginx 指向自定义目录
vim /etc/nginx/nginx.conf# 修改server块中的root路径为/www/zysystemctl restart nginx

访问主机地址显示403,说明selinux对/www/zy的安全上下文件检测未通过

 

4. 分析 SELinux 上下文冲突
  • 查看默认网页目录上下文:
[root@server ~]# ls -Zd /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/# 输出:system_u:object_r:httpd_sys_content_t:s0 (正确上下文)

  • 查看自定义目录上下文:
[root@server ~]# ls -Zd /www/aa
system_u:object_r:default_t:s0 /www/aa

5. 修改上下文为合法类型
  • 方法 1:直接指定类型
[root@server ~]# chcon -Rv -t httpd_sys_content_t /www/aa

  • 方法 2:参考现有目录(推荐)
[root@server ~]# chcon -R --reference=/usr/share/nginx/html/ /www/aa
6. 验证配置
[root@server ~]# ls -Zd /www/aa/
system_u:object_r:httpd_sys_content_t:s0 /www/aa/# 浏览器访问成功,403错误消失

四、实验 2:Nginx 自定义端口的 SELinux 配置

4.1 实验目标

允许 Nginx 监听非默认端口(如 7777),解决 SELinux 端口拦截问题。

4.2 操作步骤

1. 修改 Nginx 监听端口
[root@server ~]# vim /etc/nginx/nginx.conf# 在server块中添加:listen 7777;

[root@server ~]# systemctl restart nginx# 重启失败,SELinux拦截

2. 查看 SELinux 允许的 HTTP 端口
[root@server ~]# semanage  port -l  |  grep  http_port_t# 输出:http_port_t tcp 80,81,443,...9000 (默认允许端口列表)

3. 添加新端口到 HTTP 端口类型
[root@server ~]# semanage port -a -t http_port_t -p tcp 7777# -a:添加端口;-t:指定类型;-p:协议+端口
4. 验证端口策略
[root@server ~]# semanage port -l | grep http_port_t# 确认7777已加入列表

[root@server ~]# systemctl restart nginx # 成功启动

# 浏览器访问http://192.168.2.131:7777 验证

 

五、实验 3:SSH 服务端口修改的 SELinux 配置

5.1 实验目标

将 SSH 默认端口 22 修改为 2222,并解决 SELinux 策略限制。

5.2 操作步骤

1. 修改 SSH 配置文件
[root@server ~]# vim /etc/ssh/sshd_config# 修改Port 2222

systemctl restart sshd

[root@server ~]# systemctl restart sshd# 重启失败,SELinux拦截

2. 查看 SSH 端口策略
[root@server ~]# semanage port -l | grep ssh_port_t# 输出:ssh_port_t tcp 22 (默认仅允许22端口)

3. 添加新端口到 SSH 端口类型
[root@server ~]# semanage port -a -t ssh_port_t -p tcp 2222
4. 验证并重启服务
[root@server ~]# semanage port -l | grep ssh_port_t# 确认2222已加入列表

 

systemctl restart sshd # 成功启动

[root@server ~]# systemctl restart sshd

# 使用ssh客户端连接IP:2222 验证

六、SELinux 配置核心要点总结

6.1 安全上下文管理

  • chcon 命令:临时修改文件 / 目录的安全上下文,重启后可能失效。
    • -t:指定类型(如 httpd_sys_content_t)。
    • --reference:通过参考现有文件快速复制上下文。
  • 永久生效:使用semanage fcontext结合restorecon,例如:

semanage fcontext -a -t httpd_sys_content_t '/www/zy(/.*)?'

restorecon -Rv /www/zy

6.2 端口策略管理

  • semanage port:永久修改端口策略,需明确端口类型(如 http_port_t、ssh_port_t)。
  • 常见服务端口类型
    • HTTP:http_port_t
    • HTTPS:https_port_t
    • SSH:ssh_port_t
    • MySQL:mysql_port_t

七、总结

通过以上实验可见,SELinux 通过安全上下文和端口策略实现了对服务的细粒度控制。在生产环境中,应避免直接关闭 SELinux(设置为 permissive 或 disabled),而是通过chcon、semanage等工具合理配置策略,在保障安全性的前提下满足自定义需求。熟练掌握 SELinux 配置,是 Linux 系统管理员进阶的重要技能。

参考资料

  • SELinux 官方文档
  • man chcon、man semanage
http://www.lryc.cn/news/2396427.html

相关文章:

  • C++ —— STL容器——string类
  • 用JS实现植物大战僵尸(前端作业)
  • Rust Mock 工具
  • C++读写锁以及实现方式
  • Electron-vite【实战】MD 编辑器 -- 文件列表(含右键快捷菜单,重命名文件,删除本地文件,打开本地目录等)
  • 华为云Flexus+DeepSeek征文|华为云Flexus云服务器X实例上部署Dify:打造高效的开源大语言模型应用开发平台
  • [git每日一句]Your branch is up to date with ‘origin/master‘
  • 高密爆炸警钟长鸣:AI为化工安全戴上“智能护盾”
  • 机器人学基础——正运动学(理论推导及c++实现)
  • [网页五子棋][对战模块]处理连接成功,通知玩家就绪,逻辑问题(线程安全,先手判定错误)
  • TensorFlow Extended (TFX) 生产环境模型版本控制与回滚实战指南
  • 【Web应用】若依框架:基础篇11功能详解-系统接口
  • 【Docker项目实战篇】Docker部署PDF查看器PdfDing
  • Redis 常用数据类型和命令使用
  • 【Linux系统】第八节—进程概念(上)—冯诺依曼体系结构+操作系统+进程及进程状态+僵尸进程—详解!
  • WPF 全局加载界面、多界面实现渐变过渡效果
  • WebSocket与实时对话式AI服务的集成
  • 【xmb】】内部文档148344599
  • MobaXterm国内下载与安装使用教程
  • 数据结构——优先级队列(PriorityQueue)
  • 代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程
  • 服务器上用脚本跑python深度学习的注意事项(ubantu系统)
  • 【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议
  • 青少年编程与数学 02-020 C#程序设计基础 10课题、桌面应用开发
  • 把 jar 打包成 exe
  • 【目标检测】检测网络中neck的核心作用
  • 【经验】Ubuntu中设置terminator的滚动行数、从Virtualbox复制到Windows时每行后多一空行
  • 使用微软最近开源的WSL在Windows上优雅的运行Linux
  • HackMyVM-Teacher
  • BugKu Web渗透之矛盾