在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結合成smtps,pop3s,imaps這些都是點到點的。發送服務器sendmail不支持驗證、防垃圾、防病毒,認證基於中繼的IP地址和帳號認證,但IP地址不太方便,當用戶移動到其他地方就不被認證了,sendmail支持sasl(簡單認證安全層)協議,所以使用sasl協議進行帳號認證。
(1)Linux5.4版本的發送服務器sendmail軟件包已經安裝,並且已啓動
[root@localhost ~]# cd /mnt/cdrom/Server
[root@localhost Server]# rpm -qa |grep sendmail
sendmail-
[root@localhost ~]# netstat -tupln |grep sendmail #查看目標端口
tcp 0 0 127.0.0.1:25
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.db用m4軟件包,該包默認已經安裝
-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-
2.剛纔我們查看目標端口時sendmail監聽的端口是25,IP地址爲127.0.0.1也就是本機的IP,這樣我們只能通過telnet才能登錄到該服務器,進行郵件的發送和接受,爲了解決問題我們來改變主程序的參數,把IP改爲
[root@localhost ~]# vim /etc/mail/sendmail.mc
DAEMON_OPTIONS(`Port=smtp,Addr=
[root@localhost ~]# service sendmail restart
關閉 sm-client: [確定]
關閉 sendmail: [確定]
啓動 sendmail: [確定]
啓動 sm-client: [確定]
[root@localhost ~]# netstat -tupln |grep 25
tcp 0 0
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
HELP #查看信息
214-
214-
214-
214-
214-
214-
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-
[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-
[root@localhost Server]# rpm -ivh bind-chroot-
[root@localhost Server]# rpm -ivh caching-nameserver-
修改主配置文件
[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.
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 #88到90行改爲可選
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) [
Organization Name (eg, company) [
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]:
Locality Name (eg, city) [
Organization Name (eg, company) [
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]:
Locality Name (eg, city) [
Organization Name (eg, company) [
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 #103行CA證書的文件路徑
[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. smtps和pop3s都已經完成,在linux中抓包工具是wireshark工具,爲了測試我們先安裝
安裝wireshark存在依賴關係我們按順序安裝
[root@mail Server]# rpm -ivh wireshark-
error: Failed dependencies:
libsmi.so.2 is needed by wireshark-
[root@mail Server]# rpm -ivh libsmi-
[root@mail Server]# rpm -ivh wireshark-
[root@mail Server]# tshark -ni eth0 -R "tcp.port eq 995" #測試接受服務器的端口
在客戶端要選擇使用ssl加密
在工具→賬戶→雙擊帳號名稱→高級→使用ssl加密
(4)ssl加密已經完成,我們再實現認證
Sendmail無驗證能力,任何帳號都能夠發送,我們使用身份驗證,所以我們藉助sasl實現認證。認證有基於地址和帳號的,基於地址的不太符合實際,如果用戶離開該計算機到其他計算機就沒法使用了,所以我們實現基於帳號的,使用的協議sasl(簡單認證安全層),使用的服務器軟件包cyrus-sasl,服務器名稱saslauthd
[root@mail Server]# rpm -qa |grep cyrus-sasl #cyrus-sasl已經安裝
cyrus-sasl-plain-
cyrus-sasl-
cyrus-sasl-lib-
cyrus-sasl-devel-
[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 #在52,53行驗證機制打開
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLA IN')dnl
DAEMON_OPTIONS(`Port=smtp,Addr=
[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
我們也可以使用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
auth login dXNlcjNAMTYzLmNvbQ==
334 UGFzc3dvcmQ6
MTIzNDU2
235
在客戶端進行驗證時,如果你不指定服務器使用身份驗證則存在的帳號也不能發郵件
在工具→賬戶→雙擊帳號→服務器
user3發給user4