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了