深入理解 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 小时前
Linux - 安全排查 3
android·linux·安全
搂……住3 小时前
shiro550反序列化漏洞复现(附带docker源)
安全·docker·容器
番茄老夫子6 小时前
可穿戴智能硬件在国家安全领域的应用
安全·智能硬件
yqcoder7 小时前
13. https 是绝对安全的吗
网络协议·安全·https
凉拌青瓜哈8 小时前
DVWA-LOW级-SQL手工注入漏洞测试(MySQL数据库)+sqlmap自动化注入-小白必看(超详细)
mysql·安全·网络安全
quweiie9 小时前
tp8.0\jwt接口安全验证
前端·安全·jwt·thinkphp
没有bug.的程序员10 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
乌云暮年11 小时前
Linux常用命令
linux·服务器·ssh·php
潘晓可11 小时前
Docker部署Nginx代理多个服务:公网域名与内网IP场景全解
nginx·docker·nginx proxy
学习溢出12 小时前
【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线
网络·安全·web安全·网络安全·ids