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