利用libapache2-mod-chroot包加固Apache2服务

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

利用libapache2-mod-chroot包加固Apache2服务

#1

帖子 firehare » 2005-08-20 10:17

在做测试时改得我头都有点晕了,可能有些因素尚未考虑到,主要是chroot环境下的虚根目录,同 apache2加载时的实根目录之间的问题。不过基本运行是没什么问题的,就怕日志什么有些可能会没有。所以一定要考虑清楚,如果不清楚的话,可以在正常运行之后,多看看Error.log日志。祝大家愉快!!
===================
今天继续写:
现在要安装Chroot环境了,为什么要安装Chroot环境呢?因为它安全,chroot可以把进程的根目录变成不是“/”目录的其他目录。这就意味着该进程被锁定到一个虚拟文件系统的根中。如果你再适当地配置你的chroot jail,Apache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西。同时,非根进程也不能离开chroot jail环境的。(注意:从上面描述我们不难看出把设备文件,被suid的二进制文件以及硬链接放入jail是十分不明智的。原因?因为它们可以破坏 chroot jail环境)
使用chroot环境有两种方式:一则是常规方式,在该方式下你必须要十分小心地建立一个“虚拟根”,并将程序可能需要的文件给包含进来。一般说来有:
* C 语言库
* 其他的库 (如libssl、libm及libmysqlclient等)
* 解析配置文件(如/etc/nsswitch.conf、/etc/resolv.conf等)
* 用户相关文件 (/etc/passwd, /etc/group)
* 为 log 文件指定目录
* 程序所需的附加模块(如mod_php 和 其他模块)
然后,你得运行程序,读错误信息,拷贝错失的文件,拆腾一通之后,得以运行正常。但还没完,想一下升级时的情形吧,你将不得不保持你当前的“虚拟根”,如果在libssl中有一个Bug,那么你就必须要将新版本放在两个地方。是不是有点吓着了?所幸还有另一种mod_chroot方式。 mod_chroot允许你在一个chroot jail环境里运行Apache2,而无需附加任何文件。chroot()系统会在程序开始引导时是最后被调用,因为Apache2在开始引导期间需要访问整个文件系统 - 那时所有的库文件已被引导并且日志文件也已经被打开。
运行chroot jail环境中的Apache(和CGI/Perl/PHP)是很需要些技巧的。我们下面开始构造我们的chroot环境。首先安装mod-chroot
$sudo apt-get install libapache2-mod-chroot
该包会在/etc/apache2/mod-available/目录中生成一个mod_chroot.load,然后我们制作mod_chroot.conf文件:
>ChrootDir /var/www
为使该模块能被引导,可以做该模块的软链接,如果想快点的话,可以用
$sudo a2enmod mod_chroot
然后为了使所有配置都得到改变,运行
$sudo /etc/init.d/apache2 force-reload
但如果这样的话,就存在一个问题,我们的DocumentRoot是/var/www的,现在虚拟根已经指向了/var/www,这样我们就必须将DocumentRoot修改成“/”才算正确!所以要修改/etc/apache2/sites-enabled/000-default文件

代码: 全选

NameVirtualHost *
<VirtualHost *>
   ServerAdmin webmaster@localhost
   
#   DocumentRoot /var/www/
#   <Directory />
#      Options FollowSymLinks
#      AllowOverride None
#   </Directory>
#   <Directory /var/www/>
#      Options Indexes FollowSymLinks MultiViews
#      AllowOverride None
#      Order allow,deny
#      allow from all
      # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        # Commented out for Ubuntu
        #RedirectMatch ^/$ /apache2-default/
#   </Directory>

   <Directory />
      Options FollowSymLinks
      AllowOverride None
   </Directory>
   <Directory /htdocs>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
      # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        # Commented out for Ubuntu
        #RedirectMatch ^/$ /apache2-default/
   </Directory>
   
#   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
#   <Directory "/usr/lib/cgi-bin">
#      AllowOverride None
#      Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
#      Order allow,deny
#      Allow from all
#   </Directory>

   ErrorLog /var/log/apache2/error.log

   # Possible values include: debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn

   CustomLog /var/log/apache2/access.log combined
   ServerSignature On

#    Alias /doc/ "/usr/share/doc/"
#    <Directory "/usr/share/doc/">
#        Options Indexes MultiViews FollowSymLinks
#        AllowOverride None
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.0/255.0.0.0 ::1/128
#    </Directory>

</VirtualHost>
做完了之后,来个$sudo /etc/init.d/apache2 force-reload 重新引导Apache2,成功!高兴,再打开Firefox,地址栏中输入localhost,回答拒绝。??!!
$more /var/log/apache2/error.log
>[Sun Jul 17 11:41:35 2005] [error] (2)No such file or directory: could not create /var/run/apache2.pid
>[Sun Jul 17 11:41:35 2005] [error] apache2: could not log pid to file /var/run/apache2.pid
原来在Apache启动时,由于mod-chroot最后生效,所以apache2.pid的路径是对的,但在mod-chroot生效之后,根已指向了/var/www,那所谓的 /var/run/apache2.pid实际上指的是/var/www /var/run/apache2.pid了,而这个目录是不存在的。这个好办,没有的话创建好了!
$sudo mkdir -p /var/www/var/run
$sudo chown -R root.root /var/www/var/run
$sudo ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
第三步很重要,为的是保持一致性!
同样的,对LockFile也做相同处理
$sudo mkdir -p /var/www/var/lock/apache2
$sudo chown -R root.root /var/www/var/lock/apache2
$sudo ln -s /var/www//var/lock/apache2/accept.lock /var/lock/apache2/accept.lock
如果你还要用到其他的,请参照上面自行修改
然后创建网站的缺省目录
$sudo mkdir /var/www/htdocs
然后来重启一次:
$sudo /etc/init.d/apache2 force-reload
运行正常!
我心无畏,源自于我心无知。
图片
头像
kopera
帖子: 52
注册时间: 2005-06-14 1:25
来自: 南华大学

#2

帖子 kopera » 2005-09-10 15:19

多谢谢!用了
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#3

帖子 firehare » 2005-09-10 18:07

顺便帮我测试一下是否还存在没有考虑到的问题,谢谢!!
我心无畏,源自于我心无知。
图片
zhuzhzh
帖子: 265
注册时间: 2005-07-28 15:08

#4

帖子 zhuzhzh » 2005-09-17 22:24

firehare



zhuzhzh@focus:/var/www/apache2-default$ sudo /etc/init.d/apache2 force-reload
* Forcing reload of web server (Apache2)...
(98)Address already in use: make_sock: could not bind to address [::]:80
no listening sockets available, shutting down
*able to open logs
无声胜有声
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#5

帖子 firehare » 2005-09-17 23:21

你是不是起了其他服务,占用了Apache端口?
我心无畏,源自于我心无知。
图片
头像
juanzhewudi
帖子: 1114
注册时间: 2006-01-19 11:55
来自: HUST
联系:

#6

帖子 juanzhewudi » 2007-03-19 13:06

zhuzhzh 写了:firehare



zhuzhzh@focus:/var/www/apache2-default$ sudo /etc/init.d/apache2 force-reload
* Forcing reload of web server (Apache2)...
(98)Address already in use: make_sock: could not bind to address [::]:80
no listening sockets available, shutting down
*able to open logs
when the chroot works, seems like you can not stop the apache2,,,
see that by $ps -e ||grep apache
and in the newest libapache2-mod-chroot, you should keep the chroot-dir/var/run and chroot-dir/var/log empty....

i test the libapache2-mod-chroot in feisty, but it can not be loaded, so i download the source and complied it with apxs2. it works fine. :lol: :lol:
头像
juanzhewudi
帖子: 1114
注册时间: 2006-01-19 11:55
来自: HUST
联系:

#7

帖子 juanzhewudi » 2007-03-19 16:27

现在我的问题是apache无法正常关闭
#/etc/init.d/apache2 restart
Password:
* Forcing reload of web server (apache2)... httpd (no pid file) not running
(98)Address already in use: make_sock: could not bind to address 127.0.0.1:80
no listening sockets available, shutting down
Unable to open logs
[fail]

原因可能是我没有将chrootdir/var/run里面建立apache2.pid的连接。但是当我建立了后却无法启动apache
郁闷了
killall apache2
头像
juanzhewudi
帖子: 1114
注册时间: 2006-01-19 11:55
来自: HUST
联系:

#8

帖子 juanzhewudi » 2007-03-19 16:34

搞定,原来是要在/var/run里建立一个apache2.pid指向chrootdir/var/run/apache2.pid的软连接,我原来建立反了,结果出错。哈哈
fishfree
帖子: 53
注册时间: 2007-04-20 11:05

#9

帖子 fishfree » 2007-08-14 10:52

我按照楼主的做法一步步地做了,但是在浏览器中打开以前一个可以正常打开的路径时:http://localhost/drupal
出现错误:
Not Found

The requested URL /drupal/ was not found on this server.
Apache/2.2.3 (Debian) mod_mono/1.2.1 PHP/5.2.0-8+etch7 Server at localhost Port 80
然后我将drupl目录中的所有文件考到htcdocs目录中,还是如此。
而且在force-reload时还会出现warn信息:
Forcing reload of web server (apache2)...[Tue Aug 14 09:42:47 2007] [warn] NameVirtualHost *:0 has no VirtualHosts
[Tue Aug 14 09:42:47 2007] [warn] NameVirtualHost *:0 has no VirtualHosts
[Tue Aug 14 09:42:57 2007] [warn] NameVirtualHost *:0 has no VirtualHosts
[Tue Aug 14 09:42:57 2007] [warn] NameVirtualHost *:0 has no VirtualHosts

这是怎么回事呢?
另外,$sudo mkdir /var/www/htdocs这一步有什么用处?

谢谢!
头像
firehare
帖子: 2625
注册时间: 2005-04-10 16:54
来自: 温州大学
联系:

#10

帖子 firehare » 2007-08-14 15:49

第一个问题:
你是否做了虚似主机?虚拟主机中的目录是否是 /drupal ?

第二个问题:
$sudo mkdir /var/www/htdocs 的目的是为了配置中下面这段,原因是允许我们使用 apache2 的缺省开始页。

<Directory /htdocs>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# This directive allows us to have apache2's default start page
# in /apache2-default/, but still have / go to the right place
# Commented out for Ubuntu
#RedirectMatch ^/$ /apache2-default/
</Directory>
我心无畏,源自于我心无知。
图片
kinfinger
帖子: 198
注册时间: 2009-05-16 14:22

Re: 利用libapache2-mod-chroot包加固Apache2服务

#11

帖子 kinfinger » 2010-04-22 9:14

:em20,我的搞崩溃了,郁闷阿
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [notice] Apache/2.2.12 (Ubuntu) PHP/5.2.10-2ubuntu6.4 with Suhosin-Patch mod_chroot/0.5 configured -- resuming normal operations
[Thu Apr 22 09:09:54 2010] [alert] Child 2910 returned a Fatal error... Apache is exiting!
missing is i missing you...
kinfinger
帖子: 198
注册时间: 2009-05-16 14:22

Re: 利用libapache2-mod-chroot包加固Apache2服务

#12

帖子 kinfinger » 2010-04-22 9:43

firehare 写了:在做测试时改得我头都有点晕了,可能有些因素尚未考虑到,主要是chroot环境下的虚根目录,同 apache2加载时的实根目录之间的问题。不过基本运行是没什么问题的,就怕日志什么有些可能会没有。所以一定要考虑清楚,如果不清楚的话,可以在正常运行之后,多看看Error.log日志。祝大家愉快!!
===================
今天继续写:
现在要安装Chroot环境了,为什么要安装Chroot环境呢?因为它安全,chroot可以把进程的根目录变成不是“/”目录的其他目录。这就意味着该进程被锁定到一个虚拟文件系统的根中。如果你再适当地配置你的chroot jail,Apache和它的子进程(比如CGI脚本)将除于chroot jail环境之外不能访问其他任何东西。同时,非根进程也不能离开chroot jail环境的。(注意:从上面描述我们不难看出把设备文件,被suid的二进制文件以及硬链接放入jail是十分不明智的。原因?因为它们可以破坏 chroot jail环境)
使用chroot环境有两种方式:一则是常规方式,在该方式下你必须要十分小心地建立一个“虚拟根”,并将程序可能需要的文件给包含进来。一般说来有:
* C 语言库
* 其他的库 (如libssl、libm及libmysqlclient等)
* 解析配置文件(如/etc/nsswitch.conf、/etc/resolv.conf等)
* 用户相关文件 (/etc/passwd, /etc/group)
* 为 log 文件指定目录
* 程序所需的附加模块(如mod_php 和 其他模块)
然后,你得运行程序,读错误信息,拷贝错失的文件,拆腾一通之后,得以运行正常。但还没完,想一下升级时的情形吧,你将不得不保持你当前的“虚拟根”,如果在libssl中有一个Bug,那么你就必须要将新版本放在两个地方。是不是有点吓着了?所幸还有另一种mod_chroot方式。 mod_chroot允许你在一个chroot jail环境里运行Apache2,而无需附加任何文件。chroot()系统会在程序开始引导时是最后被调用,因为Apache2在开始引导期间需要访问整个文件系统 - 那时所有的库文件已被引导并且日志文件也已经被打开。
运行chroot jail环境中的Apache(和CGI/Perl/PHP)是很需要些技巧的。我们下面开始构造我们的chroot环境。首先安装mod-chroot
$sudo apt-get install libapache2-mod-chroot
该包会在/etc/apache2/mod-available/目录中生成一个mod_chroot.load,然后我们制作mod_chroot.conf文件:
>ChrootDir /var/www
为使该模块能被引导,可以做该模块的软链接,如果想快点的话,可以用
$sudo a2enmod mod_chroot
然后为了使所有配置都得到改变,运行
$sudo /etc/init.d/apache2 force-reload
但如果这样的话,就存在一个问题,我们的DocumentRoot是/var/www的,现在虚拟根已经指向了/var/www,这样我们就必须将DocumentRoot修改成“/”才算正确!所以要修改/etc/apache2/sites-enabled/000-default文件

代码: 全选

NameVirtualHost *
<VirtualHost *>
   ServerAdmin webmaster@localhost
   
#   DocumentRoot /var/www/
#   <Directory />
#      Options FollowSymLinks
#      AllowOverride None
#   </Directory>
#   <Directory /var/www/>
#      Options Indexes FollowSymLinks MultiViews
#      AllowOverride None
#      Order allow,deny
#      allow from all
      # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        # Commented out for Ubuntu
        #RedirectMatch ^/$ /apache2-default/
#   </Directory>

   <Directory />
      Options FollowSymLinks
      AllowOverride None
   </Directory>
   <Directory /htdocs>
      Options Indexes FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
      # This directive allows us to have apache2's default start page
        # in /apache2-default/, but still have / go to the right place
        # Commented out for Ubuntu
        #RedirectMatch ^/$ /apache2-default/
   </Directory>
   
#   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
#   <Directory "/usr/lib/cgi-bin">
#      AllowOverride None
#      Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
#      Order allow,deny
#      Allow from all
#   </Directory>

   ErrorLog /var/log/apache2/error.log

   # Possible values include: debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn

   CustomLog /var/log/apache2/access.log combined
   ServerSignature On

#    Alias /doc/ "/usr/share/doc/"
#    <Directory "/usr/share/doc/">
#        Options Indexes MultiViews FollowSymLinks
#        AllowOverride None
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.0/255.0.0.0 ::1/128
#    </Directory>

</VirtualHost>
做完了之后,来个$sudo /etc/init.d/apache2 force-reload 重新引导Apache2,成功!高兴,再打开Firefox,地址栏中输入localhost,回答拒绝。??!!
$more /var/log/apache2/error.log
>[Sun Jul 17 11:41:35 2005] [error] (2)No such file or directory: could not create /var/run/apache2.pid
>[Sun Jul 17 11:41:35 2005] [error] apache2: could not log pid to file /var/run/apache2.pid
原来在Apache启动时,由于mod-chroot最后生效,所以apache2.pid的路径是对的,但在mod-chroot生效之后,根已指向了/var/www,那所谓的 /var/run/apache2.pid实际上指的是/var/www /var/run/apache2.pid了,而这个目录是不存在的。这个好办,没有的话创建好了!
$sudo mkdir -p /var/www/var/run
$sudo chown -R root.root /var/www/var/run
$sudo ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid
第三步很重要,为的是保持一致性!
同样的,对LockFile也做相同处理
$sudo mkdir -p /var/www/var/lock/apache2
$sudo chown -R root.root /var/www/var/lock/apache2
$sudo ln -s /var/www//var/lock/apache2/accept.lock /var/lock/apache2/accept.lock
如果你还要用到其他的,请参照上面自行修改
然后创建网站的缺省目录
$sudo mkdir /var/www/htdocs
然后来重启一次:
$sudo /etc/init.d/apache2 force-reload
运行正常!
添加或是删除模块的时候,服务器必须是运行的么?
missing is i missing you...
xep007
帖子: 871
注册时间: 2006-01-03 20:44

Re: 利用libapache2-mod-chroot包加固Apache2服务

#13

帖子 xep007 » 2010-11-17 9:17

请问问题解决了吗?我从lenny升级到squeeze后也碰到了这个问题。阅读/usr/share/doc/libapache2-mod-chroot中的文档。好像设置不一样了。


kinfinger 写了::em20,我的搞崩溃了,郁闷阿
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [alert] (2)No such file or directory: Can't chdir to /var/www
[Thu Apr 22 09:09:54 2010] [notice] Apache/2.2.12 (Ubuntu) PHP/5.2.10-2ubuntu6.4 with Suhosin-Patch mod_chroot/0.5 configured -- resuming normal operations
[Thu Apr 22 09:09:54 2010] [alert] Child 2910 returned a Fatal error... Apache is exiting!
回复