centos7 下nginx报403错误的处理记录,如何修改selinux使其正常

当在CentOS7上遇到Nginx 403错误,问题可能由SELinux引起。通过执行`sestatus`确认SELinux启用,然后使用`chcon`和`semanage`工具修改目录的安全上下文,恢复成httpd_sys_content_t。通过`semanage fcontext`创建默认策略,再用`restorecon`将目录安全上下文设置为默认,从而解决403错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx刚装好,因为配置文件里面设置的网站根目录是自己在/home下的www目录,所以访问的时候直接报403

猜测一:

权限问题,整个文件夹改成了755,然后又改成777,还是不行

猜测二:

nginx的运行用户组权限不够

ps -aux | grep nginx 

发现用户是nginx,然后去配置文件(nginx的配置文件)修改,把用户改成了root ,重启nginx,发现还是403

 那就应该不是nginx的配置问题

猜测三:

SELinux问题,这个问题就是linux的一个安全机制了

执行sestatus命令查看se状态

status为 enable,证明se是打开的状态,我们尝试关闭一下,临时关闭(非永久关闭):

setenforce 0

linux不报403了,功能正常,可以确定,就是selinux的拦截导致的nginx报403错误。

到目前为止,网上很多的教程也就到此为止了,毕竟关闭掉SElinux就解决了nginx403的问题,有的教程会给出详细的如何永久关闭SElinux的方式,但是我想说,这并不安全,SElinux关闭会导致很多其他的安全问题,得不偿失,那就得找找SElinux的设置是什么。

先看一个命令,大家都是 ls 命令是查看目录下面都有什么内容的,这时候可以加一个参数 Z 大写的Z,来查看他的安全上下文,我也不知道为啥叫上下文,等我啥时候研究了再补这一块,你就暂时当做他的安全权限(大概率不是,先这么理解吧)

先新建一个www目录,直接在~目录下建一个,mkdir,我的是 /root/www,看看他的权限是啥

先不要急着想这都是什么东西,再查看下正常的,可以访问的目录,也就是默认的 /var/www 目录是什么权限

可以看到一个是 admin_home_t   一个是 httpd_sys_content_t

 那么再思考,nginx能访问什么样的文件呢,执行命令查看下 

ps -auxZ | grep nginx

可以看到nginx里面有个 httpd_t 的权限,同时nginx和apache一样都是个httpd_t的类型

SELinux 里一个非常重要的概念就是: type !没错,就像我们说 C++ 是一门强类型语言一样, SELinux 也会对每个文件、进程做类型检查。举个例子:

  • Nginx 进程的类型是 httpd_t
  • 文件夹 /var/www/ 及里面的东西的类型是 httpd_sys_content_t
  • 文件夹 /root/www及里面的东西类型是 home_t
  • 对于一个 httpd_t 的进程,访问 httpd_sys_content_t 的文件似乎十分的合理
  • 对于一个 httpd_t 的进程,访问 home_t 和 shadow_t 的文件似乎就不那么合理了

要知道,对于 Web 服务——这是一个暴露在十分恶劣环境下的服务——要是你以 root 的身份运行 httpd ,碰巧你的脚本又写得漏洞百出(比如 <?php echo file_get_contents($_GET['path']); ?> ),那么借此 hack 服务器可并不是什么难事。 SELinux 的存在使得就算是 root 也不能够我行我素,对于前面这个弱智代码, SELinux 可以保护服务器的敏感信息不被窃取。

 那么就简单了,修改目标目录和文件的安全策略不就得了

那么现在开始修改,修改工具有两个

chcon

chcon -R -t httpd_sys_rw_content_t /root/www/

semanage

这个后面展开讲,为啥推荐使用semanage呢

CentOS系统自带的chcon工具只能修改文件、目录等的文件类型和策略,无法对端口、消息接口和网络接口等进行管理,semanage 能有效胜任 SELinux 的相关配置工作

 先查看 

semanage fcontext -l | grep "/www"

好家伙,全是var目录下面的,一个root里面的也没有

 那么就设置一个吧

semanage fcontext -a -t httpd_sys_content_t "/root/www(/.*)?"

查看 semanage的上下文安全策略 

查看被修改目录的安全策略

 ls -Zd www

 哎?为啥没修改过来?还是 admin_home_t ,查了资料才知道,因为只修改了默认安全上下文,而没有修改目录的当前安全上下文,还差一步,使用restorecon命令,恢复成默认的上下文。

 

 restorecon,这个命令的作用就是把文件的安全上下文恢复成默认的安全上下文。

restorecon 命令格式如下:

[root@localhost ~] # restorecon [选项】 文件或目录

选项:

  • -R:递归.当前目录和目录下所有的子文件同时恢复;
  • -V:把恢复过程显示到屏幕上;

 啥意思呢,就是你先用semanage fcontext命令给当前的这个目录做个默认的安全上下文,就是安全策略,然后呢,你需要把当前目录的安全上下文设置成默认的。就相当于,你先做了个镜像,然后你再把你要的东西和镜像对比修改。

执行命令

restorecon -Rv /root/www/

行了,这次成功了,nginx终于也不报403了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值