2010年11月17日 星期三

OpenBSD 4.6 + Postfix + Mysql + Dovecot + Amavisd + ClamAV + Spamassassin + Roundcubemail (三)

3. Dovecot

Dovecot 提供 IMAP 和 POP3 的服務,並且在開發中很重視安全性的需求,當然同時也有提供 SSL 的加密連線。Dovecot 同時還支援多種認證方式和多種資料庫連結,對於 Postfix 的支援也相當的好。Dovecot 不只提供 IMAP 和 POP3 的服務,並且還提供了 LDA (Local Deliver Agent) 作為信件傳遞功能。在 LDA 啟動時,可以提供 Quota 的功能,還支援 Sieve Script ( 一種郵件過濾的腳本 )。

3.1.1 安裝程式 (支援 Managesieve)

在 4.6 版的 Ports 裡,Dovecot 只支援 Sieve 功能,也就是說你可以寫好腳本,由 LDA 幫你作郵件過濾的工作。但是用戶如果想要自行上傳自已的規則時,就必須用 Ftp 上傳自已的腳本,這非常的不方便。於是出現了 Managesieve 的伺服器,這讓你可以不用透過設定 Ftp 也可以上傳腳本。重點是,在之後的 Roundcube Webmail 系統中,有支援 Managesieve 的套件可以使用。

不過目前的 Ports 中並不支援 Managesieve ,如果我們要使用它的話,必須手動方式匯入更新檔,並且編譯程式,才能夠支援。當然如果你選擇不要使用 Managesieve 功能的話,可以直接看 3.1.2。

首先,我們先下載 Managesieve 的 patch 檔和原始碼。因為我們用 Ports 安裝的 Dovecot 的版本是1.1.19,所以我們要下載對應版本的patch 檔和原始碼,路徑如下:
http://www.rename-it.nl/dovecot/1.1/dovecot-1.1.19-managesieve-0.10.7.diff.gz
http://www.rename-it.nl/dovecot/1.1/dovecot-1.1-managesieve-0.10.7.tar.gz

# lynx http://www.rename-it.nl/dovecot/1.1/dovecot-1.1.19-managesieve-0.10.7.diff.gz
# lynx http://www.rename-it.nl/dovecot/1.1/dovecot-1.1-managesieve-0.10.7.tar.gz
在這裡,我們要先作一次 Dovecot 的編譯,然後再將 diff 檔匯入,再安裝 Dovecot。記得我們要支援 Mysql。

# cd /usr/ports/mail/dovecot
# env FALVOR="mysql" make
[...]
# cd /usr/ports/obj/dovecot-1.1.19-mysql/dovecot-1.1.19
# gzip -dc /path/to/patchfile.diff.gz | patch -p1
[...]
# cd /usr/ports/mail/dovecot
# env SUBPACKAGE="-server" FLAVOR="mysql" make install
# env SUBPACKAGE="-sieve" FLAVOR="mysql" make install

接下來把 Managesieve 原始碼解壓並編譯
# tar xzvf dovecot-1.1-managesieve-0.10.7.tar.gz
# cd dovecot-1.1-mamagesieve-0.10.7
# ./configure --with-dovecot=/usr/ports/obj/dovecot-1.1.19-mysql/dovecot-1.1.19/  \
   --with-dovecot-sieve=/usr/ports/obj/dovecot-1.1.19-mysql/dovecot-sieve-1.1.7/
[...]
# make
[...]
# make install

3.1.2 安裝程式 (不支援 Managesieve)
# cd /usr/ports/mail/dovecot
# env SUBPACKAGE="-server" FLAVOR="mysql" make install

3.2 設定配置檔

接下來要設定 Dovecot 的設定檔,我們預計啟用 imap pop3 和它們的 ssl 連線。我們也同時開啟了 Dovecot 自帶的 Managesieve 務,還另外設定了 LDA 的 deliver 服務,這樣才能幫我們控制 quota 和 sieve 的功能。設定完主要設定檔之後,我們還要設定供 userdb 和 passdb 存取的 sql 設定檔 dovecot-mysql.conf。
/etc/dovecot.conf
# 設定 chroot 目錄
base_dir = /var/dovecot/
# 設定要啟用的服務 ( 沒打算使用 managesieve 請刪掉)
protocols = imap imaps pop3 pop3s managesieve
# 指定要監聽的 ip 和 port 這裡用預設就可以
listen = *, [::]
#禁止明碼認證,這裡要選 no
disable_plaintext_auth = no
# ssl cert 存放的位置
ssl_cert_file = /etc/ssl/dovecotcert.pem
# 登入時使用的目錄
login_dir = /var/dovecot/login
# 是否使用 chroot ,這裡選 yes
login_chroot = yes
# 認證時預設的user
login_user = _dovecot
# 郵件存放的位置
mail_location = maildir:/var/vmail/%d/%n
# 有存取郵件權限的 uid 和 gid
mail_uid = 2000
mail_gid = 2000

protocol imap {
  # 使用 quota 套件
  mail_plugins = quota imap_quota
}

protocol pop3 {
  # 使用 quota 套件
  mail_plugins = quota
}

protocol lda {
  # 設定deliver 預設的管理者信箱
  postmaster_address = postmaster@skycat.no-ip.org
  # 使用 quota 和 sieve 套件 (不使用 sieve 的請刪除)
  mail_plugins = quota cmusieve
  # 指定 sendmail 的位置
  sendmail_path = /usr/local/sbin/sendmail
  # 指定auth-master socket 的位置
  auth_socket_path = /var/dovecot/auth-master
}

# 設定 managesive 監聽的 port (不使用 managesieve 的請刪除)
protocol managesieve {
  listen = *:2000
}

# 預設的登入網址
auth_default_realm = skycat.no-ip.org
# 認證過程和除錯,有問題再開吧
auth_verbose = no
auth_debug = no

auth default {
  # 使用明碼,沒辦法,讓outlook收信的話只能用這個
  mechanisms = plain
  # 設定 userdb 和 passdb 的 sql 設定檔
  passdb sql {
    args = /etc/dovecot-mysql.conf
  }
  userdb sql {
    args = /etc/dovecot-mysql.conf
  }
  # auth-login 預設的使用者
  user = root
  socket listen {
    master {
      # 供 LDA 用的 socket,預設擁有者要有存取 /var/vmail 的權限
      path = /var/dovecot/auth-master
      mode = 0600
      user = vmail
      group = vmail
    }
    client {
     # 供 postfix sasl 認證的socket 建立在 /var/spool 裡,這樣 postfix 就能在chroot 下存取它
      path = /var/spool/postfix/private/auth
      mode = 0660
      # 要有被 postfix 存取的權限
      user = _postfix
      group = wheel
    }
  }
}

plugin {
  quota = maildir
  # 設定預設執行的script,在這裡的設定是by user的 (不使用 sieve的請刪除)
  sieve = /var/vmail/%u.sieve
}


/etc/dovecot-mysql.conf
driver = mysql
connect = host=127.0.0.1 dbname=mail user=vmail password=vmail
default_pass_scheme = CRYPT
password_query = SELECT CONCAT(account, '@', domain) AS user, password FROM users \
       WHERE account = '%n' AND domain = '%d' AND active = 1
user_query = SELECT uid, gid, home, maildir AS mail, CONCAT('*:storage=', quota) \
       AS quota_rule FROM users WHERE  account = '%n' AND domain = '%d' AND active = 1

然後設定 /etc/ssl/dovecot-openssl.cnf 檔,建立 /etc/ssl/dovecotcert.pem

/etc/ssl/dovecot-openssl.cnf
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
# country (2 letter code)
C=TW

# State or Province Name (full name)
ST=Taiwan

# Locality Name (eg. city)
L=Taoyuan

# Organization (eg. company)
O=HOME

# Organizational Unit Name (eg. section)
OU=IMAP server

# Common Name (*.example.com is also possible)
CN=mail.skycat.no-ip.org

# E-mail contact
emailAddress=postmaster@skycat.no-ip.org

[ cert_type ]
nsCertType = server

# /usr/local/sbin/dovecot-mkcert.sh

最後我們可以設定在開機時啟動 Dovecot
/etc/rc.local
if [ -x /usr/local/sbin/dovecot ]; then
        echo -n ' dovecot';       /usr/local/sbin/dovecot >/dev/null 2>&1
fi

3.3 設定Postfix 使用 Dovecot deliver

要讓 Postfix 使用 Dovecot 作為 deliver ,這樣我們的quota 和 sieve 功能才能生效,要在 main.cf 和 master.cf 增加設定值:
/etc/postfix/main.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

/etc/postfix/master.cf
dovecot unix    -       n       n       -       -       pipe
    flags=DRhu  user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver  -f ${sender} -d ${recipient}

記得重新啟動 Postfix
# postfix reload

沒有留言: