因为近来网路越来越普及,相对的网路安全也越来越被注重,所以转此帖给大家分享
************************************************************************
摘要
网路的普及,使得许多传统的行为出现了典范转移,一个明显的例子就是电子邮件。
人们透过网路,可以轻易的寄送信件,而无需再经由邮差递送。电子邮件的应用非常广泛
,举凡报纸、贺卡等产业,都受到直接影响。和传统信件比起来,电子邮件有以下优点:
.免费:免贴邮票,免费使用,只需支付些微的电费即可。
.快速:寄信人在这一分钟寄信,收信人可在下一分钟收信。
.方便:免用纸笔,免贴邮票,免跑邮局。
但是,「水能载舟,亦能覆舟。」电子邮件的优点反而成为不肖骇客的利器。若邮件
伺服器之安全性不足,很有可能被用来当做广告信件的跳板,或者邮件可能遭受窃取。尤
其是垃圾信件(Spam Mails)的问题,几乎人人收信后第一件事就是砍垃圾信,若一不小
心,还有砍到重要信件的危险。
为防止这种情况发生,本文提供一些邮件伺服器的安全防范机制,以期邮件伺服器能
避免被作为垃圾信件的转送跳板,并让电子邮件使用者能享有更清新安全的电子邮件使用
环境。
一、邮件伺服器可能遭遇的安全威胁
一般邮件伺服器常提供以下几种服务:SMTP、POP3、WebMail。
◎ SMTP 全名为「Simple Mail Transfer Protocol」,中文称为「简单邮件传输协定」。
SMTP 最大的缺点为:太过信任使用者。这是因为 SMTP 发展之初仅为学术使用,它相信所
有使用者的身分均为真实的,因此不肖商人可以很容易地捏造一个不实身分,透过 SMTP
伺服器来寄送广告信件。虽然 SMTP 有先天上的缺陷,但仍有许多人是针对 SMTP 提出改
良方案,例如在 SMTP 协定中加入使用者身份认证机制,并且在 SSL/TLS 上执行 SMTP,
以防止使用者之帐号密码泄漏。本文将在第二节简单介绍建立认证 SSL/TLS SMTP 伺服器
的方法。
◎ POP3 全名为 Post Office Protocol, version3」,中文称为「邮局通讯协定」。POP3
是用来接收电子邮件的通讯协定,它会把使用者位于邮件伺服器上的信件通通下载至使用者
的个人电脑中,此外,亦可选择是否将邮件保留于伺服器上。POP3 在过去是以明码传递使
用者的帐号和认证密码,因此若邮件伺服器遭到窃听,则使用者的帐号和密码即可能泄漏,
或者于邮件传递过程中窃取信件。因此,有人提出了基于 SSL 的 POP3 协定,称为 POP3S
。本文将于第三节简单介绍建立 POP3S 伺服器的方法。
◎ WebMail 亦是邮件伺服器经常提供的服务,它可让使用者于个人电脑的浏览器上收取并
阅读信件,而无需下载信件到个人电脑中。通常,邮件伺服器的 WebMail 必须配合网页伺
服器运作,因此网页伺服器的安全性与 WebMail 有直接的关联性。要提供安全的 WebMail
,最简单的方式就是一并提供支援 SSL 加密的网页伺服器。本文将于第四节简单介绍一些
安全小技巧,以Open WebMail为例。
鉴于大部分的邮件伺服器均以 UNIX 为架设平台,因此本文选用 FreeBSD 4.x 作业系
统作为介绍的基本架构,针对以上三项服务提供一份安全的架构方案(Postfix + IMAP-UW
+ Open WebMail)。
二、建立安全的SMTP伺服器
在这一节中,我们将介绍如何以 Postfix 来建立安全的 SMTP 伺服器。何以选用 Postfix
而不使用 Sendmail 呢?这是由于 Sendmail 存在许多安全性问题,并且 Sendmail.cf 复
杂难懂。Wietse Venema 先生有鉴于此,就设计了一个足以取代 Sendmail 的软体,因此
Postfix 就此而生。Postfix 无论在安全性、稳定性、效能、设定等方面均相当出色,并且
相容于 Sendmail,满足原本 Sendmail 用户的使用习惯。
一个安全的 SMTP 伺服器应当提供两个功能:身分认证机制和资料加密传输机制。因为
本文是以 FreeBSD 为架构平台,因此下列安装范例是以 FreeBSD 的通讯埠来安装。
# Step 1. 停止 Sendmail 运作
shell> killall sendmail
# Step 2. 由 FreeBSD 的通讯埠安装 Postfix
shell > cd /usr/port/mail/postfix
shell > make install clean
# 在出现的第一个选单中选择 SASL 和 TLS
# 在出现的第二个选单中选择 PWCHECK
# 之后的程序中会出现两个选项,一个是问「是否将 postfix 加入 mail 群组?」,另一
个是问「是否在 /etc/mail/mailer.conf 中启动 Postfix?」,请都选 y
# 安装过程中,会出现指示使用者进行下面 Step 3 和 Step 4 动作的讯息
# Step 3. 修改 /etc/rc.conf,加入以下设定,以让 Postfix 取代 Sendmail:
sendmail_enable="YES"
sendmail_flags="-bd"
sendmail_outbound_enable="NO"
sendmail_submit_enable="NO"
sendmail_msp_queue_enable="NO"
# Step 4. 建立 /etc/periodic.conf 档案,内容为:
daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"
# Step 5. 编辑 /usr/local/etc/postfix/main.cf 档案,设定伺服器环境,通常需设定以
下四项:
myhostname = your.host.name
mydomain = your.domain
myorigin = $myhostname
alias_maps = hash:/usr/local/etc/postfix/aliases
# Step 6. 建立 alias 资料库
shell> postalias /usr/local/etc/postfix/aliases
# Step 7. 设定 SASL 认证
# 修改/etc/group,将postfix加入cyrus群组:
cyrus:*:60:postfix
# 建立/usr/local/lib/sasl/smtpd.conf,内容为:
pwcheck_method: pwcheck
# 确定/usr/local/etc/rc.d/cyrus_pwcheck.sh存在下列一行:
cyrus_pwcheck_enable="yes"
# 启动 cyrus_pwcheck:
shell> /usr/local/etc/rc.d/cyrus_pwcheck start
# 编辑/usr/local/etc/postfix/main.cf,加入:
smtpd_recipient_restrictions = permit_sasl_autheNticated,check_relay_domains,
permit_mynetworks
smtpd_client_restrictions = permit_sasl_authenticated
smtpd_sasl_auth_enable= yes
smtpd_sasl_security_options= noanonymous
smtpd_sasl_local_domain = $myhostname
# Step 8. 加入SSL/TLS支援,编辑/usr/local/etc/postfix/main.cf,加入:
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
# 以下三行设定伺服器认证金钥的位置,若无钥匙,可自行以OpenSSL产生
# 产生钥匙的方法请自行参阅相关文件,在此不多行赘述
smtpd_tls_key_file = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/CA/server.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
mtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
# 9. 启动Postfix
shell> /usr/local/sbin/postfix start
至此,我们已启动了一个支援身分认证及 SSL/TLS 加密传输的 SMTP 伺服器,此时
telnet 到 SMTP 所使用的 port 25 作测试,输入 ehlo localhost 后将看到下面二行:
250-STARTTLS
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
有了此身分认证功能后,SMTP 伺服器将不会再转送未经认证之使用者的信件,而只信
任通过认证的真正合法使用者,只要在 Outlook 帐号设定中的进阶标签里,把「我的外寄
伺服器(SMTP)需要验证」打勾,就可以使用身分认证机制。唯一的隐忧是合法使用者的
密码外泄,并且被骇客用来从事不法行为。此时可在配合 SSL/TLS 的加密机制,让骇客无
法窃听使用者之帐号密码,进而防止骇客盗用合法帐号。支援 SSL/TLS 加密的邮件伺服器
必须向其使用者宣导使用 SSL/TLS 来做寄信的动作,只要在 Outlook 帐号设定中的进阶标
签里,把「外寄伺服器(SMTP),此伺服器需要加密连线(SSL)」打勾,就可以采用 TLS
加密连线了。至于其他的邮件客户端软体(如 Mozilla Mail),请参阅其文件,将 SMTP
设定为 TLS/SSL 加密连线。
三、建立安全的POP3伺服器
传统的 POP3 协定并不提供 SSL 加密功能,因此随后有人提出了 POP3S 协定来加强
POP3 的安全性。POP3S 为加上 SSL 支援的 POP3,预设使用的是 port 995 作为其加密传
输的预设通讯埠。
目前支援 POP3S 的 POP3 软体仍然不多,在此介绍其中之一:IMAP-UW。IMAP-UW 是由
西雅图华盛顿大学(University of Washington)所发展,提供 IMAP/POP3 协定,更重要
的是 IMAP-UW 亦提供了 IMAPS/POP3S 等 SSL 加密协定。以下简单列出其安装方法,一样
是基于 FreeBSD 平台,并且使用通讯埠安装:
# Step 1. 安装 IMAP-UW
shell> cd /usr/ports/mail/imap-uw
shell> make WITH_SSL=YES install clean
# Step 2. 建立认证金钥
shell> make cert
# Step 3. 设定 /etc/inetd.conf,加入:
pop3 stream tcp nowait root /usr/local/libexec/ipop3d ipop3d
imap4 stream tcp nowait root /usr/local/libexec/imapd imapd
pop3s stream tcp nowait root /usr/local/libexec/ipop3d ipop3d
imaps stream tcp nowait root /usr/local/libexec/imapd imapd
# Step 4. 设定 /etc/hosts.allow,加入:
imapd : ALL : allow
ipop3d : ALL : allow
# Step 5. 设定 /etc/pam.conf,加入:
imap auth required pam_unix.so
imap account required pam_unix.so try_first_pass
imap session required pam_deny.so
pop3 auth required pam_unix.so
pop3 account required pam_unix.so try_first_pass
pop3 session required pam_deny.so
# Step 6. 启动服务
shell> killall -HUP inetd
完成上面步骤后,邮件伺服器的使用者即可享受以 SSL 加密传输的 POP3S 协定。邮件
伺服器必须宣导使用者使用该项服务,只要在Outlook帐号设定中的进阶标签里,把「内送
伺服器(POP3),此伺服器需要加密连线(SSL)」打勾,就可以采用 SSL 加密连线了。至
于其他的邮件客户端软体(如Mozilla Mail),请参阅其文件,将 POP3 设定为 TLS/SSL
加密连线。
四、建立安全的WebMail
因为 WebMail 必须和网页伺服器共同运作,因此 WebMail 要安全,就必须透过一个支
援 SSL 加密传输的网页伺服器。
前面提到,我们使用 Open WebMail 来作为范例,它是一个以 CGI 写成的 WebMail,
安装完成后,其首页位于
http://your.host.name/cgi-bin/...penwebmail.pl 但直接连接该页的话,使用者不一定会走 SSL 协定(HTTPS),透过下面这个小技巧,可以
让使用者更加安全。
邮件伺服器不一定要以该连结为 WebMail 进入页面,而可以对外公布说,本 WebMail
的进入页面位于
http://your.host....bmail/ 。此时,只要在网页伺服器根目录下建
立一个名为 webmail 的子目录,并在其中放置一个名为 index.html 档案(或其他网页伺
服器的预设首页档名),其内容如下:
<meta http-equiv="refresh" content="0;URL=https://your.host.name/cgi-bin/openwebmail/openwebmail.pl">
上面的 HTML 语法所进行的动作是将使用者以 HTTPS 的协定导到真正的 Open WebMail
进入页面。如此一来,大部分的使用者将会被自动导到支援 SSL 加密协定的页面,并且享用
安全的 WebMail 使用环境。此外,这样的网址也较原来那一大串网址好记。
参考资料
[1] [教学]Postfix+Cryus-SASL2+SSL/TLS+Courier-IMAP 实作,
http://www.backup.idv.tw/php...c.php?t=683 [2] [教学]FreeBSD - Postfix + SMTP AUTH,
http://www.backup.idv.tw/php...c.php?t=628 [3] 简易 Mail Server 架设 -- Postfix 设定,
http://linux.vbird.org/linux...postfix.php [4] 如何把 Sendmail 换成 Postfix,
http://linux.tnc.edu.tw/tec...x-howto.htm [5] 使用FreeBSD建立安全的邮件系统-imap/pop篇
http://www.ascc.net/n...4/04.txt [6] HTML完全程式设计手册
http://db.books.com.tw/exep/prod/...tem=0010007995