在linux系统中电子邮件系统sendmail的发送和接受都是以明文进行传输的,发送邮件使用的协议是smtp(简单传输协议),接受邮件使用的协议是pop2、pop3、imap4,这些协议都工作在应用层,在传输层传输都是tcp,sendmail的端口是25,pop2的端口是109,pop3的端口是110,imap的端口是143。linux系统中发送服务器有sendmail、postfix、extmail,接受服务器是dovecot,dovecot支持pop2、pop3、imap4协议,明文传输显然是不安全的,别人可以截取你的消息。为了安全我们使用加密和认证,加密基于协议的和ssl结合成smtpspop3simaps这些都是点到点的。发送服务器sendmail不支持验证、防垃圾、防病毒,认证基于中继的IP地址和帐号认证,但IP地址不太方便,当用户移动到其他地方就不被认证了,sendmail支持sasl(简单认证安全层)协议,所以使用sasl协议进行帐号认证。

1Linux5.4版本的发送服务器sendmail软件包已经安装,并且已启动

[root@localhost ~]# cd /mnt/cdrom/Server

[root@localhost Server]# rpm -qa |grep sendmail

sendmail-8.13.8-2.el5

[root@localhost ~]# netstat -tupln |grep sendmail    #查看目标端口

tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      3714/sendmail: ace

sendmail的一些常见问题

1.sendmail的主要的文件都被安装到/etc/mail目录下

[root@localhost ~]# cd /etc/mail

[root@localhost mail]# ll

总计 244

-rw-r--r-- 1 root root   355 2006-11-28 access

-rw-r----- 1 root root 12288 04-23 20:02 access.db      #该文件为中继文件存放的是数据库和二进制文件,我们看不懂没法修改文件的内容,上面的access文件和该文件的参数一样,所以我们修改access文件,把access文件转换成access.dbm4软件包,该包默认已经安装

-rw-r--r-- 1 root root    64 2006-11-28 local-host-names   #存放服务器域名和机名

-rw-r--r-- 1 root root 58205 04-23 20:02 sendmail.cf       #主程序

-rw-r--r-- 1 root root  7209 2006-11-28 sendmail.mc     #和主程序的参数一样,只是该文件易于理解,当我们修改文件的内容后再运用sendmail-cf软件包转换成sendmail.cf文件,该软件包没有安装

我们安装sendmail-cf

[root@localhost ~]# cd /mnt/cdrom/Server

[root@localhost Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm

2.刚才我们查看目标端口时sendmail监听的端口是25IP地址为127.0.0.1也就是本机的IP,这样我们只能通过telnet才能登录到该服务器,进行邮件的发送和接受,为了解决问题我们来改变主程序的参数,把IP改为0.0.0.0默认都可以。

[root@localhost ~]# vim /etc/mail/sendmail.mc

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl      #大约在116

[root@localhost ~]# service sendmail restart     

关闭 sm-client                                           [确定]

关闭 sendmail                                            [确定]

启动 sendmail                                            [确定]

启动 sm-client                                           [确定]

[root@localhost ~]# netstat -tupln |grep 25

tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      5360/sendmail: ace

3.邮件的帐号分为本地帐号和虚拟帐号

本地帐号存放在/etc/passwd目录下,可以查看但是不安全

虚拟帐号就是没有存放目录虚拟的

4.邮件管理员进行排错时经常使用的工具telnet,通过telnet实现邮件的发送

[root@localhost ~]# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8; Fri, 3 May 2013 09:17:29 +0800

HELP                #查看信息

214-2.0.0 This is sendmail

214-2.0.0 Topics:

214-2.0.0       HELO    EHLO    MAIL    RCPT    DATA

214-2.0.0       RSET    NOOP    QUIT    HELP    VRFY

214-2.0.0       EXPN    VERB    ETRN    DSN     AUTH

214-2.0.0       STARTTLS

HELO表示人与机的交流,EHLO表示服务器支持的特性,MAIL表示发送邮件者,RCPT表示接受者,DATA表示输入邮件的内容,QUIT表示退出,AUTH表示验证,STARTTLS表示加密

2)接收服务器dovecot没安装,我们进行安装,在安装过程中存在依赖关系我们可以使用yum,但我使用的是rpm一个一个的安装

[root@mail Server]# rpm -ivh perl-DBI-1.52-2.el5.i386.rpm

[root@mail Server]# rpm -ivh mysql-5.0.77-3.el5.i386.rpm

[root@mail Server]# rpm -ivh dovecot-1.0.7-7.el5.i386.rpm

[root@mail Server]# service dovecot start

启动 Dovecot Imap                                        [确定]

3)发送和接受服务器都安装好后,我们通过一个例子来完成sendmail的加密和认证,SSL基于协议的加密,协议smtps(发送)和pops(接受)点到点的。安照下面拓扑实现加密,SSL的加密过程:首先服务器向用户出示证书,用户检查该服务器是否在有效期,是不是一个授信人的机构所颁发,用户所访问的名字是否和证书上的名字一样,如果都没问题,用户会产生一个K,通过证书上的公钥传递给服务器,服务器用自己的私钥打开,双方都有相同的密钥K,这样用户向服务器发送消息就是加密的,服务器使用用户的K进行解密,

实验步骤

1. 我们首先安装DNS

DNS的安装

相关软件包安装

[root@localhost ~]# cd /mnt/cdrom/Server

[root@localhost Server]# rpm -ivh bind-9.3.6-4.P1.el5.i386.rpm

[root@localhost Server]# rpm -ivh bind-chroot-9.3.6-4.P1.el5.i386.rpm

[root@localhost Server]# rpm -ivh caching-nameserver-9.3.6-4.P1.el5.i386.rpm

修改主配置文件

[root@localhost var]# cd /var/named/chroot/

[root@localhost chroot]# cd etc

[root@localhost etc]# cp -p named.caching-nameserver.conf named.conf

[root@localhost etc]# vim named.conf      

listen-on port 53 { any; };       #大约在15行,其实注释掉也可以

allow-query       { any; };       #大约在27

allow-query-cache { any; };       #大约在28

match-clients      { any; };      #大约在37

match-destinations { any; };      #大约在38

[root@localhost etc]# vim named.rfc1912.zones       #创建区域文件

zone "163.com" IN {

        type master;

        file "163.com.zone";

        allow-update { none; };

};

编辑区域文件正向解析

[root@localhost etc]# cd /var/named/chroot/var/named

[root@localhost named]# cp -p localhost.zone 163.com.zone

[root@localhost named]# vim 163.com.zone       

$TTL    86400

@               IN SOA  ns.163.com.       root (

                                        42              ; serial (d. adams)

                                        3H              ; refresh

                                        15M             ; retry

                                        1W              ; expiry

                                        1D )            ; minimum

 

@               IN NS           ns.163.com.

ns              IN A            192.168.255.250

mail            IN A            192.168.255.250

smtp            IN CNAME        mail

pop3            IN CNAME        mail

@               IN MX 10        mail

[root@localhost named]# service named restart

停止 named                                               [确定]

启动 named                                               [确定]

改变DNS指向

[root@localhost ~]# vim /etc/resolv.conf        

; generated by /sbin/dhclient-script

nameserver 192.168.255.250

search localdomain

2. 我们先实现SMTPS,服务器要从CA获得证书,所以我们先创建CA,创建可以在服务器上

[root@localhost ~]# vim /etc/pki/tls/openssl.cnf     #修改CA配置文件

[ CA_default ]

dir             = /etc/pki/CA         #45行直接写出CA路径

countryName             = optional    #8890行改为可选

stateOrProvinceName     = optional

organizationName        = optional

countryName_default             = CN        #136行改为中国为默认值

stateOrProvinceName_default     = Beijing      #141行改为任意的默认值

localityName_default            = Beijing      #144也改为任意的默认值

创建CA中需要的文件夹和文件

[root@localhost ~]# cd /etc/pki/CA

[root@localhost CA]# mkdir certs newcerts crl

[root@localhost CA]# touch serial index.txt

[root@localhost CA]# echo 01 >serial

[root@localhost CA]# openssl genrsa 1024 >private/cakey.pem      #产生CA的私钥文件

[root@localhost CA]# chmod 600 private/cakey.pem         #改变私钥文件的权限

[root@localhost CA]# openssl req -new -key private/cakey.pem -x509 -out cacert.pem

#获得CA证书

Country Name (2 letter code) [CN]:          #获得国家中国

State or Province Name (full name) [Berkshire]:Beijing        #这些可以任意写

Locality Name (eg, city) [beijing]:

Organization Name (eg, company) [beijing]:

Organizational Unit Name (eg, section) []:zyg

Common Name (eg, your name or your server's hostname) []:rootca.com

Email Address []:

3. sendmai服务器是支持ssl加密,但是没开启。服务器要想获得证书,服务器有请求,然后获得证书,请求上有公钥,公钥是有私钥产生,所以我们先产生私有再向CA请求,最后获得有效的证书

[root@localhost ~]# mkdir -pv /etc/mail/certs       #创建sendmail服务器存放证书的地方

mkdir: created directory `/etc/mail/certs'

[root@localhost ~]# cd /etc/mail/certs/

[root@localhost certs]# openssl genrsa 1024 >sendmail.key      #私钥

[root@localhost certs]# chmod 600 sendmail.key

[root@localhost certs]# openssl req -new -key sendmail.key -out sendmail.crs   #请求

Country Name (2 letter code) [CN]:

State or Province Name (full name) [Berkshire]:beijing

Locality Name (eg, city) [beijing]:

Organization Name (eg, company) [beijing]:

Organizational Unit Name (eg, section) []:tec

Common Name (eg, your name or your server's hostname) []:smtp.163.com     #该名称为访问服务器的名称

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

[root@localhost certs]# openssl ca -in sendmail.crs -out sendmail.crt    #CA签署

[root@localhost certs]# ll

total 8

-rw-r--r-- 1 root root 651 May  7 08:07 sendmail.crs

-rw-r--r-- 1 root root   0 May  7 08:09 sendmail.crt

-rw------- 1 root root 887 May  7 08:04 sendmail.key

获得证书之后要想被别人看到,要进行绑定,修改sendmail的主程序

[root@localhost certs]# vim /etc/mail/sendmail.mc

define(`confCACERT_PATH', `/etc/pki/CA')dnl     #大约在60行证书路径

define(`confCACERT', `/etc/pki/CA/cacert.pem')dnl

define(`confSERVER_CERT', `/etc/mail/certs/sendmail.crt')dnl

define(`confSERVER_KEY', `/etc/mail/certs/sendmail.key')dnl

DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl    #大约在134行开启smtps端口

然后重启sendmail,我们可以使用上面提到的管理员排错时用到的telnet

[root@localhost certs]# telnet 127.0.0.1 25

ehlo 127.0.0.1

250-STARTTLS        #支持加密

4. 实现pop3s,当用户登录到接受服务器上时,该接受服务器也存在证书,向用户出示证书,所以我们先创建pop3s证书

[root@localhost ~]# mkdir /etc/dovecot/certs

[root@localhost ~]# cd /etc/dovecot/certs/

[root@localhost certs]# openssl genrsa 1024 >dovecot.key

[root@localhost certs]# chmod 600 dovecot.key

[root@localhost certs]# openssl req -new -key dovecot.key -out dovecot.crs

Country Name (2 letter code) [CN]:

State or Province Name (full name) [Berkshire]:beijing

Locality Name (eg, city) [beijing]:

Organization Name (eg, company) [beijing]:

Organizational Unit Name (eg, section) []:tec

Common Name (eg, your name or your server's hostname) []:pop3.163.com

[root@localhost certs]# openssl ca -in dovecot.crs -out dovecot.crt

Sign the certificate? [y/n]:y    

1 out of 1 certificate requests certified, commit? [y/n]y

[root@localhost certs]# ll

total 12

-rw-r--r-- 1 root root  651 May  7 09:28 dovecot.crs

-rw-r--r-- 1 root root 3074 May  7 09:29 dovecot.crt

-rw------- 1 root root  887 May  7 09:27 dovecot.key

捆绑证书在dovecot的配置文件中

[root@localhost certs]# vim /etc/dovecot.conf

protocols =  imaps  pop3s                    #20行只剩下加密的协议

ssl_cert_file = /etc/dovecot/certs/dovecot.crt       #91行证书的文件路径

ssl_key_file = /etc/dovecot/certs/dovecot.key       #92行私钥的文件路径

ssl_ca_file =/etc/pki/CA/cacert.pem                #103CA证书的文件路径

[root@localhost certs]# service dovecot restart

停止 Dovecot Imap                                        [确定]

启动 Dovecot Imap                                        [确定]

[root@localhost certs]# netstat -tupln |grep dovecot     #查看端口

tcp        0      0 :::993                      :::*                        LISTEN      31203/dovecot      

tcp        0      0 :::995                      :::*                        LISTEN      31203/dovecot      

5 smtpspop3s都已经完成,在linux中抓包工具是wireshark工具,为了测试我们先安装

安装wireshark存在依赖关系我们按顺序安装

[root@mail Server]# rpm -ivh wireshark-1.0.8-1.el5_3.1.i386.rpm

error: Failed dependencies:

        libsmi.so.2 is needed by wireshark-1.0.8-1.el5_3.1.i386

[root@mail Server]# rpm -ivh libsmi-0.4.5-2.el5.i386.rpm

[root@mail Server]# rpm -ivh wireshark-1.0.8-1.el5_3.1.i386.rpm

[root@mail Server]# tshark -ni eth0 -R "tcp.port eq 995"     #测试接受服务器的端口

在客户端要选择使用ssl加密

在工具→账户→双击帐号名称→高级→使用ssl加密

4ssl加密已经完成,我们再实现认证

Sendmail无验证能力,任何帐号都能够发送,我们使用身份验证,所以我们借助sasl实现认证。认证有基于地址和帐号的,基于地址的不太符合实际,如果用户离开该计算机到其他计算机就没法使用了,所以我们实现基于帐号的,使用的协议sasl(简单认证安全层),使用的服务器软件包cyrus-sasl,服务器名称saslauthd

[root@mail Server]# rpm -qa |grep cyrus-sasl       #cyrus-sasl已经安装

cyrus-sasl-plain-2.1.22-5.el5

cyrus-sasl-2.1.22-5.el5

cyrus-sasl-lib-2.1.22-5.el5

cyrus-sasl-devel-2.1.22-5.el5

[root@mail Server]# service saslauthd start          #默认是关闭的

启动 saslauthd                                           [确定]

sendmail借助sasl,所以我们要修改sendmail的主程序使两者结合

[root@mail Server]# vim /etc/mail/sendmail.mc

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl  #5253行验证机制打开

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLA    IN')dnl

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA, M=Ea')dnl          #116行强制验证

[root@mail Server]# service sendmail restart

关闭 sm-client                                           [确定]

关闭 sendmail                                            [确定]

启动 sendmail                                            [确定]

启动 sm-client                                           [确定]

测试

[root@mail Server]# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

ehlo 127.0.0.1

250-AUTH LOGIN PLAIN         #存在该验证功能

mail from:asdfsffg@163.com    #我们写一个帐号

530 5.7.0 Authentication required    #验证需求

我们也可以使用auth验证,使用正确的帐号

Auth验证中的帐号和密码都要使用base64位的,我们首先进行更改

在系统中创建了user3帐号,密码为123456

[root@mail ~]# echo -n "user3@163.com" |openssl base64

dXNlcjNAMTYzLmNvbQ==

[root@mail ~]# echo -n "123456" |openssl base64

MTIzNDU2

我们进行测试

[root@mail ~]# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

220 mail.163.com ESMTP Sendmail 8.13.8/8.13.8; Tue, 7 May 2013 11:43:23 +0800

auth login dXNlcjNAMTYzLmNvbQ==

334 UGFzc3dvcmQ6

MTIzNDU2

235 2.0.0 OK Authenticated         #验证通过就可以发信了

在客户端进行验证时,如果你不指定服务器使用身份验证则存在的帐号也不能发邮件

在工具→账户→双击帐号→服务器

user3发给user4