Google

保障Ubuntu Apache Web服务器安全

     在一个linux发行版本上设置一个web服务器是一个很快的过程,不过要让这种设置成为一种安全的过程可能就需要花点儿工夫。本文将向你展示如何有效地使用访问控制和身份验证策略,使你的apacheweb服务器更安全。下面所有的例子都假定你用的是ubuntu7.10,并对apache进行了基本的配置。不过,这些例子将帮助任何一位运行apache服务器的用户获得更大的安全性,因为其要领仍然适用于其它linux系统。本文中所涉及到的方法应当首先在一台测试服务器上进行试验,在成功之后才能迁移到一个实际使用的web服务器上。
  一、文件许可和访问控制

  1. 用户和组

  首先要保障的是apache不要以root身份运行,因为如果apache被攻破的话,那么攻击者就可以控制root账户。下面让我们看一下apache正以何种用户和组的身份运行:

  运行下面的命令:

      # ps auwwfx | grep apache www-data 25675 0.0 0.0 10348 508 ? s jan21 0:00 _ /usr/sbin/apache2 -k start
  www-data 25686 0.0 0.2 231816 2208 ? sl jan21 0:00 _ /usr/sbin/apache2 -k start
  www-data 25688 0.0 0.2 231816 2200 ? sl jan21 0:00 _ /usr/sbin/apache2 -k start
  可以看出,www-data是运行apache的用户。不过,我们需要编辑apache的配置并创建一个新用户和组:

   # groupadd www-data
  # useradd -g www-data www-data
  # vi /etc/apache2/apache2.conf
  将user root group root改为:

      user www-data group www-data
  然后重新加载以使改变生效:

      # /etc/init.d/apache2 reload
  2. 服务文件准许

  一个最易被忽视的安全问题是如何正确地使用chmod命令。例如,我们在apache 的html root目录中创建了一个index.cgi文件,不过在浏览器中打开这个文件时却被告知拒绝访问。为了让我们的index.cgi文件正常工作,我们执行一个chomod 777 index.cgi。在我们如此试验时,每一个apache管理员都在考虑这样安全吗?答案是否定的。不过,如何使这种许可足够安全并能允许index.cgi脚本正常运行呢?

  apache需要得到准许来访问index.cgi文件。不过,我们不希望人人都能读写index.cgi。这个文件的所有者应当拥有读写这个文件的许可。为此我们需要下面的命令:

      # chmod 755 index.cgi
  将下面的一行加入到你的apache.conf文件中是很重要的:

       options followsymlinks allowoverride none
  注意:

  1、上面的命令行防止apache访问root之外的文件。

  2、有一些linux发行版本比其它版本拥有更好的安全性。engarde secure linux就是一个很好的例子,因为它默认情况下就在其apache配置文件中包含了上面的代码行。

  我们并不想让用户在文件系统上的任何地方运行cgi脚本,不过我们确实需要它们在root中运行。对这个问题的解决办法是“options execcgi”指令。

  例如,将下面的行添加到/etc/apache2/apache2.conf文件中:

      allowoverride none options execcgi order allow,deny allow from all
  重新加载apache:

      # /etc/init.d/apache2 reload
  那么,如果你拥有只应当被某个网络或ip地址访问的资源怎么办?对这个问题的解决办法是使用我们的apache配置来为你增强安全性:

  先说一个只允许访问192.168.0.0网络的例子,需要改变/etc/apache2/apache2.conf文件中以下的一行:

      allowoverride none options execcgi order allow,deny allow from all
    将其改为:

allowoverride none options execcgi order deny,allow deny from all allow from 192.168.0.0/16
  然后重新加载以使更改生效:

      # /etc/init.d/apache2 reload
  现在只有你内部网络上的用户能够在/home/username/public_html/cgi-bin中运行cgi脚本。

       二、身份验证

  我们怎样才能仅允许那些拥有正确口令和用户名的用户访问部分web root呢?下面的步骤将向你展示如何安全地做到这一点:

  1. 基本验证

  允许.htaccess:

      # vi /etc/apache2/apache2.conf
  将allowoveride none改为allowoveride authconfig

  重新加载以使改变生效:

      # sudo /etc/init.d/apache2 reload
  创建一个口令文件:

   # mkdir /var/www/misc
  # chmod a+rx /var/www/misc
  # cd /var/www/misc
  # htpasswd -bc private.passwords username password adding password for user username
  创建.htaccess

      # cd /home/username/public_html/cgi-bin # vi .htaccess
  在.htaccess中增加下面的命令:

authname my private area” authtype basic authuserfile /var/www/misc/private.passwords authgroupfile /dev/null require valid-user
  将allowoverride none options execcgi order deny,allow deny from all allow from 192.168.0.0/16

  改变为:allowoverride .htaccess options execcgi order deny,allow deny from all allow from 192.168.0.0/16

  然后重新加载以使更改生效:

      # /etc/init.d/apache2 reload
  2、摘要验证(digest authentication)

  另外一种验证方法称之为摘要验证。如果采用摘要验证,你的口令将不是以明文通过网络传送,因为它们总是作为用户口令的一个md5摘要传送的。如果采用这种方法,那么通过嗅探网络通信的方法就不能决定用户的口令了。

  下面创建口令文件:

   # mkdir /var/www/misc
  # chmod a+rx /var/www/misc
  # cd /var/www/misc
  # htdigest -c private.passwords realm username adding password for username in realm realm. new password:
  创建 .htaccess :

      # cd /home/username/public_html/cgi-bin # vi .htaccess
  在.htaccess中增加下面的内容:

authname “my private area” authtype digest authuserfile /var/www/misc/private.passwords authgroupfile /dev/null require valid-user
  注意:

  1、一些老的浏览器并不支持摘要验证(digest authentication)

  2、要完全地保护你的.htaccess就要使用ssl

  三、总结

  使apache更安全的下一步措施是使用apache的模块来帮助实现更好的安全性,例如mod_security 和 mod_chroot。此外,要保护我们的验证我们还需要配置ssl。

Tags: ,

Leave a Reply 留下一个回复

用户名和电子邮件必需填写(填写信息不会被公开)