sendmail進階設定
2006/03/08
參考文件:
http://www.ofb.net/~jheiss/sendmail/tlsandrelay.shtml
http://www.imacat.idv.tw/tech/sslcerts.html

sendmail relay設定
目前版本的sendmail ,因為安全的因素(避免成為圾垃郵件主機),並不幫其它主機relay郵件,但是這樣會造成公司同仁無法在公司外(roaming users)(動態IP)想藉由公司主機來傳送郵件.

1.使用SMTP AFTER POP3外掛程式(sendmail預設並不提供任何方法)
原理:
一般的使用者的流程是先收信->寫信->送信(也就是先pop3再smtp),當收信(pop3)成功之後會觸發外掛程式改寫 relay資料庫,允許該IP 傳送郵件,在設定的時間後該IP的傳送郵件的權限會被取消,外掛程式將會刪除relay資料庫該IP允許relay的設定,這種作法必須修改pop3的(本文不介紹設定)
2.使用sendmail內建功能,(後來加入的)
原理:
smtp使用者密碼驗證


sendmail.cf其說明(很重要)

dnl # The following allows relaying if the user authenticates, and   disallows
dnl # plaintext authentication (PLAIN/LOGIN) on non-TLS links
dnl #
dnl define(`confAUTH_OPTIONS', `A p')dnl
dnl #
dnl # PLAIN is the preferred plaintext authentication method and used by
dnl # Mozilla Mail and Evolution, though Outlook Express and other MUAs do
dnl # use LOGIN. Other mechanisms should be used if the connection is not
dnl # guaranteed secure.
dnl # Please remember that saslauthd needs to be running for AUTH.
dnl #
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl #
dnl # Rudimentary information on creating certificates for sendmail TLS:
dnl #     cd /usr/share/ssl/certs; make sendmail.pem
dnl # Complete usage:
dnl #     make -C /usr/share/ssl/certs usage
dnl #
define(`confCACERT_PATH',`/usr/share/ssl/certs')
define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt')
define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem')
define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem')
#以下是允許使用者驗證來relay郵件,但如果使用 plaintext驗證但沒有使用TLS則功能請不要使用這個功能


如果要你要使用LOGIN千萬不要使用這個項目

使用define (`confAUTH_OPTIONS', `A')就好了,因為它會限制只有編碼才可以使用
PLAIN驗證方法使用在MozilaMail /Evolution
LOGIN驗證方法使用在Outlook Express


請記住saslauthd必須被執行,才能使用AUTH
#定義信任的驗證機制

#定義驗證的機制



如果要使用TLS請使用下面命令
cd /usr/share/ssl/certs;make sendmail.pem
完整的用法
make -C /usr/share/ssl/certs usage
#下面設定憑證,key等設定

SMTP AUTH (RFC 2554)
sendmail原不支援smtp auth 如果要使用這個功能你必須使用Cyrus SASL這是一個可抽換的驗證的程式介面
在送信時使用outlook express 的驗證(LOGIN),mozilla, netscape使用PLAIN
驗證時sendmail會向saslauthd行程來查證
#我是使用FC3/4因此預設Cyrus SASL都已經編譯在sendmail
1./etc/sysconfig/saslauthd
# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/var/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled to use.
MECH=pam
#MECH=shadow好像也可以
# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=

2./usr/lib/sasl2/Sendmail.conf
pwcheck_method:saslauthd
3.啟動saslauthd
 service saslauthd start
(如果以後要開機自動啟動saslauthd ,chkconfig saslauthd --level 2345 on )
4.vi /etc/mail/sendmail.mc
各加入LOGIN
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
5.m4 sendmail.mc > sendmail.cf
6.vi /etc/mail/sendmail.cf 將LOGLEVEL=13增加/var/log/maillog 記錄訊息
7.service MailScanner restart
8.查看訊息/var/log/maillog ,如果沒有錯誤
9.測試:
[root@dns1 ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 dns1.ocean-pioneer.com ESMTP Sendmail 8.13.1/8.13.1; Fri, 3 Feb 2006 13:20:11 +0800
ehlo test
250-dns1.ocean-pioneer.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
10.Outlook Express 設定(工具->帳戶-伺服器)
oe_login

#經由上述的設定後你的sendmail己經可以傳送郵件,但實在是不安裝,因為如果是直接使用 LOGIN/PLAIN(明碼) 很容易並別人取得密碼,然後使用你的主機來傳垃圾郵件,因此必須加入TLS編碼

TLS和SSL
ssl是目前最常使用來加密的方式,它可以應用在smtp,pop3,http等等在傳輸面的加密,細節請參考其它專書介紹,這堨u介紹基本觀念
SSL是直接使用另一個連接埠來接受連線,而TLS則是使用原服務的連接埠,在原程式的命令加入STARTTLS,若要啟動編碼連線則使用STARTTLS來進入編碼連線,因此減少了一個連接埠來等待服務
凡是用到TLS,SSLx509憑證的設定你一定要會
#TLS可以應用SENDMAIL在兩方面
sendmail <-> sendmail  -目前很少人限制只收透過TLS的信(在這堣ˊ)
mail clinet -> sendmail  -CA驗證成功的話verify=OK可以relay郵件
在上述的sendmail.mc中含有下面四個設定,我們將使用x.509來建立下面的設定
define(`confCACERT_PATH',`/usr/share/ssl/certs')
define(`confCACERT',`/usr/share/ssl/certs/ca -bundle.crt')-上層憑證,用來驗證用
define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem')-本機憑證
define(`confSERVER_KEY', `/usr/share/ssl/certs/sendmail.pem')-私key
define(`confCLIENT_CERT',`/etc/mail/certs/myhost-msp.crt')
define(`confCLIENT_KEY',`/etc/mail/private/myhost-msp.key')
SERVER/CLIENT是有分別的
define(`confDONT)BLAME_SENDMAIL',`GroupReadablekeyFile')

在建立好了憑證(請參照:附件),並設定好路徑
m4 sendmail.mc > sendmail..cf
修改 LogLevel=12 (增加除錯的記錄)
重新啟動sendmail
測試連線
[root@dns1 ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 dns1.ocean-pioneer.com ESMTP Sendmail 8.13.1/8.13.1; Fri, 3 Feb 2006 13:20:11 +0800
ehlo test
250-dns1.ocean-pioneer.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP

如果正確則STARTTLS會出現在ehlo 之後,如果沒有出來查看/var/log/maillog
Outlook Express tls設定
oe ssl
#注意當/etc/mail/access有拒絕REJECT/DROP時,是無法進入後續的ssl/smtp auth會直接被拒絕掉
假設內容如下:
dynamic.hinet.net       REJECT
dynamic.apol.com.tw     REJECT
dynamic.so-net.net.tw   REJECT
dynamic.ttn.net         REJECT
dynamic.giga.net.tw    REJECT
dynamic.tfn.net.tw      REJECT
上述的網域將直接被拒絕掉,因此你必須去掉

附錄1: SASL驗證的方法
passwd
/etc/passwd . 簡單的設定選項 "pwcheck_method"為 "passwd".

shadow
/etc/shadow  如果伺服器使用 SASL使用 root的身份來執行 (如Sendmail) 沒有問題:只要設定"pwcheck_method" 選項為 "shadow". 然而, 有許多daemons 因安全的原故,並不是以 root的身份來執行, 如Cyrus imapd.為了這些伺服器檢查密碼, 它們需要一個 helper 程式以root來執行, 或需要特別的權限來讀取 /etc/shadow. 最簡單的方法是給予這個伺服器讀取 /etc/shadow 的權利,例如加入 cyrus user 到 "shadow" 群組中然後設定 "pwcheck_method"為 "shadow".

也可能寫一個特別的 PAM 模組,擁有必須的權限 .

kerberos_v4
Kerberos v4, 如果在編譯期間有設定, 可以啟動純文字密碼檢查設定"pwcheck_method" 到 "kerberos_v4". 這是不同的格式 KERBEROS_V4 機制討論如下---設定選項如下.
pam
PAM, 可抽換式的驗證模組, 是預設使用在Solaris和 Linux. 它可以設定檢查密碼在不同的方法:透過 Radius, 透過 NIS, 透過 LDAP,或 傳統 /etc/passwd 檔案. 如果你希望使用 PAM來驗證和Cyrus SASL library 尋找 PAM library當在編譯時設定, 它是預設 (或設定 "pwcheck_method" 為 "PAM"). 它使用 PAM 服務名稱 (例如, Sendmail使用 "smtp" 和 Cyrus imapd 使用 "imap").

PAM 認證對SASL 只影響 plaintext 驗證. 不影響其它機制, 所以限制使用 PAM 在其它機制是不對的.

sasldb
儲存密碼在SASL密碼資料庫, 相同的資料庫儲存密碼及分享的方法. 它的原則性的優點是意味著passwords 使用分享密碼機制將會同步用 plaintext password mechanisms.然而, 系統預設不使用 sasldb.

注意設定plaintext passwords 在資料庫sasldb中,你需要設定 "saslpasswd" . "saslpasswd" 使用相同設定像任何 SASL 伺服器.建立 /usr/lib/sasl/saslpasswd.conf 包含這一行 "pwcheck_method: sasldb" 來 "saslpasswd" 來建立 plaintext secrets在額外正常的密碼.

#SASL的好處
可以跨主機驗證,一般的驗證方法只能單機驗證,並且可以選用上述的機制
#sasldb 必須使用saslpasswd來加入使用者名稱及密碼

附錄2:使用Auth login範例
S:220 smtp.com ESMTP Sendmail 8.13.1/8.13.1; Fri, 3 Feb 2006 14:51:4 5 +0800
C: ehlo test
S:250-smtp.com Hello test [192.168.0.32], pleased to meet you
S:250-ENHANCEDSTATUSCODES
S:250-PIPELINING
S:250-8BITMIME
S:250-SIZE
S:250-DSN
S:250-AUTH LOGIN PLAIN
S:250-DELIVERBY
S:250 HELP
C:AUTH LOGIN
334 VXNlcm5hbWU6
# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 bbs.cj.mis.yzu.edu.tw ESMTP Sendmail 8.12.6/8.12.6; Tue, 29 Apr 2003
ehlo localhost
250-bbs.cilab.mis.yzu.edu.tw Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
AUTH LOGIN
334 VXNlcm5hbWU6          -Username的base64編碼
[貼上 base64 編碼後的 User Name]
334 UGFzc3dvcmQ6            -Password的base64編碼
[貼上 base64 編碼後的 User Password]
235 2.0.0 OK Authenticated <-- 出現這行表示認證成功
quit



#base64編碼的取得,我使用python
>>> import base64
>>>base64.b64encode('字串')                 #編碼
>>>base64.b64decode('字串')                 #解碼
#所以使用login一樣很容易被破解,為了安全的原故,因此我們需要加入TLS/SSL

SSL憑證及key 建立
由於fc3和fc4的openssl的安裝設定檔的目錄不一樣請注意,以下以FC3為主,請根據自己環境來修改
fc3 -/usr/share/ssl
fc4-/etc/pki/tls
  1. 修改openssl.cnf 其中
    dir = /usr/share/ssl
    dir = /etc/pki/tls
  2. 根據參考文章建立/etc/ssl 目錄,其實可以使用ln -s /etc/ss /usr/share/ssl
    建立網域CAcert
  3. 建立私key
       openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
  4. 填寫憑證要求
       openssl  req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req
  5. 簽發憑證
       openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey /etc/ssl/private/myrootca.key -in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt
  6. 重複3,4,5(專門給OE使用)
        mkdir /etc/mail/private
        mkdir /etc/mail/certs
       chgrp smmsp /etc/mail/private
       chmod  o-rwx /etc/mail/private
       建立私key: openssl genrsa -out /etc/ssl/private/myhost-msp.key 2048
       建立憑證要求:openssl  req -new -key /etc/ssl/private /myhost-msp.key -out /tmp/myhost-msp.req
    簽發憑證 openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA /etc/ssl/certs/myrootca.crt -CAkey /etc/ssl/private/myrootca.key -in /tmp/myhost-msp.req /etc/mail/certs/myhostmsp.crt