Total Pageviews

Friday 29 November 2013

从备份的文件还原网站数据后, SELinux 导致 httpd(apache2) 无法启动

SELinux 是美国国安局开发的一个能有效增强 Linux 安全性的套件,现在现在很多 Linux 发行版都默认集成。这个东西用好了能极大的增强服务器性能,然而,有时候也会带来一些不便和困惑。如果对它不了解的话,有时候出的问题甚至能把人搞迷糊 了。建议大家去了解一下它,至少要知道它的用途、如何禁用、启用它,和由它引发的一些常见问题,以免碰到了一些由它引发的问题的时候一头雾水,不知所措。
比如我今天碰到这这个问题,要是事先不知道 SELinux 的话,估计会把人搞疯了,不过好在哥们我比较 professional,哪能随便被一些小 case 磕倒啊,哈哈  :-)
今天的事情是这样的,我今天把服务器重装了,重装好了以后把之前做好的网站备份还原到了新系统上,但启动 httpd 时报错,提示:
[root@www vhosts]# service httpd restart
Stopping httpd:                                            [  OK ]
Starting httpd: Syntax error on line 290 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
[FAILED]
我看了下配置文件,DocumentRoot 指向的目录确确实实是存在的,权限设置也是没问题的,但 apache 就是不认,WTF????
反复确认了几次后,我100%确认配置是没有问题的,权限也是没有问题的,那会是什么原因捏~~ SELinux,只有这个可能了。先确认一下:
[root@www vhosts]# ls -Z
drwxr-xr-x  root  root  root:object_r:user_home_t www.mydomain.com
[root@www vhosts]# grep denied /var/log/audit/audit.log
type=AVC msg=audit(1278157850.075:163): avc:  denied { search } for  pid=10100 comm=”httpd” name=”vhosts” dev=dm-1 ino=4391538 scontext=root:system_r:httpd_t:s0 tcontext=root:object_r:user_home_t:s0 tclass=dir
看到没,文件夹的 SELinux 属性必须是 httpd_sys_content_t 才能被 web 服务器访问,但现在却是 user_home_t
[root@www vhosts]# cd ..
[root@www www]# chcon -R -t httpd_sys_content_t vhosts/
检查一下结果:
[root@www www]# ls -Z vhosts/
drwxr-xr-x  root  root  root:object_r:httpd_sys_content_t www.mydomain.com
好了,已经正确改回来了,重启下 httpd:
[root@www www]# service httpd start
Starting httpd:                                            [  OK ]
OK,访问一下网站,也能正常访问了。
总结:
当时我是先把备份文件解压到自己的用户目录下,结果就被自动设置上了 user_home_t 属性,把移动到网站目录下后,没有被重新设置为 httpd_sys_content_t 属性,导致 httpd (以 apache 用户身份启动) 无权限访问该文件夹。使用 chcon 修改属性为 httpd_sys_content_t 后,httpd 即可以正常访问,问题解决。