深入理解 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
相关推荐
未来之窗软件服务12 小时前
服务器运维(二十三) 服务器安全探针封装—东方仙盟练气期
安全·仙盟创梦ide·东方仙盟·安全探针
corpse201016 小时前
Linux监控软件Monitorix 安装部署
linux·安全
飞鸟真人16 小时前
关于python -m http.server的一些安全问题
python·安全·http
用户19653306721117 小时前
【TryHackMe】JPT-文件包含
安全
橘色的喵17 小时前
嵌入式二级 Bootloader (SBL) 的设计与实现:基于裸机环境的安全固件管理
安全·bootloader·二级boot
麦聪聊数据17 小时前
MySQL 性能调优:从EXPLAIN到JSON索引优化
数据库·sql·mysql·安全·json
白山云北诗19 小时前
企业网站网络安全防护方案
安全·web安全·网络安全·ddos防护·web应用防火墙·cc防护
电报号dapp11920 小时前
NFT系统开发:在数字荒漠中铸造文明
安全·去中心化·区块链·智能合约
乾元21 小时前
企业无线的 AI 频谱与功率自动优化——从人工勘测到“可学习的无线网络”(含真实室内工程案例)
服务器·网络·人工智能·网络协议·安全·信息与通信
2301_7807896621 小时前
服务器感染的病毒有哪些特点呢?
安全·web安全