harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

courier-mta+phpcourier

   


編集日:2006/03/14

courier-mta+phpcourier

courier-mta。
MySQLと連動したアカウント管理ツールにphpcourierを使用。

参照サイト

  • php-courier
    [MySQLを利用したwebアカウント管理ツール]postfixadminのcourier版
    http://phpcourier.sourceforge.net/
    日本語の情報が無いので設定は上記サイトのほかアーカイブ内のドキュメントを参照。

構築環境

pop3/imap認証にはcourier-authlibを使用するので
こちらは事前にインストールしておく。
またcourier-imapが動作している場合、
後ほどコンパイルするcourier-imapdとコンフリクトするので
アンインストールしておく。
※そのままでも恐らく使えるが、設定ファイルが分散&起動デーモンが増えるのが微妙。

パッケージのビルドとインストール

courierのアプリはroot権限でのビルド/コンパイルが出来ないので
一般ユーザーで実行する。

# pwd
/home/testuser/rpm/SOURCE
# wget http://jaist.dl.sourceforge.net/sourceforge/courier/courier- 0.50.0.tar.bz2 
# rpmbuild -ta courier-0.50.0.tar.bz2

コンパイルに成功すると以下のパッケージが出来上がる。

courier-0.50.0-1.4ES.src.rpm
courier-0.50.0-1.4ES.i386.rpm
courier-ldap-0.50.0-1.4ES.i386.rpm
courier-mysql-0.50.0-1.4ES.i386.rpm
courier-pgsql-0.50.0-1.4ES.i386.rpm
courier-pop3d-0.50.0-1.4ES.i386.rpm
courier-imapd-0.50.0-1.4ES.i386.rpm
courier-webmail-0.50.0-1.4ES.i386.rpm
courier-webadmin-0.50.0-1.4ES.i386.rpm
courier-mlm-0.50.0-1.4ES.i386.rpm
courier-maildrop-0.50.0-1.4ES.i386.rpm
courier-fax-0.50.0-1.4ES.i386.rpm
courier-maildrop-wrapper-0.50.0-1.4ES.i386.rpm
courier-debuginfo-0.50.0-1.4ES.i386.rpm

上記のうち、fax、ldap、pgsqlを除いたパッケージを
インストールする。

courier-0.50.0-1.4ES
courier-webadmin-0.50.0-1.4ES
courier-authlib-devel-0.56-1.4ES
courier-imapd-0.50.0-1.4ES
courier-authlib-debuginfo-0.56-1.4ES
courier-debuginfo-0.50.0-1.4ES
courier-mysql-0.50.0-1.4ES
courier-authlib-mysql-0.56-1.4ES
courier-maildrop-0.50.0-1.4ES
courier-mlm-0.50.0-1.4ES
courier-webmail-0.50.0-1.4ES
courier-maildrop-wrapper-0.50.0-1.4ES
courier-pop3d-0.50.0-1.4ES

環境設定[初期設定]

設定ファイルは/etc/courier以下に展開される。
初期設定ファイルはなぜか用意されていないので、自分でtouchして編集する。
書式はqmailに似ている。

  • me 自ホスト名を記入
    mail.example.com
  • defaultdomain ドメインの無いアドレスを補完するドメイン記入
    example.com

    rootは、 <root@example.com> となります。

  • locals ローカルで受けるドメインを入力(デフォルトドメイン用)
    localhost
    example.com
    example.net 

    user@example.comへのメールはアカウント "user" へ届けられます。
    user@example.netへのメールもアカウント "user" へ届けられます。

  • hosteddomains ローカルで受けるドメインを記載(バーチャルアカウント用)
    example.com
    example.net

    user@example.comへのメールは、アカウント "user@example.com"へ届けられます。
    user@example.netへのメールはアカウント "user@example.net" へ届けられます。
    ※変更後には makehosteddomains が必要

  • esmtpacceptmailfor SMTPで受け付けるドメインを全て記載。
    example.com
    example.net
    mail2ndry.example.org 
  • aliases/system システムアカウントのaliasを記載。
    今回はphpcourierを使用するので未使用。
  • esmtpd
    変更箇所

    73c73
    < ESMTP_LOG_DIALOG=0
    ---
    > ESMTP_LOG_DIALOG=1
    267c268,269
    < TCPDOPTS="-stderrlogger=/usr/sbin/courierlogger"
    ---
    > #TCPDOPTS="-stderrlogger=/usr/sbin/courierlogger"
    > TCPDOPTS="-stderrlogger=/usr/sbin/courierlogger -nodnslookup -noidentlookup"
    281c284,286
    < ESMTPAUTH=""
    ---
    > AUTHMODULES="authdaemon"
    > ESMTPAUTH="LOGIN CRAM-MD5"
    > #ESMTPAUTH=""
    326c331
    < ESMTPDSTART=NO
    ---
    > ESMTPDSTART=YES 

設定DBの更新

postmapやpostaliasと同様、DBの更新を行う。
初めて実行する場合はDBファイルが作成される。

  • hosteddomains
    # /usr/lib/courier/sbin/makehosteddomains
  • esmtpacceptmailfor
    # /usr/lib/courier/sbin/makeacceptmailfor
  • aliases
    # /usr/lib/courier/sbin/makealiases

デーモン設定

authlibやpop3/imap、esmtpの設定を行う。

  • authlib
    • /etc/authlib/authdeamonrc
      25c25
      < # can use are: authuserdb authpam authldap authmysql authcustom authpipe
      ---
      > # can use are: authuserdb authpam authpgsql authldap authmysql authcustom authpipe
      27c27,28
      < authmodulelist="authuserdb authpam authldap authmysql authcustom authpipe"
      ---
      > #authmodulelist="authuserdb authpam authpgsql authldap authmysql authcustom authpipe"
      > authmodulelist="authmysql"
      34c35,36
      < authmodulelistorig="authuserdb authpam authldap authmysql authcustom authpipe"
      ---
      > #authmodulelistorig="authuserdb authpam authpgsql authldap authmysql authcustom authpipe"
      > authmodulelistorig="authmysql"
      75c77
      < DEBUG_LOGIN=0
      ---
      > DEBUG_LOGIN=2
    • /etc/authlib/authmysqlrc
      下記phpcourierの設定を参照。
  • pop3/imap
    デフォルトで起動するので初期設定は不要。
    tlsやsaslを使う場合は要編集&証明書を用意する。
  • esmtp
    デフォルトでは起動しないので起動を有効にする。

    • /etc/courier/esmtpd
      ESMTPDSTART=YES

      smtp認証はデフォルトで有効になっているv(^o^)v
      が、初期設定のままメーラーからメールを送信すると妙にレスポンスが悪いので
      要検証。

Maildir設定

※今回はphpcourierで運用するので以下を参照。

phpcourierのインストールと設定

  • ダウンロードと展開
    アーカイブをダウンロード&展開後、apacheのdocumentrootに移動する。

    # cd /usr/local/src/
    # wget http://jaist.dl.sourceforge.net/sourceforge/phpcourier/phpcourier1.5.tgz
    # tar -zxvf phpcourier1.5.tgz
    # cp -pR phpcourier/ /var/www/html/
  • DB作成
    展開したファイル内にsqlファイルがあるので、それをもとにDBを作成。
    下記はテスト環境なのでrootで作成してしまったが、実際に作成する場合は
    専用ユーザーを作成しておくべき。

    # cd /var/www/html/phpcourier/
    # mysql -uroot -p******
    mysql> create database phpcourier;
    Query OK, 1 row affected (0.00 sec)
    • 専用ユーザーphpcourierを作成する場合の例
      mysql> create database phpcourier;
      mysql> GRANT ALL ON phpcourier.* TO phpcourier@localhost IDENTIFIED BY '*******';
  • DBへテーブル投入
    mysql> source sql/remake.sql;
  • DBを確認。
    mysql> use phpcourier;
    Database changed
    mysql> show tables;
    +----------------------+
    | Tables_in_phpcourier |
    +----------------------+
    | Accounts             |
    | Aliases              |
    | DomainAccess         |
    | Domains              |
    | Forwards             |
    | Mail                 |
    | Sessions             |
    | UpdateTime           |
    +----------------------+
    8 rows in set (0.00 sec) 
    
    mysql> quit
  • 設定ファイルの編集。
    設定ファイルはglobals.php。これを編集する。
    編集箇所は主にMySQLの設定とID/パスワード、courierが使用する
    コマンドのパスの変更(変更が有る場合)など。
    またapacheユーザーで動作するのでcommongrpをapacheに更新。
  • 変更箇所:
    11c11
    < $mysql['password']                    = "";
    ---
    > $mysql['password']                    = "********";
    32c32,33
    < $commongrp                            = "vmail";
    ---
    > #$commongrp                           = "vmail";
    > $commongrp                            = "apache";
  • メール配信ディレクトリの作成
    postfixadminのvirtualディレクトリと同様、
    受信したメールファイルを置くユーザーとディレクトリを作成。
    基本は/home/vmail←/home以下に設置するのがグッド。
    オーナーはapache。

    # useradd vmai
    # chmod 775 /home/vmail
    # chown apache:vmail /home/vmail
  • crontabの設定
    util/以下に有るextractスクリプトを実行するための
    crontabを登録する。
    extractはドメイン/エイリアスの最終更新時刻を更新するためのperlスクリプト。
    デフォルトのcron記入例は以下のとおり。15分ごとに更新する。

    # crontab -e
    0-59/15 * * * * root /var/www/html/phpcourier/util/extract
  • authlib設定
    docs/authmysqlrcを参考に、authmysqlrcを編集する。
    認証時に見に行くフィールドを変更したい場合は直接テーブルを
    参照してもオッケー。

    26,28c26,28
    < MYSQL_SERVER          mysql.example.com
    < MYSQL_USERNAME                admin
    < MYSQL_PASSWORD                admin
    ---
    > MYSQL_SERVER          localhost
    > MYSQL_USERNAME                root
    > MYSQL_PASSWORD                ********
    35c35
    < # MYSQL_SOCKET                /var/mysql/mysql.sock
    ---
    > MYSQL_SOCKET          /var/lib/mysql/mysql.sock
    42c42
    < MYSQL_PORT            0
    ---
    > MYSQL_PORT            3306
    54c54
    < MYSQL_DATABASE                mysql
    ---
    > MYSQL_DATABASE                phpcourier
    61c61
    < MYSQL_USER_TABLE      passwd
    ---
    > MYSQL_USER_TABLE      Mail
    70c70
    < MYSQL_CRYPT_PWFIELD   crypt
    ---
    > MYSQL_CRYPT_PWFIELD   CryptPass
    75c75
    < # MYSQL_CLEAR_PWFIELD clear
    ---
    > MYSQL_CLEAR_PWFIELD   ClearPass
    83c83
    < # DEFAULT_DOMAIN              example.com
    ---
    > #DEFAULT_DOMAIN               example.com
    91c91
    < MYSQL_UID_FIELD               uid
    ---
    > MYSQL_UID_FIELD               10001
    97c97
    < MYSQL_GID_FIELD               gid
    ---
    > MYSQL_GID_FIELD               10001
    106c106
    < MYSQL_LOGIN_FIELD     id
    ---
    > MYSQL_LOGIN_FIELD     UserName
    111c111
    < MYSQL_HOME_FIELD      home
    ---
    > MYSQL_HOME_FIELD      Home
    117c117
    < MYSQL_NAME_FIELD      name
    ---
    > MYSQL_NAME_FIELD      UserName
    128c128
    < # MYSQL_MAILDIR_FIELD maildir
    ---
    > #MYSQL_MAILDIR_FIELD  MailboxName
    143c143
    < # MYSQL_QUOTA_FIELD   quota
    ---
    > MYSQL_QUOTA_FIELD     quota
  • グループ設定
    最後に、実行ユーザーとなるapacheユーザーをvmailグループに追加する。

    # vigr
    vmail:x:10001:apache

起動

smtp/popの起動は全サービスがひとつのinitスクリプトに集約されるので
起動するのはcourier-authlibとcourie(mta本体)の2つのみでOK。
※先にcourier-authlibを起動しておく。

# /etc/init.d/courier-authlib start
Starting Courier authentication services: authdaemond
# /etc/init.d/courier start
courierfilter webmail courierd esmtpd esmtpd-msa pop3d pop3d-ssl imapd imapd-ssl
#

テスト送受信

ブラウザからphpcourierへアクセスし、DBにてアカウントを作成。
その後、OutLookExpressで送受信テストを行う。

受信:OK
送信:外部ドメインへの送信はOKだが
ローカルアカウントへの配信でパーミッションエラー発生。
該当ディレクトリのパーミッションを変更して一旦解消したが
実行ユーザーの確認と設定を要調査。
恐らくphpcourierの設定に依存すると思われる。

smtp認証

smtp認証の設定はデフォルトで設定ファイル内に
ディレクティブが用意されているので速攻で実装可能(^▽^喜)

smtp認証の設定は/etc/courier/esmtpdファイル内の
AUTH_REQUIREDディレクティブで有効/無効化する。
デフォルトは無効となっている。

AUTH_REQUIRED=0	無効 
↓
AUTH_REQUIRED=1	有効

その他、認証デーモンの指定や認証タイプを指定する。

編集したらデーモンを再起動。

# /etc/init.d/courier restart

その後、telnetコマンドで確認。

[root@mailsvr courier]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.example.com ESMTP
ehlo localhost
250-mail.example.com Ok.
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN X-NETSCAPE-HAS-BUGS
250-STARTTLS
250-XVERP=Courier
250-XEXDATA
250-XSECURITY=NONE,STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE
250 DSN
quit
221 Bye.
Connection closed by foreign host.
[root@mailsvr courier]#

こちらも送受信は正常性を確認。

TLS暗号化

暗号化はデフォルトで設定ファイルが用意されているので
こちらも証明書を用意すればすぐ実装可能ヽ(*^。^*)ノ
対象ファイルは/etc/courier/esmtpd-ssl
※今回はまだ編集中。

懸案事項

  • sendmailとの互換性はどのくらいまであるのか?
    →courierのバイナリ保存ディレクトリにsendmailコマンドがあるので
    シンボリックリンクの設定で対応可能。
  • smtp認証をNWごとに変更することが出来るか?
    社内NWは認証不要、社外からのみ認証を必須としたいので
    指定したNWは認証を許可する、などの設定。
  • pop3/smtp認証時のパスワードが2種類保存される(clear/平文とcrypt/暗号)が
    認証に使用するパスワードがclearのため、平文のままパスワードがログに残される。
    ログレベルの指定でログに残さない設定は可能だが、スニッフィングの危険大。
    というかsmtp認証の意味が無い。暗号化パスワードでの認証設定を要確認。

認証パスワードの変更

pop3/smtp登録/認証時に使用されるパスワードがデフォルトではClearPassと
なっているため、これをCryptPassに変更。
phpcourierの各ファイルを編集して対応する。

対象ファイル:phpcourier/editmbx.php

# diff editmbx.php.org editmbx.php
150c150,151
<                               "CryptPass = NULL, " .
---
> #                             "CryptPass = NULL, " .
>                               "CryptPass = PASSWORD ('$_POST[password]'), " .
173c174,175
<                               "CryptPass = NULL, ";
---
> #                             "CryptPass = NULL, ";
>                               "CryptPass = PASSWORD ('$_POST[password]'), ";
309c311
<               " UserName, ClearPass, AliasLimit, Uid, Gid, Home, Quota, FullName, " .
---
>               " UserName, CryptPass, ClearPass, AliasLimit, Uid, Gid, Home, Quota, FullName, " .
315a318,319
> #             " '$_POST[accountpwd]'," .
>               " PASSWORD ('$_POST[password]')," .

これでテーブルMailにcryptパスワードを格納可能。
だが、pop3側の認証が対応していないため、実質利用できず。
同様にauthmysqlを使用するsmtp認証も使用不可。

  • →結論
    pop3/smtp認証にはcleartextのみ使用可能(→暗号化しないと実装は現実的ではない)
    →暗号化の検証が必要?情報収集せねば。

コメント








 - GNU/Linux, MAIL, MySQL