使用Apache2 mpm-peruser在单独的UID / GID下运行Vhost在Debian Etch

使用Apache2 mpm-peruser在Debian Etch下运行独立UID / GID下的Vhost

版本1.0
作者:Falko Timme

本文介绍如何在Debian Etch服务器上安装和配置apache2-mpm-peruser 。 apache2-mpm-peruser是Apache 2 Web服务器的MPM(多处理模块),与apache2-mpm-itk非常相似,但速度更快(与apache2-mpm-prefork一样快)。 mpm-peruser允许您在单独的UID和GID下运行每个vhosts - 简而言之,一个vhost的脚本和配置文件不再需要对所有其他vhosts可读。 它是基于metuxmpm,一个工作实现的perchild MPM。 结果是为您的用户提供了一个理智和安全的Web服务器环境,而不需要像PHP的safe_mode这样的kludges。

本文档不附带任何形式的保证! 我不会保证这将为您工作!

1初步说明

有关速度的考虑,请查看http://blog.stuartherbert.com/php/2008/03/20/using-mpm-peruser-to-secure-a-shared-server/

我假设你的Debian Etch服务器上有一个可以使用mod_php的Apache2安装工具,例如安装如下:

apt-get install apache2-mpm-prefork libapache2-mod-php5

当您使用phpinfo()创建PHP文件时; 功能,例如这样...

vi /var/www/info.php
<?php
phpinfo();
?>

...并在浏览器中调用它,您会看到prefork被列在apache2handler下的Loaded Modules行中:

2安装apache2-mpm-peruser

与apache2-mpm-itk不同,apache2-mpm-peruser不可用作Debian软件包,因此我将构建自己的Debian软件包(我将使用apache2-mpm-itk源码包作为构建我的apache2-mpm- peruser Debian包,因为它们非常相似)。

在我开始构建软件包之前,我安装了一些先决条件:

apt-get install build-essential dpkg-dev fakeroot debhelper dpatch apache2-prefork-dev libcap-dev apache2-src autoconf

然后我去/ usr / src并下载apache2-mpm-itk源码包:

cd /usr/src
apt-get source apache2-mpm-itk
ls -l
server1:/usr/src# ls -l
total 52
drwxr-xr-x 3 root root  4096 2008-08-16 13:29 apache2-mpm-itk-2.2.3-01
-rw-r--r-- 1 root src  11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz
-rw-r--r-- 1 root src    664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc
-rw-r--r-- 1 root src  29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz
server1:/usr/src#

接下来我将apache2-mpm-itk目录重命名为apache2-mpm-peruser:

mv apache2-mpm-itk-2.2.3-01 apache2-mpm-peruser-2.2.3-01

然后我去那个目录,下载mpm-peruser补丁并删除目录中已经存在的mpm-itk补丁:

cd apache2-mpm-peruser-2.2.3-01/
wget http://www.telana.com/files/httpd-2.2.3-peruser-0.3.0.patch
rm -f apache2.2-mpm-itk.patch

现在我们去debian /子目录:

cd debian/
ls -l
server1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian# ls -l
total 64
-rw-r--r-- 1 root root    10 2008-08-15 16:21 apache2-mpm-itk.dirs
-rw-r--r-- 1 root root   633 2008-08-15 16:21 apache2-mpm-itk.postinst
-rw-r--r-- 1 root root   561 2008-08-15 16:21 apache2-mpm-itk.preinst
-rw-r--r-- 1 root root   342 2008-08-15 16:21 apache2-mpm-itk.prerm
-rw-r--r-- 1 root root   438 2008-08-15 16:21 changelog
-rw-r--r-- 1 root root     2 2008-08-15 16:21 compat
-rw-r--r-- 1 root root   980 2008-08-15 16:21 control
-rw-r--r-- 1 root root 31777 2008-08-15 16:21 copyright
-rwxr-xr-x 1 root root  1328 2008-08-15 16:21 rules
server1:/usr/src/apache2-mpm-peruser-2.2.3-01/debian#

我们在文件名中重命名包含itk的所有文件:

mv apache2-mpm-itk.dirs apache2-mpm-peruser.dirs
mv apache2-mpm-itk.postinst apache2-mpm-peruser.postinst
mv apache2-mpm-itk.preinst apache2-mpm-peruser.preinst
mv apache2-mpm-itk.prerm apache2-mpm-peruser.prerm

接下来我们必须修改changelog文件,例如:

cat /dev/null > changelog
vi changelog
apache2-mpm-peruser (2.2.3-01-1) stable; urgency=low

  * Initial port to Apache 2.2.

 -- Falko Timme <ft@falkotimme.com>  Fri, 15 Aug 2008 14:29:36 +0100

确保最后一行在开头(之前- )和电子邮件地址和日期之间的两个空格之间只有一个空格

现在我们打开控制文件并用apache2-mpm-peruser替换所有出现的apache2-mpm-itk 。 我离开说明,但是替换ITKPeruser 。 在“ 冲突”行中,我添加了apache2-mpm-itk

vi control
Source: apache2-mpm-peruser
Section: net
Priority: extra
Build-Depends: apache2-src, apache2-prefork-dev, libcap-dev, autoconf, debhelper (>> 5.0.0)
Maintainer: Falko Timme <ft@falkotimme.com>
Standards-Version: 3.7.2

Package: apache2-mpm-peruser
Provides: apache2-modules, apache2, httpd, httpd-cgi
Conflicts: apache2-mpm-prefork, apache2-mpm-itk, apache2-mpm-worker, apache2-mpm-perchild, apache2-mpm-event, apache2-common
Depends: ${apache:Depends}, ${shlibs:Depends}
Architecture: any
Description: multiuser MPM for Apache 2.2
 The Peruser Multi-Processing Module (MPM) works in about the same way as the
 classical "prefork" module (that is, without threads), except that it allows
 you to constrain each individual vhost to a particular system user. This
 allows you to run several different web sites on a single server without
 worrying that they will be able to read each others' files.
 .
 Please note that this MPM is highly experimental, and is not from the same
 tree as the other MPMs.

接下来我们修改规则文件:

vi rules

更换

cd apache2.2/ && patch -p1 < ../apache2.2-mpm-itk.patch

cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch

更换

sed 's,prefork,itk,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice

sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice

更换

install -m 0755 build-tree/apache2 debian/apache2-mpm-itk/usr/sbin/

install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/

更换

echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-itk.substvars

echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars

完整的文件如下所示:

#! /usr/bin/make -f

clean:
        dh_testdir
        dh_testroot
        dh_clean
        $(RM) -r build-tree/
        $(RM) -r apache2.2/
        $(RM) build-stamp

build: build-stamp
build-arch: build-stamp
build-stamp:
        dh_testdir
        mkdir build-tree/
        mkdir apache2.2/
        cd apache2.2/ && tar zxf /usr/src/apache2.tar.gz

        # workaround for apache2-src 2.2.3-3
        if [ -d apache2.2/apache2 ]; then \
                mv apache2.2/apache2/* apache2.2/; \
                rmdir apache2.2/apache2/; \
        fi

        cd apache2.2/ && patch -p1 < ../httpd-2.2.3-peruser-0.3.0.patch
        cd apache2.2/ && autoconf
        sed 's,prefork,peruser,;s,^".*/configure",../apache2.2/configure,;s,^"--srcdir=.*",--srcdir=../apache2.2/,' < /usr/share/apache2/build/config.nice > build-tree/config.nice
        chmod +x build-tree/config.nice
        cd build-tree/ && ./config.nice
        cd build-tree/ && $(MAKE)
        touch build-stamp

binary: binary-arch
binary-indep:
binary-arch: build-arch
        dh_testdir
        dh_testroot
        dh_installdirs

        install -m 0755 build-tree/apache2 debian/apache2-mpm-peruser/usr/sbin/

        dh_fixperms
        dh_strip
        dh_installdocs README
        dh_installchangelogs
        dh_installdeb
        dh_compress
        dh_shlibdeps
        echo "apache:Depends=apache2.2-common (= `dpkg -s apache2.2-common | grep ^Version: | cut -d" " -f2`)" >> debian/apache2-mpm-peruser.substvars
        dh_gencontrol
        dh_md5sums
        dh_builddeb

.PHONY: clean build build-arch binary binary-arch binary-indep

这些都是我们需要做的更改 - 我们现在可以构建包:

cd ..
dpkg-buildpackage

该包将在/ usr / src目录中可用:

cd /usr/src
ls -l
server1:/usr/src# ls -l
total 6512
-rw-r--r-- 1 root src    11392 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.diff.gz
-rw-r--r-- 1 root src      664 2007-10-03 19:02 apache2-mpm-itk_2.2.3-01-2.dsc
-rw-r--r-- 1 root src    29071 2006-10-31 00:04 apache2-mpm-itk_2.2.3-01.orig.tar.gz
drwxr-xr-x 5 root root    4096 2008-08-16 13:40 apache2-mpm-peruser-2.2.3-01
-rw-r--r-- 1 root src      353 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.dsc
-rw-r--r-- 1 root src      710 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.changes
-rw-r--r-- 1 root src   165438 2008-08-16 13:40 apache2-mpm-peruser_2.2.3-01-1_i386.deb
-rw-r--r-- 1 root src    50282 2008-08-16 13:36 apache2-mpm-peruser_2.2.3-01-1.tar.gz
-rw-r--r-- 1 root root 6364431 2008-03-22 10:35 apache2.tar.gz
server1:/usr/src#

我们刚刚构建的mpm-peruser包命名为apache2-mpm-peruser_2.2.3-01-1_i386.deb 。 在我们安装之前,我们必须卸载apache2-mpm-prefork,因为它与apache2-mpm-peruser冲突(记住控制文件):

apt-get remove apache2-mpm-prefork

server1:/ usr / src#apt-get remove apache2-mpm-prefork
阅读包列表...完成
建立依赖树...完成
以下包将被删除:
apache2-mpm-prefork libapache2-mod-php5
0升级,0新安装,2删除,68未升级。
需要获得0B的档案。
拆包后6115kB的磁盘空间将被释放。
是否要继续[Y / n]? < - Y
(读取数据库... 29620当前安装的文件和目录。)
删除libapache2-mod-php5 ...
模块php5禁用; 运行/etc/init.d/apache2强制重新加载完全禁用。
删除apache2-mpm-prefork ...
停止Web服务器(apache2)....
server1:/ usr / src#

不幸的是,这也删除了libapache2-mod-php5包,这样PHP就不再工作了。 我们会在一会儿解决。

现在我们可以安装apache2-mpm-peruser包:

dpkg -i apache2-mpm-peruser_2.2.3-01-1_i386.deb

现在,如果您尝试重新安装libapache2-mod-php5软件包,您将看到apt坚持删除apache2-mpm-peruser并重新安装apache2-mpm-prefork,这不是我们想要的 - 因此我们中止这一点:

server1:/ usr / src#apt-get install libapache2-mod-php5
阅读包列表...完成
建立依赖树...完成
将安装以下额外的软件包:
apache2-mpm-prefork
建议包:
梨梨
以下包将被删除:
apache2-mpm-peruser
将安装以下新软件包:
apache2-mpm-prefork libapache2-mod-php5
0升级,2新安装,1删除,61升级。
需要获得0B / 2833kB的档案。
拆包后,将使用5681kB的额外磁盘空间。
是否要继续[Y / n]? < - n
中止。
server1:/ usr / src#

这是因为在构建libapache2-mod-php5包的时候,维护者告诉它,它取决于apache2-mpm-prefork或者apache2-mpm-itk。 这意味着我们必须从源重建libapache2-mod-php5,并将apache2-mpm-peruser软件包添加到该软件包的依赖项(您可以使用任何其他软件包执行此操作,如果您与其他软件包有相同的问题包)。 我会一会儿来的。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏