dovecot + mysql

説明

virtual domain 対応 postfix + dovecot + mysql システムの一環として、
dovecot + mysql を構築する。

 
 

入手

公式サイト: Dovecot
Download ページを選択。

 

必要環境

 

インストール

  1. アーカイブの入手と準備
    $ wget http://dovecot.org/releases/1.1/dovecot-1.1.1.tar.gz
    $ tar xvzf dovecot-1.1.1.tar.gz -C /usr/local/src/build/
    $ cd /usr/local/src/build/dovecot-1.1.1
    $ vi ./Config.sh
    
    CPPFLAGS=-I/usr/local/ssl/include LDFLAGS=-L/usr/local/ssl/lib
    ./configure \
    --prefix=/usr/local/SOFTWARE/dovecot-1.1.1 \
    --with-linux-quota=2 \
    --with-mysql \
    --with-ssl=openssl \
    --with-ssldir=/usr/local/ssl/etc \
    2>&1 | tee configure.log

  2. ビルド
    $ sh Config.sh
    $ make 2>&1 | tee make.log
    $ sudo make install 2>&1 | tee install.log

  3. stow (1) を使いシンボリックリンク作成
    $ su -
    # stow -t /usr/local/ /usr/local/SOFTWARE/dovecot-1.1.1/
  1. 設定ファイル雛型のコピー
    # cd /uet/local/etc
    # cp dovecot-example.conf dovecot.conf
    # cp dovecot-sql-example.conf dovecot-sql-.conf

  2. 起動スクリプト作成
    dovecot wiki 内 Sample Dovecot init.d script のサンプルを環境にあわせて変更したものを使用。
 
 

設定ファイル

dovecot.conf で dovecot 全体の設定、
dovecot-sql.conf では mysql に問い合わせる際に必要な設定を行う。

認証パスワード等を記載するので、管理者以外読み込めなくしておく。

# chmod 600 dovecot.conf dovecot-sql.conf
 
 
  1. devcot.conf
    # 指定しない場合は /usr/local/dovecot/var/run が適用される
    base_dir = /var/run/dovecot/ 
    # 扱う protocol を指定
    protocols = imaps pop3s
    
    # 受付 port 番号を指定
    protocol imap {
     listen = *:143
     ssl_listen = *:993
    }
    protocol pop3 {
     listen = *:110
     ssl_listen = *:995
    }
    
    # plaintext での認証をデフォルト拒否する
    # SSL 接続やローカルホストからの接続は受け付ける
    disable_plaintext_auth = yes
    
    # syslog とは別にログを取得する場合に指定
    log_path = /var/log/dovecot/err.log
    info_log_path = /var/log/dovecot/info.log
    
    # ssl 通信に必要なサーバー鍵を指定
    ssl_cert_file = /usr/local/etc/postman.pem
    ssl_key_file = /usr/local/etc/newkey.pem
    
    # ログイン認証時に chroot する
    login_dir = /var/run/dovecot/login
    login_chroot = yes
    login_user = dovecot
    
    # バーチャルドメイン共通メールボックスを指定
    # postfix 及び postfix-admin での指定に合わせる
    # /path/to 部:postfix
    #   /%d/%n 部:postfix-admin
    mail_location = maildir:/path/to/%d/%n
    first_valid_uid = 10000
    
    # 各プロトコルで使用する plugin を指定
    protocol imap {
     mail_plugins = quota imap_quota
    }
    protocol pop3 {
     mail_plugins = quota
    }
    
    protocol lda {
     # 拒否メールを送るときに使うアドレス。
     postmaster_address = postmaster@example.com
    
     # Message-Id などのメールの送信で色々な部分で使うホスト名。
     # デフォルトはシステムでの実際のホスト名。
     hostname = postman.tukizakura.org
    }
    
    # 認証設定
    auth default {
      # 認証メカニズムを列挙する。クライアントととのパスワード交換時に使う。
      # 通常は plain のまま (apop 使用時は apop も指定)
      mechanisms = plain
    
      # mysql 使用時にパスワード、ユーザデータを問い合わせする
      # SQL クエリを設定しているファイルを指定する。
      passdb sql {
        args = /usr/local/etc/dovecot/dovecot-sql.conf
      }
      userdb sql {
        args = /usr/local/etc/dovecot/dovecot-sql.conf
      }
    
      #ユーザデータベースとパスワードデータベースにアクセスする時のユーザ
      user = root
    
      #他のプログラムに提供する認証のインタフェース
      socket listen {
        master {
          path = /var/run/dovecot/auth-master
          mode = 0600
        }
        # postfix で smtp-auth を行う設定
        client {
         path = /var/spool/postfix/private/auth
         user = postfix
         group = postfix
         mode = 0660
        }
      }
    }
    
    プラグイン全般の設定
    plugin {
      # quota 方式の指定
      quota = maildir
      # 全てのメールボックスを指定サイズに制限
      quota_rule = *:storage=256MB
    
      # ユーザ個別 quota を mysql に問い合わせる設定
      # 固定 uid/gid で管理している場合は uid/gid を固定で指定
      user_query = select home, 10000 as uid, 10000 as gid \
       concat('*:bytes=', quota) as quota_rule \
       from mailbox where username = '%u' and active = '1'
    
      # 指定% になった時に実行するプログラムの指定
      quota_warning = storage=90%% /usr/local/bin/quota-warning.sh 90
    }


  2. dovecot-sql.conf
    driver = mysql
    # mysql に収納さているパスワードの方式を指定(postfixadminの設定にあわせる)
    default_pass_scheme = MD5-CRYPT
    
    # ローカルホスト上の DB の場合は、unix ソケットを指定する
    connect = host=/var/run/mysqld/mysqld.sock \
              dbname=postfixDB名 user=postfixユーザ password=postfixパス
    
    # 固定 uid/gid で管理している場合は uid/gid を固定で指定
    user_query = SELECT concat('/usr/local/virtual/', maildir) as home, \
      10000 as uid, 10000 as gid FROM mailbox WHERE username='%u' AND active='1'
    
    password_query = \
      SELECT username, domain, password \
      FROM mailbox WHERE username='%u' AND active='1'


  3. quota warnning script
    # vi /usr/local/SOFTWARE/dovecot-1.1.1/sbin/quota-warning.sh
    # ln -s /usr/local/SOFTWARE/dovecot-1.1.1/sbin/quota-warning.sh \
        /usr/local/sbin/quota-warning.sh
    
    #!/bin/bash
    PERCENT=$1
    echo "Your mailbox is now $PERCENT% full." \
      | /usr/bin/mail -s "<Tukizakura Mail System> Important report "$USER"

 
 

認証に関して


⇒ See Also: ユーザ認証の理解


セキュリティ確保の為に、認証及び、パスワード自体の暗号化が求められる。
この二つの暗号化はやもすると混同しがちになるが、基本的に下記のようになる。

  • 認証のメカニズム
    認証時のクライアント/サーバ間のやり取りに使用する暗号化。
    通信を傍受された場合等への対処として、生のテキスト(plaintext)で送受信せずにデータを暗号化する。
    sylpheed 等の MUA ~ Dovecot 間、postfix での SMTP-AUTH 使用時の MTA ~Dovecot 間で使い、
    それぞれが使用する認証メカニズムに対応している必要がある。
    これには PLAIN を含め、CRAM-MD5, DIGEST-MD5, APOP 等を指定する。

    auth default {
       mechanisms = plain
    } 

  • パスワード暗号化
    サーバがクラックされた時等に、パスワード本体がそのままでは読まれないようにする為の暗号化。
    多数の異なるフォーマットを扱える。
    CRYPT, MD5, PLAIN-MD5, HMAC-MD5, DIGEST-MD5, SHA, SSHA, PLAIN
    default_pass_scheme = MD5-CRYPT

  • 注意点
    認証メカニズム間の互換性が無い為に下記2点の制限がある。

    1. 複数のメカニズムを使用する場合、パスワード本体は PLAIN である事が必要。
    2. パスワード側が暗号化(PLAIN でない)されている場合は、認証メカニズムをパスワードの暗号方式に合わせるか、
      もしくは PLAIN 方式でなくてはならない。

    通常はパスワードが何かしらの形ですでに暗号化されている事から、2.の方式を取る事が多い。
    通信の傍受に対する危険については、POP3S, IMAPS などの SSL を使った通信にすれば問題が無くなる。

    システム全体の設計によるが、今回のシステムではそもそも postfix-admin で MD5-CRYPT を使用するので、自動的に 2. の形式をとる事となった。

    ProFTPd (FTP-SSL)       <--------|
    Postfix (SMTP-TLS)      <--------|
           |                         |
           |                    locale接続
       remote接続(SSL)               |
           |                        +--------> Dovecot-SASL <----------> MySQL (Postfix-Admin)
           |                [認証メカニズム PLAIN]        [パスワード方式 MD5-CRYPT]
       メール送信&FTP               |
    ===クライアント===            remote接続(SSL)
       メール受信                       |
           |                            |
    MUA(POP3S, IMAPS)          <--------|
 
 

扱うテーブルの内容

devcot がユーザ認証時に問い合わせる postfix-admin で作った DB & table

$ mysql -u root postfix

mysql> desc mailbox;
+----------+--------------+------+-----+---------------------+-------+
| Field    | Type         | Null | Key | Default             | Extra |
+----------+--------------+------+-----+---------------------+-------+
| username | varchar(255) | NO   | PRI |                     |       |
| password | varchar(255) | NO   |     |                     |       |
| name     | varchar(255) | NO   |     |                     |       |
| maildir  | varchar(255) | NO   |     |                     |       |
| quota    | bigint(20)   | NO   |     | 0                   |       |
| domain   | varchar(255) | NO   |     |                     |       |
| created  | datetime     | NO   |     | 0000-00-00 00:00:00 |       |
| modified | datetime     | NO   |     | 0000-00-00 00:00:00 |       |
| active   | tinyint(1)   | NO   |     | 1                   |       |
+----------+--------------+------+-----+---------------------+-------+


 
 

courier-imap Maildir から dovecot Maildir へコンバート

公式サイトで配布されているコンバートスクリプトを使用する。

$ ./courier-dovecot-migrate.pl
Finding maildirs under .
Maildir/courierimapuiddb: OK
Maildir/.Draft/courierimapuiddb: OK
Maildir/.Drafts/courierimapuiddb: OK
Maildir/.Sent/courierimapuiddb: OK
Maildir/.Trash/courierimapuiddb: OK

Total: 0 POP3 changes for 0 mailboxes / 0 users
       0 IMAP changes for 0 mailboxes / 0 users
       0 errors
No actual conversion done, use --convert parameter

$ ./courier-dovecot-migrate.pl --convert
Finding maildirs under .
Maildir/courierimapuiddb: OK
Maildir/.&g0l6Pw-/courierimapuiddb: OK
Maildir/.&kAFP4V+FMGE-/courierimapuiddb: OK
Maildir/.&kAFP4WOn-/courierimapuiddb: OK
Maildir/.&U9dP4Xux-/courierimapuiddb: OK
Maildir/.Draft/courierimapuiddb: OK
Maildir/.Drafts/courierimapuiddb: OK
Maildir/.Sent/courierimapuiddb: OK
Maildir/.Trash/courierimapuiddb: OK

Total: 0 POP3 changes for 0 mailboxes / 0 users
       0 IMAP changes for 0 mailboxes / 0 users
       0 errors
9 dovecot-uidlist files written


Maildir 内に dovecot 用ファイルが作成される。

  • Maildir/dovecot-uidlist
  • Maildir/subscriptions


/usr/local/virtula/-DOMAIN- 配下の-USER-という名前のディレクトリに mv し、
適切な所有者に変更しておく。

# mv /homu/-USER-/Maildir /usr/local/virtual/-DOMAIN-/-USER-
# chown -R vmail:vmail /usr/local/virtual/-DOMAIN-/-USER-
# rm -fr courierimap*
 
 

参考資料


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-11 (月) 17:51:40 (5744d)