深入理解 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
相关推荐
海带紫菜菠萝汤1 小时前
金融文档翻译安全合规:ISO 27001与数据保护实践
安全·金融
Sagittarius_A*1 小时前
【RCELABS】Level 17~18 —— PHP命令执行函数与环境变量注入
开发语言·安全·web安全·靶场·php·rce
七七powerful4 小时前
为离线的bcliunx euler&龙晰 配置 yum源 nginx代理
nginx·yum·bclinux
云祺vinchin4 小时前
IT行业数据备份实例:安全备份+秒级恢复
安全·数据备份·数据归档·容灾备份
网络安全零基础教程4 小时前
零基础转行网安,前两个月具体该学什么工具
网络·学习·安全·web安全·网络安全
AlbertS5 小时前
Let‘s Encrypt 证书自动续期并自动应用到Nginx
运维·nginx·ssl·cerbot·renew·续期
如若1235 小时前
Ubuntu 无 sudo 安装花生壳并实现 SSH 内网穿透:Conda 环境部署、冲突排查与自动启动
linux·运维·ubuntu·ssh·内网穿透
独守一片天6 小时前
HarmonyOS 新生态 从原生应用到 AI Agent 的全场景智能底座
人工智能·安全·harmonyos
LDZKKJ17 小时前
OpenAI模型“越狱“入侵Hugging Face——AI安全史上的至暗时刻
网络·人工智能·安全
zzq779718 小时前
别把大模型 API Key 写进 APK:移动 AI 应用接口防盗刷实践
android·人工智能·安全·app加固·御盾安全·安卓加固