顯示具有 「郵件服務 專區」 標籤的文章。 顯示所有文章
顯示具有 「郵件服務 專區」 標籤的文章。 顯示所有文章

2014-07-17

郵件的傳送流程、MUA、MTA、MDA

郵件的傳送流程、MUA、MTA、MDA


先說明什麼是MUA,MTA與MDA,然後說明信件的傳送流程。

MUA(Mail User Agent):顧名思義,MUA就是“郵件用戶代理”。舉個例子,Windows裏的OutLook Express、Netscape裏的mail功能與KDE裏的Kmail都是MUA。MUA主要的功能就是接收郵件主機的電子郵件,並提供用戶瀏覽與編寫郵件的功能。 MTA(Mail Transfer Agent):MUA是用在Client端的軟件,而MTA是用在郵件主機上的軟件,它也是主要的郵件服務器。MTA就是“郵件傳送代理”的意思,既然是 “傳送代理”,那麼用戶寄信與收信時,都找MTA就對了 MDA(Mail Delivery Agent):“郵件投遞代理”主要的功能就是將MTA接收的信件依照信件的流向(送到哪裏)將該信件放置到本機賬戶下的郵件文件中(收件箱),或者再經由MTA將信件送到下個MTA。了解了MUA,MTA與MDA之後,下面說說如何將信寄出去。可以分爲幾個步驟。

Step 1 用戶利用MUA寄信到MTA。通常我們使用MUA(例如Outlook express)寫信時,要寫明幾個項:
發信人與發信網站:必須有這個信息。發信網站就是下面Step 2接收信件的那個MTA;
收信人與收信網站:以account@e-mail.server 的形式給出,其中,account就是該e-mail.server裏的賬號。      在圖20-1左上角的那臺機器上,也就是“本地客戶端使用的電腦”,利用MUA功能(如Outlook express)寫好信之後,按下MUA的“發送”按鈕,MUA就會依據你所定義的主機地址將信發送到MTA上。

Step 2      MTA收到信件,交由MDA發送到該賬號的MailBox中。如果在Step 1收到的信件中,那個e-mail.server就是MTA自己,此時MTA會將該信件交由MDA處理,將信件放置在收信者的信箱中。

Step 3      MTA將信再轉送出去。如果由Step 1發來的信件的收件人並不是MTA的內部賬號,那麼該信將被再次轉送出去!Step 1及Step 3的動作,我們也稱爲Relay(郵件轉發)功能。

Step 4      遠程MTA收到本地MTA發出的郵件。遠程MTA會收到我們這臺MTA的信件,並將該信件交給它的MDA處理(Step 5),此時,信件會存放在遠程MTA上,等待用戶登錄讀取或下載。
整個發信流程大致就是這樣。
  收信的動作很簡單。不再接受。


郵件在傳輸的時候會使用到 MUA,MTA,MDA這三個角色。他們分別是:

MUA:Mail User Agent ,郵件用戶代理。客戶端用到的軟件,如 mutt,thunderbird,outlook等。

MTA:Mail Transport Agent,郵件傳輸代理。服務器端用的軟件,如 msmtp,postfix,sendmail等。

MDA:Mail Delivery Agent,郵件投遞代理。服務器處理郵件的軟件,有分揀、過濾 的功能,postfix、sendmail都自帶有,也有獨立的procmail。

2013-10-04

Postfix 三十天就上手 (全)

Postfix 三十天就上手


經過了上篇  安裝 Postfix 之後,相信很多讀者對於 Posetfix 設定上有很多疑惑,所以此篇特別整理了 Postfix 的基礎概念與設定技巧,加強讀者在管理 Postfix 時能夠更有效的管理維運。


Postfix 三十天就上手-Day 01 Postfix 是什麼

要學 Postfix 之前,當然是要先知道什麼是 Postfix ,本篇文章,會先對 Postfix 作間單的介紹讓大家知道 Postfix 是什麼,它有哪些功能,以及如何運用它。

Postfix 的用途是『郵件伺服器』,以前大家比較熟悉的可能是『 Sendmail 伺服器』,這個 Postfix 與 sendmail 是類似的東西,那就是『MTA』啦,既然都是 MTA ,這個 Postfix 最早之前的用途也是想要用來『取代 sendmail 』。

Postfix 是由 Wietse Zweitze Venema ( http://www.porcupine.org/wietse/ ) 所發展的。sendmail 雖然很好用,但是安全性卻不足,尤其效能上是最大的困擾。

Venema 博士就在 1998 年利用他老大在 IBM 公司第一個休假年進行一個計畫:『設計一個可以取代 sendmail 的軟體套件,可以提供網站管理員一個更快速、更安全、而且"完全相容"於 sendmail 的 mail server 軟體!』

Venema 博士也在 1998 年首次釋出這個自行發展的郵件伺服器,並定名為 VMailer。不過為了避免註冊的商標很類似,引起一些註冊上面的困擾。所以 Venema 博士就將名稱改為 Postfix !這個 Postfix 有『在什麼什麼之後修正』的意思(大改就是在 sendmail 之後修正所以這樣取名吧)。

Postfix 改善了 sendmail 安全性上面的問題,改良了 mail server 的工作效率,更由於其設定檔完全為 ASCII 碼,且設定內容都是『人類看的懂得語言!』因此,你可以輕易的由 sendmail 改良到 Postfix 上面!


Postfix 三十天就上手-Day 02 名詞解釋 MUA MTA MDA

MUA ( Mail User Agent ):顧名思義, MUA 就是『郵件使用者代理人』,
您如果需要收發郵件,除了現在流行的 webmail ,一般您會需要使用 mail 的收發軟體(也有人人喜歡叫他 mail client ) 這個幫您進行郵件收發工作的東西,就是MUA ( Mail User Agent ) Client 端的用戶都需要透過各個作業系統提供的 MUA 才能夠使用郵件系統。

舉個例子來說, Windows XP 裡面的 OutLook Express 或是 Microsoft Office裡的 Outlook,還有免費又好用的 Thunderbird ( http://www.mozilla.org/en-US/thunderbird/ )
都是 MUA 的一種!

MUA 主要的功能就是收受郵件主機的電子郵件,以及提供使用者瀏覽與編寫郵件的功能!

MTA ( Mail Transfer Agent ) : 顧名思義, MTA 就是『郵件傳送代理人』,它要負責幫使用者傳送郵件,當MUA要收送信件的時候,就需要先找 MTA 連絡一下。

MTA 的基本功能如下:

1.接收外部主機寄來的郵件
2.幫使用者傳送 ( 寄出 ) 郵件
3.提供使用者接收自己的郵信

通常我們所說的 Mail server ( 郵件伺服器 ) 就是指 MTA

MDA ( Mail Delivery Agent ) : 顧名思義,MDA 就是『郵件遞送代理人』,主要的功能就是將 MTA 所收受的信件,依照信件的 Flow ( 送到哪裡去 ) 來將該信件進行放置到本機帳戶下的郵件信箱中 ( Mailbox ),或者是再經由 MTA 將這個信件送到下個
MTA 去。

今天您已大致了解郵件傳送中,常會用到的名詞,明天將會為您解是郵件是如何傳送。


Postfix 三十天就上手-Day 03 郵件如何傳送

該知道的名詞知道了之後,接下來我們就來看郵件如何傳送。

上一篇說明了 MUA、MTA 跟 MDA,知道了這些名詞之後,接下來想知道郵件傳送流程也就不困難了。

MUA 您就把它想成是要寫信的人
MTA 您就把它想成是郵局吧。
MDA 您就把它想成是郵差吧。

平常如果要些封信給朋友,寫完通常要送給郵局,郵局會先送交給離目的地最近的郵局,最後再送給您的朋友。

以上幾句就說明郵件傳送奧義,對應到電子郵件傳送流程如下。

  1. 使用者利用 MUA 寄信到 MTA -->我們寄信到郵局去。
  2. MTA 轉送到目的帳號所屬的 MTA--> 郵局作業都是先送到離目的地最近的郵局(所以寫郵遞區號才會快),此段就像是 MTA 對 MTA 的郵件 relay。
  3. MTA 收到自己的信件,交由 MDA 發送到該帳號( 如果此信件的目的地屬於該郵局,則交給郵差發送到收件者的信箱)

Postfix 三十天就上手-Day 04 設定檔結構說明

在要進行 Postfix 設定之前,第一步當然就是先了解設定檔的結構,這樣您設定起來才會快速又正確。

以 CentOS 為例來說,Postfix 的設定檔預設位置在 /etc/postfix 裡面,主要的設定檔案如下:

/etc/postfix/main.cf
從這個檔名您大概就可以猜到,這個設定檔就是 postfix 最主要的內容,這個檔案本身基本上就是一個簡單的 postfix 說明文檔。

/etc/postfix/master.cf
此檔案規範了 postfix 中,process 運作的參數,從檔名您就知道他是老大囉,您就是透過它來告訴 process 做事方法囉!

/etc/postfix/access
當您需要對某些伺服器 ( Hostname or IP ) 作 relay 或者是 deny ,需要使用的檔案。不過這是預設的位置,複雜的郵件伺服器設定大多會配合管理者的習慣,在 main.cf 中指定檔案。

/etc/postfix/aliases
此檔案就是讓您設定別名,與 naccess 一樣這是預設的位置,複雜的郵件伺服器設定大多會配合管理者的習慣,在 main.cf 中指定檔案。


Postfix 三十天就上手-Day 05 佇列 (Queue)

了解Postfix 的佇列可以幫助您判斷郵件目前的狀態。

您可以由上一篇中介紹的 main.cf 檔案中,找到 queue_directory 的參數,此參數會指定佇列存放的目錄,預設值是設定在 /var/spool/postfix 。

每一個佇列都擁有一個子目錄,停留在該佇列的郵件都會存在該子目錄下,存在哪個佇列也就代表著目前該郵件的狀態。

佇列說明如下:

incoming
新進的郵件都會送進去 incoming 的佇列 ,postfix 會掃描 incoming 的佇列,並將郵件移往active的佇列。

maildrop
postfix允許沒有權限的 sendmail 程式將郵件放到 maildrop 的佇列中。就算 postfix 目前沒有運作您也可以直接將郵件放入,postfix 一啟動就會到 maildrop 進行檢查。

deferred
當有部分收件者無法收件,且可收件的人員都已送達時,就會將郵件放入 deferred 的佇列。

active
當郵件準備要傳送時,就會進入到 active 的佇列。

hold
放到 hold 的佇列的郵件,不會被週期性的傳送,並等待系統管理者來手動處理,如果郵件在停留在此佇列超過 maximal_queue_lifetime 參數所設定的時間,就會被退回給寄件者。

corrupt
如果有損回的佇列檔就會被放到 corrupt 的佇列,等待系統管理者處理。
以上了解了 postfix 的佇列之後,您就可以依照的佇列判斷目前郵件的狀態


Postfix 三十天就上手-Day 06 常用指令說明

利用Postfix 所以供的命令列指令,可以幫助您更輕鬆管理郵件伺服器的工作。
今天的介紹會將重點放在日常操作比較需要的地方,如果對該指令有需要更進一步了解,可以參考一下指令的使用說明,Postfix 所提供的命令列指令有一個共通點,就是全部都使用post開頭。

指令說明如下:

postfix
用來啟動、停止跟重新載入設定檔,使用上配合參數如下:

啟動
檢視原始檔複製到剪貼簿列印關於
postfix start  

停止
檢視原始檔複製到剪貼簿列印關於
postfix stop  

重新載入設定檔
檢視原始檔複製到剪貼簿列印關於
postfix reload

postmap
postmap主要是將文字檔的內容建立出索引對照檔,ex:將 /etc/postfix/virtual 轉為 /etc/postfix/virtual.db
postmap hash:/etc/postfix/virtual  

另外它還有另外一個很重要的功用,用來 debug (執行 "postmap -q")。您可以利用 postmap 來檢查對照表中傳回的項目是否與您預期的一樣。

ex: 檢查 /etc/postfix/access_sender 中 key 為 funkent@ithome.com.tw 的 value
postmap -q funkent@ithome.com.tw hash:/etc/postfix/access_sender

postalias
功能類似 postmap,是將別名檔建立一個索引別名,postalias 必須在別名檔上使用。

postcat
postcat 用來顯示郵件內容,使用時須要提供郵件 ID 。
ex:查看郵件ID為 0E3569009C 的內容
postcat -q 0E3569009C

postlog
postfix 允許外部程式 (如 shell script ) 使用postlog,將訊息寫到 maillog 中。 ex: 將 This is a test 寫入 maillog
postlog This is a test  

postqueue
postqueue 是 postfix 提供給 user 對上一篇介紹的佇列進行操作的使用者介面,參數使用如下:

重送所有佇列中的郵件
postqueue -f  

列出佇列中內容
postqueue -p

PS:postqueue 需要在 postfix 啟動的情況下才能運作。

postsuper
postsuper 是提供管理者維護 postfi x佇列的工具,執行 postsuper 需要有 root 權限。
最常使用的就是刪除佇列中卡住的郵件, 下列範例會將郵件 ID 為 0E3569009C 的郵件從佇列中移除。
postsuper -d 0E3569009C

正所謂工欲善其事,必先利其器!以上了解了 postfix 提供的工具之後,您就可以更輕鬆的管理postfix。


Postfix 三十天就上手-Day 07 Mail Server 的 DNS

郵件伺服器要如要對外正常收送郵件,當然最先必要條件就是讓別人可以透過DNS找到你的伺服器。

要讓您的 Mail Server 正常在網際網路上運作,請先設定好 DNS,建議最少將下列3種 Type 的 Resource record 設定好。

A record
address record --一筆 A record 會對應到一個 ip address,您的 mail server 需要完全合法的的主機名稱,讓客戶端能夠找到您的主機。如:mail.ithome.com.tw  

PTR record
pointer record--由 ip address 反解到主機名稱就需要使用 PTR record ,您的主機名稱應該要可以被反解,因為在這個垃圾郵件氾濫的時代,如果不能被反解是很容易被判斷成為垃圾郵件。

MX record
mail exchange record --用來說明那些伺服器負責該網域的郵件服務,您可以有多台郵件伺服器來為您的網域作郵件服務,透過 MX record 就能找到這些服務的伺服器的 ip address。

在設定 DNS 的時候,您可以將 MX record 指到 A record,另外為企業為了避免遇到郵件伺服器掛點害郵件無法正常運作,對外通常都會有超過一台的郵件伺服器,也就是會有多筆的 MX ,當由郵件送到該網域時,會依 MX 的順序來寄送,如果第一台 MX 紀錄的主機掛點,就會送到順序第二的伺服器。

在此順便分享一個小撇步,通常垃圾郵件伺服器都會將垃圾郵件送給最後一台 MX,且它不會重送,所以有一招避免垃圾郵件的方式是將最後的 MX 指到空的IP

不過現在垃圾郵件不斷進化,如何防垃圾郵件已經變成系統管理員最頭痛的問題了。


Postfix 三十天就上手-Day 08 郵件日誌 (maillog)

系統管理員最好的朋友就是 log了,想知道系統在搞什麼鬼,最好要知道 log 跟你說什麼?

當您要對您的 mail server作 debug 時,第一個要想到的就是郵件日誌 ( maillog ),postfix 使用syslog 紀錄 maillog,您可以在 /etc/syslog.conf 查看 maillog 的位置。

一般建議設定的設值如下:

mail.none 將不會把郵件訊息存在  /var/log/messages,避免大量郵件日誌搞亂你的系統訊息。
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

再將 mail 的 log 單獨寫到 /var/log/maillog 中。
# Log all the mail messages in one place.  
mail.*                                                  -/var/log/maillog  

在 maillog  中還有一個很重要可是卻可能被初學者忽略的問題,就是系統時間時間戳記,正確的系統時間對 mail server 來說相當的重要,尤其遇到需要與其他 mail server 管理者進行 debug 時,非常需要一個精準的時戳來查核。


Postfix 三十天就上手-Day 09 信件代轉 (relay)

了解代轉避免您的伺服器變成垃圾發送者。

開放式代轉 ( Open relays ) 可能會讓您的郵件伺服器變成垃圾發送機,可以說是系統管理員的大噩夢。

所以 Postfix 在預設只會允許你的網域內的郵件代轉。

您可以透過 mynetworks_style 設定一般的待轉權限,設定如下:

mynetworks_style = class
將 mynetworks_style 設定為 class 時,postfix 將會把代轉範圍放寬到伺服器所設定的 IP 的 class 。

mynetworks_style = subnet
將 mynetworks_style 設定為 subnet 時,postfix 將會把代轉範圍限定在伺服器所屬的子網路。

mynetworks_style = host
將 mynetworks_style 設定為 hos 時,postfix 將會把只允許自己主機進行代轉。

另外您也可以透過設定 mynetworks 來設定獨立允許的代轉,設定方法如下:
mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.254.1.30

請以逗號作為分隔。


Postfix 三十天就上手-Day 10 建立別名 (Alias)
 
使用別名 ( Alias ) 可以讓大家更好記得您的 e-mail address。

一般系統開帳號,會使用比較像類似  m91001 這類的英文字搭配數字(如工號學號),此時您的 e-mail address 可能就會長的像 m91001@ithome.com.tw 。

您會發現這樣別人很難從你的 e-mail address 聯想到你是誰。此時您就需要使用別名,假設您的名子是 Steve Jobs,您一定會希望您的 e-mail address長的像 steve.jobs@ithome.com.tw,讓別人個好記得你的 e-mail address (尤其業務人員更是需要)。

另外還有一個狀況,假設您跟另外兩個同事 ( m91002,m91003 )都需要收到 ithelp@ithome.com.tw的郵件時,ithelp@ithome.com.tw 就是像是一個郵件群組,希望大家有問題要問得時候都寄到這個郵件信箱中,此時一樣可以透過建立別名來達成。

第一步您需要先將這些別名對應到您的需要的系統帳號,您可以編輯 /etc/postfix/aliases,加入的項目如下:
#user
steve.jobs: m91001  
#group
ithelp:     m91001,m91002,m91003

編輯完畢後,您還需要執行 postalias hash:/etc/postfix/aliases 這樣才會更新你的 aliases.db 。

別名建立好之後,您就可以試著發送測試的郵件測試看看囉!


Postfix 三十天就上手-Day 11 利用 LDAP 建立別名 (Alias)
 
利用 LDAP 讓你的 postfix 更好用。

昨天已經跟大家介紹如何建立別名。相信您看完昨天的文章之後,可能會產生一個小小疑惑,那就是假設我有一千個以上的帳號,是不是會造成檔案很難維護,又如果說你要有多台postfix 那檔案不一致不是很麻煩嗎?

這個時候您就可以搭配 LDAP,小弟個人比較愛好使用 OpenLDAP,為了要讓您的 Postfix 使用LDAP 來當作查看的對照表( MAPS ),您需要先在 main.cf 先定義 LDAP 的 source,您需要編輯main.cf 並定義 alias_maps 如下範例:
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-aliases.cf

另外您的 /etc/postfix/ldap-aliases.cf 範例如下:
server_host = ldap.ithome.com.tw  
search_base = dc=ithome, dc=com, dc=tw

完成以上設定後,假設您的 Postfix 收到一封寄給 Steve.Jo s 的郵件,當它在 /etc/aliases 中找不到時,就會連線到 ldap.ithome.com.tw,由於我們沒有指定 ldap 使用的 port ,所以他會預設使用 port 389 ,另外我們也沒有指定 bind 的 user(password),所以他會 bind anonymously,然後搜尋dc=ithome, dc=com, dc=tw 這棵樹,找出 mailacceptinggeneralid 這個屬性( attribute )為 "Steve.Jos" 的項目( entry ),然後回傳此項目的 maildrop

利用這樣的方式,就算您有上千個帳號,就算您有多台 postfix,都可以簡單管理。


Postfix 三十天就上手-Day 12 利用 MySQL 建立別名 (Alias)

利用MySQL 讓你的postfix 更好用。

昨天已經跟大家介紹如何利用 LDAP 建立別名。相信您看完昨天的文章之後,可能也會除了LDAP 是否也能利用資料庫?

沒錯今天我們就接著來介紹利用 MySQL 建立別名( Alias ),跟 LDAP一樣您需要先告訴 postfix要去找 MySQL,一樣編輯 main.cf 並定義 alias_maps 如下範例:
alias_maps = mysql:/etc/postfix/mysql-aliases.cf  

接著在 /etc/postfix/mysql-aliases.cf 您需要告訴 postfix 如何去參考資料庫,如下列範例:
# 設定要連入的主機
hosts = mysql.ithome.com.tw  

# 設定要登入資料庫的帳號跟密碼  
user = ithome_user  
password = ithome_password

# 設定使用的資料庫名稱  
dbname = mail_db

# 設定查詢條件
query = SELECT maildrop FROM mxaliases WHERE alias='%s' AND status='active'  

PS:當您使用 MySQL 來查詢的時候,要記得考量到 postfix 的大量連線數,很多時候容易因為後方的執行效率導致前方的 postfix 變慢。


Postfix 三十天就上手-Day 13 main.cf

說明 main.cf 基本語法

在第四天的時候有說明過 Postfix 三十天就上手-Day 04 設定檔結構說明,相信大家看完之後對於 postfix 主要設定檔與作用有了一個大概的概念。

今天我們就針對 main.cf 說明一下此檔案設定語法,postfix 預設將 main.cf 放在 /etc/postfix 的目錄下,該檔案的 owner 預設為 root,所以您要編輯的時候,需要使用 root 進行編輯。

postfix 在 main.cf 中使用的參數設定方法,與 UNIX shell 的變數設定方式類似,您可以如下列範例將等號左邊的數值(設定值)設定給等號右邊的參數。ex:
parameter = value  

除了直接設定設定值給參數,您也可以將某一參數設定為另外一個參數的設定值,就像變數使用的方法一樣,您只要在開頭使用錢字號 "$",如以下範例:ex:
other_parameter = $parameter  

這裡要特別跟大家說明,postfix 與 UNIX shell 有兩點比較不一樣的地方,說明如下:

第一:Postfix 不使用雙引號
第二:就算在設定 $parameter 的設定值之前您一樣可以使用 $parameter

最後,當您變更了mail.cf 的設定值之後,請記得要在 root 的身分下執行下列指令,讓您的postfix ( running ) 重新載入設定檔。
postfix reload 


Postfix 三十天就上手-Day 14 改寫郵件地址

利用Canonical address mapping 改寫郵件地址

在第10天的文章 Postfix 三十天就上手-Day 10 建立別名(Alias) 中有說明利用別名可以讓一個系統帳號有多個 e-mail address,當 user 在收信的時候,我們可以讓 postfix 幫忙將這些系統帳號的e-mail 在 postfix 把郵件地址改寫為您希望設定的 e-mail address,當然改寫的目的有很多,比如說把 "username" 轉到 "username@ithome.com.tw",或是 把 "username@hostname" 轉到 "username@hostname.ithome.com.tw 等等之類,其他目的我們就不多談,今天主要介紹利用Canonical address mapping 改寫郵件地址。

今天的範例假設使用者的 login name是 steve,但是我們希望把他換成全名 "steve.jobs"。

Canonical 預設是被停用的 ( disabled ),您需要在 main.c f中設定 canonical_maps 這個參數。

Step1.編輯 main.cf 設定 canonical_maps 參數如下:
canonical_maps = hash:/etc/postfix/canonical

Step2.編輯/etc/postfix/canonical內容如下:
steve        steve.jobs  

這樣就可以讓postfix幫您改寫郵件地址。


Postfix 三十天就上手-Day 15 利用 LDAP 改寫郵件地址

利用LDAP 當成你的 postfix 的 lookup table。

昨天已經跟大家介紹如何改寫郵件地址。如果您有讀過前幾天的文章,您也許會想說是否一樣可以利用 LDAP 作為 Canonical address mapping 的 lookup table,這樣就算您有一千個以上的帳號,也不會造成檔案很難維護,又如果說你要有多台 postfix 那檔案不會不一致。

為了要讓您的 Postfix 使用 LDAP 來當作查看的對照表 ( MAPS ),您需要先在 main.cf 先定義LDAP 的 source,您需要編輯 main.cf 並定義 canonical_maps 如下範例:
canonical_maps = hash:/etc/postfix/canonical,ldap:/etc/postfix/ldap-canonical.cf  

當然如果您如果完全不想使用 local file ,只使用 LDAP 來當 lookup table,您可以改寫如下:
canonical_maps = ldap:/etc/postfix/ldap-canonical.cf  

另外您的 /etc/postfix/ldap-canonical.cf 範例如下:
server_host = ldap.ithome.com.tw    
search_base = dc=ithome, dc=com, dc=tw    
query_filter = (&(mailacceptinggeneralid=%s)  
result_attribute= mail

另外LDAP 的 Data假設內容節錄如下:
mail: Steve.Jobs@ithome.com.tw  
uid: m91001  
cn: ITHome Steve Joes  
maildrop: m91001@ithome.com.tw  
mailacceptinggeneralid:Steve@ithome.com.tw

完成以上設定後,假設您的 Postfix 收到一封寄給 Steve@ithome.com.tw 的郵件,就會連線到ldap.ithome.com.tw,然後搜尋 dc=ithome, dc=com, dc=tw 這棵樹,找出 mailacceptinggeneralid 這個屬性 ( attribute ) 為 "Steve.Jos" 的項目( entry ),然後回傳此項目的 mail,取得回傳的 mai l值之後,回拿這個回傳值來改寫郵件地址。

PS:如果你的 LDAP Query 結果回傳超過一筆資料,會讓你的郵件地址改寫機制失敗,您會在maillog 看到如下列的錯誤訊息:
Oct 11 07:51:42 mailsrv postfix/cleanup[25578]: warning: D6652F8D11: multi-valued canonical_maps entry for Steve@ithome.com.tw

為了避免發生邏輯上的設定錯誤,您可以對照 Postfix 三十天就上手-Day 06 常用指令 說明中的postmap 來檢查對照表中傳回的項目是否與您預期的一樣。

範例如下:
postmap -q Steve@ithome.com.tw ldap:/etc/postfix/ldap-canonical.cf

正確的話就會得到下列結果:
Steve.Jobs@ithome.com.tw

如果回傳多個值,那您就要看看您邏輯或是資料哪裡錯囉!


Postfix 三十天就上手-Day 16 利用 MySQL 改寫郵件地址

利用 MySQL 當成你的 postfix 的 lookup table。

昨天已經跟大家介紹如何何利用 LDAP 改寫郵件地址。如果您有讀過前幾天的文章,您也許會想說是否一樣可以利用 MySQL 作為 Canonical address mapping 的 lookup table,這樣就算您有一千個以上的帳號,也不會造成檔案很難維護,又如果說你要有多台 postfix 那檔案不會不一致。

為了要讓您的 Postfix 使用 MySQL 來當作查看的對照表 ( MAPS ),您需要先在 main.cf 先定義MySQL 的 source,您需要編輯 main.cf 並定義 canonical_maps 如下範例:
canonical_maps = mysql:/etc/postfix/mysql-canonical.cf  

另外您的 /etc/postfix/mysql-canonical.cf 範例如下:
# 設定要連入的主機  
hosts = mysql.ithome.com.tw  

# 設定要登入資料庫的帳號跟密碼  
user = ithome_user    
password = ithome_password  

# 設定使用的資料庫名稱  
dbname = mail_db  
 
# 設定查詢條件  
query = SELECT mail FROM user WHERE mailacceptinggeneralid='%s' AND status='active' limit 1

這裡跟LDAP比較不一樣的作法是,我們可以限制指回傳一筆資料,拿回傳的第一筆去改寫郵件地址改。


Postfix 三十天就上手-Day 17 限制 Client 的連線頻率

調教您的Postfix 效能。

postfix 預設並不會對 Client 端的連線頻率設限,但是現在的網路實在是跟以前不一樣了,一個什麼防護都沒有的 postfix 放到網路上,我想可以活的天數不會太久。

所以今天就來跟大家講如何限制 Client 端的連線頻率,避免遇到惡意人士吃掉你的資源。

第一步、您需要告訴 postfix 要計算多久期間的的連線數,假設我們要現在每分鐘不能超過的連線數,所以您需要編輯 main.cf 並定義 client_connection_rate_time_unit 如下範例:
client_connection_rate_time_unit = 60s  

第二步、設定在期間內允許單一 Client 的連線數,假設我們要設定允許的連線數為 30,所以您需要編輯 main.cf 並定義 smtpd_client_connection_rate_limit 如下範例:
smtpd_client_connection_rate_limit=30

設定完成之後記得要執行 postfix reload


Postfix 三十天就上手-Day 18 控制每個 Client 的同時連線數

調教您的Postfix 效能。

Postfix 三十天就上手-Day 17 限制 Client 的連線頻率 中已經知道如何限制連線頻率,當然在效能上還需要考慮到同一時間的連線數,所以今天就來跟大家說明如何控制每個 Client 的同時連線數。

postfix 預設每個 Client 是預設程序數的一半,這樣的設定可能會讓兩個惡意 Client 就吃光您允許的 smtpd process 數。

您可以透過 smtpd_client_connection_count_limit 來控制每個 Client 的同時連線數,假設我們要設定允許的連線數為20,所以您需要編輯 main.cf 並定義 smtpd_client_connection_count_limit 如下範例:
smtpd_client_connection_count_limit=20

PS:請注意,建議此數值不應大於 smtpd 與 default_process_limit 大,否則一個 Client 就把 process 吃光囉!

Exception
如果某些 Client 您希望他不要受到限制,您可以透過smtpd_client_connection_count_limit_exceptions 來設定,預設已經允許 mynetworks,您可以另外加上您需要設定的主機,如以下範例:
smtpd_client_connection_count_limit_exceptions=$mynetworks, .ithome.com.tw,192.168.45.0/24

設定完成之後記得要執行 postfix reload


Postfix 三十天就上手-Day 19 淺談 Lookup Table ( 對照表 )

說明Postfix的對照表。

postfix 使用 lookup tables 來查看需要的資訊,如前面幾篇所介紹的 Postfix 三十天就上手-Day 10 建立別名( Alias )Postfix 三十天就上手-Day 14 改寫郵件地址,都是 postfix 使用 lookup table 的範例,
另外也有人叫它作 maps (從參數設定可以看出來),反正我們中文就翻成對照表吧!

這些對照表一個共通的特性,就是-- 左手值(Key) 對應 右手值(Value),如 Postfix 三十天就上手-Day 10 建立別名 ( Alias ) 範例中的 lookup table 如下:
steve.jobs:     m91001  

左手邊的部分為 Key ( steve.jobs ),右手邊的部分為 Value( m91001 ),postfix 依照對照表的 key找到它所對應的 value。

postfix 支援多種不同類型的對照表,您可以執行下列指令來查看您的 postfix 支援哪些類型的對照表:
postconf -m

另外當您編輯 main.cf 來設定 postfix 使用哪一個 lookup table 時,都會以 type:table 來開頭,其中type 就是指對照表類型,如下列設定中,type 就是 hash
alias_maps = hash:/etc/postfix/aliases

以下是幾個比較常支援的類型:
btree  
cidr  
environ  
hash  
ldap  
nis  
pcre  
proxy  
regexp  
static  
unix  


Postfix 三十天就上手-Day 20 使用 LDAP 當 Lookup Table

說明 Postfix 使用 LDAP 作為對照表。

postfix 使用 lookup tables 來查看需要的資訊,先前就有說明如果使用檔案來維護,當你帳號多機器多的時候,可能就會讓你太費力,所以使用 LDAP 來當 Lookup Table 會是一個不錯的選擇,今天就來對他好好說明一下。

如同上一篇所提到對照表共通的特性,左手值(Key) 對應 右手值(Value),在 LDAP 中您需要定義 postfix 來查詢時的 Key的屬性,邏輯如下:

對照檔方式:  Key     Value
LDAP 查詢方式:   Query_filter    Result_attribute  

Postfix 三十天就上手-Day 15 利用 LDAP 改寫郵件地址 範例中說明,使 query_filter 來定義查詢的 Key 屬性,並設定 result_attribute 回查詢後對映傳回的 Value。
範例節錄如下:
server_host = ldap.ithome.com.tw      
search_base = dc=ithome, dc=com, dc=tw      
query_filter = (&(mailacceptinggeneralid=%s)    
result_attribute= mail  

上列範例中您可以看到在對 LDAP 進行查詢時,常會使用倒置換的運算元,說明如下:
%s
完整的mail address (ex:m91001@ithome.com.tw)
%u
取得@先前的 uid (ex:m91001)
%d
取得@之後的 domain (ex:ithome.com.tw)


Postfix 三十天就上手-Day 21 請求主機名稱

對抗垃圾郵件招數一,請求主機名稱。

在現在的網際網路上,可以說好人不多見,隨時都有惡意人士上門拜訪,將您 postfix 設定嚴格一點,是管理人員的必要實務之一。

要避免惡意人士,第一步當然就是請他先自我介紹一下,所以我們可以設定當有郵件傳送到或是經過時,要有正確的自我介紹。

我們可以在 SMTP 的對話中,在 HELO/EHLO 中限制主機名稱,這樣可以要求對方送出合乎規定的主機名稱。

您可以透過 smtpd_helo_required 來進行設定,請編輯 main.c f並定義 smtpd_helo_required 如下範例:
smtpd_helo_required=yes

此預設值為 no,設定後記得要執行 postfix reload

以下就是測試沒有 HELO 的反應結果:
502 Error: send HELO/EHLO first 


Postfix 三十天就上手-Day 22 要求 FQDN

對抗垃圾郵件招數一,請求FQDN。

FQDN 對一台正規郵件伺服器來說是非常重要的,許多郵件伺服器都會檢查對方是否有提供FQDN,如果就會拒絕接收。
所謂的 FQDN(Fully Qualified Domain Name) 是由「主機名稱」與「網域名稱所組成」。

mail.ithome.com.tw 為例:
主機名稱就是 mail
網域名稱就是 ithome.com.tw

您可以透過下列指令查看是否您的主機有設定正確的 FQDN:
hostname -f  

傳回結果範例如下:
mail.ithome.com.tw

很多垃圾郵件發送機,可能都不會提供 FQDN,透過要求提供 FQDN 可以過濾掉一些水準較低的垃圾郵件發送機

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.c f並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_non_fqdn_hostname  
...

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_hostname,設定後 postfix 會拒絕任何來自未傳送 FQDN 的主機的郵件。

以下就是測試沒有 FQDN 的反應結果:
504 <Client>: Helo command rejected: need fully-qualified hostname


Postfix 三十天就上手-Day 23 要求寄件人包含 FQDN

對抗垃圾郵件招數一,要求寄件人包含 FQDN。

上一篇 Postfix 三十天就上手-Day 22 要求FQDN 說明 FQDN 以及要求主機需要提供 FQDN。
對付垃圾郵件的另外一招就是要求寄件人也需要包含 FQDN,一個完整的信件,寄件人應該要整的像是下列的樣子:
sender@ithome.com.tw

在網域的部分 (@之後) 需要包含 FQDN,如果像是下列範例,都是不合格:
sender  
sender@ithome  

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_non_fqdn_sender  
...

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_sender,設定後 postfix 會拒絕任何來自未傳送 FQDN 的主機的郵件。

以下就是測試沒有 FQDN 的反應結果 (假設 from 是 sender ):
504 <sender>: Sender address rejected: need fully-qualified address


Postfix 三十天就上手-Day 24 拒絕不合法的主機名稱

對抗垃圾郵件招數一,拒絕不合法的主機名稱。

主機名稱除了必須是 FQDN,您還可以要求需要遵守網域名稱 ( DNS ) 系統的需求。合法的一個網域名稱需要遵守下列幾點:

需要有一個最上層網域top-level domain (TLD),如 [com]
需要一個網域名稱,如 [ithome]
個區隔網域名稱與 TLD 的點 (.)

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_invalid_hostname  
...

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_invalid_hostname,設定後 postfix 拒絕不合法的主機名稱。

另外如果您的 postfix 版本 >=2.3 您可以透過 smtpd_helo_restrictions 來進行設定,請編輯 main.cf並定義 smtpd_helo_restrictions 如下範例:
smtpd_helo_restrictions =  
 reject_invalid_helo_hostname

以下就是測試沒有合法主機名稱的反應結果(假設主機名稱為[.]):
501 <.>: Helo command rejected: Invalid name  


Postfix 三十天就上手-Day 25 拒絕網域不存在的郵件
 
對抗垃圾郵件招數一,拒絕網域不存在的郵件。

垃圾郵件的寄送者會利用 不存在的網域( unknow domain ) 來隱藏他們的來源。建議不要讓您的郵件伺服器接收網域不存在的郵件,如果讓您的郵件伺服器接收,如果在傳送過程中發生錯誤(如找不到收件人),會讓您的伺服器退件找不到正確位址,最後可能就會擠爆郵件管理者的信箱囉!

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_unknown_sender_domain  
...  

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_unknown_sender_domain,設定後 postfix 會拒絕網域不存在的郵件。

以下就是測試結果,postfix會回傳 Error Code 450 :
450 <sender@unknow.domain>: Sender address rejected: Domain not found 


Postfix 三十天就上手-Day 26 設定收件人限制
 
對抗垃圾郵件招數一,設定收件人限制。

抵抗垃圾郵件的瘋狂亂送,我們可以拒絕收件人中有不存在網域。這樣您可以避免您的伺服器收了一堆信件,處理半天後又忙著回覆說找不到,不小心還會被 user 誤會是伺服器有問題。
所以最好的方法就是一開始就拒絕帶有不存在網域的收件人郵件。

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_unknown_recipient_domain  
...  

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_unknown_recipient_domain,設定後 postfix 會拒絕收件人網域不存在的郵件。

以下就是測試結果,postfix會回傳 Error Code 450 :
450 <recipient@unknow.domain>: Recipient address rejected: Domain not found 


Postfix 三十天就上手-Day 27 拒絕無 FQDN 的收件人
 
對抗垃圾郵件招數一,拒絕無FQDN的收件人。

如果送件的人沒有提供完整的收件人位址,您是可以拒絕接收的。當然提供正確的收件人位址是送件人的責任。您可以設定 postfix 拒絕那些非 FQDN 的收件人郵件。

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_non_fqdn_recipient  
...  

由於通常 smtpd_recipient_restrictions 會設定多條的條件,這裡就用 ...替代,我們主要是要設定reject_non_fqdn_recipient,設定後 postfix 會拒絕非 FQDN 收件人的郵件。


以下就是測試提供一個非 FQDN 收件人的測試結果,我們測試送信給 recipient,postfix 會回傳Error Code 504 :
450 <recipient>: Recipient address rejected: need fully-qualified address


Postfix 三十天就上手-Day 28 檢核寄件人
 
對抗垃圾郵件大絕招,檢核寄件人。

對抗垃圾郵件的大絕招,檢核寄件人,這是 postfix 對垃圾郵件非常重要的工具,當然相對的,跟你打 KOF(King of Fighters) 一樣,要使用大絕招通常都需要先集氣,在 postfix 中雖然不用集氣,但是使用這招是需要付出相對的代價,需要時間與相對的系統資源。使用此招數postfix 會檢查寄件人是否真的存在,如果不存在則會拒絕接收該郵件。

當 postfix 對郵件進行第一次寄件人檢核的時候,該郵件會有9秒的短暫延遲,如果檢核的程序超過 9秒,postfix 會回應 code 450,並拒絕來自客戶端的郵件,正常的郵件客戶端在延遲之後,都會重新連線,但是垃圾郵件伺服器就不會想要重複讓費力氣囉。

您可以透過 smtpd_recipient_restrictions 來進行設定,請編輯 main.cf 並定義smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
reject_unverified_sender  
permit  

特別要說明的是,由於這招是大絕招,所以建議放到最後,如範例中您會看到reject_unverified_sender 之後就是 permit 了,這樣如果前面的條件可以拒絕掉的郵件,就不用再浪費大力氣了。


Postfix 三十天就上手-Day 29 選擇性的檢核寄件人
 
對抗垃圾郵件中絕招,選擇性檢核寄件人。

昨天 Postfix 三十天就上手-Day 28 檢核寄件人 已經說明了對抗垃圾郵件的大絕招,但是我們也有說明使用這招是需要付出相對的代價,如果您的郵件伺服器平常負載已經很高,很可能使用這招就造成系統的瓶頸。

想要使用大絕招又不想浪費不必要的力氣,當然就跟打 KOF (King of Fighters) 一樣,要發大絕招的時候,當然是要在能一擊必中的情況下,有打過的都知道,最好把大絕讓在連續技的最後一著,保證對手大失血。

雖然 postfix 沒辦法使用連續技讓垃圾郵一擊必中,但是可您讓您選擇要使用的對象,我們可以針對特別幾個愛發垃圾郵件的網域作選擇性的檢核寄件人。

Step.1 準備對照表,如 Postfix 三十天就上手-Day 19 淺談 Lookup Table (對照表) 中所說明的,您需要準備一個對照表,用對照表來定義您對哪些網域進行檢核寄件人。
建立 /etc/postfix/spam_domain ,檔案範例如下:
yahoo.com.tw    reject_unverified_sender  
hotmail.com reject_unverified_sender

以上範例指定當信件的寄件人符合設定的 domain,就會執行 reject_unverified_sender 的動作。

Step.2 完成對照表之後,接著就是要告訴 postfix 要來參考對照表,您還需要先執行 postmap hash:/etc/postfix/spam_domain 轉換為 db 檔。然後您可以透過 smtpd_recipient_restrictions 來進行設定讓 postfix可以參考對照表,請編輯 main.cf並定義 smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
...  
check_sender_access hash:/etc/postfix/spam_domain  
permit

完成以上步驟後,當信件的寄件人符合設定的 domain,就會執行 reject_unverified_sender,reject_unverified_sender 的動作您可以參考上一篇 Postfix 三十天就上手-Day 28 檢核寄件人


Postfix 三十天就上手-Day 30 定義您的 VIP
 
給 VIP 特別的待遇。

在介紹了這麼多對付垃圾郵件的招數之後,相信大家最後一定心中會有一個疑慮,那就是萬一這些厲害招數攔了不該攔的人,那管理者可就頭大了。

相信企業的郵件伺服器除了害怕遭到垃圾郵件攻擊,更是害怕攔掉了客戶來的郵件,現實狀況中,可能不是只要求不能誤攔,連慢一點可能就要被抓起來打了。

面對這樣的情況,當然要給客戶 VIP 的待遇,所以今天就來說明如何在這些攔截條件執行之前,開一條 VIP 的康莊大道給客戶走。

Step.1 準備對照表,如 Postfix 三十天就上手-Day 19 淺談 Lookup Table( 對照表) 中所說明的,您需要準備一個對照表,用對照表來定義您的 VIP 是哪些網域寄件人。
建立 /etc/postfix/sender_vip ,檔案範例如下:
ithome.com.tw   OK  
apple.com   OK

有看財經新聞的都知道,只要企業打進頻果供應鏈,股價就要漲了,雖然現在可成引爆毒頻果事件,但是我相信 Apple 還是最大的客戶,所以一定要拿 apple.com 來當範例囉。當然跟apple.com 一樣紅的 ithome.com.tw 也不能錯攔。

Step.2 完成對照表之後,接著就是要告訴 postfix 要來參考對照表,您還需要先執行 postmap hash:/etc/postfix/sender_vip  轉換為 db 檔。然後您可以透過 smtpd_recipient_restrictions 來進行設定讓 postfix 可以參考對照表,請編輯 main.cf 並定義 smtpd_recipient_restrictions 如下範例:
smtpd_recipient_restrictions=  
check_sender_access hash:/etc/postfix/sender_vip  
...  

這邊您特別要注意的是您放的順序,請注意本範例將它放到第一條,也就是說當第一條符合的時候,會得到 OK,其它條件就不會在繼續檢查下去,當然他就不怕被其他條件攔掉,也不用浪費時間作其他的檢查。

PS:如果您害被有垃圾郵件假造是您的 VIP 剛好 bypass 掉你的檢查,可以考慮在 VIP 之前作比較基本的檢查,此時您只要調整順序即可



參考資料:http://www.postfix.org/   iT邦幫忙

2013-07-30

Sendmail 帳號與 Microsoft 2003 AD整合

Sendmail 帳號與 Microsoft 2003 AD整合


要達成sendmail+dovecot使用AD帳號做整合,必須希達成以下幾要建。

> Linux 機器不可以與AD機器時間相差超過五分鐘
> 使用samba中的winbind加入網域中並取得網域帳號。
> Pam認證模組中插入winbind.so達到AD帳號可以登入linux主機。
> 利用pam_mkhomedir.so來自動建立AD帳號的家目錄,不須自己手動建立家目錄。

1 . 測試環境

AD Server Windowns Server 2003
AD Samba CentOS 5.1 (未更新套件)

主機 Hostname IP
PDC adserver 192.168.227.130/24
linux samba samba.example.com.tw 192.168.227.131/24

Domain name example.com.tw
DNS 192.168.227.130

所需安裝套件(CentOS 5.1)
samba-client-3.0.25b-0.el5.4
samba-common-3.0.25b-0.el5.4
samba-3.0.25b-0.el5.4
ntp-4.2.2p1-7.el5
dovecot-1.0-1.2.rc15.el5

使用NTP套件作向AD作時間校正
# ntpdate 192.168.227.130
# hwclock -w

2 . 架設sendmail
(有時會忘記怎麼架,大約半年當機一次,不知是自動更新問題還是套件漏洞,沒去查)

2.1 設定Sendmail所服務的IP範圍
# vi /etc/mail/sendmail.cf
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA  # 原本
O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA       # 已修改的

2.2 設定接收信件的條件
(@後面的名稱符合這裡的條件的話把它接收下來)
# vi /etc/mail/local-host-names
example.com.tw
samba.example.com.tw

2.3 設定可Relay的條件
預設Relay本機

# vi /etc/mail/access
Connect:192.168.227 RELAY
Connect:example.com.tw RELAY
To:root@example.com.tw DROP #root的信丟棄掉

3 . 將Linux主機加入網域並取得帳號
3.1 設定samba設定檔 smb.conf
# vi /etc/samba/smb.conf
#=================== Global Settings ========================
[global]
workgroup = EXAMPLE # 架網域的時候有一個網域的NetBios name

netbios name = SAMBA
# ----------------- Domain Members Options ------------------
security = domain 
; passdb backend = tdbsam
realm = EXAMPLE.COM.TW

password server = 192.168.227.130

idmap uid = 10000 - 20000 # UID範圍限制
idmap gid = 10000 - 20000 # GID範圍限制
template shell = /bin/bash # 登入的Shell,郵件相關可以設成/sbin/nologin
template homedir = /home/%U # 登入的時候所使用的家目錄 /home/user
winbind separator = % # 網域與名稱的分隔符號
winbind use default domain = yes
winbind enum users = yes
winbind enum groups = yes
encrypt passwords = yes

若不做分享的話可以把== Share Definitions ==以下的全部拿掉

3.2 編輯 /etc/nsswitch.conf 來修改winbind對帳號的信任
# vi /etc/nsswitch
修改以下位置
passwd: files winbind
shadow: files
group: files winbind

# net rpc join -S adserver.example.com.tw -U administrator
Password:                                    # 輸入網域administrator的密碼
Joined domain EXAMPLE.     # 成功了 !!!

# service smb restart                      # 並非必需要啟動,有分享再啟動
# service winbind restart

3.3 測試是否有跟AD取得帳號與群組

# wbinfo -u
administrator
guest
support_388945a0
krbtgt
00001
00002
00003

# wbinfo -g
domain computers
domain controllers
schema admins
enterprise admins
domain admins
domain users
domain guests
group policy creator owners
dnsupdateproxy
group1

4 Linux 系統登入使用 AD認證

4.1 插入自動建立家目錄的模組 pam_mkhomedir.so
# vi /etc/pam.d/login

#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth include system-auth
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session include system-auth
session required pam_loginuid.so
session optional pam_console.so                    # 在這一行下面新增下一行
session required pam_mkhomedir.so skel=/etc/skel umask=0077 # 新增的一行,自動建立家目錄
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session optional pam_keyinit.so force revoke

4.2 Linux帳號使用winbind.so作AD帳號的認證
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth sufficient /lib/security/pam_winbind.so         # 插入的pam_winbind.so模組
auth sufficient pam_unix.so nullok try_first_pass        # 在這一行的上面新增一行
auth requisite pam_succeed_if.so uid >= 500 quiet
auth required pam_deny.so

account sufficient /lib/security/pam_winbind.so            # 插入的pam_winbind.so模組
account required pam_unix.so # 在這一行的上面新增一行
account sufficient pam_succeed_if.so uid < 500 quiet
account required pam_permit.so

password requisite pam_cracklib.so try_first_pass retry=3
password sufficient pam_unix.so md5 shadow nullok try_first_pass use_authtok
password required pam_deny.so

session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so



驗證類型說明
auth - 驗證你輸入的帳號密碼
account - 帳號密碼對了之後,account驗證類型還必須檢驗你的帳號密碼是否過期等等,來決定是否給你登入
password - 改變帳號資訊的時候用到的。
session - 紀錄或是限制登入次數的前置或後製的工作。

驗證控制說明
required - 驗證失敗時仍然繼續,不管後面驗證成功與否,最後都將錯誤傳回給應用程式。
requisite - 驗證失敗則立即結束整個驗證過程,錯誤傳回給應用程式。
sufficient - 驗證成功後不繼續驗證,失敗後繼續驗證。
session - 無論驗證結果如何,均不會影響。

一些資料 (接擷取自http://us3.samba.org/samba/docs/using_samba/toc.html)

Port 137 Used for NetBIOS network browsing
Port 138 Used for NetBIOS name service
Port 139 Used for file and printer sharing and other operations
Port 445 Used by Windows 2000/XP when NetBIOS over TCP/IP is disabled

Table 6-2. Samba variables

Variable Definition

Client variables
%a Client's architecture (see Table 6-1)
%I Client's IP address (e.g., 172.16.1.2)
%m Client's NetBIOS name
%M Client's DNS name

User variables
%u Current Unix username
%U Requested client username (not always used by Samba)
%H Home directory of %u
%g Primary group of %u
%G Primary group of %U

Share variables
%S Current share's name
%P Current share's root directory
%p Automounter's path to the share's root directory, if different from %P

Server variables
%d Current server process ID
%h Samba server's DNS hostname
%L Samba server's NetBIOS name
%N Home directory server, from the automount map
%v samba version
%D 網域名稱

Miscellaneous variables
%R The SMB protocol level that was negotiated
%T The current date and time
%$var The value of environment variable var

解決Exchange 2007 POP3 寄信權限的問題

解決Exchange 2007 POP3 寄信權限的問題


最近公司Mail Server Exchange 2003掛掉了~

於是想說Exchange 2007是新產品就來玩玩看~就這樣走上了不歸路啦,目前還有些問題還在Debug中~到時候在慢慢po上來給大家參考一下,公司Exchange server 2007已經開啟POP3、IMAP4服務,LoginType 採用 PlainTextLogin 明文方式,用戶端使用 Outlook Express,Outlook 2003,Outlook 2007,Outlook Web Access。

在進階的部分也都開啟了使用 SSL 加密 port 的選項,使用 POP3 或 IMAP4 收信也都正常,但是很奇怪有些使用者寄信的時候,會出現下列錯誤訊息而無法寄出郵件 ?


無法傳送郵件,因為伺服器拒絕寄件者的電子郵件地址。寄件者的地址是 test@mcg.com.tw’。主旨 ’1′, 帳戶: ‘test’, 伺服器: ‘mail.mcg.com.tw’, 通訊協定: SMTP, 伺服器回應: ’550 5.7.1 Client does not have permissions to send as this sender’, 連接埠: 25, 安全(SSL): 是, 伺服器錯誤: 550, 錯誤碼: 0x800CCC78

以為在powershell裡面打下面指令就可以解決權限的問題

add-adpermission ‘<receivername>’ -User ‘NT AUTHORITY\ANONYMOUS LOGON’ -ExtendedRights ms-Exch-SMTP-Accept-Authoritative-Domain-Sender

重開服務以後一樣沒用

原因可能是因為升級到Exchange 2007之後,加入了Exchange群組,AD的繼承自動會被拿掉,因此會造成升級後OWA及POP3有問題沒有權限寄信。 Administrator、Enterprise admins、Domain Admins等帳號或群組的成員有許多權限是被設為『拒絕』的。

你可以使用『Active Directory使用者及電腦』程式,將檢視選擇為『進階功能』


然後點選『有問題的帳號』–>內容–>安全性標籤,檢查看看有沒有SELF帳號,若沒有把它加進來(選擇新增–>手動輸入SELF–>確定),正常應有此帳號,接著在『安全性』標籤頁選擇『進階』


檢查一下『允許從父項繼承權限套用到這個物件和所有的子物件,包括明確定義於此的項目(A)』選項是否未勾選,一般的帳號應會勾選起來,若沒有勾選,接著直 接點選『預設』按鈕,會自動勾選起來,然後再按確定–>等同步後再重試一次寄信,記得按『預設』按鈕,它會把原來該有的權限加入。


備註:即使有SELF帳號,『允許從父項繼承權限套用到這個物件和所有的子物件,包括明確定義於此的項目(A)』選項也有勾選,也應按一下『預設』按鈕,因為有些權限有可能某些因素被拿掉。

Centos - yahoo pchome hotmail 拒絕接收自己架設的 SMTP 的 mail ?

Centos - yahoo pchome hotmail 拒絕接收自己架設的 SMTP 的 mail ?


我的 Linux Mail Server 送出去的信被拒絕了,以下這幾家特別不受歡迎
yahoo.com.tw
pchome.com.tw
hotmail.com
yahoo.com

解決方案:

如果以 sendmail 當作 Mail Server,修改 /etc/mail/mailertable
yahoo.com.tw    smtp:168.95.4.211
yahoo.com         smtp:168.95.4.211
pchome.com.tw   smtp:168.95.4.211
hotmail.com     smtp:168.95.4.211

意思是把收件人位於上述網址內的 email 轉給 168.95.4.211 (msa.hinet.net) Relay

如果以 Postfix  當作 Mail Server,修改 /etc/postfix/transport
pchome.com.tw    smtp:[msa.hinet.net]
yahoo.com.tw    smtp:[msa.hinet.net]
yahoo.com    smtp:[msa.hinet.net]
hotmail.com    smtp:[msa.hinet.net]

再修改 /etc/postfix/main.cf 加入
transport_maps = hash:/etc/postfix/transport

然後執行
postmap /etc/postfix/transport

2012-10-22

嚴重犯規!談郵件過濾與垃圾信犯規手法

嚴重犯規!談郵件過濾與垃圾信犯規手法


為什麼郵件過濾設定好了卻老是過濾不到東西?其實是垃圾信廠商實在太會鑽了,而您用的郵件過濾軟體又不夠強的緣故。

垃圾信過濾的技術領域當中,內容過濾是透過郵件的標題,寄件人,收件人,以及本文的內容文字,來判斷一封電子郵件訊息是否屬於垃圾信

此種方式碰到極大的一個挑戰,就是文字編碼的問題,在 RFC-2822 (電子郵件訊息格式規範) 制定時,法定了電子郵件的 Header 部分只可有 7bit ACSII 字元,目前我們看到的中文的郵件標題,收件人,寄件人等等這方面的文字,也都是放置在 Header 之內,您肯定也發現了,這些 8bit 中文字是怎麼放進去的呢,原來是透過 RFC-2047 以及 RFC-2231 所規定的編碼方式將 8bit 文字轉為 7bit,透過這種方式,所有電子郵件的 Header 部分都可以被轉為 7bit 並且支援各種語言,此類編碼方式有一個特色,也就是他保持了編碼方式的關鍵字,讓郵件軟體可以輕易地判斷出編碼是屬於哪一種,例如 utf8 或是 big5。

接著就是研究郵件本文的部分了,郵件本文的部分則是透過 MIME 的方式,類似 HTTP 所使用的 Header,來告知本文的編碼方式,但對於內容過濾領域來說,郵件本文不光是要注意文字編碼 "charset" 還得注意到 "encoding",通常一段較複雜的文字會先以 base64 或是 qp 的方式做 encoding,要過濾本文必須先解開 encoding,解開 encoding 之後還必須再判斷其編碼 charset,若是內容為 html 格式,在郵件本文中可能又包含了完整的 html,裡面可能在 http-equivlent 的 meta 部分再去宣告文章的 charset。

不管標題還是本文,郵件過濾器都必須確實的知道其編碼,並且轉換為 unicode 才能夠與設定的關鍵字做比對,若過濾軟體不支援 unicode 想想除了 big5 的東西之外你都過濾不到,那這樣的過濾器根本沒有什麼用。

解釋清楚原理之後,我們就可以了解到垃圾信廠商的手法了!目前郵件過濾有兩大宗流派:

※ 所有郵件一律當作垃圾,只有放行少數被設為非垃圾條件的信件
※ 所有郵件一律放行,只擋掉被過濾掉的垃圾信

當防垃圾策略使用的是第二種的時候,垃圾信手法就可以得逞了,它們的目的就是要你的郵件過濾器根本無法過濾這封信件,最終導致放行,以下是它們常用的策略

※ 郵件 Header 中的寄件人,收件人,主旨文字故意直接使用 big5 中文,不宣告其編碼
※ 郵件內文區塊的 MIME 宣告部分,故意不指定郵件文字編碼 charset,改在郵件內文的 html http-equivlent 之內宣告,而又把 html 以 base64 編碼起來

相信精明的您又有了一個問題,連郵件過濾都過濾不到了,這些非標準的郵件,在郵件軟體如 Outlook 中,看得到東西嗎?

還真的看得到,因為郵件軟體的用戶群眾太廣了,它們的設計理念必須是盡可能的讓一封郵件去顯示出來,因此它們必須透過種種的線索去猜出這封不正常郵件的編碼,如此一來就讓垃圾郵件商得逞了,郵件過濾器濾不到,但郵件軟體看得到!

因此,在選擇郵件過濾軟體的時候,最好要注意以下幾個關鍵點:

※ 是否能解碼各種非 RFC-2822 標準的垃圾郵件手法
※ 是否能以 UNICODE 設定關鍵字過濾?

當心!當網管必知的4種可惡的垃圾信來源

當心!當網管必知的4種可惡的垃圾信來源


發送垃圾信,必須透過一種叫做「SMTP伺服器」的電腦軟體來做為發送媒介,而其實這 SMTP伺服器並不是什麼壞玩意,他是正常郵件伺服器三件式「SMTP、POP3、IMAP」中的其中一環,它的合法用途就是用來替網域做收件及寄件的動作。

那是否只要架設了一套「SMTP伺服器」就能夠開始發送垃圾信呢?在十幾年前,是的,因為當時垃圾信防堵技術還不發達,但到了今天,可不是這麼回事,今天的垃圾信防堵技術中,有下面幾種常見的方式:

IP名譽檢查:你的IP位址是否有過寄垃圾信的壞紀錄,或者是否是動態IP還是固定IP,這些都有辦法透過一些公開的網路服務做查詢

IP反解檢查:各大ISP早就執行了這項動作,所有動態IP都會冠上 *.dynamic.* 的反解網域,一看就知道是不是動態IP

DNS SPF檢查:透過一個 DNS 設定中的 TEXT 紀錄,哪一個網域的寄件主機有包含哪幾台,一看就知道,根本騙不了人

DNS DKIM檢查:比 SPF 檢查要更進一步,甚至可以做到驗證信件寄件人及郵件內容是否被竄改的程度

接下來,我們就來看看,到底是誰在寄垃圾信

第一種 透過ISP撥接帳號:這種是最笨的方法,自以為不斷地換IP就能寄垃圾信而不被禁止連線,實際上他取得的任何一個IP都被

列於「IP名譽檢查」資料庫中的黑名單,就算沒列入,也沒辦法通過「IP反解檢查」中動態IP字串的檢查,大型郵件代管商是不會接受來自這種地方的垃圾郵件的

第二種 透過被入侵的主機:如果某台郵件伺服器被入侵了(正常帳戶被破解),駭客透過他來發垃圾信,將可以通過「IP名譽檢查」及「IP反解檢查」的查核,因為正規的郵件伺服器主機一定都是使用優質的固定IP,但駭客寄信時若使用非該網域正常的回信地址,則無法通過「SPF檢查」,比如說被入侵的網域是 *.edu.tw 但駭客想要用 gmail.com 作為寄件者地址,則不會通過「SPF檢查」也無法通過「DNS DKIM」

第三種 透過 Yahoo! 或 Google 的社群機制:這一種實在是很糟糕的方式,糟糕的是這些網路服務提供商,他們提供某種社群服務,並且讓群組的管理者建立通知信箱列表,並利用這一機制發送垃圾信,這將能通過所有垃圾信機制的檢查,因為它們完全合法,網路服務提供商應該確實的驗證內容訂閱者的意願,但它們很顯然沒有這麼做,你根本沒有加入,但信箱卻被加入到郵寄清單中。

第四種 透過殭屍電腦網路:這實在是讓人無奈的事情,由於電腦教育的不足,全世界有數千萬台以上的電腦,早已被植入木馬,讓駭客為所欲為,犯法作亂,這些殭屍電腦也常常被用於寄垃圾信,不過這些殭屍電腦基本上也無法通過「IP名譽檢查」,但由於許多殭屍電腦為長期僵化,很可能遭受駭客完全控制,並利用於設定合法的 spf 紀錄,有可能會通過這項檢查。

因此,我們建議 mis 架設企業郵件伺服器時,不但要注意上面防堵的機制是否都有準備到位,對於自己的主機,也要好好地加以管理,避免成為另一個犯罪的溫床。

轉載自《不及格網管

2012-10-02

Linux - mail/mailx命令使用外部SMTP來發送郵件

Linuxmail/mailx命令使用外部SMTP來發送郵件

/bin/mail會默認使用本地sendmail發送郵件,這樣本地的機器必須安裝和啟動Sendmail服務,配置非常麻煩,而且會帶來不必要的資源佔用。而通過修改配置文件可以使用外部SMTP服務器,可以達到不使用sendmail而用外部的SMTP服務器發送郵件的目的:

修改/etc/mail.rc 加入底下設定:

set from=fromuser@domain.com smtp=domain.com
set smtp-auth-user=username smtp-auth-password=password
set smtp-auth=login


說明:

from是發送的郵件地址
smtp是發生的外部smtp服務器的地址
smtp-auth-user是外部smtp服務器認證的用戶名
smtp-auth-password是外部smtp服務器認證的用戶密碼
smtp-auth是郵件認證的方式

配置成功後,就可以使用了,可以發送一封郵件測試一下:

mail -s "test" user@domain.com < content.txt

其中-s後面的是郵件標題,user@domain.com是收件人地址,content.txt裡面是郵件內容

2012-09-25

Webmail (一) Horde webmail 安裝與設定

Webmail (一) Horde webmail 安裝與設定


簡介:

Horde 是個高效能的 Open Source 程式 , 基於 PHP , 不像 OpenWebMail 是採用 CGI 語法寫成 , 效能當然也比較優!
且支援許多方便的功能 , 如 待辦事項 , 備忘錄 , 行事曆... 等 , 其中的行事曆功能也不亞於 Google 的行事曆功能相當不錯! 更支援 檔案總管 功能 , 讓所有擁有Mail帳號的使用者可互相共享資料 , 省去 FTP 或是 Mail 傳來傳去的時間 , 常用的 通訊錄 也支援 windows 的 .cvs 檔 (OutLook 通訊錄檔) , 匯入匯出功能 , 更讓使用者省去許多建立通訊錄的時間 , Horde 真的是很貼心呢! 萬一使用者有任何問題要提報管理者 , 只需點右上角的 "問題" 的驚嘆號圖示 , 內容填一填 , 系統就直接發一封 Mail 到管理者的信箱 , 與管理者溝通更直接快速!
Horde 與 Google 一樣也支援許多佈景主題 , 提供使用者選擇 , 另外 , 使用者更可以自己排列自己的首頁 , 只需點上面工具列的 "版面配置" , 將許多常用的功能放在首頁 , 行事曆..備忘錄..待辦事項..信件..全部一目了然 , 這真的是太方便囉 , 這可是 OpenWebMail 辦不到的特異功能!
Horde 其實還有許多功能 , 目前止能點到為止 , 因為還不是很瞭解 Horde , 日後有新功能在慢慢補上囉~
注意事項:

在安裝 Horde 之前 , 必須先確認 CentOS 已經安裝設定好 Postfix , Dovecot , httpd(nginx) , DNS , 且都可以正常運作

環境:

CentOS 5.4 - 2.6.18-164.11.1.el5

安裝流程:

安裝必要元件 GD Linrary:

#yum install php-gd -y

修改 PHP memory_limit:
若記憶體允許 , 建議改成 128M

#vi /etc/php.ini
memory_limit = 64M

#/etc/init.d/httpd reload

修正 temporary bug (CentOS x86_64的bug):

#vi /etc/dovecot.conf
login_process_size = 64

#/etc/init.d/dovecot restart

啟動 & 設定 MySQL:
 啟動MySQL , 設定開機啟動

#/etc/init.d/mysql start
#chkconfig mysqld --on

第一次啟動 MySQL , 設定 root 密碼
#mysqladmin -u root password 'new-password'
#mysqladmin -u root -h yourhostname.yourdomain.com password 'new-password'

修改 MySQL 預設語系 latin 為 UTF-8

#vi /etc/my.cnf

[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
init_connect="SET NAMES 'utf8'"

[client]
default_character_set=utf8

#/etc/init.d/mysql restart

Apache 設定 Horde Virtual Host:
新增horde virtual host,並設定安全性設定

#vi /etc/httpd/conf.d/horde.conf

#
# Horde is a web application framework written in PHP.
#

Alias /horde /usr/share/horde

# Uncomment the following 3 lines to make Horde locally accessible only
#Order Deny,Allow
#Deny from all
#Allow from 127.0.0.1

Options +FollowSymLinks

# horde.org's recommended PHP settings:
php_admin_flag safe_mode off
php_admin_flag magic_quotes_runtime off
php_flag session.use_trans_sid off
php_flag session.auto_start off
php_admin_flag file_uploads on
# Optional - required for weather block in Horde to function
php_admin_flag allow_url_fopen on

# If horde dies while trying to handle large email file attachments,
# you are probably hitting PHP's memory limit. Raise that limit here,
# but use caution
# Set to your preference - memory_limit should be at least 32M
# and be greater than the value set for post_max_size
#php_value memory_limit 32M
#php_value post_max_size 20M
#php_value upload_max_filesize 10M

# /usr/share/pear is needed for PEAR. /var/www/html/horde is needed for Horde itself
# TODO: Set an appropriate include_path, too. Might even increase speed a bit.
php_admin_value open_basedir "/var/www/html/horde:/var/www/html/horde/config:/usr/share/pear:/tmp"
php_admin_flag register_globals off

Order Deny,Allow
Deny from all

# Deny access to files that are not served directly by the webserver

Order Deny,Allow
Deny from all

# Deny access to the test.php files except from localhost
#
# Order Deny,Allow
# Deny from all
# Allow from 127.0.0.1
#

安裝 phpMyAdmin:

下載新版 phpMyAdmin - http://www.phpmyadmin.net/home_page/downloads.php

建立 Admin 資料夾 , 將phpMyAdmin放進去

詳細步驟就不說明囉 , 很簡單

安裝 Horde:
使用 yum groupinstall 一口氣全部安裝

#yum groupinstall Horde

修改 Horde 專用的帳號與密碼

#cd /usr/share/horde/scripts/sql
#vi create.mysql.sql

REPLACE INTO user (host, user, password)
VALUES (
'localhost',
'horde',
-- IMPORTANT: Change this password!
PASSWORD('password')
);

測試支援度:
用test.php測試一下支援度 , 看看是否全部都支援 !

http://yourdomain.com.tw/horde/test.php

導入 Horde 各項 SQL 資料庫:
匯入 Horde 主資料庫

#cd /usr/share/horde/script/sql
#mysql -u root -p < create.mysql.sql

匯入kronolith行事曆table到horde

#cd /usr/share/horde/kronolith/scripts/sql
#mysql --user=root --password=? horde < kronolith.mysql.sql

匯入mnemo備忘錄table到horde

#cd /usr/share/horde/mnemo/scripts/sql
#mysql --user=root --password=? horde < mnemo.sql

匯入turba通訊錄table到horde

#cd /usr/share/horde/turba/scripts/sql
#mysql --user=root --password=? horde < turba.mysql.sql

匯入nag待辦事項table到horde

#cd /usr/share/horde/nag/scripts/sql
#mysql --user=root --password=? horde < nag.sql

設定 Horde 及其他:
建立 Log 記錄資料夾

#mkdir /var/log/horde
#chown apache:apache /var/log/horde

設定轉址檔index.php

#cd /var/www/html
#vi index.php

SunArt

FRAME
BORDER="no" BORDER=0 NORESIZE>

 Hored 設定

#vi /usr/share/horde/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: horde/config/conf.xml,v 1.74.2.48 2007/02/02 11:03:05 jan Exp $
$conf['debug_level'] = E_ALL;
$conf['max_exec_time'] = 0;
$conf['compress_pages'] = true;
$conf['umask'] = 077;
$conf['use_ssl'] = 2;
$conf['server']['name'] = $_SERVER['SERVER_NAME'];
$conf['server']['port'] = $_SERVER['SERVER_PORT'];
$conf['session']['name'] = 'Horde';
$conf['session']['use_only_cookies'] = true;
$conf['session']['cache_limiter'] = 'nocache';
$conf['session']['timeout'] = 0;
$conf['cookie']['domain'] = $_SERVER['SERVER_NAME'];
$conf['cookie']['path'] = '/horde';
$conf['sql']['persistent'] = false;
$conf['sql']['username'] = 'horde';
$conf['sql']['password'] = 'password';
$conf['sql']['protocol'] = 'unix';
$conf['sql']['database'] = 'horde';
$conf['sql']['charset'] = 'UTF-8';
$conf['sql']['phptype'] = 'mysql';
$conf['auth']['admins'] = array('jakson');
$conf['auth']['checkip'] = true;
$conf['auth']['checkbrowser'] = true;
$conf['auth']['alternate_login'] = false;
$conf['auth']['redirect_on_logout'] = false;
$conf['auth']['params']['app'] = 'imp';
$conf['auth']['driver'] = 'application';
$conf['signup']['allow'] = false;
$conf['log']['priority'] = PEAR_LOG_INFO;
$conf['log']['ident'] = 'HORDE';
$conf['log']['params'] = array();
$conf['log']['name'] = '/var/log/horde/horde.log';
$conf['log']['params']['append'] = true;
$conf['log']['type'] = 'file';
$conf['log']['enabled'] = true;
$conf['log_accesskeys'] = false;
$conf['prefs']['params']['table'] = 'horde_prefs';
$conf['prefs']['params']['driverconfig'] = 'horde';
$conf['prefs']['driver'] = 'sql';
$conf['datatree']['params']['table'] = 'horde_datatree';
$conf['datatree']['params']['table_attributes'] = 'horde_datatree_attributes';
$conf['datatree']['params']['driverconfig'] = 'horde';
$conf['datatree']['driver'] = 'sql';
$conf['group']['driver'] = 'datatree';
$conf['cache']['default_lifetime'] = 1800;
$conf['cache']['params']['dir'] = Horde::getTempDir();
$conf['cache']['params']['gc'] = 86400;
$conf['cache']['driver'] = 'file';
$conf['token']['params']['table'] = 'horde_tokens';
$conf['token']['params']['driverconfig'] = 'horde';
$conf['token']['driver'] = 'sql';
$conf['mailer']['params']['host'] = 'localhost';
$conf['mailer']['params']['port'] = 25;
$conf['mailer']['params']['localhost'] = 'localhost';
$conf['mailer']['params']['auth'] = '0';
$conf['mailer']['type'] = 'smtp';
$conf['vfs']['params']['persistent'] = false;
$conf['vfs']['params']['username'] = 'horde';
$conf['vfs']['params']['password'] = 'password';
$conf['vfs']['params']['protocol'] = 'unix';
$conf['vfs']['params']['database'] = 'horde';
$conf['vfs']['params']['charset'] = 'UTF-8';
$conf['vfs']['params']['phptype'] = 'mysql';
$conf['vfs']['params']['vfs_table'] = 'horde_vfs';
$conf['vfs']['params']['driverconfig'] = 'custom';
$conf['vfs']['type'] = 'sql';
$conf['sessionhandler']['params']['persistent'] = false;
$conf['sessionhandler']['params']['rowlocking'] = true;
$conf['sessionhandler']['params']['protocol'] = 'unix';
$conf['sessionhandler']['params']['hostspec'] = 'localhost';
$conf['sessionhandler']['params']['username'] = 'horde';
$conf['sessionhandler']['params']['password'] = 'password';
$conf['sessionhandler']['params']['database'] = 'horde';
$conf['sessionhandler']['params']['table'] = 'horde_sessionhandler';
$conf['sessionhandler']['type'] = 'mysql';
$conf['problems']['email'] = ' jakson@yourdomain.com.tw這個 E-mail 地址已經被防止灌水惡意程式保護,您需要啟用 Java Script 才能觀看 ';
$conf['problems']['maildomain'] = 'yourdomain.com.tw';
$conf['problems']['tickets'] = false;
$conf['menu']['apps'] = array('gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
$conf['menu']['always'] = false;
$conf['menu']['links']['help'] = 'all';
$conf['menu']['links']['help_about'] = true;
$conf['menu']['links']['options'] = 'authenticated';
$conf['menu']['links']['problem'] = 'all';
$conf['menu']['links']['login'] = 'all';
$conf['menu']['links']['logout'] = 'authenticated';
$conf['hooks']['permsdenied'] = false;
$conf['hooks']['username'] = false;
$conf['hooks']['preauthenticate'] = true;
$conf['hooks']['postauthenticate'] = false;
$conf['hooks']['authldap'] = false;
$conf['portal']['fixed_blocks'] = array();
$conf['accounts']['params']['quota_path'] = '/usr/bin/quota';
$conf['accounts']['params']['grep_path'] = '/bin/grep';
$conf['accounts']['params']['translateMountPoint'] = false;
$conf['accounts']['params']['translationTable'] = '/etc/mtab';
$conf['accounts']['driver'] = 'localhost';
$conf['imsp']['enabled'] = false;
$conf['kolab']['enabled'] = false;
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

imp 設定

#vi /usr/share/horde/imp/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: imp/config/conf.xml,v 1.53.2.18 2007/05/03 15:24:51 chuck Exp $
$conf['utils']['gnupg_keyserver'] = array('pgp.mit.edu');
$conf['utils']['gnupg_timeout'] = '10';
$conf['utils']['openssl_binary'] = '/usr/bin/openssl';
$conf['menu']['apps'] = array('gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
$conf['user']['select_sentmail_folder'] = false;
$conf['user']['allow_resume_all_in_drafts'] = false;
$conf['user']['allow_folders'] = true;
$conf['user']['allow_resume_all'] = false;
$conf['user']['allow_view_source'] = true;
$conf['user']['alternate_login'] = false;
$conf['user']['redirect_on_logout'] = false;
$conf['server']['change_server'] = false;
$conf['server']['change_port'] = false;
$conf['server']['change_protocol'] = false;
$conf['server']['change_smtphost'] = false;
$conf['server']['change_smtpport'] = false;
$conf['server']['server_list'] = 'none';
$conf['server']['sort_limit'] = '0';
$conf['server']['cache_folders'] = false;
$conf['server']['cache_msgbody'] = false;
$conf['mailbox']['show_attachments'] = false;
$conf['mailbox']['show_preview'] = false;
$conf['mailbox']['show_xpriority'] = false;
$conf['fetchmail']['show_account_colors'] = false;
$conf['fetchmail']['size_limit'] = '12000000';
$conf['msgsettings']['filtering']['words'] = './config/filter.txt';
$conf['msgsettings']['filtering']['replacement'] = '****';
$conf['spam']['spamfolder'] = false;
$conf['spam']['bounce'] = 'DSPAM';
$conf['spam']['program'] = '/usr/local/bin/spamassassin -r';
$conf['spam']['reporting'] = true;
$conf['notspam']['reporting'] = false;
$conf['msg']['prepend_header'] = true;
$conf['msg']['append_trailer'] = true;
$conf['compose']['allow_cc'] = true;
$conf['compose']['allow_bcc'] = true;
$conf['compose']['allow_receipts'] = true;
$conf['compose']['special_characters'] = true;
$conf['compose']['use_vfs'] = false;
$conf['compose']['link_all_attachments'] = false;
$conf['compose']['link_attachments_notify'] = true;
$conf['compose']['link_attachments'] = true;
$conf['compose']['add_maildomain_to_unexpandable'] = false;
$conf['compose']['attach_size_limit'] = '0';
$conf['compose']['attach_count_limit'] = '0';
$conf['hooks']['vinfo'] = false;
$conf['hooks']['signature'] = false;
$conf['hooks']['trailer'] = false;
$conf['hooks']['fetchmail_filter'] = false;
$conf['hooks']['mbox_redirect'] = false;
$conf['hooks']['mbox_icon'] = false;
$conf['hooks']['spam_bounce'] = false;
$conf['maillog']['use_maillog'] = true;
$conf['tasklist']['use_tasklist'] = true;
$conf['notepad']['use_notepad'] = true;
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

ingo 過濾器設定

#vi /usr/share/horde/ingo/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: ingo/config/conf.xml,v 1.13 2004/02/11 19:24:23 slusarz Exp $
$conf['menu']['apps'] = array( 'gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
$conf['storage']['driver'] = 'prefs';
$conf['storage']['maxblacklist'] = 0;
$conf['storage']['maxwhitelist'] = 0;
$conf['rules']['userheader'] = true;
$conf['rules']['usefolderapi'] = true;
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

turba 通訊錄設定

#vi /usr/share/horde/turba/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: turba/config/conf.xml,v 1.6.2.3 2006/05/09 15:58:10 jan Exp $
$conf['menu']['import_export'] = true;
$conf['menu']['apps'] = array('gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
$conf['client']['addressbook'] = 'localsql';
$conf['comments']['allow'] = true;
$conf['documents']['params']['driverconfig'] = 'horde';
$conf['documents']['type'] = 'sql';
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

kronolith 行事曆設定

#vi /usr/share/horde/kronolith/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: kronolith/config/conf.xml,v 1.14.10.4 2006/02/08 12:27:31 jan Exp $
$conf['calendar']['params']['table'] = 'kronolith_events';
$conf['calendar']['params']['driverconfig'] = 'horde';
$conf['calendar']['driver'] = 'sql';
$conf['storage']['params']['table'] = 'kronolith_storage';
$conf['storage']['params']['driverconfig'] = 'horde';
$conf['storage']['driver'] = 'sql';
$conf['metadata']['keywords'] = false;
$conf['reminder']['server_name'] = 'yourdomain.com.tw';
$conf['reminder']['from_addr'] = 'yourdomain.com.tw';
$conf['autoshare']['shareperms'] = 'none';
$conf['menu']['print'] = true;
$conf['menu']['import_export'] = true;
$conf['menu']['apps'] = array('gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

gollem 檔案總管設定

#vi /usr/share/horde/gollem/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: gollem/config/conf.xml,v 1.5.2.2 2005/12/11 18:31:18 slusarz Exp $
$conf['manager']['date_format'] = '%x';
$conf['backend']['backend_list'] = 'hidden';
$conf['menu']['apps'] = array( 'gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'passwd', 'turba');
$conf['user']['alternate_login'] = false;
$conf['user']['redirect_on_logout'] = false;
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

nag 待辦事項設定

#vi /usr/share/horde/nag/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: nag/config/conf.xml,v 1.25.10.1 2005/10/18 12:56:37 jan Exp $
$conf['storage']['params']['table'] = 'nag_tasks';
$conf['storage']['params']['driverconfig'] = 'horde';
$conf['storage']['driver'] = 'sql';
$conf['menu']['print'] = true;
$conf['menu']['import_export'] = true;
$conf['menu']['apps'] = array( 'gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

mnemo 備忘錄設定

#vi /usr/share/horde/mnemo/config/conf.php

/* CONFIG START. DO NOT CHANGE ANYTHING IN OR AFTER THIS LINE. */
// $Horde: mnemo/config/conf.xml,v 1.17 2004/10/03 13:07:37 stuart Exp $
$conf['storage']['params']['table'] = 'mnemo_memos';
$conf['storage']['params']['driverconfig'] = 'horde';
$conf['storage']['driver'] = 'sql';
$conf['menu']['print'] = true;
$conf['menu']['import_export'] = true;
$conf['menu']['apps'] = array( 'gollem', 'horde', 'imp', 'ingo', 'kronolith', 'mnemo', 'nag', 'turba');
/* CONFIG END. DO NOT CHANGE ANYTHING IN OR BEFORE THIS LINE. */

安全性設定:
config 安全部分

#chown apache:root -R /var/www/html/horde/config
#chown apache:root -R /var/www/html/horde/*/config
#chmod -R go-rwx /var/www/html/horde/config
#chmod -R go-rwx /var/www/html/horde/*/config

script 安全部分

#chown -R root:root /var/www/html/horde/scripts
#chown -R root:root /var/www/html/horde/*/scripts
#chmod -R go-rwx /var/www/html/horde/scripts
#chmod -R go-rwx /var/www/html/horde/*/scripts

test.php 安全部分

#chmod a-rwx /var/www/html/horde/test.php
#chmod a-rwx /var/www/html/horde/*/test.php


完成與測試:

也可以使用 Webmail (二) OpenWebmail


※以上參考 - DNS,Samba,DHCP,IPTABLES,Postfix 架設全記錄

Webmail (二) OpenWebmail的安裝與設定

Webmail (二) OpenWebmail的安裝與設定



一、下載下列套件至 /usr/local/src 與 /usr/local/src/clamav 下:


openwebmail-2.52-1.i386.rpm (下載網址如下:)
可於http://openwebmail.org/openwebmail/download/redhat/rpm/release/下載最新版本

二、安裝 openwebmail 相關套件、電郵防毒、廣告信過濾套件等:


yum install perl-suidperl perl-Compress-Zlib perl-Text-Iconv spamassassin clamav clamav-devel clamav-milter clamav-server clamav-update


三、修改/var/www/cgi-bin/openwebmail/etc/openwebmail.conf

一般設定

default_language zh_TW.Big5

default_iconset Cool3D.Chinese.Traditional

掃毒設定

enable_viruscheck yes

viruscheck_pipe /usr/bin/clamdscan --mbox --disable-summary --stdout -

viruscheck_source_allowed all

廣告信過濾設定

enable_spamcheck yes
spamcheck_pipe /usr/bin/spamc -c -x -t60 -u @@@USERNAME@@@
spamcheck_source_allowed all
spamcheck_maxsize_allowed 1000
spam_destination spam-mail
has_spamfolder_by_default yes
enable_learnspam yes
learnspam_pipe /usr/bin/sa-learn --spam
learnham_pipe /usr/bin/sa-learn --ham
learnspam_destination spam-mail
learnham_destination INBOX
default_spamcheck_source all
enable_saprefs no

四、啟動各相關程式

※ /var/www/cgi-bin/openwebmail/openwebmail-tool.pl --init
     (完成安裝)

※ /sbin/service spamassassin start
     (啟動廣告信過濾服務)

※ chkconfig --level 345 spamassassin on
     (設定開機時自動啟動廣告信過濾服務)

也可以使用 Webmail (一) Horde webmail

※尚未建立 POP3與 SMTP 服務嗎?