位置:海鸟网 > IT > linux/Unix >

实例:保障UbuntuApacheWeb服务器安全

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

1.用户和组

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

运行下面的命令:

#psauwwfx|grepapachewww-data256750.00.010348508?SJan210:00\_/usr/sbin/apache2-kstart
www-data256860.00.22318162208?SlJan210:00\_/usr/sbin/apache2-kstart
www-data256880.00.22318162200?SlJan210:00\_/usr/sbin/apache2-kstart

可以看出,www-data是运行Apache的用户。不过,我们需要编辑Apache的配置并创建一个新用户和组:

#groupaddwww-data
#useradd-gwww-datawww-data
#vi/etc/apache2/apache2.conf

将UserrootGrouproot改为:

Userwww-dataGroupwww-data

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

#/etc/init.d/apache2reload

2.服务文件准许

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

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

#chmod755index.cgi

将下面的一行加入到你的Apache.conf文件中是很重要的:

OptionsFollowSymLinksAllowOverrideNone

注意:

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

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

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

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

AllowOverrideNoneOptionsExecCGIOrderallow,denyAllowfromall

重新加载Apache:

#/etc/init.d/apache2reload

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

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

AllowOverrideNoneOptionsExecCGIOrderallow,denyAllowfromall

 将其改为:

AllowOverrideNoneOptionsExecCGIOrderDeny,AllowDenyfromallAllowfrom192.168.0.0/16

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

#/etc/init.d/apache2reload

现在只有你内部网络上的用户能够在/home/username/public_html/cgi-bin中运行CGI脚本。
二、身份验证

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

1.基本验证

允许.htaccess:

#vi/etc/apache2/apache2.conf

将AllowOverideNone改为AllowOverideAuthConfig

重新加载以使改变生效:

#sudo/etc/init.d/apache2reload

创建一个口令文件:

#mkdir/var/www/misc
#chmoda+rx/var/www/misc
#cd/var/www/misc
#htpasswd-bcprivate.passwordsusernamepasswordAddingpasswordforuserusername

创建.htaccess

#cd/home/username/public_html/cgi-bin#vi.htaccess

在.htaccess中增加下面的命令:

AuthNameMyPrivateArea"AuthTypeBasicAuthUserFile/var/www/misc/private.passwordsAuthGroupFile/dev/nullrequirevalid-user

将AllowOverrideNoneOptionsExecCGIOrderDeny,AllowDenyfromallAllowfrom192.168.0.0/16

改变为:AllowOverride.htaccessOptionsExecCGIOrderDeny,AllowDenyfromallAllowfrom192.168.0.0/16

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

#/etc/init.d/apache2reload

2、摘要验证(Digestauthentication)

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

下面创建口令文件:

#mkdir/var/www/misc
#chmoda+rx/var/www/misc
#cd/var/www/misc
#htdigest-cprivate.passwordsrealmusernameAddingpasswordforusernameinrealmrealm.Newpassword:

创建.htaccess:

#cd/home/username/public_html/cgi-bin#vi.htaccess

在.htaccess中增加下面的内容:

AuthName"MyPrivateArea"AuthTypeDigestAuthUserFile/var/www/misc/private.passwordsAuthGroupFile/dev/nullrequirevalid-user

注意:

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

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

三、总结

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