電郵收發相關指令與設定
中小企業Mail Server實戰應用與觀念剖析(上)

2009-01-05
從本期開始,筆者將為各位讀者介紹中小企業如何設定與實作郵件伺服器,本文上篇先從單機Mail Server收發郵件開始談起,進而介紹使用客戶端收信相關的設定與調整,以及郵件安全相關的議題。
首先從最古早的單機電子郵件收發開始介紹,這其中主要是學習mail與mutt這兩個指令的常見使用方法與應用時機,現在就開始說明吧!  

單機Mail Server收發郵件  

這裡使用的郵件帳號與Linux使用者帳號相同,密碼也是使用Linux系統的密碼,預設的使用者收信匣則位於「/var/spool/mail/」目錄下,每個帳號擁有與帳號名稱相同的檔案,例如帳號foo擁有的inbox(收信匣)檔案在「/var/spool/mail/foo」。  

使用mail指令來寄信  

使用mail指令來寄信是一個相當精簡的寄信方法,例如要寄信給這台電腦的root帳號,使用「mail root」即可。隨後會出現「Subject:」(主旨)訊息,在此輸入主旨,然後按下,接著輸入內文。要結束內文輸入有兩個方法。第一個方法是在新的一行開頭只輸入一個「.」。

第二個方法則是在新的一行開頭按下。至於Cc:,指的是副本要寄給誰,若沒有的話,直接按下Enter。

TIPS
使用指令mail也可以寄給外部郵件帳號,例如執行指令「mail foo@gmail.com」可寄給Gmail的foo帳號。另外,整體環境須配合對方才收得到,像是確認這台Mail Server能夠寄出去,且對方(例如Google)的Mail Server也願意收信才行。

以mail指令收信  

直接輸入「mail」指令就可以收信。若在&符號模式下,輸入「?」,將會顯示簡單的說明。

除此之外,mail指令的使用方式還有:按下可用來讀取信件,透過按鍵可列出信件標題,指令「h 200」可列出200號附近的信件。而按鍵可用來刪除信件,除了一次刪除一封之外,也可以大量刪信,例如「d 12-18」刪除信件12到18封。若直接輸入「號碼」,則讀取此號碼的信件,例如123讀取信件123號內文。  

最後可利用按鍵離開&模式,已經讀取過的信件將會改放在家目錄下的mbox檔案,尚未讀取的信件依舊存放在「/var/spool/mail/$USER」。$USER指的是「使用者名稱」,例如root帳號對應「/var/spool/mail/root」檔案。若要重新讀取mbox信件的話,只要執行指令「mail -f mbox」即可。

在權限許可的情況下,可以利用mail搭配-f選項讀取其他帳號的信箱檔案,例如使用root執行指令「mail -f /var/spool/mail/foo」即可讀取foo帳號的信箱。  

寄信時使用已經存在的檔案當作內文
(搭配導向<符號)
 

剛才寄信輸入內文時,輸入第三行的時候,無法倒退回去修改第二行有錯誤的地方。要改善這種情況,建議使用檔案代替鍵盤當作標準輸入,先使用編 輯器撰寫文字檔案,再使用導向符號(<)將此檔案內容變成郵件的內文。  

例如指令「mail root < anaconda-ks.cfg」可將檔案anaconda-ks.cfg當成內文寄給root,但信件主旨是空的。若要加上信件主旨,可使用-s選項,例如「mail -s "test mail" root < anaconda-ks.cfg」(郵件主旨是「test mail」),如下圖所示。

將指令執行結果以通知信寄出
(搭配管線|符號)
 

遇到要將執行指令產生的結果,寄給某人做參考時,無須先行存檔再用上述方法寄送,可以直接利用管線|符號,例如指令「pstree | mail -s "pstree command" root」會將pstree指令執行結果,交給mail當作內文寄給root。

請特別注意,管線只處理標準輸出,不處理錯誤輸出。若是連錯誤輸出也要處理的話,可利用「2>&1」將錯誤輸出(代號2)重新導向到標準輸出(代號1)。若執行指令「pwdd | mail -s "pwdd command isn't exist" root」,但這封信件內文是空白時,螢幕上會提示出「Null message body; hope that's ok」訊息,原因是沒有pwdd這個指令,產生的錯誤會輸出在螢幕上,螢幕上將顯示「-bash: pwdd: command not found」訊息。而指令「pwdd 2>&1 | mail -s "pwdd command isn't exist" root」(加上了「2>&1」)會讓信件變成有內文,內文是pwdd指令的錯誤訊息。

以指令寄信夾帶附加檔案
(使用mutt的-a選項
)  

遇到命令模式寄信需要夾帶附加檔案時,使用指令mutt會比mail來得方便,例如執行指令「mutt -a anaconda-ks.cfg root」即可夾帶anaconda-ks.cfg附加檔案。mutt用起來會比mail人性化些,編輯內文預設是使用vi(所以編輯完畢須按下然後輸入「:wq」存檔離開),最後按下Y即可寄出。

mutt有一個-x選項,使得mutt寄信類似mail模式(simulate the mailx send mode),應用在批次寄送信件相當方便。千萬別小看這些指令寄信的方法,撰寫shell scripts搭配會員名單來寄送會員信件,或是自動寄送通知信可是很方便的!  

以mutt指令收信  

直接輸入「mutt」指令就可以收信,在畫面上方有一行常用按鍵與其功能,例如按下按鍵離開、按下按鍵刪除信件等等,以及輸入「?」可尋求使用說明。

mutt類似mail,也支援-f選項指到某個郵件檔案(權限足夠即可讀取),例如執行指令「mutt -f /var/spool/mail/foo」可讀取foo信件(foo帳號須建立亦可寄一封測試信件給他)。

NOTE
mutt支援pop、imap、pops與imaps等等通訊協定收信(功能類似一般的圖形介面郵件收發軟體)也是利用-f選項來達成,稍後會在架設好相關服務時介紹。

收信時的Client/Server設定  

現在的郵件使用者傾向使用Web-Based介面或圖形介面客戶端來收發電子郵件,使用圖形介面客戶端通常藉由POP3或IMAP通訊協定讀取Server上的信件,因此Server要先開啟相關的服務才行,這個服務是「dovecot」。  

dovecot基本操作與聆聽埠號  

dovecot預設未安裝,使用指令「yum install -y dovecot」就可以安裝好(yum在RHEL5要先設定正常才行,請參考筆者相關文件)。若使用指令「grep -Ew "pop3|imap|pop3s|imaps" /etc/services」則能夠觀察出底下這四個通訊協定使用的埠號(有s是加密的通訊方式,代表over SSL之意)。

pop3 110/tcp POP version 3
imap 143/tcp Interim Mail Access Proto v2
imaps 993/tcp IMAP over SSL
pop3s 995/tcp POP-3 over SSL

在使用指令「/etc/init.d/dovecot restart」啟動的前後(首次停用的FAILED不影響設定),利用指令「netstat -na | grep -Ew "110|143|99[35]"」可觀察dovecot預設就是聆聽這四個埠。隨後使用指令「chkconfig dovecot on」設定下次開機自動啟動。

TIPS
也可以使用指令「netstat -nltp | grep -w dovecot」,其中netstat的l(小寫的L)選項是顯示LISTEN、t是tcp、p是程式名稱,也就是因為改成顯示程式名稱,所以後面grep的關鍵字變成「dovecot」。

設定防火牆時,記得開啟這四個埠並指定為tcp通訊協定,以下是使用指令「system-config-securitylevel」開啟防火牆設定的畫面。

點圖放大

客戶端測試連線(使用mutt指令)  

在另一台電腦(也就是Client端)使用mutt測試方法如下:  

先執行指令「mutt -f pop://172.18.0.108/」,接著輸入Mail Server的帳號密碼,即可以POP3方式收信,其中172.18.0.108是Server的IP位址,也可以使用主機名稱(須正確解析成Server IP位址)。  

收信時不能以root來收,須使用一般帳號,例如使用foo帳號來登入收信並輸入正確的密碼。請注意,使用者密碼必須先在Server上設定完成(例如在Server上使用指令「passwd foo」)。  

除了pop(這就是POP3)通訊之外,mutt也支援imap、pops和imaps等等通訊方式。例如,可執行指令「mutt -f imaps://172.18.0.108/」以IMAP over SSL的方式來收信。

NOTE
執行指令「mutt –f」時若使用pop3、pop3s(多了3)這兩個通訊將會失敗,並顯示錯誤訊息「No such file or directory (errno = 2)」。

如果懶得每次都輸入帳號密碼,可以加在指令列中。以郵件帳號foo、密碼f為例,使用指令「mutt -f pop://foo@172.18.0.108/」指明收件帳號foo,以及透過指令「mutt -f pop://foo:f@172.18.0.108/」指明收件帳號foo且密碼為f。

NOTE
上述使用方法類似http、ftp擁有URI(Uniform Resource Identifier)的表示方式,如「ftp://username:password@hostname/」。

實際使用mutt當作郵件客戶端的時候,若DNS也都解析正確,就會採用「主機名稱」而不使用IP來連線,不過要小心以下常見的誤解:  

指令「mutt -f pop://foo@mail.foo.com.tw/」中的「mail.foo.com.tw」會解析成郵件主機IP位址即可連線(正確的使用方法)。  

而指令「mutt -f pop://foo@foo.com.tw/」很容易將「foo@foo.com.tw」誤解成E-mail帳號。實際上,「foo.com.tw」同樣須解析出其IP位址才可以連線(例如foo.com.tw有一個A紀錄指向郵件主機IP)。若沒辦法解析,就會導致連線失敗。  

圖形介面客戶端thunderbird相關設定  

在GUI客戶端郵件軟體thunderbird中,有關收信的設定畫面如下所示:  

收信伺服器類型有POP或IMAP可供二選一,下方輸入「收信伺服器」主機名稱或IP位址,實務上通常都是使用主機名稱居多,如mail.foo.com.tw。

而收信使用者名稱則輸入在下一個頁面,如foo。

圖形介面客戶端evolution相關設定  

在功能更強大的GUI客戶端郵件軟體evolution收信設定中,收信的伺服器類型支援POP、IMAP以及其他更多種類。

下圖是選擇IMAP收信伺服器類型後,組態輸入收信伺服器主機名稱或IP位址(如mail.foo.com.tw),以及收信使用者名稱,例如foo。

客戶端telnet測試POP3服務  

遇到使用mutt或圖形介面軟體測試並未得到該有的結果,或是連線無法建立的時候,建議使用telnet指令來測試Server端有無反應,或者測試驗證是否成功。  

例如,使用指令「telnet 172.18.0.108 110」針對Server IP是172.18.0.108的110埠(POP3預設使用110 port)進行連線測試。回應的如果是「No route to host」也許是被Server防火牆擋住,此刻在Server上使用指令「system-config-securitylevel」設定開放即可。如果回應為「Connection refused」,也許是dovecot服務尚未啟動,則在Server上執行指令「/etc/init.d/dovecot restart」重新啟動。  

正常的回應應該是「+OK Dovecot ready.」,就可輸入POP3指令「user foo」(使用帳號foo)、「pass f」(密碼是f)來測試登入。若登入成功,可使用指令「list」列出Server上的信件,以及執行「quit」指令結束POP3連線。

客戶端telnet測試IMAP服務  

欲使用telnet測試IMAP連線與POP3相當類似。例如使用指令「telnet 172.18.0.108 imap」針對Server IP為172.18.0.108的IMAP埠(IMAP預設使用143 port)進行連線測試。若正常的回應是「* OK Dovecot ready.」,則輸入IMAP指令「. login foo f」(使用帳號foo、密碼f)測試登入、以及「. logout」指令來結束IMAP連線。

NOTE
telnet指令第二個參數採用埠號(如110)或是通訊協定名稱(如imap)皆可。名稱會被轉成埠號,是因為在「/etc/services」裡面有定義「通訊協定名稱預設所使用的埠號」。

遇到telnet連線後卻無法斷線的窘境時(可能是突然忘記如何下結束連線指令時)可使用(按住之後按下右邊的中括號按鍵)再輸入「quit」即可。

NOTE
telnet指令執行後顯示訊息「Escape character is '^]'」,其中^是「Ctrl」之意,合起來就是

郵件帳號建立與通訊安全  

此時登入郵件伺服器所使用的帳號密碼,同時也就是Linux系統的帳號密碼,這意味著使用此組帳號密碼不僅僅能夠收信,還可以ssh或telnet到主機上執行系統指令。  

開放登入執行系統指令,會使得主機安全受到很大的威脅,為了防止郵件帳號使用Linux指令介面,強烈建議將介殼(shell)由原先「/bin/bash」改成「/sbin/nologin」。  

使用chsh指令修改介殼  

使用指令「chsh foo」即可修改foo帳號的介殼,接著輸入「/sbin/nologin」即可。可試試更改介殼之後的差異,使用指令「ssh foo@172.18.0.108」登入後,雖然密碼正確認證成功,但無法執行系統指令,會出現「This account is currently not available.」訊息並結束連線。上述修改以不影響原先的收信功能為原則。

使用vipw指令修改介殼  

「vipw」指令顧名思義是使用vi編輯「/etc/passwd」之意,系統預設值使用「/etc/passwd」當作使用者資訊,檔案內容會記載使用者到底採用了哪一個介殼。舉例來說,可以利用指令「finger foo」觀察使用者foo的介殼是哪一個,介殼通常是「bin/bash」不然就是「/sbin/nologin」,其他種類的介殼就比較少用。  

使用指令「grep foo /etc/passwd」可過濾出與foo相關的那幾行,以底下的例子來看,會發現「foo:x:500:500::/home/foo:/sbin/nologin」這一行,使用vipw就是更改這行的最後一個欄位(欄位是以冒號:做為分隔符號),這欄位是用來定義使用者所用的介殼。若是將foo的介殼改回「/bin/bash」,又可以登入鍵入指令了。

建立郵件帳號時順便設定介殼為/sbin/nologin  

可以利用useradd指令的-s選項指明使用者的介殼,例如執行指令「useradd -s /sbin/nologin foo2」可以建立帳號foo2,並將介殼設定成「/sbin/nologin」。

POP3與IMAP通訊時的資安考量  

預設的POP3與IMAP都是採用明碼傳輸,有心人士想要擷取封包觀看內容來探取郵件帳號密碼非常容易,底下是以軟體wireshark來抓取POP3封包的情形。wireshark前身即是ethereal;另外還有一個tcpdump,也是指令模式下知名的(老字號的)封包擷取軟體。

由於wireshark預設不會安裝,所以使用指令「yum install -y wireshark」進行安裝。安裝好了之後,使用指令「tshark -R 'tcp.port eq 110'」針對TCP埠號110的封包進行觀察。  

由下圖可以看到先前介紹的POP3指令「USER foo」、「PASS f」以及「+OK Logged in.」登入成功的訊息,這樣就「擷取」到別人的郵件帳號和密碼了。

NOTE
封包必須是從被執行tshark的這台主機上取得才能分析。

Wireshark也有提供GUI介面,執行指令「yum install -y wireshark-gnome」補裝套件之後,執行「wireshark」就會出現如下的圖形介面。

結語  

介紹wireshark並不是為了要取得別人的帳號密碼,而是建議收信時一定要由原先明碼方式改用加密連線,這樣比較安全。承接本文,下期的文章將會繼續介紹更進階的內容。  

作者註:

前期「中小企業DNS Server安全防護實作」一文中,第86頁提到在執行指令「yum list | grep bind」後,會看到一個名為「bind-chroot」套件,它能夠提升DNS Server的安全性。接著,就使用指令「yum install -y bind」將其裝起來吧!此處的指令應為「yum install -y bind-Chroot」。

另第88頁中,設定開不開放recursion,可透過「allow-recursion」(類似allow-transfer格式)或「recursion yes」(或是no)來進行。例如,編輯named.conf加入「recursion no; };」後,即可關閉recursion功能。此處應為加入「recursion no;」後,特此更正。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!