FreeBSD-5.3 courier-imap-3.0.8,1 postfix-2.1.5_1,1 postgresql-7.4.6

Courier-IMAPでのPOP3ユーザの管理をPostgreSQLで行う為の設定方法です

本設定は、postfixでpop before smtp(FreeBSD-5.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

データベースの作成

以下の様なPostgreSQLデータベースを作成します

データベース名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の再起動

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アクセス権限の付与

courierimapuserユーザが、先ほど作成したテーブル(passwd)にアクセスできる様に権限を与えます

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

Courier-imapの設定

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テーブルに以下の様なレコードを追加します。

idfoo ※ここで指定した値がメールクライアントでのユーザIDとなります
crypt(abcを暗号化した値)
namefoo
uidfooユーザのuid
gidfooユーザのgid
ghomeid/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」以外の人は認証に失敗します

関連ページ