手動 RELAY 測試 想要知道自己架設的郵件主機是否設定正確,沒有 Relay 的問題,可以使用 telnet 工具作測試,先以 help 查詢可以使用的指令: # telnet 127.0.0.1 25 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 220 ESMTP //sendmail 版本訊息已經被隱藏 help 214-2.0.0 This is sendmail version 8.12.8 //但是打 help 還是看得到版本訊息,這個問題請修改 /etc/mail/helpfile 來解決 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 214-2.0.0 For more info use "HELP <topic>". 214-2.0.0 To report bugs in the implementation send email to 214-2.0.0 sendmail-bugs@sendmail.org. 214-2.0.0 For local information send email to Postmaster at your site. 214 2.0.0 End of HELP info helo test.com //嘗試假冒自己身份為 test.com 250 mail.spps.tp.edu.tw Hello localhost.localdomain [127.0.0.1], //這裡一定會顯示正確的連線位置 pleased to meet you. mail from: spam@test.com //假裝寄信人是 spam@test.com 250 2.1.0 spam@test.com... Sender ok rcpt to: spam@test.com //假裝收信人也是 spam@test.com 250 2.1.5 spam@test.com... Recipient ok //居然被接受了,其實因為是從 127.0.0.1 連線,所以會這樣 quit 221 2.0.0 mail.spps.tp.edu.tw closing connection Connection closed by foreign host. $ telnet 192.57.1.7 25 //這次從別台主機連上來測試 Trying 192.57.1.7... Connected to 192.57.1.7. Escape character is '^]'. 220 ESMTP helo test.com //假冒自己的身分 250 mail.spps.tp.edu.tw Hello stu.spps.tp.edu.tw [192.57.1.6], pleased to meet you. //顯示正確的連線位置 mail from: spam@test.com //假裝寄信人是 spam@test.com 250 2.1.0 spam@test.com... Sender ok rcpt to: spam@test.com //假裝收信人是 spam@test.com 550 5.7.1 spam@test.com... Relaying denied. Proper authentication required. //果然被要求要先登入 rcpt to: shane@mail.spps.tp.edu.tw //改寄給本機帳號 shane@mail.spps.tp.edu.tw 250 2.1.5 shane@mail.spps.tp.edu.tw... Recipient ok //被接受了,事實上單純收信是不會擋 RELAY,當然前提條件是寄信人 spam@test.com 在 access.db 中不可以被 REJECT data //開始輸入信件內容 354 Enter mail, end with "." on a line by itself From: 你抓不到我@test.com //透過這個標頭, 可以取代 MAIL 指令所設定的郵件信箱地址,以避免被追蹤 To: 你抓不到我@test.com //透過這個標頭, 可以取代 RCPT 指令所設定的郵件信箱地址,以避免被追蹤 Subject: hello
hi, how are you? . //結束輸入,必須另起一行然後輸入英文句號 250 2.0.0 h284YtkF025941 Message accepted for delivery //信件被接受並進行分信處理 quit 221 2.0.0 mail.spps.tp.edu.tw closing connection Connection closed by foreign host. $ telnet 192.57.1.7 25 Trying 192.57.1.7... Connected to 192.57.1.7. Escape character is '^]'. 220 ESMTP auth plain //嘗試以純文字密碼登入 504 5.3.3 AUTH mechanism plain not available //這種驗證機制已經被移除 auth login //嘗試以 POP3 方式登入 334 VXNlcm5hbWU6 //提示輸入 username,之所以看不懂是因為被編成 base64 shane //直接輸入帳號是錯的 ,請先使用底下指令找出 base64 字串: perl -MMIME::Base64 -e 'print encode_base64("要編密的字串");' 334 UGFzc3dvcmQ6 //提示輸入 password 123456 //與帳號相同,要先編成 base64 535 5.7.0 authentication failed //由於 base64 編碼事實上並未加密,最好還是不要用 auth digest-md5 //嘗試其他驗證機制存不存在 504 5.3.3 AUTH mechanism digest-md5 not available starttls //嘗試 TLS/SSL 安全傳輸層有沒有啟用 454 4.3.3 TLS not available after start help dsn //查詢進階指令 214-2.0.0 MAIL FROM: <sender> [ RET={ FULL | HDRS} ] [ ENVID=<envid> ] 214-2.0.0 RCPT TO: <recipient> [ NOTIFY={NEVER,SUCCESS,FAILURE,DELAY} ] 214-2.0.0 [ ORCPT=<recipient> ] 214-2.0.0 SMTP Delivery Status Notifications. 214-2.0.0 Descriptions: 214-2.0.0 RET Return either the full message or only headers. 214-2.0.0 ENVID Sender's "envelope identifier" for tracking. 214-2.0.0 NOTIFY When to send a DSN. Multiple options are OK, comma- 214-2.0.0 delimited. NEVER must appear by itself. 214-2.0.0 ORCPT Original recipient. 214 2.0.0 End of HELP info ehlo test.com //用 EHLO 指令打招呼,就可以使用進階指令,事實上進階指令有很多安全漏洞 250 mail.spps.tp.edu.tw Hello stu.spps.tp.edu.tw [192.57.1.6], pleased to meet you. mail from: spam@mail.spps.tp.edu.tw //嘗試假裝自己是本機使用者 250 2.1.0 spam@mail.spps.tp.edu.tw... Sender ok rcpt to: hp2013@ms8.hinet.net //能不能寄垃圾信到 hinet 550 5.7.1 hp2013@ms8.hinet.net... Relaying denied. Proper authentication required. //結果被拒絕了,跟上一次的測試不同的是,現在是要寄信出去所以當然會擋 RELAY,況且剛才嘗試登入也沒成功 quit 221 2.0.0 mail.spps.tp.edu.tw closing connection Connection closed by foreign host. procmail 濾信程式 procmail 是一支功能強大用途廣泛的濾信程式,當 sendmail 收到 給本機的信件進行分信時,會先處理 aliases 別名對應,處理完 aliases 後 procmail 就會被呼叫執行,procmail 將會根據比對規則進行信件標頭(Header)或信件內文(Body)的特徵比對,比對規則是採用正規表達式的形式,若比對成功則進行相對應的處理,包括:轉信給另一個帳號、轉存到檔案、轉給另一支程式處理......等等,其餘未符合條件之信件則繼續進行比對,直到所有比對規則比對完畢為止,最後比對未成功的信件,則會交由 sendmail 內建的 MDA 分信給收信人。系統預設的比對規則應該擺放於 /etc/procmailrc 檔案內,或者是 /etc/procmailrcs 資料夾內,這些規則在收到每一封信時都會被載入比對,接著 procmail 才會去讀取使用者自行建立在自己家目錄內的 .procmailrc 檔案,以便針對個人的信件進行比對,當然本文並不討論一般使用者運用 procmail 的範例,也不建議教使用者去利用這個功能,筆者建議濾信工作應該由系管師統一規劃實施。 底下介紹幾個範例來說明 procmail 的用法,更多的範例可以參考 http://www.iki.fi/era/procmail/links.html 網站的說明。procmailrc 的語法格式如下: :0<旗標>:<鎖定檔檔名> * <特殊比對字元> <正規表示式-1> * <特殊比對字元> <正規表示式-2> * <特殊比對字元> <正規表示式-N> <特殊處理字元><處理標的> 在說明語法涵義之前,先來看底下幾個例子,以便了解應用的方式與效果: :0: all_mail_stored.here 上面這個範例將會建立鎖定檔,建立鎖定檔可以保證信件寫入到 all_mail_stored.here 的同時,不會有其它程序存取此檔案,由於範例中未指定鎖定檔檔名,所以該檔名將由 procmail 自行命名,另外範例中省略比對演算,也就是說所有新收到的郵件都符合比對條件(無條件),都會進行進一步的處理,處理方式是將信儲存於 all_mail_stored.here 檔案中,處理過的信件將不會分信給收信人。事實上這個範例一旦執行,所有的信件都會被儲存於單一檔案中,沒有人會再收到信件。 :0c ! spy@some.where 與前一個範例不同的是,這個範例不會建立鎖定檔,同時由於使用旗標 c,因此比對成功後處理的是複製信,這個範例會將此伺服器所有收到的信件,轉寄給 spy@some.where 信箱,但收信人仍然可以正常收到信件,並無法得知信件被轉寄到其它地方以便檢查內容。 :0 * ^From: spammer@some.where /dev/null 這個範例不會建立鎖定檔,範例中有比對演算式,會比對寄信人是否為 spammer@some.where,若是則進行後續處理,處理方式是將信丟到黑洞裡,該信將會徹底消失! 底下逐一說明語法結構中每種參數的意義: | 旗標 | 決定比對生效的方式 | | A | 進行 and 比對,當上一次比對(沒有 A 或 a 旗標的那一次)比對成功的情形下才進行此次比對 | | a | 同上,但會先確認前一次的處理動作是否處理成功,若是才進行此次比對 | | B | 比對信件內文是否符合條件 | | b | 進行處理動作時,例如:轉寄給某人或轉存到檔案,是否要包含信件內文,預設要包含 | | c | 在處理比對之前,是否先複製一份,並比對複製的那一份,若比對成功時,則僅處理複製信,原始信件仍會繼續進行後續比對,或比對完畢後由 MDA 分信給收信人 | | D | 指定比對時要區分大小寫,預設值是不區分 | | E | 進行 else 比對,當上一次比對(沒有 E 或 e 旗標的那一次)比對不成功的情形下才進行此次比對 | | e | 同上,但會先確認前一次的處理動作是否處理失敗,若是才進行此次比對 | | f | 指定將 | 符號視為管道而非 OR | | H | 比對信件標頭是否符合條件 | | h | 進行處理動作時,例如:轉寄給某人或轉存到檔案,是否要包含信件標頭,預設要包含 | | w | 要求 procmail 進行下一個比對之前,先等待處理動作處理完畢,通常是用於呼叫外掛處理程式的情形下,這是為了避免該外掛程式未執行完畢卻被反覆啟動,造成 IO 衝突 | | 特殊比對字元 | 運用於正規表達式無法處理的比對場合 | | ! | 表示要做反向比對,比對不符合條件的信件 | | < | 比對信件大小是否小於指定 Bytes 數 | | > | 比對信件大小是否大於指定 Bytes 數 | | 正規表示法 | 請自行參考 regular expression 說明文件 | | 特殊處理字元 | 決定如何進行信件的處理,如果省略此字元,意思是要轉存到一個檔案裡 | | ! | 轉寄給某個指定的信箱 | | $ | 轉寄給某個預先設定好的變數其所指定的信箱 | | | | 轉交給其他程式處理(任何可執行的程式,例如:shell script、perl、二進位檔案......等等) | | {} | 進行巢狀處理,該信件將會被保留並繼續進行後續比對,詳細用法可參考底下 HTML 剖析範例的內容 | | 處理標的 | 檔名、信箱或外掛程式的名稱 |
formail 郵件產生器 這個工具是用來重新改寫信件標頭,或是用來產生信件內文,procmail 結合 formail 就可以用來寄發警告信、通知信或是用來設計自動回信機制,由於應用方式稍嫌複雜,在此課程中不介紹,請有興趣的學員自行研究。 過濾病毒信範例 早期利用病毒信的特徵,可以過濾一些簡單的病毒,隨著病毒不斷的衍生進化,病毒信已經沒有一定的特徵可供比對,這時候就只能透過附加檔案的延伸檔名來判斷該附加檔案是否可以執行,如果可以執行就會有傳播病毒的危險性,一律將它丟棄,這類的檔案包含:wsh、bat、exe、pif......等,但曾幾何時隨著微軟 MIME 偽裝的漏洞出現後,有許多可執行檔化身為圖形檔以躲避防毒軟體的過濾,而此類檔案卻會被微軟的 MIME 剖析器開啟執行,導致病毒氾濫。除此之外,更多的病毒檔案隱藏在 HTML 編碼中,在遠端伺機而動,等待使用者開啟郵件時自動下載執行,這類的病毒需要能剖析 HTML 語法的濾信程式才能過濾,幸運的是有個公益組織已經利用 procmail 的機制寫出可以剖析 HTML 的濾信演算法,推薦大家安裝使用,該站台網址為 http://www.impsec.org/ ,目前最新的版本為 1.318 請按這裡 procmail-sanitizer.tar.gz 下載。(下載石牌國小 PROCMAILRC) 啟用 procmail 日誌 請在 /etc/procmailrc 檔頭加入 LOGFILE="/var/log/procmail" 接著自己用 touch 指令建立該檔案,這樣就會啟用日誌功能,對於除錯很有幫助! 別名與郵寄群組 sendmail 檢查信件的收信人欄位,當發現收信人的網域名稱為本機網域時就會開始進行分信,所謂本機網域指的就是定義在 /etc/mail/local-host-names 中的網域名稱(舊版本使用 sendmail.cw),分信之前會先檢查 aliases 別名檔,看看是否有定義虛擬信箱,所謂虛擬信箱就是指不是給使用者使用的信箱,這些信箱多半是有特殊用途,例如:系統管理用的、郵寄群組用的......等等。也有人把 aliases 別名檔拿來作使用者全名的對應,例如:Shane.Lee 對應成 shane,雖然這也是一種應用的方式,但按照 sendmail 設計的原意,應該是使用 genericstable 去做這件事比較正確,兩者不同的地方在於:genericstable 在 ruleset 2 進行收信人欄位改寫時就直接處理了,不會等到分信時才處理,而且按照 aliases 的設計必須要能載入 include、呼叫執行 script,並且允許使用遞迴別名,這都會降低處理效能,如果只是單純要作全名對應使用 aliases 比較不划算! 當安裝 sendmail 時系統會自動幫我們產生 aliases 別名檔,同時會把系統上的服務帳號對應給 root,這是因為服務帳號是給應用程式使用的,當應用程式執行過程中遇到某些突發狀況時,或網路上的其他管理人員需要聯絡該應用程式的管理人時,有時候會寫信給這些帳號,透過 aliases 別名檔的作用,這些信件就會分到 root 的個人信箱以免沒人處理。但在實際環境中,為了避免 root 密碼在網路上傳輸遭到駭客竊取,不管是透過 outlook express 或是透過 web 介面,我們都不該去收取 root 的信件,而應該在 aliases 別名檔中將 root 的信件分給實際管理該機器的使用者,而且為了避免駭客查出誰是真正的管理員,這個檔案的權限應該設成 600。預設別名檔的內容節錄如下: # # Aliases in this file will NOT be expanded in the header from # Mail, but WILL be visible over networks or from /bin/mail. # # >>>>>>>>>> The program "newaliases" must be run after # >> NOTE >> this file is updated for any changes to # >>>>>>>>>> show through to sendmail. # # Basic system aliases -- these MUST be present. mailer-daemon: postmaster postmaster: root
# General redirections for pseudo accounts. bin: root daemon: root ============中間省略===================
# trap decode to catch security attacks decode: root
# Person who should get root's mail #root: marc <==請去掉 Remark 並改成自己的帳號 |
aliases 除了用來將虛擬信箱對應給真實的帳號外,還可以將信件儲存在備份檔案內,這樣做的目的是希望信件被收走後,能留一份在伺服器上備查,例如我們可以把上例解說過的那一行改為: root: shane,/var/log/backup-mail 除此之外,aliases 也可以用來轉寄信件,例如下面的設定會將信件轉寄出去,以便確定 shane 一定收得到: root: shane,shane@ms8.hinet.net,shane@tmtc.edu.tw,shane@tp.edu.tw 當要轉寄的信箱很多時,全部寫成一行還真是困難,譬如想寄同一封信給全校所有老師,但不想一個一個輸入收信人地址,透過 aliases 的幫助,我們只需要建立一個 teachers 虛擬信箱,接著準備一個空的純文字檔,把全校老師的信箱地址打進去,一個地址一行,最後得留一行空白行。檔案做好後,我們就可以將別名設定改成: teachers: ":include:/etc/mail/all_teachers.txt" 利用這個方式,想同時寄信給一群人再容易不過了。但是,當郵寄群組很多而且成員相互重疊時,想要維護郵寄清單的正確性就會很痛苦,好比除了全校教師外,我們另外還有各學年教師、科任教師、行政人員、主任等多個清單,學期末老師退休或學期初新進同仁加入,這麼多清單要同時檢查修改不能遺漏,這工作可累了!還好 aliases 提供了遞迴參照的功能,讓我們可以將清單分批建立,並以參照方式建立聯集,工作就輕鬆多了,例如: headship: lee (校長) director: suelan,wang,............(主任) manager: maggy,young,..........(組長) grade1: jack,mary,helen,........(一年級老師) grade2: vicky,johnny,,,,,,,......(二年級老師) ..........................................................(省略) course: sean,marc,.................(科任) administer: headship,director,manager(行政人員) teachers: administer,grade1,grade2,grade3,grade4,grade5,grade6,course(全校老師) 在更複雜的應用中,aliases 還可以結合外掛的程式提供更進階的服務,例如:郵件訂閱、自動回信系統(auto reply)、討論群組(mailing list)......等。例如: check: "| perl /usr/libexec/subscribe.cgi" 如果您想建立討論群組但不想花精神維護它,建議您安裝 smart list,這個套件雖然陽春但是非常簡易好用,它包含:信件訂閱、取消訂閱、討論文件索引備分、查詢討論清單與內容、自動清除遞送有問題之訂閱者......等等。如果您想讓使用者都能建立自己的討論群組,majordomo 是第一選擇,這個軟體不但使用者眾多,相關統計分析工具也已經開發得很完善,這些套件在 rpm 安裝時會自動修改 aliases 組態,需要手動修改的情況不多,因此不在此討論。 設定好 aliases 之後,必須以 newaliases 指令來雜湊該檔案以利 sendmail 讀取應用,由於 aliases 是隨用隨讀,因此並不需要重新啟動 sendmail 伺服器,它會立即生效。
|