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
データベースの作成
以下の様なデータベースを作成します。
(pgsqlユーザは、localhostからのみパスワード無しでログイン可能)
| データベース名 | 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)を実行する。
先程作成した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テーブルに以下の様なレコードを追加します。
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コマンドを利用して取得できます。
phpのcrypt()などでも生成できます。
C言語の場合も、crypt()関数で生成できます。
詳しくは、
# 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テーブルにフィールドを追加し、そのフィールドの値により、有効なアカウントかどうかを判定させる様にする。
(無効の場合、メールクライアントからの接続が拒否される。)
追加する列は以下です。
これで、passwdテーブルのdisabledフィールドの値が「no」以外の人は認証に失敗します。
(無効の場合、メールクライアントからの接続が拒否される。)
追加する列は以下です。
フィールド名 : 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」以外の人は認証に失敗します。
Copyright ima All Rights Reserved.
