OpenLDAP - Courier-imap Auth With LDAP 設定

1、前言

POP3 vs IMAP,如下表格為比較二者的優缺點如何選擇就看您的環境及喜好了。



E-Mail 相關服務聆聽埠號 (Listen Port)
  • SMTP:25
  • SMTPs (SMTP Over SSL):465
  • POP3:110
  • POP3s (POP3 Over SSL):995
  • IMAP:143
  • IMAPs (IMAP Over SSL):993





文章目錄

1、前言
2、實作環境
3、安裝及設定
          步驟1.安裝 Courier-imap 套件
          步驟2.產生 POP3 SSL 憑證
          步驟3.修改 /etc/rc.conf
          步驟4.啟動相關服務
          步驟5.設定 Courier-imap 使用 OpenLDAP 認證
          步驟6.對 OpenLDAP 的連接設定 (Courier IMAP 認證後端機制的設定)
          步驟7.測試 Courier IMAP 利用 OpenLDAP 帳號認證
4、補充:若無自已的 RootCA 怎辦?
5、參考
6、Me FAQ
          Q1.SMTPs 寄信或 POP3s 收信時顯示不信任憑證訊息出現?
          Q2.無法成功使用 Courier IMAP 透過 OpenLDAP 進行帳號認證?





2、實作環境

  • FreeBSD 6.1-STABLE
  • courier-imap 4.1.1,1





3、安裝及設定

Courier-imap 可支援 POP3 及 IMAP 並支援 SSL 模式,採用 MailDir 來儲存使用者郵件,當然最重要的是它 支援 OpenLDAP 認證本文將實作下列項目:
  • 安裝及設定 Courier-imap 可透過 OpenLDAP 進行認證使用者。
  • 製作 POP3 SSL 憑證。

步驟1.安裝 Courier-imap 套件

切換至 Ports Tree 路徑安裝 courier-imap 套件。
cd /usr/ports/mail/courier-imap   //切換至套件路徑
make install clean                 //勾選下列項目
 [X] OPENSSL      Build with OpenSSL support
 [X] AUTH_LDAP    LDAP support




步驟2.產生 POP3 SSL 憑證

本次實做利用自行產生的根憑證 RootCA (參考 OpenLDAP-SSL TLS 設定) 來簽發 POP3 SSL 需要的 pem 檔即可 (pem = Private Key + Certificate)。
cd /usr/local/share/courier-imap
cat /usr/local/etc/postfix/ssl/mail.weithenn.org.key > pop3d.pem
cat /usr/local/etc/postfix/ssl/mail.weithenn.org.crt >> pop3d.pem




步驟3.修改 /etc/rc.conf

修改 /etc/rc.conf 以便系統重新開機時能自動帶起相關服務。
vi /etc/rc.conf    //設定預設開機啟動程式
 courier_authdaemond_enable="YES"
 courier_imap_pop3d_enable="YES"      //啟動 POP3  (Port 110)
 courier_imap_pop3d_ssl_enable="YES"  //啟動 POP3s (Port 995)




步驟4.啟動相關服務

上述修改完成後鍵入如下指令來啟動相關服務:
啟動 Courier-Authdaemond 服務。
/usr/local/etc/rc.d/courier-authdaemond start
  Starting courier_authdaemond.

啟動 POP3 (Port 110) 服務。
/usr/local/etc/rc.d/courier-imap-pop3d.sh start
  Starting courier_imap_pop3d.

啟動 POP3s (Port 995) 服務。
/usr/local/etc/rc.d/courier-imap-pop3d-ssl.sh start
  Starting courier_imap_pop3d_ssl.




步驟5.設定 Courier-imap 使用 OpenLDAP 認證

上述相關服務啟動成功後,請測試是否能成功進行認證。
telnet localhost 110
 Trying ::1...
 Trying 127.0.0.1...
 Connected to localhost.weithenn.org.
 Escape character is '^'.
 +OK Hello there.
 user weithenn@weithenn.org     //E-Mail Address (此行為自行輸入)
 +OK Password required.
 pass 123456789                 //密碼 (此行為自行輸入)
 -ERR Temporary problem, please try again later   //出現認證錯誤 (Why?)
 Connection closed by foreign host.

此時 Maillog 顯示無法認證? 因為我們尚未設定 Courier-imap 認證方式,所以 Courier-imap 不知找誰要帳號資訊因此認證失敗。
Aug 12 09:58:33 ldap authdaemond: ldap_simple_bind_s failed: Can't contact LDAP server
Aug 12 09:58:33 ldap pop3d: LOGIN FAILED, user=weithenn@weithenn.org, ip=127.0.0.1
Aug 12 09:58:33 ldap pop3d: authentication error: Input/output error

前面步驟僅設定讓 Courier-imap 開啟 POP3、POP3s 服務,但尚未設定帳號資訊找誰要? 請指定 Courier IMAP 使用 OpenLDAP 方式來認證帳號,因此請修改 Courier IMAP 認證 (Authdaemon) 服務的設定,Courier IMAP 認證支援如下方式:
  • authpam: 使用 PAM 進行認證
  • authldap: 使用 LDAP 進行認證
  • authpgsql: 使用 PostGreSQL 進行認證
  • authmysql: 使用 MySQL 進行認證

修改 Courier IMAP 認證 (Authdaemon) 服務方式,在設定內容中加入 authdaemond.ldap 的用意,僅是在於使認證機制只找 LDAP,因為預設是以第一個發現的 authdaemond.* 模組為準。
vi /usr/local/etc/authlib/authdaemonrc
 authmodulelist="authldap"       //使用 LDAP 認證
 authmodulelistorig="authldap"   //使用 LDAP 認證
 version="authdaemond.ldap"      //加入此行

另外值得注意的是雖然 Courier-imap 可以支援不同的認證伺服器,但是不可以同一時間處理不同認証使用者資料庫下的使用者,也就是說要麻你必須把使用者全放在 LDAP 下,不然就把它全放在 MySQL 或 PostgreSQL 下;您不行把某些使用者放在 LDAP 而某些使用者放在 MySQL 下。



步驟6.對 OpenLDAP 的連接設定 (Courier IMAP 認證後端機制的設定)

修改 Courier IMAP 認證後端對於 OpenLDAP 機制的設定,其中比較重要的二個欄位 LDAP_AUTHBIND、LDAP_MAIL。
  • LDAP_AUTHBIND: 指定先尋找使用 Entry 的 DN,然後使用這 DN 和所輸入的 password 來作認證工作,如果認證工作順利的話,使用者就被認證成功。
  • LDAP_MAIL: 使用者登入資料會使用 Mail Address 來作為使用者的登入帳號 (屆時 Outlook Express 填的內送伺服器-帳號名稱)。
vi /usr/local/etc/authlib/authldaprc
 LDAP_URI                ldap://ldap.weithenn.org
 LDAP_PROTOCOL_VERSION   3
 LDAP_BASEDN             dc=weithenn, dc=org
 LDAP_TIMEOUT            5
 LDAP_AUTHBIND           1
 LDAP_MAIL               mail
 LDAP_FILTER             (objectClass=inetOrgPerson)
 LDAP_HOMEDIR            homeDirectory
 LDAP_MAILDIR            ./Maildir
 LDAP_FULLNAME           cn
 LDAP_CRYPTPW            userPassword
 LDAP_UID                uidNumber
 LDAP_GID                gidNumber




步驟7.測試 Courier IMAP 利用 OpenLDAP 帳號認證

上述修改完成後,我們可以再次測試 Courier IMAP 透過 OpenLDAP 方式來進行使用者認證。
telnet localhost 110
 Trying ::1...
 Trying 127.0.0.1...
 Connected to localhost.weithenn.org.
  Escape character is '^'.
 +OK Hello there.
 user weithenn@weithenn.org   //E-Mail Address (此行為自行輸入)
 +OK Password required.
 pass 123456789                //密碼 (此行為自行輸入)
 +OK logged in.                 //系統顯示認證成功
 quit                          //離開 (此行為自行輸入)
 +OK Bye-bye.
 Connection closed by foreign host.

此時 ldap.log 顯示認證成功資訊。
Aug 26 13:11:48 ldap slapd77165: conn=22885 op=2 SRCH base="dc=weithenn,dc=org" scope=2 deref=0
 filter="(&(objectClass=inetOrgPerson)(mail=weithenn@weithenn.org))"
Aug 26 13:11:48 ldap slapd77165: conn=22885 op=2 SRCH attr=homeDirectory ./Maildir uid userPassword uidNumber gidNumber mail
Aug 26 13:11:48 ldap slapd77165: conn=22885 op=2 SEARCH RESULT tag=101 err=0 nentries=1 text=
Aug 26 13:11:48 ldap slapd77165: conn=22886 op=1 BIND anonymous mech=implicit ssf=0
Aug 26 13:11:48 ldap slapd77165: conn=22886 op=1 BIND dn="uid=weithenn,ou=People,dc=weithenn,dc=org" method=128
Aug 26 13:11:48 ldap slapd77165: conn=22886 op=1 BIND dn="uid=weithenn,ou=People,dc=weithenn,dc=org" mech=SIMPLE ssf=0
Aug 26 13:11:48 ldap slapd77165: conn=22886 op=1 RESULT tag=97 err=0 text=

此時 Maillog 也顯示登入成功 (POP3)。
Aug 26 13:08:04 ldap pop3d: LOGIN, user=weithenn@weithenn.org, ip=127.0.0.1
Aug 26 13:08:12 ldap pop3d: LOGOUT, user=weithenn@weithenn.org, ip=127.0.0.1, top=0, retr=0, rcvd=6, sent=30, time=8

此時 Maillog 也顯示登入成功 (POP3 Over SSL)。
Aug 11 15:35:49 ldap pop3d-ssl: LOGIN, user=weithenn, ip=192.168.1.11
Aug 11 15:35:49 ldap pop3d-ssl: LOGOUT, user=weithenn, ip=192.168.1.11, top=0, retr=2717, rcvd=34, sent=2917, time=0

使用 SMTPs 及 POP3s 注意事項,Outlook Express 的內送郵件-POP3 及外送郵件-SMTP 設定欄位內容即為當時產生給 Postfix 使用憑證的 CN。





4、補充:若無自已的 RootCA 怎辦?

請依如下步驟來產生給 POP3 用的 pem。
cd /usr/local/etc/courier-imap                //切換到產生憑證路徑
cp /usr/local/etc/courier-imap/pop3d.cnf .  //複製 POP3 憑證設定檔
vi pop3d.cnf                                    //設定 POP3 憑證內容
    RANDFILE = /usr/local/share/courier-imap/pop3d.rand
     req
    default_bits = 1024
    encrypt_key = yes
    distinguished_name = req_dn
    x509_extensions = cert_type
    prompt = no
     req_dn
    C=TW
    ST=Taiwan
    L=Taipei
    O=FreeBSD Personal Reserach
    OU=FreeBSD Personal Reserach
    CN=mail.weithenn.org
    emailAddress=weithenn@weithenn.org
     cert_type
    nsCertType = server
/usr/local/sbin/mkpop3dcert                  //產生 POP3 憑證 (pop3d.pem)






5、參考






6、Me FAQ

Q1.SMTPs 寄信或 POP3s 收信時顯示不信任憑證訊息出現?

Error Message:
因為本次實作是自已產生 RootCA,因此使用者一定要下載 RootCA.cer 並匯入才能算是信任你的憑證,因為憑證是我們自行產生的 RootCA 所以在預設的情況下 Windows 電腦並不認識 (不信任) 您所製作的憑證。

Ans:
以下為簡述使用者如何匯入 (信任) 您所製作的根憑證 (RootCA)。為何不是匯入 RootCA 簽發給 MTA 的憑證呢? 答案當然也是可以的不過這樣對於我們整合之後的服務會更方便,因為 MTA 的憑證也是 RootCA 簽發的而二者都是自行製作的,且您只要匯入 (信任) RootCA 之後它所簽發的就會自動信任。
1. 使用者下載您所製作 RootCA.crt
2. 開啟 【Outlook Express】
     1. 點選【工具】
     2. 點選【選項】
     3. 點選【安全性】
     4. 點選【數位識別碼】
     5. 點選【信任的根憑證授權】
     6. 尋找放置 rootca.crt 路徑並匯入【rootca.crt】



Q2.無法成功使用 Courier IMAP 透過 OpenLDAP 進行帳號認證?

Error Message:
telnet localhost 110
 Trying ::1...
 Trying 127.0.0.1...
 Connected to localhost.weithenn.org.
 Escape character is '^'.
 +OK Hello there.
 user weithenn@weithenn.org
 +OK Password required.
 pass 918273645
 -ERR chdir Maildir failed     //出現說找不到 Maildir
 Connection closed by foreign host.

而 Maillog 訊息也出現說找不到 Maildir。
Aug 26 13:19:15 ldap pop3d: chdir Maildir: No such file or directory
Ans:
MailDir 如何產生?正常情況下,當設定 Courier IMAP 利用 OpenLDAP 帳號認證成功的話,只要使用者收到 E-Mail 則系統會自動在該使用者家目錄下建立 MailDir 資料夾 (裡面又包含三個資料夾 cur、new、tmp),當然若無法順利建立的話你也可手動幫使用者建立 MailDir 資料夾。

正常情況下使用者收到 E-Mail 後可以看到 Maillog 有如下訊息:
Aug 26 13:28:13 ldap postfix/local51429: AC1105C3A: to=<weithenn@mail.weithenn.org>,
 relay=local, delay=1.1, delays=1/0.01/0/0.09, dsn=2.0.0, status=sent (delivered to maildir)     //此時 Maildir 資料夾同步建立

如何手動建立 MailDir? 詳細內容可參考 LinuxHall - Courier-imap - Mail client 同 Postfix 的中間人 以下為簡述步驟:
cd /home/user/weithenn                //切換到使用者家目錄
maildirmake Maildir                   //建立使用者 MailDir 資料夾
chown -R weithenn Maildir            //更改為該使用者可存取權限
cd /home/user/weithenn/Maildir;ll   //列出 MailDir 下相關資料夾
 total 6
 drwx------  2 weithenn  weithenn  512  8 11 15:20 cur
 drwx------  2 weithenn  weithenn  512  8 11 15:20 new
 drwx------  2 weithenn  weithenn  512  8 11 15:20 tmp