目录
[三、实验 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