中小企業 Mail Server 實戰應用與觀念剖析(特)

作者:徐秉義(Albert Hsu)

本文上篇先從單機 Mail Server 收發郵件開始談起,進而提到使用客戶端收信相關的設定與調整,以及郵件安全相關的議題。

本文中篇接著從 Mail Server 之間遞送信件開始介紹,以及 sendmail 設定、郵件 RELAY 概念等等。

本文下篇接著從圖形收發郵件軟體 evolution 開始介紹、談到該如何設定 yum 使用副廠 evolution 套件、郵件通訊協定 POP 與 IMAP 的特性差異、郵件伺服端帳號別名功能、郵件伺服器 RELAY 設定等等。

本文特篇接著從認證後寄信功能開始談起,並提及一些實務上較常更改的設定,像是 ~/.forward 檔案撰寫、控制 dovecot 提供的服務、Smart Host 設定以及 openwebmail 的建置等等,仍按照先前實做的測試環境,簡介如下:

 

A主機172.18.0.191郵件伺服端,接收寄給『郵件帳號@foo2.com.tw』信件
B主機172.18.0.108郵件伺服端,接收寄給『郵件帳號@foo.com.tw』信件  
C主機172.18.0.176郵件客戶端,使用 evolution 新增郵件帳號測試收發信件

認證後寄信功能

在本文下篇曾提到郵件伺服器 RELAY 設定,主要是以發信的客戶端來源 IP 來作鎖定,這種鎖定方式適合用在來源主機是固定 IP 或是固定於某個 IP 區段的方式;遇到使用者在不固定 IP 的地點發送郵件(比如說出差在外)或是使用 3G 上網等等,這種來源 IP 不固定卻要用我們的伺服器來寄信時,我們就很難利用先前介紹的鎖定來源 IP 設定來解決不能寄信的問題。

此時建議使用『認證後寄信』來解決這個問題,也就是寄信時需要帳號密碼認證,我們先來看看郵件客戶端程式 evolution 有關認證後寄信的設定畫面。

在 evolution 啟用認證後寄信功能

在新增 evolution 郵件帳號精靈『傳送電子郵件』頁面,伺服器組態下方有個『伺服器要求驗證』選項(預設是打勾的),勾選代表啟用認證後寄信功能。

r

在 sendmail 啟用認證後寄信功能

我們將會在B主機實做認證後寄信功能,首先要讓 sendmail 啟用此功能的設定方法如下:

使用指令「cd /etc/mail/」切換目錄到 /etc/mail/ 下,接著編輯 sendmail.mc 檔案。

在 sendmail.mc 檔案內容尋找 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

r

改好之後接著執行「make」、「make restart」使設定生效(請注意要位於 /etc/mail/ 目錄下)。

r

啟用 saslauthd 並設定開機自動啟動

在剛才 sendmail.mc 檔案註解說明中,有此行附註
『Please remember that saslauthd needs to be running for AUTH.』
(此行位於圖中央的方框標示之上)

意思是『若要認證後寄信功能正常,請記得要啟動 saslauthd 這個服務』。

於是使用指令「/etc/init.d/saslauthd restart」重新啟動 saslauthd 服務(初次停用的 FAILED 不影響設定)

使用指令「chkconfig saslauthd on」設定開機自動啟動此服務。

r

指令測試認證後寄信功能

使用指令「telnet mail.foo.com.tw 25」連線到主機的 25 埠

輸入郵件通訊指令「EHLO localhost」

回應的訊息內有『250-AUTH LOGIN PLAIN』應該就是有啟用認證後寄信功能。

輸入「QUIT」離開郵件通訊的指令介面。

r

使用 evolution 測試認證後寄信功能

使用 evolution 測試認證後寄信時,就會跳出輸入 SMTP 密碼的畫面,認證成功後就可以寄信。

r

關於 sendmail 的 Log Level 提高

開啟認證後寄信的功能以後,意味著只要擁有一組能夠認證的帳號密碼,我們就可以發送信件,若是放任使用者將密碼設定成很簡單的時候,就有可能會被有心人士猜對,猜對之後這台郵件伺服器就會淪為垃圾信、病毒信、廣告信的發送站,此時需要把 sendmail 紀錄等級(Log Level)拉高,才看的到是用那一組帳號密碼認證後寄信的。

溫馨提示:強迫使用者將密碼設定的複雜些,可提高主機的安全性。

以下是將 Log Level 由原先的 9 拉高至 14 的範例。

使用指令「cd /etc/mail/」切換目錄到 /etc/mail/ 下,接著編輯 sendmail.mc 檔案。

在 sendmail.mc 檔案內容尋找 LOG_LEVEL 關鍵字會找到紀錄等級相關內容如下圖,請將 LOG_LEVEL 由原先的 9 改成 14。

r

改好之後接著執行「make」、「make restart」使設定生效(請注意要位於 /etc/mail/ 目錄下)。

r

Log Level 提高後的 maillog 觀察

提高 Log Level 以後,測試認證後寄信功能,接著在 maillog(位於 /var/log/ 目錄下)檔案中搜尋『authid』關鍵字,就可以找到是哪個帳號認證後寄信。

下圖是使用 less 觀察 maillog 範例,請注意圖中黑點附近(圖中三點鐘方向),寫著 authid=foo 就是使用 foo 帳號來認證後寄信的紀錄。

r

使用者自訂郵件轉遞

使用者如果想要把信件轉遞(forward)給別的帳號時,只要在自己的家目錄下,產生一個名為 .forward 檔案,這是一個以點開頭的隱藏檔案,我們以B主機上的 foo3 帳號填寫內容範例如下:

foo
foo@foo2.com.tw
\foo3

第一行 foo 是指轉遞給這台主機 foo 帳號。

第二行 foo@foo2.com.tw 是指轉遞給 foo@foo2.com.tw 帳號。

第三行 \foo3 是保留一份郵件備份在這個 foo3 帳號(所以在帳號前面要加上 \ 反斜線)。

實際操作可能遇到的問題

下圖是實際操作的情況,在B主機建立帳號 foo3 後,使用帳號 foo3 來建立 .forward 檔案,檔案內容如同先前所述,並寄送一封測試信給自己。

指令「useradd foo3」新增帳號 foo3(此時預設的介殼是 /bin/bash)

指令「su - foo3」切換身份成 foo3(介殼是 /bin/bash 才可以登入到下指令的介面)

指令「vim .forward」編輯 .forward 檔案內容。

指令「mail foo3」寄送自我測試信件。

溫馨提示:如果介殼是 /sbin/nologin 的話,就不能使用 bash 指令方式存取,此時 .forward 檔案可能要使用其他方式傳上來(或是用 root 權限撰寫後,再更改檔案的擁有者、群組以及權限),上傳至伺服器的方式像是 ftp、nfs 或 samba 等等。

r

maillog 觀察

寄送完畢之後並未如預期的轉遞信件,於是觀察 maillog 發現,有個『/home/foo3/.forward: Group writable file』訊息。

r

.forward 檔案的權限建議值

使用指令「ls -l .forward」觀察此檔案的權限是 rw-rw-r--(數字表示法為 664)所以這個檔案開放群組權限能讀寫其內容。

既然 sendmail 指出群組寫入 .forward 檔案似乎權限開啟過大,使用指令「chmod g-w .forward」將群組寫入的權限拿掉。

二度觀察 .forward 檔案權限,更改之後為 rw-r--r--(數字表示法為 644)同群組的就只能唯讀了。

再度自我測試寄信,這次就正常轉遞了。

r

umask 指令與『檔案/目錄產生的預設權限』有關

下圖先使用 root 身份,使用指令 umask 觀察數值 0022,指令 touch 產生檔案、指令 mkdir 製作目錄並使用 ls 配合 -ld 選項觀察其權限;

接著使用指令「su - foo」切換身分成 foo,在 Red Hat 系統使用者帳號的 umask 值預設是 0002,產生檔案與目錄並觀察其權限;

再來使用指令「umask 0027」將值設定成 0027,產生檔案與目錄並觀察其權限;

最後二度使用 foo 登入,umask 值恢復成預設的 0002,意思是暫時的變更 umask 值,不影響下次登入情況(除非將設定寫入 bash 初始化執行的檔案)。

r

三種 umask 數值範例只看後三位數比較簡單易懂,分別是 022、002、027 其建立檔案與目錄的預設權限,整理如下表:

 

umask 數值檔案的權限目錄的權限
022(0022)-rw-r--r--(644)drwxr-xr-x(755)
002(0002)-rw-rw-r--(664)drwxrwxr-x(775)
027(0027)-rw-r-----(640)drwxr-x---(750)

umask 的 mask 有「面具」、「遮蔽」之意,其數值一一拆開來看常用的有三種,分別是 0 不遮(開放完整存取權限)、2 遮住寫入的 w(意味著唯讀)、7 完全遮住(完全不開放存取),其他的數值(1 3 4 5 6)不是不能用,而是比較少用到,詳細的 umask 基礎以及運算法則請參考網中人的文章,網址 http://www.study-area.org/linux/system/linux_fs.htm 關於 umask 那一段的敘述。

溫馨提示:基礎懂得更多就會將 Linux 用的更好。

r

控制 dovecot 提供的服務

在本文上篇提到 dovecot 預設提供四個服務,若是有需要控制四個服務是否開啟或關閉的話,則是設定 /etc/dovcot.conf 關於『protocols = imap imaps pop3 pop3s』那一行。

例如說僅僅開放加密連線的收信方式,也就是將檔案內的註解拿掉以後,修改成『protocols = imaps pop3s』接著重新啟動 dovecot 即可。

r

Smart Host 設定

遇到伺服器希望將外寄的信件,交由另一台主機幫忙送信時,可以調整 sendmail.mc 檔案關於 SMART_HOST 的設定來完成。

溫馨提示:另一台主機若有需要開放 RELAY 的話,就按照先前介紹過的設定方法即可。

下圖是編輯 sendmail.mc 檔案的快照,複製原本那行『dnl define(`SMART_HOST', `smtp.your.provider')dnl』並取消開頭的 dnl 註解以後改寫成『define(`SMART_HOST', `mail.foo2.com.tw')dnl』這樣外寄的信件就都會送往 mail.foo2.com.tw 主機。

記得要在 /etc/mail/ 目錄下,執行 make 與 make restart 使設定生效。

r

建置 openwebmail

openwebmail 是網頁介面(Web-Based)郵件收發軟體,裝好之後我們就可以透過網頁瀏覽器收發電子郵件。

筆者是到 openwebmail 站台的 Download 連結找到這個 readme.txt 照著說明的方式所作。

連結的網址是 http://openwebmail.org/openwebmail/download/redhat/rpm/packages/rhel5/readme.txt 主要是利用新增一個 yum client 設定檔案 /etc/yum.repos.d/openwebmail.repo 來使用 yum 安裝 openwebmail 簡介如下:

openwebmail 安裝

使用指令「cd /etc/yum.repos.d/」切換目錄到 /etc/yum.repos.d/ 底下。

使用指令「lftpget http://openwebmail.org/openwebmail/download/redhat/rpm/release/openwebmail.repo」將 openwebmail.repo 檔案抓回來並放到 /etc/yum.repos.d/ 目錄下。

使用指令「yum install -y openwebmail」安裝 openwebmail。

筆者遇到缺少相依套件的狀況是先自行下載 perl-Text-Iconv 套件並安裝。

下載給 RHEL5 用的 perl-Text-Iconv 套件檔案 perl-Text-Iconv-1.7-2.el5.i386.rpm 位於 http://openwebmail.org/openwebmail/download/redhat/rpm/packages/rhel5/perl-Text-Iconv/perl-Text-Iconv-1.7-2.el5.i386.rpm(可以用 wget 來抓)

使用指令「rpm -ivh perl-Text-Iconv-1.7-2.el5.i386.rpm」將 perl-Text-Iconv 套件裝起來。

r

openwebmail 初始化

使用指令「/var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init」初始化 openwebmail。

存取郵件主機『http://localhost.localdomain/cgi-bin/openwebmail/openwebmail.pl』或『http://localhost.localdomain/webmail』都可以。

若是名稱解析正確無誤的話,我們就可以將 localhost.localdomain 替換成正確的主機名稱或 IP 位址,例如:mail.foo.com.tw。

若是 httpd 還沒安裝、沒啟動,使用指令「yum install -y httpd」安裝;「/etc/init.d/httpd restart」重新啟動;「chkconfig httpd on」設定 httpd 開機自動啟動。

防火牆的部份需要開啟 80 埠是在所難免的,至於 SELinux 在 openwebmail 的 readme.txt 寫說要關掉(permissive 或 disabled 都可以)!

要處理防火牆以及 SELinux 都可以使用指令「system-config-securitylevel」來完成。

若只是要暫時關掉 SELinux 來測試 openwebmail 的話,使用指令「setenforce 0」即可。

r

圖為 openwebmail 登入畫面,請使用一般帳號登入(例如:foo)

r

 

Valid XHTML 1.0! Valid CSS! Get Firefox

Creative Commons License
This site is licensed under a Creative Commons Attribution 2.5 Taiwan License.