SELinux简介/SELinux 导致 Nginx 启动失败解决方案 📅 2026/7/24 4:04:52 SELinuxSecurity-Enhanced Linux安全子系统由美国 NSA 开发是 Linux 内核级强制访问控制MAC安全模块。SELinux服务主配置文件/etc/selinux/config。定义SELinx的默认允许状态即系统重启后的状态getenforce-------查看当前 SELinux 的运行工作模式Linux使用SELinx技术是为了让各个服务进程都受到约束使其仅获取到本应获取的资源。传统 Linux 权限属于自主访问控制 DACroot 几乎不受限制进程权限跟随启动用户 SELinux 在 DAC 之上增加一层强制访问控制不管用户是谁进程只能访问策略允许的资源。实现对服务程序的功能限制对文件资源的访问进行限制。三种运行模式enforcing强制模式强制启动安全策略模式将拦截服务的不合法请求。permissive宽容 / 警告模式遇到服务越权访问时只发出警告而不强制拦截disabled关闭模式对越权的行为既不警告也不拦截setenforce 0/10 表示禁用SELinux1为启用。这种修改只是临时的在系统重启后失效例如将 Nginx 网站资源根目录修改为/www/144目录目录所有者为 root。Nginx 进程读取该目录网页资源时新建目录不具备 Web 服务所需 SELinux 安全上下文访问行为被 SELinux 拦截。Nginx 服务能够正常启动但客户端访问网站会出现 403 禁止访问关闭 SELinux 后限制解除网页可正常访问。SELinux 四大核心名词 简答标准解释1. 主体Subject指系统中运行的进程是发起访问请求的一方。 示例nginx 进程、httpd 进程。2. 目标Object被访问的资源常见为文件、目录、端口、设备。 示例网页目录/www/144。3. 安全上下文Security ContextSELinux 给主体与目标打上的安全标签用来识别身份作为权限判定依据。 格式用户:角色:类型:级别类型 (type) 为最核心字段。4. 策略Policy系统预先定义好的一套访问控制规则SELinux 依据策略对比主体、目标的安全上下文判断是否允许本次访问。当主体 (进程) 访问目标 (文件) 时首先和 SELinux 中定义好的策略进行匹配若符合定义的规则且主体的安全上下文和目标的安全上下文匹配则允许访问文件若安全上下文比较失败则拒绝访问并通过 AVCAccess Vector Cache访问向量缓存主要用于记录所有和 SELinux 相关的访问统计信息生成拒绝访问信息注意最终是否可以访问到目标文件还要匹配产生进程主体的用户是否对目标文件拥有合理的 rwx 权限SELinux 生效≠一定能访问文件传统 ugo 权限依然需要满足查看文件安全上下文system_u:object_r:admin_home_t:s0安全上下文使用冒号分割一共四个字段身份标识角色类型安全级别1. 身份标识user相当于账号层面的身份标识root身份为 root默认映射为unconfined_usystem_u系统用户身份后缀_u代表 user说明user 字段仅标记数据 / 进程归属身份系统资源使用system_u普通用户文件使用user_u2. 角色role限定身份能够执行的操作范围object_r文件、目录等资源默认角色客体角色system_r系统进程使用的角色主体角色3. 类型type【重要】SELinux 策略主要依靠类型做访问控制。 示例内admin_home_t代表管理员家目录资源类型Web 网页标准类型为httpd_sys_content_t。4. 安全级别s0MLS 多级安全机制用于分级保密场景。semanage用来管理SELinux的策略。写入策略库永久定义目录 / 文件默认上下文格式semanage 【选项】 [参数] [文件]选项loginLinux 用户与 SELinux 用户映射管理userSELinux 身份用户管理port管理端口对应的 SELinux 安全类型interface网络接口安全上下文管理fcontext文件 / 目录默认安全上下文重中之重translationSELinux 身份转换设置booleanSELinux 布尔功能开关参数-l查询-a添加-m修改-d删除在ls命令中-Z参数用来查看文件的安全上下文值-d代表对象是文件夹在文件上设置的SELinux安全上下文是由用户段、角色段、类型等多个信息项共同组成的。其中用户段system_u代表系统进程的身份角色段object_r代表文件目录的角色类型段httpd_sys_content_t代表网站服务的系统文件。/usr/share/nginx/html是nginx服务的默认网站根记录为网站目录添加安全上下文现在为该目录添加一条SELinux安全上下文让整个目录能被httpd服务程序访问到fcontext代表文件安全上下文该参数用于永久添加、修改文件与目录的 SELinux 上下文策略修改后需配合 restorecon 命令应用上下文。在执行完添加设置后需使用restorecon命令让设置好的SELinux安全上下文立即生效。—Rv参数对指定的目录进行递归操作以及显示修改SElinux安全上下文的过程。此时不关闭SELinux也能访问了。修改 Nginx 配置文件指定监听端口尝试重启 Nginx 服务发现启动失败查看 Nginx 错误日志定位故障原因日志提示bind() to 0.0.0.0:12345 failed (13: Permission denied)权限拒绝判定为 SELinux 拦截非标准 HTTP 端口。查询 SELinux 放行的 HTTP 端口列表放行策略中没有12345这个端口向 SELinux 永久策略添加 12345 端口使用 semanage port 添加 12345 端口策略chcon临时修改文件 SELinux 上下文文件重新创建、执行restorecon会复原。方法 1chcon [-R] [-t type] [-u user] [-r role] 文件名-R递归修改当前目录及目录下的所有文件都同时设置-t后面接安全上下文件的类型字段重要-u后面接身份标识-r后面接角色-v显示变动结果方法 2chcon -R --reference 范例文件 文件名restorecon让文件的 SELinux 类型恢复为默认的 SELinux 类型默认的 SELinux 类型与 semanage 命令有关参考 semanage 命令所查询的默认 SELinux 类型格式restorecon [-Rv] 文件或目录-R连同子目录一起修改-v将过程显示到屏幕上