我有一台 Debian 虚拟机服务器,我可以完全控制它,但有人想在上面托管一个域。这显然是一个安全问题,因为即使他的特定用户无法读取其他域的所有其他文件,但他在 Web 服务器上运行的任何脚本 (PHP) 都可以。举例来说:
% ls -l /srv
drwxr-x--x 5 admin admin 4096 Mar 4 13:29 secretsite.com
drwxr-x--x 4 bob bob 4096 Apr 4 12:41 mycoolsite.co.uk
$ su - bob
$ ls /srv/
ls: cannot open directory /srv/: Permission denied
$ ls -R /srv/mycoolsite.co.uk/
/srv/mycoolsite.co.uk:
public
/srv/mycoolsite.co.uk/public:
htdocs
/srv/mycoolsite.co.uk/public/htdocs:
index.php
然而:
$ cat /srv/mycoolsite.co.uk/public/htdocs
<?php
echo shell_exec('whoami');
echo shell_exec('ls /srv');
?>
在浏览器中输出:www-data secretsite.com mycoolsite.co.uk
...不太理想。
因此我决定使用 FastCGI 和 Suexec 来确保 bob 的 PHP 文件以他的身份执行。我主要遵循给出的说明这里,但我已经设置好了大规模托管的 Apache 配置。
我sites-enabled
有一个名为的配置文件zz-mass-hosting
:
NameVirtualHost my.ip.address:80
<VirtualHost my.ip.address:80>
<Directory "/srv">
AllowOverride all
</Directory>
AddHandler cgi-script .cgi
UseCanonicalName Off
VirtualDocumentRoot /srv/%0/public/htdocs/
VirtualScriptAlias /srv/%0/public/cgi-bin/
SetVirtualDocumentRoot on
</VirtualHost>
效果非常好。
因此,为了设置这个域,mycoolsite.co.uk
具体来说我是通过 apt 安装的:libapache2-mod-fcgid apache2-suexec-custom php5-cgi
我修改/etc/apache2/suexec/www-data
为:/srv
。没有第二行。并创建/etc/apache2/conf.d/php5-fastcgid.conf
:
AddType application/x-httpd-php .php
AddHandler php-fcgi .php
Action php-fcgi /fcgi-bin/php5-fcgi
Alias /fcgi-bin/ /home/www-data/
<Location /fcgi-bin/>
SetHandler fcgid-script
Options +ExecCGI
</Location>
/home/www-data/php5-fcgi 是:
#!/bin/sh
exec /usr/bin/php5-cgi
拥有所有权www-data:www-data
。我拥有/home/www-data/bob
所有权bob:bob
并复制到php5-fcgi
那里。
然后我创建zzz-mycoolsite.co.uk
了sites-available
:
<VirtualHost my.ip.address:80>
ServerAdmin [email protected]
ServerName mycoolsite.co.uk
Alias /fcgi-bin/ /home/www-data/bob/
SuexecUserGroup bob bob
DocumentRoot /srv/mycoolsite.co.uk/public/htdocs/
<Directory /srv/mycoolsite.co.uk/public/htdocs/>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
但当我激活此网站并访问时,mycoolsite.co.uk/index.php
它仍然显示正在运行www-data
。有人能看出我哪里出错了吗?
答案1
最有可能的原因是,默认情况下,debian 的 suexec root 是使用 /var/www 进行编译的,而您尝试在 /srv 上使用。另请参阅:如何将 suexec 根目录从“/var/www”更改为“/home”?