搭建廉價Cluster Mail Service - BackEnd篇

成個Cluster Mail嘅infrastructure裡面嘅元素都講得七七八八,今次講BackEnd Server,呢部嘢裡面需要做嘅事情有兩件:第一係通過LDAP做Linux用戶驗證,第二係Dovecot Service。

LDAP用戶驗證

要做到你部Linux用LDAP認證,實際係取其用戶信息,根本唔會比佢登錄,當然大前提係你setup好部LDAP。有LDAP在手後,就可以開始工作,以前講LDAP安裝時都有講過點做LDAP Authentication架啦,不過時移世易,有啲file位置變咗,呢度重複下,自己執生!首先係安裝一啲package:

apt-get install ldap-utils libnss-ldap -y

注意有啲問題要答嘅,主要係LDAP Base,RootDN同Password等。跟著係run兩個command,咁就基本搞掂。

auth-client-config -t nss -p lac_ldap
pam-auth-update

呢堆command牽涉咗好幾個file嘅改動,主要包括 /etc/ldap.conf,最新version嘅Linux都差不多統一到呢度,你識嘢嘅可以edit佢加以細化個configure,做靚啲。以前嘅libnss_ldap.conf已經唔用,你見唔到個file都唔需要理佢啦。當然仲有一堆 pam.d 嘅file,主要係 /etc/pam.d/common-auth 同 /etc/pam.d/common-password,你會見到喺pam_unix.so後面會多咗pam_ldap.so,意思即系先試試Linux本身嘅user能否驗證,衰咗就試試ldap,都唔得就梗係PK啦。而點樣map去嗰ldap度,就係靠/etc/ldap.conf,所以唔可以錯,唔好懶醒改都自己都唔掂。你會見到/etc/ldap.conf只係得幾句,其實佢做咗好多嘢,只不過係全部take default,所以無咩寫喺度。假如你唔係用openldap而係用AD嚟做一樣得,不過會多咗十幾句mapping嘅configure。而最後有個/etc/nsswitch.conf,會多咗ldap係file後面。假如你係通過標準個ldap attribue,一啲都唔難,假如你嘅design係唔跟標準,如user home directory唔係用 homeDirectory,username唔係用uid,電郵唔係用mail(唔係email呀!無e架!),咁就係自作孽。唔單止要set餐死,仲唔同其它software compatible,搞到個個software嘅configure都改到狗咁先用得。系唔系自作孽呀?

設定Dovecot

先講安裝,無咩特別,可以裝嗮dovecot-*都得。一般會咁:

apt-get -y install dovecot-ldap dovecot-lmtpd dovecot-common dovecot-antispam dovecot-sieve dovecot-postfix dovecot-pop3d dovecot-managesieved dovecot-imapd dovecot-core

有啲盲目,不過勝在唔洗用腦,裝嗮算Q數。入肉啦!

認證

先搞掂個LDAP認證 /etc/dovecot/dovecot-ldap.conf.ext,內容作如是觀:

dn = cn=ldapviewer,dc=mydomain,dc=com   # 注意開頭兩句唔一定要!下面解釋
dnpass = nopasswordbor
auth_bind = yes # 假如無第一二句就no
uris = ldap://ldapserver/ ldap://backupldap/ # 你個LDAP喺邊度,可以打好多個嘅,打IP或hosts隨便 
tls = no # 一般都係通過內部network去access個LDAP server,有無TLS唔係太重要 
pass_attrs = uid=user # 呢個係代表password認證個username點嚟,有如/etc/shadow,等號前面係 LDAP Attribute,後面係Dovecot variable記住呀 
user_attrs = uid=user,homeDirectory=home,uidNumber=uid,gidNumber=gid # Unix嘅user id, group id, home係點嚟,好緊要架 
base = ou=People,dc=mydomain,dc=com # 所有嘅user都係under呢條tree 
scope = subtree # 你唔係問我點解呀!? 
pass_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u))) # 代替 /etc/shadow 尋找user嚟驗證password嘅條件 
user_filter = (&(objectClass=inetOrgPerson)(|(uid=%u)(mail=%u))) # 代替 /etc/passwd 尋找user屬性(home,uid,...)嘅條件
好!解釋下第一二句,假如你嘅LDAP係可以anonymous search到user基本information,係可以唔打嘅。不過高級啲嘅環境都會唔比一般人anonymous list到user,最少你要login到先比你search。咁就要呢家嘢啦,個dn可以係一個user嘅DN都得,無咩所謂。假如你用AD,dn可以簡單到sAMAccountName嘅Windows login name都得。至於兩個 filter,係好經典嘅寫法,一個query就可以compatible用戶用email代替username嚟login,你high啲可以加個 (mobile=%u) 添。有啲白癡會做兩個profile嚟compatible username同email login,無法啦,design嗰個蠢,用嗰個仲蠢,物以類聚。
 
其實個LDAP file係通過 /etc/dovecot/conf.d/10-auth.conf 去引用嘅,內容可以簡單到咁:
 
disable_plaintext_auth = no    # 呢個唔係default,一定要改為no,因為yes係好難用嘅,寧願通過TLS/SSL嚟做安全訪問算啦
auth_username_format = %n      # 不要問,只管用!係LMTP用嘅,話佢知我唔睇@後面啲嘢
auth_mechanisms = login plain  # 一般咁寫,login係做base64 encode,我鼓勵使用,plain係逼不得已,唔翻譯咁send
!include auth-ldap.conf.ext    # 哪哪哪!就係呢度話用LDAP架啦,講原本用嘅comment咗佢
跟住就係 /etc/dovecot/conf.d/auth-ldap.conf.ext ,內容好簡單,如下。就係裡面引用上面講嘅 /etc/dovecot/dovecot-ldap.conf.ext 明白嗮啦:
 
passdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}

userdb {
  driver = ldap
  args = /etc/dovecot/dovecot-ldap.conf.ext
}
 

電郵文件儲存

電郵點樣存放係通過 /etc/dovecot/conf.d/10-mail.conf 嚟決定。我地會選擇 maildir 方式,即一個email一個file。就一句都可以:
 
mail_location = maildir:~/.MailDir
呢個寫法代表喺user個home directory 下面放一個 .MailDir 嘅 sub directory,email file就係放喺裡面。
 

提供本地Deliver程序入口

呢個configuration嘅目的係處理執行 /usr/lib/dovecot/deliver 程序嘅(點用問男人 man deliver),不過無咩好set。但係有啲陰濕嘢要講講,就係一定要有postmaster_address。無咗唔只LDA有事,連LMTP都唔一定work!比個 /etc/dovecot/conf.d/15-lda.conf 例子大家:

postmaster_address = postmaster@mydomain.com   # 一定要有,打咩話知你,有就得啦
hostname = mailserver.mydomain.com   # 呢個名喺要統一,所有postfix同dovecot都set到一樣,記得DNS解釋得到呀!
lda_mailbox_autocreate = yes  # 一般都yes,會少好多麻煩
protocol lda {
  mail_plugins = sieve   # 我地一般都會用埋sieve
}

提供LMTP服務

呢個係好緊要嘅服務,當識別倒係本地電郵嘅時候,會通過FrontEnd嘅Postfix用LMTP連接FrontEnd嘅Dovecot Director 再proxy到BackEnd嘅Dovecot。成個infrastructure就係加埋佢先至可以令到對maildir個讀寫(NFS、OCFS ...等等)可以用cache都唔corrupt。/etc/dovecot/conf.d/15-lda.conf 例子大家。記住!呢度未踢著個service嘅,下面 10-master.conf 至係戲肉。

protocol lmtp {
  mail_plugins = sieve   # 係同 lda 差不多
}

加密

呢個講咗好多次,成個cluster應該係一樣嘅,包括埋DNS resolve出嚟個hostname(可以bind好多個IP入口),set喺dovecot同postfix都應該一樣,呢個亦都係generate張cert嘅CN。唔肯比錢買self-sign一張都要,最少個CN應該啱!!!

ssl = yes   # 踢著佢!
ssl_cert = </etc/ssl/certs/ssl-mail.pem        # 張CERT點嚟唔理,最緊要有,CN要同訪問嘅hostname一致,有錢買真嘢啦US$10蚊有找
ssl_key = </etc/ssl/private/ssl-mail.key
ssl_verify_client_cert = no                    # 高級嘢,唔好理佢
ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL  # 容許加密協議
加密協議中,! 代表唔接受,好似我嘅夢中情人咁,即使前面打咗ALL都無用,因為係拒絕優先。SSLv2喺某一個晚上出咗事,之後就被世界丟棄咗,好可憐。如果想快啲,可以刪除!LOW,不過client一邊要識得set至得,所以唔洗改,照跟啦。
 

啟動服務

/etc/dovecot/conf.d/10-master.conf  係服務啟動configure文件,差不多所有service都係喺呢度踢著,
 
default_process_limit = 2000     # default 每個service有幾多個thread去run。做tune performance時建議只調教呢個
default_vsz_limit = 1024M        # 假如你有4-8GB RAM,就起碼set呢個數。
# imap service
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}
# pop3 service,建議儘量唔開,減少消耗
service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
# 哪!戲肉呀!呢個係同時打開TCP同UNIX SOCKET嘅directive,其實unix listener唔用可以唔開嘅
service lmtp {
    inet_listener lmtp {
    address = 10.3.3.50 127.0.0.1  # 係本機IP Address,唔用嘅network乾脆唔啟動。唔係ACL!唔好誤會
    port = 24                      # 據說無default port嘅,一定要打!
  }
  unix_listener lmtp {
    mode = 0666
  }
}
service imap {
}
service pop3 {
}
# 以下係提供比postfix做用戶驗證嘅一種方法,唔用架啦,可以唔寫嘅
# 喺postfix main.cf用以下directive配合體位:
#   smtpd_sasl_path = private/dovecot-auth   # 通過dovecot UNIX SOCKET提供用戶驗證,避開唔configure ldap
#   smtpd_sasl_type = dovecot
service auth {
  unix_listener auth-userdb {
  }
  unix_listener /var/spool/postfix/private/dovecot-auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}
service auth-worker {
}
# 唔知係乜,自己查字典
service dict {
  unix_listener dict {
    mode = 0660
  }
}
 
如果想閹咗pop3,正確做法係run呢個command。當然可以remove咗 dovecot-pop3d 呢個package。呢啲都係compatible嘅做法,我最憎人唔compatible嘅,記得啦!
 
mv /usr/share/dovecot/protocols.d/pop3d.protocol /usr/share/dovecot/protocols.d/pop3d.protocol.save
service dovecot restart

 

設定Sieve

sieve係標準嘢,standard嘢我梗支持。用嚟做filter policy,將email自動轉到唔同嘅folder,好好用架,RoundCube又支持嗰度好吖嘛!對付sieve,有兩件事要做,第一係 /etc/dovecot/conf.d/20-managesieve.conf。呢個係管理filter policy命令嘅service,會通過TCP/4190嚟收發命令。
 
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
}
service managesieve {
}
protocol sieve {
  # 教細啲唔怕比人hack
  managesieve_max_line_length = 16384
  mail_max_userip_connections = 5
}
仲有 /etc/dovecot/conf.d/90-sieve.conf。呢度最緊要係一句,就係sieve file喺邊。
 
plugin {
  sieve = ~/.dovecot.sieve
  quota_full_tempfail = yes
  deliver_log_format = msgid=%m: %$
}

呢個係plugin嘅configure,最主要係嘅sieve嘅configuration file相對位置。裡面係sieve嘅configure,通過兼容sieve嘅UI工具就可以好方便咁編輯。當然你手打魚蛋用vi嚟寫都唔會怪你。

 

調教效能

上面嘅啟動服務configure係包含埋performance tuning架啦,強力建議用嗮 default_process_limit同default_vsz_limit做住先。其實dovecot default係限制你用幾多hardware資源,所以只要set大呢兩個value就搞掂,至於要set到幾大,睇住top(sar)嚟做啦。假如你 係用NFS,memory cache幫助唔大(注意唔係無呀,唔大咋!)睇住physical memory(除cache)有剩就加少少default_vsz_limit就OK。唔洗理人地講到天花龍鳳嘅,嘥時間。

 

如是者restart個dovecot就搞掂。自己試試啦!