Powered by Typecho)))
Optimized by EAimTY
现在很多linux虚拟主机商,都会开通shell权限给用户,方便管理,但是这样一来也带来了巨大的安全问题。先说说运行环境,Apache(suexec+fcgid)+php+mysql,所有用户均有shell权限。
默认情况下,一旦某个站点存在漏洞或者某位用户心存不轨,同服务器站点数据很容易被窃取。以下为例:
A,B站点同属服务器C。
比如A站点的用户发现B站点有漏洞,爆出了物理路径,但无法注入无法取得上传权限。
默认情况下,网站文件一般权限都会设置权限至少755,则漏洞就会产生(若设置成751,则html等静态文件无法读取,711会造成无法列举目录内文件,无法找到首页)。
A用户在得到了B站点的路径的情况下,完全可以通过shell登录窃取到B站点的机密配置文件如config.php等,从而窃取到B的数据库资料。
当然有一个办法,能避免文件被窃取。目录设置为755,动态文件设置为751/711/600(不给其他用户读的权限),静态文件设置成604/644
但这样做是无比的麻烦。。。
后继:通过配置ACL权限,额外分配给Apache运行用户读取和执行权限,并结合上述设置,能杜绝掉跨站攻击,而只需要设置目录或者文件权限为750即可。cgi(php)程序文件的权限可设置为600或400也能照常运行。但目录必须至少为750才能保证程序正常运行。
完美的方案是部署ACL+grsecurity+jailkit了。即便是爆了路径,也无法窃取到资料。
ACL+grsecurity+jailkit
目录最好设置成750,否则会出现403错误
php等cgi程序,去掉其他用户的任何权限,防止在开通了shell的情况下被跨站攻击
/home 目录本身为751(根据suexec配置选项所得)
/home下所有目录默认750,并分配如下ACL权限,web-httpd为Apache运行身份,www-data为nginx运行身份
/home/cgi-system/ 目录为751,子目录及其文件为750
setfacl -m u:web-httpd:rx,g:web-httpd:rx,u:www-data:rx,g:www-data:rx,o::- -R /home
setfacl -d -m u:web-httpd:rx,g:web-httpd:rx,u:www-data:rx,g:www-data:rx,o::- -R /home
logs目录设置用户可读
#setfacl -m u:user:r,g:user:r -R /home/user/logs
setfacl -d -m u:user:r,g:user:r -R /home/user/logs
/home/username 目录属性为710/750
下级目录和文件属主为用户本身,权限750
参考
http://linux.chinaunix.net/techdoc/beginner/2009/10/27/1141592.shtml
http://www.cnblogs.com/cabin/archive/2010/09/18/1830180.html
http://www.ibm.com/developerworks/cn/linux/l-acl/
http://ljh0242.blog.163.com/blog/static/5697009020088223959537/
这里有必要说明下php效率问题,suphp比suexec要快一点;比suphp更快的还有suphp_mod_php;再快一些的是mpm-peruser,不过安装配置的麻烦程度也随之递增。考虑到后期部署其他语言的方便性,故选择通用性更强的fcgi模式。
suexec编译选项要注意的事项:
--with-suexec-caller=web-httpd
调用用户,应该跟Apache运行用户保持一致
--with-suexec-uidmin=500
可使用suexec的用户最小uid
--with-suexec-gidmin=500
可使用suexec的用户组最小gid
--with-suexec-userdir=/wwwroot
定义suEXEC允许访问的用户宿主目录下的子目录。suEXEC将以用户身份执行这个目录下的所有可执行程序,所以这些程序必须是"安全程序"。如果使用"简单的"UserDir指令(即不带"*"),则此处应该被设置为相同的值。当UserDir指令所指向的目录与"passwd"文件所指定的用户宿主目录不同时,suEXEC将不会正常工作,其默认值是"public_html"。如果所支持的虚拟主机对每个用户有不同的UserDir ,则应该把他们集中在同一个父目录下,而用这个参数指向这个父目录。如果配置不当,"~userdir"下的cgi请求将无效!
--with-suexec-docroot=/home/
此选项尤为重要,必须是php程序运行的上级目录。不支持通配符*。
--with-suexec-umask=4755
更多配置请看这里
http://lamp.linux.gov.cn/Apache/ApacheMenu/suexec.html
Apache2.2.x安装配置选项略,详情见前面这里。
1:mod_fcgid安装
APXS=/usr/local/apache2/bin/apxs ./configure.apxs
make & make install
2:mod_encoding 安装(解决中文路径问题)
详情搜索本站,在此略过。
权限问题:这是最繁琐的问题,折磨我很久的问题,请注意bin目录,build目录,include目录(这里指的是相对应Apache目录,下文中未明确指出的地方,均是指相对Apache目录)下的文件属主必须为root, modules下的httpd.exp属主为root。其他未明确指出的目录或文件,属主应为Apache运行用户。
关于用户的cgi程序目录问题:1,必须隶属于--with-suexec-docroot目录(关于suexec详细参数,可以运行bin/suexec -V查看)。2,cgi程序和cgi的上级目录属主必须为用户本身,且cgi程序有x执行权限。
错误例子:
suexec_log
[2006-01-02 15:03:16]: user mismatch (postfix instead of httpd)
[2006-01-02 15:06:07]: uid: (200/postfix) gid: (200/200) cmd: index.cgi
[2006-01-02 15:06:07]: target uid/gid (200/200) mismatch with directory (502/502) or program (502/502)
[2006-01-02 15:06:11]: uid: (200/postfix) gid: (200/200) cmd: index.cgi
[2006-01-02 15:06:11]: target uid/gid (200/200) mismatch with directory (502/502) or program (502/502)
cgi文件的父目录的属性不匹配,必须也chown 到uid=200的那个。