在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软件包已经安装,并且已启动 [iyunv@localhost ~]# cd /mnt/cdrom/Server [iyunv@localhost Server]# rpm -qa |grep sendmail sendmail-8.13.8-2.el5 [iyunv@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目录下 [iyunv@localhost ~]# cd /etc/mail [iyunv@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包 [iyunv@localhost ~]# cd /mnt/cdrom/Server [iyunv@localhost Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm 2.刚才我们查看目标端口时sendmail监听的端口是25,IP地址为127.0.0.1也就是本机的IP,这样我们只能通过telnet才能登录到该服务器,进行邮件的发送和接受,为了解决问题我们来改变主程序的参数,把IP改为0.0.0.0默认都可以。 [iyunv@localhost ~]# vim /etc/mail/sendmail.mc DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl #大约在116行 [iyunv@localhost ~]# service sendmail restart 关闭 sm-client: [确定] 关闭 sendmail: [确定] 启动 sendmail: [确定] 启动 sm-client: [确定] [iyunv@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实现邮件的发送 [iyunv@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一个一个的安装 [iyunv@mail Server]# rpm -ivh perl-DBI-1.52-2.el5.i386.rpm [iyunv@mail Server]# rpm -ivh mysql-5.0.77-3.el5.i386.rpm [iyunv@mail Server]# rpm -ivh dovecot-1.0.7-7.el5.i386.rpm [iyunv@mail Server]# service dovecot start 启动 Dovecot Imap: [确定] (3)发送和接受服务器都安装好后,我们通过一个例子来完成sendmail的加密和认证,SSL基于协议的加密,协议smtps(发送)和pops(接受)点到点的。安照下面拓扑实现加密,SSL的加密过程:首先服务器向用户出示证书,用户检查该服务器是否在有效期,是不是一个授信人的机构所颁发,用户所访问的名字是否和证书上的名字一样,如果都没问题,用户会产生一个K,通过证书上的公钥传递给服务器,服务器用自己的私钥打开,双方都有相同的密钥K,这样用户向服务器发送消息就是加密的,服务器使用用户的K进行解密,
实验步骤 1. 我们首先安装DNS DNS的安装 相关软件包安装 [iyunv@localhost ~]# cd /mnt/cdrom/Server [iyunv@localhost Server]# rpm -ivh bind-9.3.6-4.P1.el5.i386.rpm [iyunv@localhost Server]# rpm -ivh bind-chroot-9.3.6-4.P1.el5.i386.rpm [iyunv@localhost Server]# rpm -ivh caching-nameserver-9.3.6-4.P1.el5.i386.rpm 修改主配置文件 [iyunv@localhost var]# cd /var/named/chroot/ [iyunv@localhost chroot]# cd etc [iyunv@localhost etc]# cp -p named.caching-nameserver.conf named.conf [iyunv@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行 [iyunv@localhost etc]# vim named.rfc1912.zones #创建区域文件 zone "163.com" IN { type master; file "163.com.zone"; allow-update { none; }; }; 编辑区域文件正向解析 [iyunv@localhost etc]# cd /var/named/chroot/var/named [iyunv@localhost named]# cp -p localhost.zone 163.com.zone [iyunv@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 [iyunv@localhost named]# service named restart 停止 named: [确定] 启动 named: [确定] 改变DNS指向 [iyunv@localhost ~]# vim /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 192.168.255.250 search localdomain 2. 我们先实现SMTPS,服务器要从CA获得证书,所以我们先创建CA,创建可以在服务器上 [iyunv@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中需要的文件夹和文件 [iyunv@localhost ~]# cd /etc/pki/CA [iyunv@localhost CA]# mkdir certs newcerts crl [iyunv@localhost CA]# touch serial index.txt [iyunv@localhost CA]# echo 01 >serial [iyunv@localhost CA]# openssl genrsa 1024 >private/cakey.pem #产生CA的私钥文件 [iyunv@localhost CA]# chmod 600 private/cakey.pem #改变私钥文件的权限 [iyunv@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请求,最后获得有效的证书 [iyunv@localhost ~]# mkdir -pv /etc/mail/certs #创建sendmail服务器存放证书的地方 mkdir: created directory `/etc/mail/certs' [iyunv@localhost ~]# cd /etc/mail/certs/ [iyunv@localhost certs]# openssl genrsa 1024 >sendmail.key #私钥 [iyunv@localhost certs]# chmod 600 sendmail.key [iyunv@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 []: [iyunv@localhost certs]# openssl ca -in sendmail.crs -out sendmail.crt #CA签署 [iyunv@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的主程序 [iyunv@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 [iyunv@localhost certs]# telnet 127.0.0.1 25 ehlo 127.0.0.1 250-STARTTLS #支持加密 4. 实现pop3s,当用户登录到接受服务器上时,该接受服务器也存在证书,向用户出示证书,所以我们先创建pop3s证书 [iyunv@localhost ~]# mkdir /etc/dovecot/certs [iyunv@localhost ~]# cd /etc/dovecot/certs/ [iyunv@localhost certs]# openssl genrsa 1024 >dovecot.key [iyunv@localhost certs]# chmod 600 dovecot.key [iyunv@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 [iyunv@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 [iyunv@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的配置文件中 [iyunv@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证书的文件路径 [iyunv@localhost certs]# service dovecot restart 停止 Dovecot Imap: [确定] 启动 Dovecot Imap: [确定] [iyunv@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存在依赖关系我们按顺序安装 [iyunv@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 [iyunv@mail Server]# rpm -ivh libsmi-0.4.5-2.el5.i386.rpm [iyunv@mail Server]# rpm -ivh wireshark-1.0.8-1.el5_3.1.i386.rpm [iyunv@mail Server]# tshark -ni eth0 -R "tcp.port eq 995" #测试接受服务器的端口 在客户端要选择使用ssl加密 在工具→账户→双击帐号名称→高级→使用ssl加密 (4)ssl加密已经完成,我们再实现认证 Sendmail无验证能力,任何帐号都能够发送,我们使用身份验证,所以我们借助sasl实现认证。认证有基于地址和帐号的,基于地址的不太符合实际,如果用户离开该计算机到其他计算机就没法使用了,所以我们实现基于帐号的,使用的协议sasl(简单认证安全层),使用的服务器软件包cyrus-sasl,服务器名称saslauthd [iyunv@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 [iyunv@mail Server]# service saslauthd start #默认是关闭的 启动 saslauthd: [确定] sendmail借助sasl,所以我们要修改sendmail的主程序使两者结合 [iyunv@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=0.0.0.0, Name=MTA, M=Ea')dnl #116行强制验证 [iyunv@mail Server]# service sendmail restart 关闭 sm-client: [确定] 关闭 sendmail: [确定] 启动 sendmail: [确定] 启动 sm-client: [确定] 测试 [iyunv@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 [iyunv@mail ~]# echo -n "user3@163.com" |openssl base64 dXNlcjNAMTYzLmNvbQ== [iyunv@mail ~]# echo -n "123456" |openssl base64 MTIzNDU2 我们进行测试 [iyunv@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
|