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

article/2025/9/8 20:54:58

目录

一、引言

二、实验环境说明

三、实验 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.hkcw.cn/article/dfFQxFGTiF.shtml

相关文章

Linux 开发工具

1.sudo白名单 我们如果要让普通用户有sudo的权限 我们就要登录root用户 在/etc/sudoers目录下 通过文本编辑器(我用的是vim) 将要添加的用户 直接添加进去 如下图光标行就是我添加的白名单用户 然后我们添加的这个ly_centos就有sudo的权限了 2.gcc…

React 第四十九节 Router中useNavigation的具体使用详解及注意事项

前言 useNavigation 是 React Router 中一个强大的钩子,用于获取当前页面导航的状态信息。 它可以帮助开发者根据导航状态优化用户体验,如显示加载指示器、防止重复提交等。 一、useNavigation核心用途 检测导航状态:判断当前是否正在进行…

从数据持久化到网络通信与OpenCV:Qt应用程序开发的深度探索与实战

文章目录 前言一、QSettings:轻量级数据持久化方案1.1 QSettings 主要特点1.2 QSettings 常用函数整理 二、数据库2.1 连接SQLite数据库2.2 建表2.3 增删改 三、网络编程3.1 网络分层3.2 IP地址3.3 端口号3.4 基于TCP的Socket通信3.4 相关接口3.4.1核心类3.4.2 通信…

【产品经理从0到1】自媒体端产品设计

后台的定义 “后台” 与“前台”都是相对独立的平台,前台是服务于互联网用户的平台 ,后台主要是支撑前台页面内容、数据及对前台业务情况的统计分析的系统; 后台与前台的区别 第1:使用用户不同 前台用户:互联网用户…

Ubuntu20.04操作系统ssh开启oot账户登录

文章目录 1 前提2 设置root密码3 允许ssh登录root账户3.1 编辑配置文件3.2 重启ssh服务 4 安全注意事项 1 前提 ssh可以使用普通用户正常登录。 2 设置root密码 打开终端,设置密码 sudo passwd root # 设置root密码3 允许ssh登录root账户 3.1 编辑配置文件 su…

四叉树实现四边形网格

import matplotlib.pyplot as plt import matplotlib.patches as patches import numpy as np # 四叉树节点 class QuadNode:def __init__(self, x, y, width, height, depth):self.x xself.y yself.width widthself.height heightself.depth depthself.children []self.…

园区智能化集成平台汇报方案

该方案为园区智能化集成平台设计,依据《智能建筑设计标准》等 20 余项国家与行业规范,针对传统园区信息孤岛、反应滞后、经验流失、管理粗放等痛点,构建可视化智慧园区管理平台,实现大屏数据可视化、三维设备监控、智慧运维(含工单管理、巡检打卡)、能源能耗分析、AI 安防…

C#中的BeginInvoke和EndInvoke:异步编程的双剑客

文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

【STIP】安全Transformer推理协议

Secure Transformer Inference Protocol 论文地址:https://arxiv.org/abs/2312.00025 摘要 模型参数和用户数据的安全性对于基于 Transformer 的服务(例如 ChatGPT)至关重要。虽然最近在安全两方协议方面取得的进步成功地解决了服务 Transf…

MyBatisPlus(1):快速入门

我们知道,MyBatis是一个优秀的操作数据库的持久层框架(优秀持久层框架——MyBatis),其基于底层的JDBC进行高度封装,极大的简化了开发。但是对于单表操作而言,我们需要重复地编写简单的CRUD语句。这其实是不…

【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议

Chapter.1 AXI4总线协议 作者:齐花Guyc(CAUC) 一、总线介绍 AXI4总线 AXI4总线就像是SoC内部的“高速公路”,负责在不同硬件模块之间高效传输数据。 AXI4协议通过 5个独立通道 传输数据和控制信号,每个通道都有自己的信号线,互…

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 目录 .NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 一、背景与技术概述 1.1 AOT 编译技术简介 1.2 Go 语言与 .NET 的互补性 二、.NET 7 AOT 编译实践 2.1 环境准备 2.2 创建 AOT 项目 2.3 AOT 编译流程 2.4 调试信息处…

Shortest path 代码

Project https://graphics.cs.utah.edu/research/projects/shortest-path-to-boundary/ Build and Debug Fork:(在Win10上) https://github.com/chunleili/Shortest-Path-to-Boundary-for-Self-Intersecting-Meshes commit hash d3160168d2b6a58188d12e6cd959da…

Spring框架学习day1--基础概念

Spring基础部分**轻量级的**IOC:控制反转(对象由自己管理变成交给框架管理)AOP:面向切面编程一站式BaenSpring体系结构 Spring Hello World 搭建 Spring基础部分 Spring是一个轻量级的IOC、AOP的一站式java开发框架,为…

立志成为一名优秀测试开发工程师(第九天)——使用fiddler工具、request库进行接口测试

接口测试学习 目录 一、接口测试的介绍 二、抓包软件Fiddler的使用 三、使用Python的Request库发送get、post请求: 1.get请求 2.post请求 四、总结 登录接口实现 认证请求处理 异常处理 高级配置 接口测试工具类封装 测试用例设计规范 Cookie处理方案 …

【面板数据】各地区新型数字基础设施数据集(2002-2025年)

新型数字基础设施是利用新一代信息技术(如5G、人工智能、物联网、大数据、区块链等)构建的基础设施体系,主要服务于信息传输、计算存储、智能分析和融合应用等环节。新型数字基础设施作为引领经济社会数字化转型的重要支撑,在各地…

小程序 - 视图与逻辑

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言: “心有多大,舞台就有多大。” 📚推荐学习: 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒T…

zynq ad7616 调试笔记

环境 zynq7020 ps端的spi外接硬件的ad7616模块(非ip核) 1 下载 https://github.com/analogdevicesinc/no-OS/blob/2019_R1/ad7616-sdz/ad7616_sdz.c 2 在zynq的sdk中新建ad7616的app程序,将上图方框中的文件拷贝过来并编译 3 移植 ad7616…

如何轻松将 iPhone 备份到外部硬盘

当您的iPhone和电脑上的存储空间有限时,您可能希望将iPhone备份到外部硬盘上,这样可以快速释放iPhone上的存储空间,而不占用电脑上的空间,并为您的数据提供额外的安全性。此外,我们还提供 4 种有效的解决方案&#xff…