【参加讨论】想定
internet需要配置一台自己的web服务器,由于没有自己的安全基础设施,应该在web服务器前面放一台配置了相应过滤规则的路由器。这台web服务器仅仅提供www和https服务,但是,它当然也需要具有远程控制特性。另外,这台web服务器最好还能够发送邮件。由于linux服务器和网页是由三个不同的管理员维护的,所有的管理操作都应该保证在以后进行日志分析是更容易理解。
实现
前面段落中说明的安全web服务器的需求如何实现呢?下面的例子说明了一种在suse linux 6.4发布的服务器上的实现方法。为了实现上述想定,我们决定选择ssh管理和apache web服务器。
第一步:配置路由器
每一个流行的路由器都提供配置过滤列表的功能。您必需配置下面的简单规则:
+------------------------------------------------------------------------------+
|------------------------------过滤规则--------------------------------------|
+-------------------------+-------------------------+-------------------------+
|----------来源----------|-----------目标----------|---------服务-----------|
+-------------------------+-------------------------+-------------------------+
|任何位置--------------|web服务器------------|www,https,udp highport,|
|--------------------------|---------------------------|icmp types 0 + 3-----|
+-------------------------+-------------------------+--------------------------+
|管理员-----------------|web服务器------------|ssh---------------------|
+-------------------------+-------------------------+-------------------------+
|web服务器-----------|任何位置---------------|dns, smtp-----------|
+-------------------------+-------------------------+-------------------------+
|web服务器-----------|路由器------------------|ssh或telnet----------|
+-------------------------+-------------------------+-------------------------+
路由器的操作手册会提供如何进行上述配置的详细信息。这里我建议使用cisco路由器,因为对于这种情况它非常容易配置,并且还在ios的第12版以后提供了ssh的加密服务。
第二步:安装linux服务器
执行suse 6.4的标准安装。处于安全考虑,至少应为/、/var、/tmp、/home和/usr/local安装5个分区。后面会定义一些mount这些分区的特殊选项,这些选项可以保证系统具有更高的本地安全性能。
现在是选择需要安装哪些程序包的时候了。选择最小系统安装,然后手工加入下面一些必要的程序包:
在basis (a)中选择compat
在applications (ap)中选择sudo
在network (n)中选择apache, bindutil;去掉postfix和sendmail
在security (sec)中选择firewals, hardensuse, mod_ssl, scanlogd, seccheck, secumod, tripwire.
其它一些您认为需要的程序包,如数据库和为apache设计的一些模块。然后完成安装。
第三步:更新
在配置之前,检查一下是否可以获得这些安装包的更新版本,如果有,需要的话最好进行更新。
您可以在这里找到suse 6.4的更新信息。
第四步:linux的本地配置
在开始真正工作之前,必需首先执行所有的诸如输入服务器名、配置网络接口和设置用户等标准linux配置。在初始情况下,所有不需要的服务都是非活动状态的。特权程序的授权回收工作并不是必需的,您可以通过harden_suse工具简单地实现这个任务:
erde#harden_suse yes
这个命令在很多地方更改了系统的配置,这些更改都记在/etc/harden_suse.log日志文件中,这些操作可以过/etc/undo_harden_suse脚本予以恢复。使用其它linux发布的用户可应使用bastille脚本或者其它类似的程序。
随后,所有网络访问服务(除了ssh)都被禁止,仅仅保留了下面的授予特权的suid和sgid程序:
erde# find / -perm -04000 -type f -exec ls -ld {} ;
-rwsr-x--- 1 root trusted 23840 mar 11 11:26 /bin/ping
-rwsr-x--- 1 root trusted 30750 mar 11 11:37 /bin/su
-rwsr-x--- 1 root trusted 21268 mar 11 11:10 /usr/bin/crontab
-rwsr-xr-x 1 man root 85460 mar 11 11:24 /usr/bin/man
-rwsr-xr-x 1 root root 15308 mar 11 11:26 /usr/bin/rcp
-rwsr-xr-x 1 root root 11052 mar 11 11:26 /usr/bin/rlogin
-rwsr-xr-x 1 root root 8104 mar 11 11:26 /usr/bin/rsh
-rwsr-x--- 1 root shadow 38340 mar 11 11:50 /usr/bin/gpasswd
-rwsr-x--- 1 root trusted 22184 mar 11 11:50 /usr/bin/newgrp
-rwsr-xr-x 1 root shadow 27920 mar 11 11:50 /usr/bin/passwd
-rwsr-x--- 1 root trusted 56600 mar 11 18:41 /usr/bin/sudo
-rwsr-xr-x 1 root root 20300 mar 11 11:26 /usr/sbin/traceroute
-rwsr-xr-x 1 root root 6132 mar 11 09:36 /usr/lib/pt_chown
erde# find / -perm -02000 -type f -exec ls -ld ;
-rwxr-sr-x 1 root tty 9452 mar 11 11:26 /usr/bin/write
-rwxr-sr-x 1 root tty 9796 mar 11 11:49 /usr/bin/wall
下一阶段工作是编辑全局配置文件/etc/rc.config,将下面脚本行中的“no”改成“yes”:
start_httpd=“yes”
start_fw=“yes”
start_scanlogd=“yes”
这样就会保证apache、scanlogd和suse防火墙在计算机启动时自动执行。现在我们继续配置本地防火墙,将/etc/rc.config.d/firewall.rc.config(个别变量的细节描述在这个文件中可以找到)文件中的对应行改成下面的形式:
fw_dev_world=“eth0” # query no. 2
fw_services_external_tcp=“www https” # query no. 9
fw_services_trusted_nets=“1.1.1.0/24” # query no. 10 - 1.1.1.0 is the netswheresthe administrators connect from.
fw_trusted_services_tcp=“ssh” # query no. 10
/sbin/susefirewall命令可以更新防火墙规则。这些规则会在每个系统启动周期中载入。
现在我们以下面的形式集成suse专用的安全模块:
erde# cat >> /sbin/init.d/boot.local
insmod secumod hardlink=1 symlink=1 pipe=1 trace=1 systable=1 logging=1
^d
当系统引导时,这个模块会被加载,它配置用来防止symlink、hardlink、pipe和一些 unix特有的攻击形式。
第五步:配置apache
web软件和页面时服务器的核心。我们必需确保没有人可以访问未授权的数据或者改变页面。为了这个目的,页面必需进行特殊的防护,然后要给予apache安全的配置。
所有的页面都必需由网站管理员统一管理,并且对除他以外的所有人都是本地写保护的。web服务器最好以非页面管理员身份运行,这样即使入侵者侵入web服务器,他也没有足够的权限更改页面。这样,就需要设置一个用户,还要产生一个cron工作,这个定时工作要保证所有的页面修改权只属于页面管理员并且具有正确的授权。
erde# useradd -m wwwdocs
erde# cat > /etc/cron.daily/wwwdocs
#!/bin/sh
/bin/chown -r -h wwwdocs /usr/local/httpd/htdocs/*
/bin/chmod -r go-w /usr/local/httpd/htdocs/*
/bin/chmod -r a+r /usr/local/httpd/htdocs/*
^d
erde# chmod 700 /etc/cron.daily/wwwdocs
由于apache可能已经预先配置好了,所以可能根本不需要进行重新配置。当然,开始的时候/etc/httpd/httpd.conf文件中的minspareservers、maxspareservers和startservers的值应该被正确设置。
maxclients选项可以用来避免connect-denial-of-service攻击。应该注意的是:如果这个选项设置的太低,一般访问者的访问也可能会被拒绝;如果太高,管理员在日志跟踪和入侵事件发生时的应对就会显得比较困难。除了自己尝试以外,好象也没有什么确定合适数量的更好建议。
应该关掉serversignature选项,这样访问一个不存在的页面时就不会回应您所使用的软件和版本号信息。但是这样也解决不了多大的问题,因为http头中包含这些——甚至更多——信息。
应该禁止/hilfe/、/doc/、/cgi-bin-sdb/、/sdb/和/manual/的别名。下面显示了标准配置更改后的大概样子:(“diff -u0”)
--- httpd.conf.orig sun apr 9 19:37:44 2000
+++ httpd.conf sun apr 9 19:42:57 2000
@@ -141,2 +141,2 @@
-minspareservers 1
-maxspareservers 1
+minspareservers 3
+maxspareservers 10
@@ -148 +148 @@
-startservers 1
+startservers 5
@@ -157 +157 @@
-maxclients 150
+maxclients 100
@@ -401 +401 @@
-serveradmin root@localhost
+serveradmin webdocs@echte-domain.de
@@ -415 +415 @@
-#servername hawking.suse.de
+servername www.echte-domain.de
@@ -485 +485 @@
-userdir public_html
+#userdir public_html
@@ -646 +646 @@
-serversignature on
+serversignature off
@@ -665,11 +664,0 @@
-alias /hilfe/ /usr/doc/susehilf/
-alias /doc/ /usr/doc/
-alias /cgi-bin-sdb/ /usr/local/httpd/cgi-bin/
-alias /sdb/ /usr/doc/sdb/
-alias /manual/ /usr/doc/packages/apache/manual/
-
-
- options followsymlinks
- allowoverride none
-
-
@@ -697,9 +685,0 @@
-# cgi-bin for suse help system
-# using sethandler
-
-
-allowoverride none
-options +execcgi -includes
-sethandler cgi-script
-
-
@@ -981,4 +961,4 @@
-#
-# deny from all
-# errordocument 403
http://phf.apache.org/phf_abuse_log.cgi
-#
+
+ deny from all
+ errordocument 403
http://phf.apache.org/phf_abuse_log.cgi
+
ssl的激活和证书的产生在/usr/doc/packages/apache/readme.suse文件中描述。
提示:ssl证书应该一个密码保护起来,以减少攻击者成功入侵后将其拷贝并滥用的可能性(很少发生!)。
作为一个一般的规则,应该保证没有在任何地方使用符号符号连接(symlinks),因此要禁止followsymlinks选项。所有的cgi都放在cgi-bin目录下,不允许放在其它任何地方,甚至也不允许在其它目录下执行。为了做到这一点,请不要使用execcgi配置选项。
为了禁止访问某些文件区,应该在这些目录下分别加入一个命名为.htaccess的文件,并在中加入下面的文本行:order deny,allow deny from all