浅谈邮件安全(sendmail的加密及认证安全) sendmail概述

sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式是非常重要的。一般情况下,我们把电子邮件程序分解成用户代理,传输代理和投递代理。 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如:outlook expressfoxmail等。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱,如:procmail。

当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器, 并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者查看自己的电子信箱。

显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。有许多的程序可以作为信件传输代理,但是sendmail是其中最重要的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail、postfix等等。

当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给对应的服务器,这是通过DNS服务实现的。例如一封邮件的目标地址是ideal@linuxaid.com.cn,那么sendmail首先确定这个地址是用户名(ideal)+机器名(linuxaid.com.cn)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。

DNS数据中,与电子邮件相关的是MX记录,例如在linuxaid.com.cn这个域的DNS数据文件中有如下设置:

IN MX 10 mail

IN MX 20 mail1

mail IN A 202.99.11.120

mail1 IN A 202.99.11.121

显然,在DNS中说明linuxaid.com.cn有两个信件交换(MX)服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的的MX服务器的优先级别比较高,因此服务 器将试图连接mail.linuxaid.com.cn的25端口,试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成了,在这以后的任务,将由mail.linuxaid.com.cn来完成。在一般的情况下,mail换器会自动把信件内容转交给目标主机,不过,也存在这样的情况,目标主机(比如linuxaid.com.cn)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。

如果DNS查询无法找出对某个地址的MX记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与来自邮件地址的主机对话并且发送邮件。例如,test@aidgroup.linuxaid.com.cnDNS中没有对应的MX记录,因此sendmail在确定MX交换器失败后,将从DNS取得对方的IP地址并直接和对方对话试图发送邮件。

试验环境:

操作系统 Red Hat Enterprise Linux Server (2.6.18-128.el5)

所需软件包:

sendmail-8.13.8-2.el5.i386.rpm // 主程序包

sendmail-cf-8.13.8-2.el5.i386.rpm //文档编辑包

sendmail-devel-8.13.8-2.el5.i386.rpm // 开发包

sendmail-doc-8.13.8-2.el5.i386.rpm //文档放置包

m4-1.4.5-3.el5.1.i386.rpm //辅助转换工具

安装邮件服务器:

rpm -ivh sendmail-8.13.8-2.el5.i386.rpm

rpm -ivh sendmail-devel-8.13.8-2.el5.i386.rpm

rpm -ivh sendmail-doc-8.13.8-2.el5.i386.rpm

rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm

rpm -ivh m4-1.4.5-3.el5.1.i386.rpm

编辑配置文档:

vim /etc/mail/sendmail.mc

clip_image002

service sendmail start //启动服务

netstat -tupln |grep sendmail //监听端口

clip_image004

vim /etc/mail/access

clip_image006

vim /etc/mail/local-host-names

加入域名:bj.com

clip_image008

service sendmail restart

添加用户进行测试:

useradd user1

echo "123" |passwd --stdin user1

clip_image010

发一封邮件到user1:

clip_image012

切换到user1查看:

clip_image014

当然如果在本机(服务器)上发邮件很是方便,但是大部分情况下我们都是在客户端发送的这时就需要用到把邮件服务器的名称和ip地址的关系映射到一起,就需要用到DNS服务器。

安装DNS域名解析服务器:

rpm -ivh bind-9.3.6-4.P1.el5.i386.rpm

rpm -ivh bind-chroot-9.3.6-4.P1.el5.i386.rpm

rpm -ivh bind-libs-9.3.6-4.P1.el5.i386.rpm

rpm -ivh bind-utils-9.3.6-4.P1.el5.i386.rpm

rpm -ivh caching-nameserver-9.3.6-4.P1.el5.i386.rpm

cd /var/named/chroot/etc/ //切换目录

cp -p named.caching-nameserver.conf named.conf

vim named.conf //编辑主配置文档

clip_image016

vim named.rfc1912.zones // 声明数据库

clip_image018

cd ../var/named/

cp -p localdomain.zone bj.com.db

vim bj.com.db //配置数据库

clip_image020

service named start

clip_image022

安装邮件接收服务器:

yum install dovecot //用yum解决依赖性问题

clip_image024

chkconfig dovecot on

service dovecot start

vim /etc/dovecot.conf //编辑配置文档

clip_image026

vim /etc/sysconfig/network // 更改主机名

clip_image028

vim /etc/hosts

clip_image030

init 6 //重启服务

客户端验证:

clip_image032

创建CA

vim /etc/pki/tls/openssl.cnf

clip_image034

clip_image036

mkdir crl certs newcerts

touch index.txt serial

clip_image038

echo "01" >serial

openssl genrsa 1024 >private/cakey.pem

openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365

clip_image040

chmod 600 private/cakey.pem

mkdir /etc/mail/certs

cd /etc/mail/certs/

openssl genrsa 1024 >sendmail.key

openssl req -new -key sendmail.key -out sendmail.csr

clip_image042

openssl req -new -key sendmail.key -out sendmail.csr

clip_image044

openssl ca -in sendmail.csr -out sendmail.cert

clip_image046

clip_image048

cp -p /etc/pki/CA/cacert.pem ./

vim /etc/mail/sendmail.mc

clip_image050

clip_image052

chmod 600 *

clip_image054

service sendmail restart

telnet 127.0.0.1 25

clip_image056

验证:

clip_image058

clip_image060

发送加密机制已完成。

客户端接受加密:

mkdir -pv /etc/dovecot/certs

cd /etc/dovecot/certs

openssl genrsa 1024 > dovecot.key

openssl req -new -key dovecot.key -out dovecot.csr

clip_image062

openssl ca -in dovecot.csr -out dovecot.cert

clip_image064

chmod 600 *

clip_image066

vim /etc/dovecot.conf

clip_image068

service dovecot restart

验证:

clip_image070

clip_image072