nginx 403 forbidden Permission denied

现象描述:

在centos7.6服务器上使用yum 安装好nginx后,又打开了防火墙的对应端口,无论在服务器本地还是在自己的机器通过IP,nginx的默认页面已经可以正常访问了。

此时,所需要部署的静态页面项目无法访问,在浏览器端提示403 forbidden,在服务器上通过tail命令查看nginx这个端口访问的error日志后,发现了很多Permission denied,说白了就是nginx没有权限访问静态页面所在的那个index.html。

至此就觉得很奇怪,目录权限,文件权限我都给了,为什么访问不了?google了好一会之后发现有人记录过SELinux 会引起这个现象。SELinux 基于最小权限原则默认拦截了 Nginx 的请求。

原谅我没文化,属实不太理解为什么SELinux会有这种设定,允许Nginx对这个静态文件的读取,就会让系统面临安全风险吗?

问题定位:

1,首先查看SELinux的状态,是不是启动的,如下是我其他地方复制的(不是我自己的,我当时没有截图),其中的enabled就表示启用的:

[root@centos-server-02 local]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

也可以使用 getenforce 命令查看,会直接输出一个单词表示启用还是受限,很直观。

2,先临时关闭SELinux看能否访问:

setenforce 0

后面的数字 0 表示临时关闭,数字 1 表示临时启用。经检查,关闭后,所需要部署的站点就能访问了,这样就确定了SELinux拦截了nginx对文件的访问。 

解决问题:

1,开启http访问:

setsebool -P httpd_can_network_connect 1

2,分析现有日志并生成关联模块,执行完此命令可以看到在当前目录下会生成后缀为*.pp和*.te文件,如果该服务器上的服务未被访问过,此命令执行无效。其实这一步我不是很懂,只是看别人这么写,我也这么抄。我执行这一步后在当前目录下生成两个文件,my-nginx.pp 和 my-nginx.te ,所以如果不想污染当前目录的话,可以先进入一个临时创建的空白目录。

ausearch -c 'nginx' --raw | audit2allow -M my-nginx

3,加载前一步生成的模块内容,这一步我也不懂,跟着做吧。

semodule -i my-nginx.pp

这一步会需要好几秒时间才能执行完。

4,由于我刚刚临时关闭了SELinux,所以这里再临时开启:

setenforce 1

再尝试访问站点,不行的话重启nginx,

nginx -s reload

 

posted @ 2023-03-15 18:51  透明飞起来了  阅读(319)  评论(0编辑  收藏  举报