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

深入理解 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.xdnf.cn/news/9823.html

相关文章:

  • 家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案
  • LVS+keepalived高可用群集
  • mac笔记本如何快捷键截图后自动复制到粘贴板
  • 首发!PPIO派欧云上线DeepSeek-R1-0528-Qwen3-8B蒸馏模型
  • 【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南​
  • Spring Boot 3.5.0中文文档上线
  • 在 WSL Ubuntu-24.04 上安装 Nacos 2.5.1 并使用 MySQL 数据库
  • 【Linux】网络--传输层--深入理解TCP协议
  • 计算机组成与体系结构:固态硬盘(Solid State Drives)
  • 数据驱动健康未来——大数据如何革新公共卫生监测?
  • [250528] NixOS 25.05 “Warbler“ 正式发布:GNOME 48、Kernel 6.12 及海量软件包更新!
  • vue3+element-plus项目主题色切换;element-plus换肤
  • DAX权威指南5:筛选上下文、表操作函数与层级结构
  • SSE vs WebSocket:两种通讯方案该如何选择?
  • MD650一对多透传场景联动
  • 二叉树迭代遍历——给一个属性便可实现迭代结构完美统一
  • Linux轻量级文件传输——tftp命令
  • 【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)
  • 腾控产品在油田间抽节能中的应用
  • Python深度学习植被参数反演AI辅助代码生成—模型构建—实战案例
  • vue3 控制url更新但不让页面更新
  • 回溯算法找出来最优价格组合
  • 深度学习-梯度消失和梯度爆炸
  • 光的干涉、衍射与偏振
  • Python入门手册:模块和包的导入与使用
  • Cookie与Session深度解析:Web会话管理的核心技术
  • 健康管理软件未来趋势:三大核心功能深度解析
  • Windows下的Qtxlsx下载和编译打包成库
  • 消息队列从入门到实战:用外卖订单理解高并发系统的核心设计
  • YOLOv8 区域计数系统:基于计算机视觉的智能物体计数方案