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

目录

一、引言

二、实验环境说明

[三、实验 1:Nginx 服务安全上下文配置](#三、实验 1:Nginx 服务安全上下文配置)

[3.1 实验目标](#3.1 实验目标)

[3.2 操作步骤](#3.2 操作步骤)

[1. 开启 SELinux 并重启系统](#1. 开启 SELinux 并重启系统)

[2. 安装 Nginx 并创建自定义目录](#2. 安装 Nginx 并创建自定义目录)

[3. 配置 Nginx 指向自定义目录](#3. 配置 Nginx 指向自定义目录)

[4. 分析 SELinux 上下文冲突](#4. 分析 SELinux 上下文冲突)

[5. 修改上下文为合法类型](#5. 修改上下文为合法类型)

[6. 验证配置](#6. 验证配置)

[四、实验 2:Nginx 自定义端口的 SELinux 配置](#四、实验 2:Nginx 自定义端口的 SELinux 配置)

[4.1 实验目标](#4.1 实验目标)

[4.2 操作步骤](#4.2 操作步骤)

[1. 修改 Nginx 监听端口](#1. 修改 Nginx 监听端口)

[2. 查看 SELinux 允许的 HTTP 端口](#2. 查看 SELinux 允许的 HTTP 端口)

[3. 添加新端口到 HTTP 端口类型](#3. 添加新端口到 HTTP 端口类型)

[4. 验证端口策略](#4. 验证端口策略)

[五、实验 3:SSH 服务端口修改的 SELinux 配置](#五、实验 3:SSH 服务端口修改的 SELinux 配置)

[5.1 实验目标](#5.1 实验目标)

[5.2 操作步骤](#5.2 操作步骤)

[1. 修改 SSH 配置文件](#1. 修改 SSH 配置文件)

[2. 查看 SSH 端口策略](#2. 查看 SSH 端口策略)

[3. 添加新端口到 SSH 端口类型](#3. 添加新端口到 SSH 端口类型)

[4. 验证并重启服务](#4. 验证并重启服务)

[六、SELinux 配置核心要点总结](#六、SELinux 配置核心要点总结)

[6.1 安全上下文管理](#6.1 安全上下文管理)

[6.2 端口策略管理](#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 并重启系统
bash 复制代码
[root@server ~]# vim /etc/selinux/config

# 修改SELINUX=enforcing

[root@server ~]# reboot
2. 安装 Nginx 并创建自定义目录
bash 复制代码
[root@server ~]# yum install nginx -y

[root@server ~]# mkdir -p /www/aa # 新建网页存储目录
bash 复制代码
#创建index.html文件并写入内容
[root@server ~]# vim /www/aa/index.html 
3. 配置 Nginx 指向自定义目录
bash 复制代码
vim /etc/nginx/nginx.conf

# 修改server块中的root路径为/www/zy

systemctl restart nginx

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

4. 分析 SELinux 上下文冲突
  • 查看默认网页目录上下文:
bash 复制代码
[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 (正确上下文)
  • 查看自定义目录上下文:
bash 复制代码
[root@server ~]# ls -Zd /www/aa
system_u:object_r:default_t:s0 /www/aa
5. 修改上下文为合法类型
  • 方法 1:直接指定类型
bash 复制代码
[root@server ~]# chcon -Rv -t httpd_sys_content_t /www/aa
  • 方法 2:参考现有目录(推荐)
bash 复制代码
[root@server ~]# chcon -R --reference=/usr/share/nginx/html/ /www/aa
6. 验证配置
bash 复制代码
[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 监听端口
bash 复制代码
[root@server ~]# vim /etc/nginx/nginx.conf
 # 在server块中添加:listen 7777;
bash 复制代码
[root@server ~]# systemctl restart nginx
  # 重启失败,SELinux拦截
 
2. 查看 SELinux 允许的 HTTP 端口
bash 复制代码
[root@server ~]# semanage  port -l  |  grep  http_port_t

# 输出:http_port_t tcp 80,81,443,...9000 (默认允许端口列表)
3. 添加新端口到 HTTP 端口类型
bash 复制代码
[root@server ~]# semanage port -a -t http_port_t -p tcp 7777

# -a:添加端口;-t:指定类型;-p:协议+端口
4. 验证端口策略
bash 复制代码
[root@server ~]# semanage port -l | grep http_port_t

# 确认7777已加入列表
bash 复制代码
[root@server ~]# systemctl restart nginx # 成功启动

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

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

5.1 实验目标

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

5.2 操作步骤

1. 修改 SSH 配置文件
bash 复制代码
[root@server ~]# vim /etc/ssh/sshd_config

# 修改Port 2222

systemctl restart sshd

bash 复制代码
[root@server ~]# systemctl restart sshd

# 重启失败,SELinux拦截
2. 查看 SSH 端口策略
bash 复制代码
[root@server ~]# semanage port -l | grep ssh_port_t


# 输出:ssh_port_t tcp 22 (默认仅允许22端口)
3. 添加新端口到 SSH 端口类型
bash 复制代码
[root@server ~]# semanage port -a -t ssh_port_t -p tcp 2222
4. 验证并重启服务
bash 复制代码
[root@server ~]# semanage port -l | grep ssh_port_t

# 确认2222已加入列表

systemctl restart sshd # 成功启动

bash 复制代码
[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 系统管理员进阶的重要技能。

参考资料

  • man chcon、man semanage
相关推荐
Hello.Reader3 小时前
Flink ZooKeeper HA 实战原理、必配项、Kerberos、安全与稳定性调优
安全·zookeeper·flink
智驱力人工智能3 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
数据与后端架构提升之路4 小时前
论系统安全架构设计及其应用(基于AI大模型项目)
人工智能·安全·系统安全
Harvey9035 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
市场部需要一个软件开发岗位6 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
lingggggaaaa6 小时前
安全工具篇&动态绕过&DumpLsass凭据&Certutil下载&变异替换&打乱源头特征
学习·安全·web安全·免杀对抗
凯子坚持 c6 小时前
CANN-LLM:基于昇腾 CANN 的高性能、全功能 LLM 推理引擎
人工智能·安全
QT.qtqtqtqtqt7 小时前
未授权访问漏洞
网络·安全·web安全
ba_pi9 小时前
每天写点什么2026-02-04(2.1)信息安全
安全·web安全
田井中律.9 小时前
【无标题】
ssh