Linux 版 (精华区)

发信人: cliff (狗皮膏藥¤返樸歸真), 信区: Linux
标  题: SMTP安全
发信站: 哈工大紫丁香 (2001年02月14日19:46:55 星期三), 转信


SMTP安全

LinuxAid技术支持网站 ideal

〖返回〗〖转发〗

一、SMTP协议原理

SMTP-简单邮件传输协议(Simple Mail Transfer Protocol),是定义邮件传输的
协议,它是基于TCP服务的应用层协议,由RFC0821所定义。SMPT协议规定的命令是
以明文方式进行的。为了说明SMTP的工作原理,我们以向www.linuxaid.com.cn发
送邮件为实例进行说明。
在linux环境下,使用"telnet www.linuxaid.com.cn 25"连接www.linuxaid.com.
cn的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指
定为www.linuxaid.com.cn,而端口号指定为25,然后连接www.linuxaid.com.cn:
交互过程如下:
[lix@ns lix]$ telnet www.linuxaid.com.cn 25
Trying 202.99.11.120...
Connected to www.linuxaid.com.cn.
Escape character is '^]'.
HELO  ideal
220 www.linuxaid.com.cn ESMTP Sendmail 8.10.2/8.10.2; Mon, 18 Sep 2000 
13:40:44
+0800
250 www.linuxaid.com.cn Hello [210.12.114.130], pleased to meet you
MAIL FROM:ideal@btamail.net.cn
250 2.1.0 IDEAL@btamail.net.cn... Sender ok
RCPT TO:ideal@linuxaid.com.cn
250 2.1.5 ideal@linuxaid.com.cn... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
hello , Pls to get to meet u :) good luck
.
250 2.0.0 e8I5j1M11204 Message accepted for delivery
QUIT
221 2.0.0 www.linuxaid.com.cn closing connection
Connection closed by foreign host.
其中黑体部分是输入的命令,其他内容是对方邮件服务器输出的状态信息。
这里,HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送
者为ideal;MAIL FROM命令用来表示发送者的邮件地址;RCPT TO:标识接收者的
邮件地址,这里表示希望发送邮件给ideal@linuxaid.com.cn,如果邮件接收者不
是本地用户,例如RCPT TO:ideal@btamail.net.cn,则说明希望对方邮件服务器为
自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是
OPEN RELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分
,输入完毕以后,以一个"."开始的行作为数据部分的结束标识;QUIT表示退出这
次会话,结束邮件发送。
这就是一个简单的发送邮件的会话过程,其实当使用outlook express等客户软件
发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情
况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。
当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过SMTP协议
通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服
务器是Linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用
mail等客户软件直接阅读邮件,但是若你希望使用本地的MUA(Mail User Agent,
如outlook express等客户软件)来阅读邮件,则本地客户端通过POP3或IMAP协议与
邮件服务器交互,将邮件信息传递到客户端(如:win98系统)。而如果你向你的朋
友回复一封信件时,你所使用的MUA也是通过SMTP协议与邮件服务(一般为发送邮
件地址对应的email地址)器通信,指示其希望邮件服务器帮助转发一封邮件到你
朋友的邮件地址指定的邮件服务器中。若本地邮件服务器允许你通过它转发邮件,
则服务器通过SMTP协议发送邮件到对方的邮件服务器。这就是接受和发送邮件的全
部过程。

二、什么是mail Relay

邮件服务器一般具有一个或若干个域名(这些域名应该出现在某个配置文件内),邮
件服务器在运行时将监听25号端口,等待远程的发送邮件的请求。网络上其他的
mail服务器或者请求发送邮件的MUA(Mail User Agent,如outlook express、
foxmail等等)会连接邮件服务器的25号端口,请求发送邮件,SMTP会话过程一般是
从远程标识自己的身份开始,过程如下:
       HELO remote.system.domainname
       250 qmailserver.domain
       MAIL FROM:user@somewherer.net
       250 OK
       RCPT TO: user1@elsewhere.net
邮件的接收者user1@elsewhere.net中的域名并不一定是邮件接受服务器的所具有
的本地域名,也就是说邮件目的可能不是上面协议交互中的接收方,而是邮件发送
者希望接收邮件服务器帮助其转发邮件。这时候本地系统可能有两种回答,接受它

        250 OK
或者拒绝接受它:
        553 sorry,.that domain isnot in my domain list of allowed 
recphosts
第一种情况下,本地邮件服务器是允许relay的,它接收并同意传递一个目的地址
不是本地的邮件;而第二种情况则不接收非本地邮件。
为什么不能配置邮件服务器为open relay?
如果系统管理员将自己的邮件服务器设置为open relay,将会导致一些垃圾邮件发
送者将你的邮件服务器作为转发自圾邮件的中继站,这将使垃圾邮件的接收者将矛
头对准你,可能会导致报复性的邮件炸弹;垃圾邮件还能消耗你大量的资源,占用
你的带宽。更为糟糕的事情可能是你的名字可能会上了黑名单,成为其他邮件接收
者共同抵制的目标,你的邮件将被这些接收者所拒绝。
因此,系统管理员应当注意不要使自己的邮件服务器是open relay的。

二、Sendmail服务器安全

sendmail是在Unix环境下使用最广泛的实现邮件发送/接受的邮件传输代理程序。
 由于Sendmail邮件服务器的特点是功能强大而复杂,因此为保证Sendmail的安全
性,需要作以下一些工作。

1、设置Sendmail使用"smrsh"

smrsh程序的目的是作为在mailer中为sendmail定义的"/bin/sh"的替代shell。
smrsh是一种受限shell工具,它通过"/etc/smrsh"目录来明确指定可执行文件的列
表。简而言之smrsh限制了攻击者可以执行的程序集。当它与sendmail程序一起使
用的时候,smrsh有效的将sendmail可以执行的程序的范围限制在smrsh目录之下。

第一步:
决定smrsh可以允许sendmail运行的命令列表。缺省情况下应当包含以下命令,但
不局限于这些命令:
"/bin/mail" (如果在你的系统中安装了的话)
"/usr/bin/procmail" (如果在你的系统中安装了的话)
注意:不可在命令列表里包括命令解释程序,例如sh(1),csh(1),perl(1),
uudecode(1)及流编辑器sed(1)。
第二步:
在"/etc/smrsh"目录中创建允许sendmail运行的程序的符号连接。
使用以下命令允许mail程序"/bin/mail"运行:
[root@deep]# cd /etc/smrsh
[root@deep]# ln -s /bin/mail mail
用以下命令允许procmail程序"/usr/bin/procmail"运行:
[root@deep]# cd /etc/smrsh
[root@deep]# ln -s /usr/bin/procmail procmail
这将允许位于".forward"和"aliases"中的用户采用"|program"语法来运行mail及
procmail程序。
第三步
配置sendmail使之使用受限shell。mailer程序在sendmail的配置文件
"/etc/sendmail.cf"中仅有一行。必须修改"sendmail.cf"文件中"Mprog"定义的那
一行。将"/bin/sh"替换为"/usr/sbin/smrsh"。
编辑"sendmail.cf"文件(vi /etc/sendmail.cf)并改动下面这一行:
例如:
Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, T=X-Unix, A=sh
 -c $u
应该被改为:
Mprog, P=/usr/sbin/smrsh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, 
T=X-Unix, A=sh -c $u
现在用以下命令手工重起sendmail进程:
[root@deep]# /etc/rc.d/init.d/sendmail restart

2、"/etc/aliases"文件

如果没有加以正确和严格的管理的话,别名文件被用来获取特权。例如,很多发行
版本在别名文件中带有"decode"别名。现在这种情况越来越少了。
这样做的目的是为用户提供一个通过mail传输二进制文件的方便的方式。在邮件的
发送地,用户把二进制文件用"uuencode"转换成ASCII格式,并把结果邮递给接收
地"decode"别名。那个别名通过管道把邮件消息发送到"/usr/bin/uuencode"程序
,由这个程序来完成从ASCII转回到原始的二进制文件的工作。
删除"decode"别名。类似的,对于所有用于执行没有被放在smrsh目录下的程序的
别名,你都要仔细的检查,可能它们都值得怀疑并应当删除它们。要想使你的改变
生效,需要运行:
 [root@deep]# /usr/bin/newaliases
编辑别名文件(vi /etc/aliases)并删除以下各行:
# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster:  root

# General redirections for pseudo accounts.
bin:  root
daemon:  root
games:  root?? 删除这一行
ingres: root ?? 删除这一行
nobody:  root
system:  root ?? 删除这一行
toor:  root?? 删除这一行
uucp:  root ?? 删除这一行

# Well-known aliases.
manager:  root ?? 删除这一行
dumper:  root ?? 删除这一行
operator:  root ?? 删除这一行

# trap decode to catch security attacks
decode:  root ?? 删除这一行

# Person who should get root's mail
#root:  marc
最后应该运行"/usr/bin/newaliases"程序使改动生效

3、避免你的Sendmail被未授权的用户滥用

最新版本的Sendmail (8.9.3)加入了很强的防止欺骗的特性。它们可以防止你的邮
件服务器被未授权的用户滥用。编辑你的"/etc/sendmail.cf"文件,修改一下这个
配置文件,使你的邮件服务器能够挡住欺骗邮件。
编辑"sendmail.cf"文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy
设置"noexpn"使sendmail禁止所有SMTP的"EXPN"命令,它也使sendmail拒绝所有
SMTP的"VERB"命令。设置"novrfy"使sendmail禁止所有SMTP的"VRFY "命令。这种
更改可以防止欺骗者使用"EXPN"和"VRFY"命令,而这些命令恰恰被那些不守规矩的
人所滥用。

4、SMTP的问候信息

当 sendmail接受一个SMTP连接的时候,它会向那台机器发送一个问候信息,这些
信息作为本台主机的标识,而且它所做的第一件事就是告诉对方它已经准备好了。

编辑"sendmail.cf"文件(vi /etc/sendmail.cf)并更改下面一行:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
改为:
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b NO UCE C=xx L=xx
现在手工重起一下sendmail进程,使刚才所做的更改生效:
[root@deep]# /etc/rc.d/init.d/sendmail restart
以上的更改将影响到Sendmail在接收一个连接时所显示的标志信息。你应该把
"`C=xx L=xx"条目中的"xx"换成你所在的国家和地区代码。后面的更改其实不会影
响任何东西。但这是"news.admin.net-abuse.email"新闻组的伙伴们推荐的合法做
法。

5、限制可以审核邮件队列内容的人员

通常情况下,任何人都可以使用"mailq"命令来查看邮件队列的内容。为了限制可
以审核邮件队列内容的人员,只需要在"/etc/sendmail.cf"文件中指定
"restrictmailq"选项即可。在这种情况下,sendmail只允许与这个队列所在目录
的组属主相同的用户可以查看它的内容。这将允许权限为0700的邮件队列目录被完
全保护起来,而我们限定的合法用户仍然可以看到它的内容。
编辑"sendmail.cf"文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
现在我们更改邮件队列目录的权限使它被完全保护起来:
[root@deep]# chmod 0700 /var/spool/mqueue
注意:我们已经在sendmail.cf中的"PrivacyOptions="行中添加了"noexpn"和
"novrfy"选项,现在在这一行中我们接着添加"restrictmailq"选项。
任何一个没有特权的用户如果试图查看邮件队列的内容会收到下面的信息:
[user@deep]$ /usr/bin/mailq
You are not permitted to see the queue

6、限制处理邮件队列的权限为"root"

通常,任何人都可以使用"-q"开关来处理邮件队列,为限制只允许root处理邮件队
列,需要在"/etc/sendmail.cf"文件中指定"restrictqrun"。
编辑"sendmail.cf"文件(vi /etc/sendmail.cf)并更改下面一行:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq
改为:
O PrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq,restrictqrun
任何一个没有特权的用户如果试图处理邮件队列的内容会收到下面的信息:
[user@deep]$ /usr/sbin/sendmail -q
You do not have permission to process the queue

7、在重要的sendmail文件上设置不可更改位

可以通过使用"chattr"命令而使重要的Sendmail文件不会被擅自更改,可以提高系
统的安全性。具有"+i"属性的文件不能被修改:它不能被删除和改名,不能创建到
这个文件的链接,不能向这个文件写入数据。只有超级用户才能设置和清除这个属
性。
为"sendmail.cf"文件设置不可更改位:
[root@deep]# chattr +i /etc/sendmail.cf
为"sendmail.cw"文件设置不可更改位:
[root@deep]# chattr +i /etc/sendmail.cw
为"sendmail.mc"文件设置不可更改位:
[root@deep]# chattr +i /etc/sendmail.mc
为"null.mc"文件设置不可更改位:
[root@deep]# chattr +i /etc/null.mc
为"aliases"文件设置不可更改位:
[root@deep]# chattr +i /etc/aliases
为"access"文件设置不可更改位:
[root@deep]# chattr +i /etc/mail/access

8、Sendmail环境下的防止邮件relay

从8.9版本开始,缺省的是不允许邮件转发(mail relay)的。最简单的允许邮件转
发的方法是在文件/etc/mail/relay-domains中进行设置。该文件中列出的域名内
的信件都允许通过本地服务器进行邮件转发。 
为了更精确的设置,可以在sendmail.mc中添加如下几个参数允许被用来设置邮件
转发:
· FEATURE(relay_hosts_only). 通常情况下,在文件/etc/mail/relay-domains
中列出的域名的主机都允许通过本地机转发,而该设置指示指定必须罗列出每个允
许通过本机转发邮件的主机。
· FEATURE(relay_entire_domain). 该参数指示允许所有本地域通过本机进行邮
件转发。 
· FEATURE(access_db). 该参数指定利用哈希数据库/etc/mail/access来决定是
否允许某个主机通过本地进行邮件转发。 
· FEATURE(blacklist_recipients).若该参数被设置,则在决定是否允许某个主
机转发邮件时同时察看邮件发送着地址和邮件接受者地址。 
· FEATURE(rbl).允许基于maps.vix.com由黑名单(Realtime Blackhole List)进
行邮件拒绝,以防范垃圾邮件。 
· FEATURE(accept_unqualified_senders).允许接受发送者地址不包括域名的邮
件,例如user,而不是user@B.NET。
· FEATURE(accept_unresolvable_domains).通常来讲,sendmail拒绝接受发送者
邮件地址指定的主机通过DNS不能解析的邮件,而该参数允许接收这种邮件。 
· FEATURE(relay_based_on_MX).该参数允许转发邮件接受者地址的MX记录指向本
地的的邮件,例如,本地接收到一个发送目的地址为user@b.com的邮件,而b.com
域名的MX记录指向了本地机器,则本地机器就允许转发该邮件。 
下面几个特性可能会有安全漏洞,一般当邮件服务器位于防火墙后时才应该使用,
因为这些参数可能导致你的系统易于被垃圾邮件发送者利用。 
· FEATURE(relay_local_from). 该参数指定若消息自称源于本地域,则允许转发
该邮件。 
· FEATURE(promiscuous_relay). 打开对所有的邮件的转发。
宏配置文件"sendmail.mc"设置成功以后,可以用下面的命令创建sendmail的配置
文件:
[root@deep]# cd /var/tmp/sendmail-version/cf/cf/
[root@deep]# m4 ../m4/cf.m4 /etc/sendmail.mc > /etc/sendmail.cf
注意:这里"../m4/cf.m4"告诉m4程序的缺省配置文件路径。

三、qmail安全

qmail有一个名为rcpthosts(该文件名源于RCPT TO命令)的配置文件,其决定了是
否接受一个邮件。只有当一个RCPT TO命令中的接收者地址的域名存在于
rcpthosts文件中时,才接受该邮件,否则就拒绝该邮件。若该文件不存在,则所有
的邮件将被接受。当一个邮件服务器不管邮件接收者和邮件接收者是谁,而是对所
有邮件进行转发(relay),则该邮件服务器就被称为开放转发(open relay)的。当
qmail服务器没有rcpthosts时,其是开放转发的。
设置自己服务器为非open relay的最简单的办法就是将你的邮件服务器的所有域名
(若DNS的MX记录指向该机器,也应该包括该域名。例如你的机器有三个域名mail.
linxuaid.com.cn、mail1.linuxaid.com.cn,而且linuxaid.com.cn的MX指向
mail.linuxaid.com.cn,则qmail的rcphosts的应该包括mail.linuxaid.com.cn、
mail1.linuxaid.com.cn和linuxaid.com.cn)。
但是这将导致你的本地客户也被拒绝使用你的服务器转发邮件,而要支持客户使用
MUA来发送邮件,必须允许客户使用服务器转发邮件。qmail-smtpd支持一种有选择
性的忽略rcpthosts文件的方法:若qmail-smtpd的环境变量RELAYCLIENT被设置,
则rcpthost文件将被忽略,relay将被允许。但是如何识别一个邮件发送者是否是
自己的客户呢?qmail并没有采用密码认证的方法,而是判断发送邮件者的源IP地
址,若该IP地址属于本地网络,则认为该发送者为自己的客户。
这里就要使用ucspi-tcp软件包。在这里我们要使用该软件包的tcpserver程序。该
程序的功能类似于inetd-监听进入的连接请求,为要启动的服务设置各种环境变量
,然后启动指定的服务。
tcpserver的配置文件是/etc/tcp.smtp,该文件定义了是否对某个网络设置
RELAYCLIENT环境变量。例如,本地网络是地址为192.168.10.0/24的C类地址,则
tcp.smtp的内容应该设置如下:
127.0.0.1:allow,RELAYCLIENT=""
192.168.10.:allow,RELAYCLIENT=""
:allow
这几个规则的含义是指若连接来自127.0.0.1和192.168.10则允许,并且为其设置
环境变量RELAYCLIENT,否则允许其他连接,但是不设置RELAYCLIENT环境变量。这
样当从其他地方到本地的25号连接将会被允许,但是由于没有被设置环境变量,所
以其连接将会被qmail-smptd所拒绝。
但是tcopserver并不直接使用/etc/tcp.smtp文件,而是需要先将该文件转化为
cbd文件:
[lix@mail /etc]$ # tcprules tcp.smtp.cdb tcp.smtp.temp < tcp.smtp
然后再回头看在/service/qmail-smtpd目录下的run文件中有
/usr/local/bin/tcpserver -v -p -x /etc/tcp.smtp.cdb
可以看到,tcpserver利用了/etc/smtp.cbd文件。若本地有多个网络,则需要这些
网络都出现在/etc/tcp.smtp文件中。
     这样就实现了允许本地客户relay邮件,而防止relay被滥用。

责任编辑:解决方案管理员(2001-01-05 10:20)  


  

--

                         【★蒸不熟,煮不烂★】


                         【★剪不断,理还乱★】

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: cliff.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:209.792毫秒