Ubuntu 18.04 使用独立用户运行虚拟主机 (mpm-itk)

在昨天的帖子中介绍了如何在Ubuntu 18.04下安装Apache2、PHP7.2、MYSQL,完成安全后,我们略作设置并绑定域名就可以跑起网站啦。


(图源 :pexels.com)

默认配置

但是默认情况下,网站的目录配置为:

DocumentRoot /var/www/html

而Apache2的用户和用户组为

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

也就是说,如果我们想运行多个站点,站点的用户和组都是www-data,这样有个风险就是,一旦一个站点被黑,那么上载恶意脚本后很容易黑掉其它站点。

mpm-itk 模块

那么有没有办法已不同的用户运行虚拟主机呢?比如说a用户的虚拟主机程序用户和用户组都是a,而b用户的虚拟主机程序用户和用户组都是b,答案是使用mpm-itk 模块。

老一点的版本可能会使用以下指令安装模块:

sudo apt-get install apache2-mpm-itk

在Ubuntu 18.04下,上述指令无法安装mpm-itk,正确的指令为:

sudo apt-get install libapache2-mpm-itk

安装完成时会自动使能这个模块。

Setting up libapache2-mpm-itk (2.4.7-04-1) ...
apache2_invoke: Enable module mpm_itk

如果需要手动使能相关模块,可以使用如下指令:

sudo a2enmod mpm_itk

提示信息如下:

Considering dependency mpm_prefork for mpm_itk:
Considering conflict mpm_event for mpm_prefork:
Considering conflict mpm_worker for mpm_prefork:
Module mpm_prefork already enabled
Module mpm_itk already enabled

创建站点

安装好这个mpm_itk模块后,我们创建个新站点(可以从默认站点配置文件来修改)

cd /etc/apache2/sites-available
sudo cp 000-default.conf mysite.conf
sudo vi mysite.conf

然后主要修改如下:

ServerName mysite.com
<ifmodule mpm_itk_module>
AssignUserID mysite mysite
</ifmodule>
DocumentRoot /home/mysite/www
ErrorLog /home/mysite/logs/error.log
CustomLog /home/mysite/logs/access.log combined

然后使用adduser添加用户:

sudo adduser mysite

登陆上述用户,创建对应目录和站点文件。

然后执行如下指令启动站点:

sudo a2ensite mysite.conf
sudo systemctl reload apache2

权限错误

按上述操作配置后,访问站点会提示 403 Forbidden 错误:

查看错误日志发现类似如下错误:

[Tue Jul 17 00:46:08.773031 2018] [authz_core:error] [pid 12821] [client xxxxx:54251] AH01630: client denied by server configuration: /home/mysite/www/
[Tue Jul 17 00:46:11.360338 2018] [authz_core:error] [pid 12821] [client xxxx:54251] AH01630: client denied by server configuration: /home/mysite/www/

我一直以为是我libapache2-mpm-itk模块没有配置好,经过一整天的反复测试和调查后,才发现在apche2.conf中设置了如下访问限制。

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

也就是说除了/var/www/以及/usr/share以外的目录都是禁止访问的。知道了这点就很好解决啦,在我们的mysite.conf中运行访问我们的目录就可以啦。

        <Directory /home/mysite/www>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        </Directory>

再来测试一下,耶,一切正常。

总结

现在我们就可以已独立的用户运行虚拟主机啦,这样做安全性更高,也更便于管理。是不是很简单?

相关链接

H2
H3
H4
3 columns
2 columns
1 column
10 Comments