qmail-ldap構築手順

qmail-ldapとは

qmail-ldapはAndre' Oppermann氏作のqmail用のパッチプログラムです。これは、qmailをldapで管理するためのもので、多くのドメインやメールアカウントを管理できます。弊社は1999年に初めてこのパッチを適用したqmailサーバーを構築しましたが、それ以来、全くトラブルなく運用しております。qmailは勿論、LDAPサーバーもOpenLDAP、ユーザーインターフェース用のDBもMySQLと、全てオープンソースで構築でき、しかも安定性が高いのでお勧めです。ただし、誰でも使える簡単なソフトではなく、SMTP、LDAPに関する知識は必要です。ここでは多少古い情報になりますが、その構築手順を公開したいと思います。最新のパッチはhttp://www.nrg4u.com/からダウンロードできます。また参考ページとしてLife With qmail-ldapをお勧めします。一部日本語訳もこちらにあるようです。

基本構成と目的

qmail-ldapはqmailをLDAPサーバーを参照して動かすようにするパッチプログラムです。目的はメールアカウントの管理を、データベースやWebプログラムを通して行なうためのもので、多くのアカウントを管理するのに適しています。ldapエントリでメール配送を制御し、アカウント管理そのものはDBを使い、さらにCGIでウェブからそれを管理する、というような使い方をします。

必要なもの

DBの設計

ユーザーのメールアカウントをどう管理したいかによって、データベースの設計をまず決めます。ユーザー管理とのからみもあるので、一概には言えませんが、シンプルにするなら以下のようになります。
create table mail ( uid varchar(16) not null primary key, upwd varchar(64) not null, alias varchar(64), domain varchar(64), local enum('Y','N'), quota int3, fwd1 varchar(128), fwd2 varchar(128), fwd3 varchar(128) ) engine=MyISAM; uidはユーザーID、upwdはユーザーパスワード、aliasはメールアドレスのID部分、domainはドメインです。localは転送設定時にローカル配送もするかどうか、quotaはメールボックス容量で、fwd1から3は転送先アドレスです。

また、CGIなどでアカウント管理をする際、データベースへのアクセスを確保する必要があります。仮にデータベースの名前をmaildbとすると、以下のように設定します。
% mysql -u root -p maildb mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> on maildb.* -> to mysql@localhost -> identified by 'PASSWORD'; Query OK, 0 rows affected (0.01 sec)

OpenLDAPのインストール

展開してインストール % gunzip openldap-release.tgz % tar -xvf openldap-release.tar % cd ldap % ./configure % make depend % make % su # make install
slapd.confの編集 /usr/local/etc/openldap/slapd.conf -rw------- 1 root wheel 1014 Oct 16 23:56 slapd.conf schemacheck on suffix "dc=youdomain, dc=com" directory /var/qmail/users rootdn "cn=root, dc=yourdomain, dc=com" index mail,mailAlternateAddress,uid index default none rootpw {crypt}$1$Hs$/.da.6lwJG1k1UIYZ8N8o/ index mail,mailAlternateAddress,uid index default none defaultaccess none access to dn=".*,dc=yourdomain, dc=com" by addr="XXX.XXX.XXX.XXX" write by addr="XXX.XXX.XXX.XXX" read
ldap.confの編集 /usr/local/etc/openldap/lapd.conf BASE dc=yourdomain, dc=com HOST mail.yourdomain.com PORT 389
slapd.oc.confの編集 以下を加える objectclass qmailUser requires objectclass, mail, uid allows mailMessageStore, homeDirectory, userPassword, mailAlternateAddress, qmailUID, qmailGID, mailQuota, mailHost, mailForwardingAddress, deliveryProgramPath, qmailDotMode, deliveryMode, mailReplyText, accountStatus

LDAPサーバーにエントリを加える

SLAPDをスタートしてエントリを追加する # /usr/local/libexec/slapd -f ./slapd.conf # ldapadd -D "cn=root, dc=yourdomain, dc=com" -w secret < qmail.ldif
しかし、ldapaddは1秒に3エントリぐらいしか入れられないので、大量のエントリを処理するのには不向き。その場合は、ldif2ldbmを使う。ただし、これは全データベースを初期化してしまうので、追加するのには使えません。使えるのは最初だけです。
# ldif2ldbm -i qmail.ldif -f slapd.conf ldifファイルの中身はこんな感じ。 最初の数行を忘れないこと。 dn: dc=yourdomain, dc=com dc: hogehoge o: infomani@ Inc objectclass: organization objectclass: dcObject dn: cn=myid, dc=yourdomain, dc=com cn: myid sn: yourdomain.com mail: myid@yourdomain.com mailHost: mail.yourdomain.com mailMessageStore: myid/ mailQuota: 3000 uid: myid userPassword: {crypt}$1$Io$49JPifEYTA/y3LsL1UB9z0 objectclass: person objectclass: qmailUser
試しに検索してみる。入れたLDAPエントリーが表示されれば成功。
% ldapsearch 'mail=myid@yourdomain.com' cn=myid,dc=n24, dc=net cn=myid sn=yourdomain.com mail=myid@yourdomain.com mailhost=mail.yourdomain.com mailmessagestore=myid/ uid=nao userpassword={crypt}$1$Io$49JPifEYTA/y3LsL1UB9z0 objectclass=person objectclass=qmailUser deliverymode=localdelivery

qmailのインストール

qmail-1.03とqmail-ldapをダウンロード、展開後、qmail-ldapパッチをあてる
% cd qmail-1.03 % patch -p1 < ../qmail-ldap-1.03-XXXXXXXX.patch .. . done %
Makefileを編集する % vi Makefile MDIRMAKE=-DAUTOMAILDIRMAKE HDIRMAKE=-DAUTOHOMEDIRMAKE QLDAPBIND=-DQLDAP_BIND LSPAWN_LOG=-DQLSPAWN_LOG -DLOG_LEVEL=4
ユーザー、グループ、ディレクトリを作成
/etc/group nofiles:*:81: qmail:*:82: # vipw alias:*:81:81::0:0:User &:/var/qmail/alias:/nonexistent qmaill:*:83:81::0:0:User &:/var/qmail:/nonexistent qmaild:*:82:81::0:0:User &:/var/qmail:/nonexistent qmailp:*:84:81::0:0:User &:/var/qmail:/nonexistent qmailq:*:85:82::0:0:User &:/var/qmail:/nonexistent qmailr:*:86:82::0:0:User &:/var/qmail:/nonexistent qmails:*:87:82::0:0:User &:/var/qmail:/nonexistent
qmailディレクトリを作成
# mkdir /var/qmail
qmailのインストール
% cd qmail-1.03 % make % make man % su # make setup check ./install ./instcheck
qldapのコンパイル、インストール
# make qldap # cp checkpassword /bin/checkpassword # chown root:wheel /bin/checkpassword # cp qmail-reply `head -1 conf-qmail`/bin # cp qmail-quotawarn `head -1 conf-qmail`/bin # ls -l `head -1 conf-qmail`/bin/qmail-reply -rwxr-xr-x 1 root qmail 14216 Oct 18 22:25 /var/qmail/bin/qmail-reply # ls -l `head -1 conf-qmail`/bin/qmail-quotawarn -rwxr-xr-x 1 root qmail 19456 Oct 18 22:25 /var/qmail/bin/qmail-quotawarn 必要に応じてchownとchmodする # make checkpassword
popusers:popusers uid 1010 gid 1010を作成する。
qmailの設定ファイルとその内容は以下の通り。 # ls -l /var/qmail/control -rw-r--r-- 1 root qmail 11 Oct 18 22:31 defaultdelivery -rw-r--r-- 1 root qmail 11 Oct 18 22:31 defaultdomain -rw-r--r-- 1 root qmail 30 Oct 18 22:47 dirmaker -rw-r--r-- 1 root qmail 22 Oct 18 22:31 ldapbasedn -rw-r--r-- 1 root qmail 9 Oct 18 22:31 ldapdefaultdotmode -rw-r--r-- 1 root qmail 5 Oct 18 22:31 ldapgid -rw-r--r-- 1 root qmail 20 Oct 18 22:31 ldapmessagestore -rw-r--r-- 1 root qmail 17 Oct 18 22:31 ldapserver -rw-r--r-- 1 root qmail 5 Oct 18 22:31 ldapuid -rw-r--r-- 1 root qmail 9 Oct 18 22:31 ldapusername -rw-r--r-- 1 root qmail 38 Oct 18 22:31 locals -rw-r--r-- 1 root qmail 17 Oct 18 22:31 me -rw-r--r-- 1 root qmail 6 Oct 18 22:31 plusdomain -rw-r--r-- 1 root qmail 38 Oct 18 22:31 rcpthosts - defaultdelivery ./Maildir/ - defaultdomain yourdomain.com - dirmaker /var/qmail/bin/create_homedir - ldapbasedn dc=yourdomain, dc=com - ldapdefaultdotmode ldaponly - ldapgid 1010 - ldapmessagestore /usr/home/popusers/ - ldapserver mail.yourdomain.com - ldapuid 1010 - ldapusername popusers - locals localhost mail.yourdomain.com yourdomain.com - me mail.yourdomain.com - plusdomain yourdomain.com - rcpthosts localhost mail.yourdomain.com yourdomain.com
create_homedirは新規アドレスに最初に着信した際、自動的にディレクトリを作るためのプログラム。内容は以下の通り。
-rwxr-xr-x 1 root qmail 93 Oct 18 22:50 create_homedir #!/bin/sh mkdir $1 cd $1 maildirmake $2 # this does not work if your aliasempty is './' #EOF
ucspi-tcp、daemontoolsのインストール。
% gunzip ucspi-tcp-0.88.tar.gz % gunzip daemontools-0.61.tar.gz % cd ucspi-tcp-0.88 % make % su Password: # make setup check ./install ./instcheck % cd daemontools-0.70 % make % su Password: # make setup check ./install ./instcheck
最後にqmailを動かします。
SMTP接続の制御をtcpserverで行なうため、tcp.smtpを作成し、そこからtcp.smtp.cdbを作成します。 vi /etc/tcp.smtp #### Local Network XXX.XXX.XXX-XXX.:allow,RELAYCLIENT="" 127.:allow,RELAYCLIENT="" # tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
起動スクリプトは以下のようにして完了。
qmail-start `cat /var/qmail/control/defaultdelivery` splogger qmail & /usr/local/bin/tcpserver -R -H -v -u 82 -g 81 -x /var/qmail/relay-ctrl/tcp.smtp.cdb \ 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd & /usr/local/bin/tcpserver -R -H -v 0 pop3 /var/qmail/bin/qmail-popup \ mail.yourdomain.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | \ /var/qmail/bin/splogger pop3 &