日志标签 ‘selinux’

SELinux 导致 PHP 无法使用 fsockopen 连接到 Memcached 服务器

2010年8月5日

前段时间刚刚写了一篇关于 SELinux 导致 httpd(Apache2) 无法启动 的文章,今天又碰到 SELinux 的问题了。

事情是这样的:

首先是服务器硬盘出问题了:-(,我给换了块硬盘,然后重装系统(CentOS 5.4 i386),然后安装各种程序、还原各种数据。最后一步是使用 memcache.php 来监控 Memcache 状态。然而却发现该工具无法连接上 Memcached 服务器。经检查,Memcached 服务器已经正常启动,使用 telnet 能够正常连接上去,使用 Memcached 的应用程序(PHP程序)也正常工作。查看 memcache.php 代码发现其是使用 fsockopen 来连接 Memcached 服务器,遂怀疑 Socket 扩展的问题。然而,检查发现可以在命令行中使用 fsockopen 连接到任意地址的任意端口,说明 Socket 扩展没问题。但在 httpd 中使用 fsockopen 来就只能连接本机的 80、8080、443 端口,连接其他端口均失败。

检查 httpd 的 log 也没发现任何问题。上网搜索也没发现类似问题,郁闷ing……

于是又想到是否是 SELinux 的问题。grep 了下 /var/log/audit/audit.log,发现以下线索:

» 阅读更多: SELinux 导致 PHP 无法使用 fsockopen 连接到 Memcached 服务器

从备份还原后 SELinux 导致 httpd(apache2) 无法启动,提示 DocumentRoot must be a directory

2010年7月3日
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.liang.eu
[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.liang.eu
好了,已经正确改回来了,重启下 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 即可以正常访问,问题解决。
例行公事:http://LiANG.eu 原创文章,转载请注明出处和保留链接,否则将会有很低俗的事情发生。