深入理解 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
相关推荐
聂 可 以2 小时前
Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)
linux·运维·nginx
神秘的土鸡4 小时前
Nginx网站服务:从入门到LNMP架构实战
运维·nginx·架构
☆凡尘清心☆4 小时前
LNMP环境中php7.2升级到php7.4
linux·nginx·centos·lnmp
XiaoLeisj4 小时前
【JUC】深入解析 JUC 并发编程:单例模式、懒汉模式、饿汉模式、及懒汉模式线程安全问题解析和使用 volatile 解决内存可见性问题与指令重排序问题
javascript·安全·单例模式
网宿安全演武实验室7 小时前
AI生态警报:MCP协议风险与应对指南(中)——MCP Server运行时安全
人工智能·安全·大语言模型·mcp协议
识途老码7 小时前
使用ssh-audit扫描ssh过期加密算法配置
运维·服务器·ssh
网易易盾8 小时前
大模型测评选型指南:企业级大模型测评实战解析
人工智能·安全·内容运营
雾岛心情9 小时前
【黑客与安全】Windows的WSL 安装Linux系统
linux·运维·安全
Menimeky10 小时前
Nginx详解(三):ngx_http_rewrite_module模块核心指令详解
运维·nginx·http
☆凡尘清心☆10 小时前
CentOS 7 环境中部署 LNMP(Linux + Nginx + MySQL 5.7 + PHP)
linux·nginx·centos·lnmp