電子郵件sendmail的加密(SSL)和認證

 在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:[email protected]    #我們寫一個帳號

530 5.7.0 Authentication required    #驗證需求

我們也可以使用auth驗證,使用正確的帳號

Auth驗證中的帳號和密碼都要使用base64位的,我們首先進行更改

在系統中創建了user3帳號,密碼爲123456

[root@mail ~]# echo -n "[email protected]" |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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章