FreeBSD - Courier-IMAPでPOP3ユーザの管理をPostgreSQLで行う

Courier-IMAPでのPOP3ユーザの管理をPostgreSQLで行う為の設定方法です。
本設定は、postfixでpop before smtp(FreeBSD-5.3の場合)で設定が正しく
行われている状態での設定手順です。


対象OS、バージョン

  • FreeBSD-5.3
  • courier-imap-3.0.8,1
  • postgresql-7.4.6
  • postfix-2.1.5_1,1
  • drac-1.12_3

Courier-IMAPの再インストール

WITH_POSTGRESQL=yes付きで再インストールします。

/usr/local/etc/pkgtools.confの変更

/usr/local/etc/pkgtools.confのMAKE_ARGSの部分の以下
'mail/courier-imap'      => 'WITH_DRAC=yes',

'mail/courier-imap'      => 'WITH_POSTGRESQL=yes WITH_DRAC=yes',
の様に、WITH_POSTGRESQL=yes を追加します。

強制再インストール

rootで以下を実行します。
#portinstall -f mail/courier-imap


データベースの作成

以下の様なデータベースを作成します。
データベース名 courierimap
データベースオーナー pgsql
データベースアクセスユーザ courierimapuser
データベースアクセスユーザパスワード xxxx

postgresqlデータベースアクセスユーザ(courierimapuser)の作成

# su - pgsql
# createuser -A -D -P courierimapuser
# exit
※パスワードを聞かれるので、パスワードを入力(xxxx)する。

データベース(courierimap)の作成

# su - pgsql
# createdb --encoding=EUC_JP courierimap
# exit

/usr/local/pgsql/data/pg_hba.confへの追加

local courierimap pgsql                             trust
local courierimap all                               password
host  courierimap all  127.0.0.1  255.255.255.255   password
host  courierimap all  0.0.0.0    0.0.0.0           reject
これで、pgsqlユーザ以外はパスワード認証にてログインすることのみ許可される設定となる。
(pgsqlユーザは、localhostからのみパスワード無しでログイン可能)

/usr/local/pgsql/data/postgresql.confの変更

tcpip_socket = true

 ※falseまたはコメントアウトされている場合のみ

postgresqlの再起動

# /usr/local/etc/rc.d/010.pgsql.sh restart


テーブルの作成

courierimapデータベースに passwd というテーブルを作成する。

SQLファイルの作成

以下のSQL文のテキストファイル(/tmp/passwd.sql)を作成する。
DROP TABLE passwd;
CREATE TABLE passwd (
        id                    varchar(128) DEFAULT ''      NOT NULL,
        crypt                 varchar(128) DEFAULT ''      NOT NULL,
        clear                 varchar(128) DEFAULT ''      NOT NULL,
        name                  varchar(128) DEFAULT ''      NOT NULL,
        uid                   int4         DEFAULT '10000' NOT NULL,
        gid                   int4         DEFAULT '10000' NOT NULL,
        home                  varchar(255) DEFAULT ''      NOT NULL,
        maildir               varchar(255) DEFAULT ''      NOT NULL,
        defaultdelivery       varchar(255) DEFAULT ''      NOT NULL,
        quote                 varchar(255) DEFAULT ''      NOT NULL,
        PRIMARY KEY (id)
);

SQLファイルの実行

psqlでcourierimapデータベースに接続し、
先程作成したSQL文のテキストファイル(/tmp/passwd.sql)を実行する。
# psql -U pgsql courierimap
courierimap=>\i /tmp/passwd.sql
courierimap=>\q
#

テーブル(passwd)へのcourierimapuserアクセス権限の付与

# psql -U pgsql courierimap
courierimap=> grant all on passwd to courierimapuser;
courierimap=>\q


Courier-imapの設定

PostgreSQLデータベースを参照する様に設定する。

/usr/local/etc/courier-imap/authpgsqlrcの設定

以下を設定する。
PGSQL_HOST              localhost
PGSQL_PORT              5432
PGSQL_USERNAME          courierimapuser
PGSQL_PASSWORD          xxxx
PGSQL_DATABASE          courierimap
PGSQL_MAILDIR_FIELD     maildir

/usr/local/etc/courier-imap/authdaemonrcの設定

以下を設定する。
authmodulelist="authpgsql"
authmodulelistorig="authpgsql"

Courier-imapの再起動

POP3サーバを再起動する。
# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart


ユーザ情報の追加

FreeBSD上のアカウントとして存在しているユーザ(例 foo)を
courierimapデータベース上のpasswdテーブルに追加します。
passwdテーブルに以下の様なレコードを追加します。
-- passwdフィールド --  -- 設定する値 --
id                      foo    <= ここで指定した値がメールクライアントでのユーザIDとなる。
crypt                   (abcを暗号化した値)
name                    foo(何でも良い)
uid                     fooユーザのuid
gid                     fooユーザのuid
home                    /home/foo/
maildir                 /home/foo/Maildir/

パスワードの暗号化について

/usr/local/sbin/userdbpwコマンドを利用して取得できます。
# userdbpw
# Passrowd: xxxx
# Reenter password: xxxx
# tOOFDlPNIrZfU    <-- これが暗号化されたパスワード
また、PostgreSQL-contribのpgcrypto関数群を導入していると、
update paqsswd set crypt = crypt('abc',gen_salt('MD5')) where id= 'foo';
又は
update paqsswd set crypt = crypt('abc',gen_salt('ad')) where id= 'foo';
のSQL文で直接登録できます。
phpのcrypt()などでも生成できます。
C言語の場合も、crypt()関数で生成できます。
詳しくは、
# man 3 crypt
で。


動作確認

適当なメールクライアントから、
ユーザID   : foo
パスワード : 設定したパスワード
サーバ     : courier-imapが起動しているサーバ
でメールが受信できることを確認する。

その他

アカウントの有効/無効を管理する

passwdテーブルにフィールドを追加し、そのフィールドの値により、有効なアカウントかどうかを判定させる様にする。
(無効の場合、メールクライアントからの接続が拒否される。)
追加する列は以下です。
フィールド名 : disabled
型           : varchar(10)
初期値       : no

passwd表への追加

以下の手順で追加します。
# psql -U pgsql courierimap
#courierimap => alter table passwd add disabled varchar(10);
#courierimap => alter table passwd alter disabled set default 'no';
#courierimap => update passwd set disabled = 'no';   ->これで既存データをすべてnoにする。
#courierimap => \q
#

/usr/local/etc/courier-imap/authpgsqlrcの変更

以下を追加する。
PGSQL_WHERE_CLAUSE    disabled='no'

courier-imapの再起動

POP3サーバを再起動する。
# /usr/local/etc/rc.d/courier-imap-pop3d.sh restart

これで、passwdテーブルのdisabledフィールドの値が「no」以外の人は認証に失敗します。