需要实现的目标:
- 允许使用PHP、MySQL、FTP,不允许使用SSH登录
- FTP目录限制在用户的home目录下
- 每一个vhost在运行php时不可读取其他目录,防止被挂马后影响其他应用
- php运行用户与ftp相同,这样上传文件权限统一
准备设置
sudo apt-get install apache2-mpm-itk
这个是切换apache权限的,这个后面会讲,或者看这里:http://bigamekiller.blog.sohu.com/161124712.html
现在知道这个补丁的bug是在stop apache后,一些进程关不掉,需要手动killall -9 apache2才可。
现在知道这个补丁的bug是在stop apache后,一些进程关不掉,需要手动killall -9 apache2才可。
Virtualmin/Webmin安装
# webmin
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.620_all.deb
dpkg --install webmin_1.620_all.deb
# 如果这时候需要其他包,可以再运行 apt-get -f install
# virtualmin
wget http://software.virtualmin.com/gpl/scripts/install.sh
chmod +x install.sh
./install.sh
模块设置
在System Settings -> Features and Plugins中,关闭不必要的模块。我只保留如下模块:
|
禁止SSH
由于不允许虚拟主机以ssh方式访问,直接在System Customization -> Custom Shells中,保留/bin/false(勾选其enabled, admin, Mailbox, default).
由于不允许虚拟主机以ssh方式访问,直接在System Customization -> Custom Shells中,保留/bin/false(勾选其enabled, admin, Mailbox, default).
限制FTP根目录
在Limits and Validation -> FTP Directory Restrictions,这里
勾上Active,选择Users' home directories,以及Users' home directories。
限制php读取目录
在System settints -> Edit Server Template中,选择Apache Website,
找到
Default PHP execution mode,使用
mod_php运行。(使用FastCGI模式似乎无法使用php_admin_value配置……)
在Directives and settings for new websites的配置模板中加入一行:
php_admin_value open_basedir "${HOME}/public_html:/tmp"
<IfModule mpm_itk_module>
AssignUserId ${USER} ${USER}
</IfModule>
AssignUserId ${USER} ${USER}
</IfModule>
即:
ServerName ${DOM}
ServerAlias www.${DOM}
DocumentRoot ${HOME}/public_html
php_admin_value open_basedir "${HOME}/public_html:/tmp"
<IfModule mpm_itk_module>
AssignUserId ${USER} ${USER}
</IfModule>
ErrorLog /var/log/virtualmin/${DOM}_error_log
CustomLog /var/log/virtualmin/${DOM}_access_log combined
ScriptAlias /cgi-bin/ ${HOME}/cgi-bin/
DirectoryIndex index.html index.htm index.php index.php4 index.php5
<Directory ${HOME}/public_html>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
</Directory>
<Directory ${HOME}/cgi-bin>
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
</Directory>
这样就限制了php脚本读取其他文件目录了。同时保证运行权限与文件所属权限相同~
另外一种替代方案,是fcgi + mod_suexec,可以让php执行用户变为virtual host的用户,解决上面的问题,但由于cgi方式下不能设置“php_admin_value open_basedir”,所以对于open_basedir的限制只能在/etc/php5下的php.ini进行,模板用不起来。同时,使用fcgi运行的话,会产生用户自己配置的php.ini,这样就算在总ini中设置了,也会被覆盖。这种情况下只是用户权限相同,而无法限制目录访问。
像apache jail这种高级东西,研究了一下也不太适合。。。。。。
完成&测试
建立一个virtual server,各选项默认即可。
检查以下内容:
- SSH无法登录
- FTP登录后,访问被限制在用户目录下
- 上传PHP木马,确定只可访问public_html目录
- php木马运行whoami,发现不是www-data,而是home所属用户。