qmailでメールサーバを作ろう! 第2回
POP/IMAPの導入、qmailの仕組み
濱野 賢一朗(khamano@d-d.co.jp)
株式会社デジタルデザイン
Project BLUE
2000/10/26
今回のおもな内容![]() ![]() ![]() ![]() |
第1回ではqmailを導入し、メール送信ができるようになるまでの設定を紹介しました。今回は、前回紹介した方法で問題となりうる部分の解決策やqmailがいかにしてメール配信を行っているのかを簡単に紹介します。また、クライアント(メーラー)に、サーバ上にあるメールにアクセスさせる機能が必要になります。後半はそれを実現するPOPサーバやIMAPサーバの構築方法を紹介していきます。
前回はSMTPの設定でtcp_wrappers(inetd)を用いた方法を紹介しました。具体的には/etc/inetd.confに
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env
tcp-env /var/qmail/bin/qmail-smtpd |
と記述することで、外部からの要求を受け付けていたわけです。しかし、inetdは同時に大量のアクセス要求を受けると著しくパフォーマンスが低下することがあります。そこで、inetdよりも効果的なtcpserverを紹介します。
tcpserverはqmailの作者が作ったサーバ制御ツールで、ucspi-tcpというパッケージに入っています。tcpserverの特徴として、
- ローカルホスト・リモートホストのホスト名、IPアドレス、ポート番号、ユーザー名を環境変数で参照できる
- 同時接続数を制限できる
- そのホストが複数のIPアドレスを持つ場合、特定のIPアドレス/ホストへの接続に対して制御できる
- ユーザー名、IPアドレス、ドメイン名を基にアクセス制御できる
- アクセス制御ルールにはハッシュ化されたデータベース(cdb)を用いているため、大規模・複雑になっても高速に処理できる
参考:http://www.jp.qmail.org/ml/tcpserver.html
それでは、tcpserverの導入・設定について解説していきましょう。まずはtcpserverが入っているucspi-tcpパッケージを、以下のURLからダウンロードしてインストールします。
http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
$ tar xzvf ucspi-tcp-0.88.tar.gz |
これでインストールは完了です。正常にインストールできれば、/usr/local/bin以下にtcpserverやtcprulesといったアプリケーションがあるはずです。
次に、tcp_wrappersで設定した内容をtcpserverに置き換えます。コマンドラインで
# /usr/local/bin/tcpserver -v -u[qmaildのUID]
-g[nofilesのGID]0 smtp /var/qmail/bin/qmail-smtp 2>&1 | /var/qmail/bin/splogger
smtpd 3 & |
と入力します。ユーザーqmaildのユーザーID(UID)およびグループnofilesのグループID(GID)は/etc/passwdおよび/etc/groupsを参照してください。
こう設定することで、外部からのSMTP接続をtcpserver経由で受け付けるようになります。しかしこれだけの設定ではリレーを行うことができません。次にリレーを許可する方法を紹介します。
まず、tcpserverが利用するデータベースファイルを準備する必要があります。このデータベースファイルでリレーを許可するホスト情報などを管理します。tcpserverではデータベースファイルとしてcdbという形式を採用しています。
参考::http://www.emaillab.org/djb/tools/cdb/top.html
リレー情報を格納したcdbファイルを作るには、準備段階として以下のような内容を記述した/etc/tcp.smtpというファイルを作成します。
172.25.0.:allow,RELAYCLIENT="" |
これは、172.25.0.*と127.*.*.*のホストからの接続に対しては環境変数RELAYCLIENTを設定して接続を許可し(リレーできる)、これ以外のホストからは環境変数を設定せずに接続を許可する(リレーできない)ということを表しています。
このtcp.smtpを用いてcdbを作成します。cdbの作成にはtcprulesというコマンドを使います(パッケージucspi-tcpに含まれているので、すでにインストールされているはずです)。
コマンドtcprulesの書式は
tcprules[生成するcdbファイル][生成時に利用する一時ファイル] |
です。今回の場合はtcprulesにtcp.smtpを渡して
# /usr/local/bin/tcprules /etc/tc.smtp.cdb
/etc/tcp.smtp.tmp < /etc/tcp.smtp |
のように実行します。これで/etc/tcp.smtp.cdbなるデータベースファイルが生成されるはずです。
このデータベースファイルを使って、tcpserverがリレーを受け付けるように設定しましょう。tcpserverはオプション-x [cdbファイル]でデータベースファイルを読み込むようになっているので、
# /usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb
-v -u [qmaildのUID] -g [nofilesのGID] 0 smtp /var/qmail/bin/qmail-smtp
2>&1 | /var/qmail/bin/ splogger smtpd 3 & |
とします。これで/etc/tcp.smtpの記述どおりのリレーが実現されるはずです。
当然ですが、tcpserverはサーバの起動ごとに実行しない限り起動しません。/etc/rc.d/rc.localなどの起動スクリプトに上のコマンドを記述して、起動時に自動実行するように設定することをおすすめします。
前回、qmailの動作確認でコマンド「ps -ef | grep "[q]mail"」としました。このときqmailが複数のプロセスで動作していることに気づかれたと思います。ここではqmailを構成しているプログラムを簡単に説明します。配信時のトラブルなどの解決にあたって役立つことと思います。
![]() |
上の図がqmailの配信の仕組みを表しています。qmailが多くのプログラムで成り立っていることがお分かりいただけると思います。では、なぜ複数のプログラムに分かれているのでしょう? それはsendmailのように1つのプロセスでメールサーバのすべての機能を実現しようとすると、構造が非常に複雑になってしまい、さらに重くなってしまうという現実があるからです(セキュリティホールが生まれやすくなるという点も挙げられます)。
たとえるなら、sendmailは郵便局員1人で郵便物の回収、宛先ごとの仕分け、切手の確認、配達までをすべてやってしまっているのです。1つのプログラムの負荷が非常に高いのは想像に難くありません。それに対して、qmailはそれぞれの作業を複数のプログラム(郵便局員)で分担しているわけです。こうすることで、高速な配信と構造の単純化によるセキュリティの向上が実現できるわけです。よくqmailとならんで説明されるpostfixも、同じ理由により複数のプログラムで構成されています。
通常、メールサーバというと、配信を行うサーバというよりも、たまっているメールを取りに行く先のサーバというイメージが強いのではないかと思います。説明するまでもないと思いますが、サーバ上のメールをダウンロードするための仕組みがPOP(Post Office Protocol)であり、その機能を提供しているサーバのことをPOPサーバといいます。
POPサーバにアクセスする際にはパスワード認証を行うのですが、パスワードが平文で流れてしまうためセキュリティ的に好ましくないということで、最近はAPOP(Authenticated Post Office Protocol)が利用されることも少なくないようです。APOPは認証の際にチャレンジ・レスポンス認証方式(CRAM)という技術を利用することで、パスワードを暗号化して漏洩を防ぎます。
それでは、qmail対応のPOPサーバを設定することにします。ここではqmailに付属しているqmail-pop3dを利用します。また、平文で認証を行うPOPと、暗号化認証を行うAPOPの両方を併用できるように設定することにします。こうすることで、ユーザーニーズに柔軟に対応できるはずです。しかし、セキュリティの観点ではAPOPだけに制限してしまう方が望ましいでしょう(世の中に出回っているすべてのメーラーがAPOPに対応しているわけではないというのが、POPが残っている理由だと考えられます)。
まずは必要なファイルを以下のURLからダウンロードします。
http://www.geocities.co.jp/SiliconValley/4777/qmail/checkpw/
checkpw-0.51.tar.gz
これらはPOPにかかわる認証を実際に行うソフトウェアです。checkpasswordがPOP用で、checkpwがAPOP用になります。 いつもどおり、これらを展開してインストールします。
$ tar xzvf checkpw-0.51.tar.gz |
(注)筆者がcheckpw-0.51.tar.gzを展開すると、解凍されたディレクトリは checkpw-0.50になっていました。「cd checkpw-0.50」としても何も問題なかったので、状況に応じてコマンドを入力してください。
ここまでの作業で/bin以下にcheckapoppwとcheckpwというプログラムが配置されているはずです。
編集部注:重要な手順が欠落しておりました。謹んで訂正いたします。 |
checkpasswordとcheckpwのインストールが終了したら、qmailにパッチを当てる必要があります。 checkpw-0.50ディレクトリ以下にqmail-popup-auth.patch というパッチがあります。第1回で紹介したqmail-date-localtime.patchと同じようにパッチを当ててた上でqmailを再度インストールしてください。 後藤様、ご指摘ありがとうございました。 |
ここでは、認証要求がAPOPであればAPOPで認証し、そうでなければPOPで認証するように設定したいので、以下のようなスクリプト/bin/check_apop_popを用意します。
#! /bin/sh |
認証時のパスワードは、/home/(ユーザー名)/Maildir/.passwordというファイルを利用します。従って、以下のようにしてパスワードを設定する必要があります。
echo "(設定したいパスワード)" > ~/Maildir/.password |
POPの場合は/etc/passwdや/etc/shadowに記述されているパスワードによる認証も可能です。具体的には、checkpasswordというプログラムをインストールし、上の/bin/check_apop_popで/bin/checkpwと記述されている部分を/bin/checkpasswordに変更します。
http://cr.yp.to/software/checkpassword-0.81.tar.gz
それでは、tcpserverを使ってqmail-pop3dの設定をしましょう。
/usr/local/bin/tcpserver 0 pop-3 /var/qmail/bin/qmail-popup
(サーバのFQDN) /bin/check_apop_pop /var/qmail/bin/qmail-pop3d Maildir
& |
ここではMaildirでの設定を紹介しましたが、もしMailbox形式を用いているのであれば、「Maildir」の部分を「Mailbox」と記述します。 これで、POPの接続を受け付けるようになっているはずです。実際に受け付けるようになっているか確認するには、以下のコマンドでサーバにアクセスして、反応があるかどうかを見るのがよいでしょう。
$ telnet localhost 110 |
最近では、SMTPのリレー設定に対する悪用(SPAMなど)が増えているため、SMTP利用にあたって直前にPOPでの認証を要求するPOP before SMTPが利用されるようになってきています。これを使うと、一定時間前にPOPによる認証が成功したホストに対してのみ、SMTPでの接続を受け付けるようになります。qmailでPOP before SMTPを実現するには、いまのところqmapopが手ごろといえます。具体的な設定に関しては以下のサイトを参考にするといいでしょう。
http://www.emaillab.org/djb/qmapop/index.html
ただし、まだqmapopは作成されたばかりで実績などが少ない点は注意した方がよいかもしれません。
IMAP(Internet Message Access Protocol)はPOPと同じように、クライアントからサーバ上にあるメールにアクセスするための仕組みです。IMAPの細かい仕様や特徴は別途参照していただきたいのですが、POPとの違いを簡単に説明すると「POPのようにメールをクライアント側にダウンロードしなくても、サーバ側にあるメールを操作・閲覧できる仕組み」です。
それでは、qmail環境でのIMAPサーバを構築しましょう。一般にIMAPサーバソフトウェアといえばCyrus IMAPやUW-IMAPが挙げられるのですが、これらはMaildir形式への対応が容易ではないため、ここでは標準でMaildir形式に対応しているCourier-IMAPを紹介します。ただし、逆にMailbox形式には対応していないので注意してください。
- Cyrus IMAP(http://asg.web.cmu.edu/cyrus/imapd/)
- UW-IMAP(http://www.washington.edu/imap/)
- Courier-IMAP(http://www.inter7.com/courierimap/)
それでは、以下のURLからCourier-IMAPをダウンロードしてインストールしましょう。記事執筆時点での最新版は「courier-imap-1.1.tar.gz」でした。
http://www.courier-mta.org/download.php#imap
$ tar xzvf courier-imap-1.1.tar.gz |
これでインストールは完了です。
Courier-IMAPを起動するのはいたって簡単で、
# /usr/lib/courier-imap/libexec/imapd.rc
start |
と入力するだけです。起動時に自動的に立ち上がるようにするなら、tcpserverなどと同様に、/etc/rc.d/rc.localなどの起動スクリプトに書いておくとよいでしょう。
IMAPは、上記のようにメールをクライアントにダウンロードせずにサーバ側で管理する環境を構築できます。そのため複数のユーザーを1つのコンピュータでまかなう大学などで、Webメーラーと併用して利用されていることが多いようです。実際、IMAPを利用したWebメーラーとして「Active! Mail」が有名です。5ユーザー版までは無償で利用できるので試してみるのも悪くないでしょう。
Active! Mail(http://www.transware.co.jp/active/)
今回はtcpserverの導入に始まり、qmailの配信プロセス、POP・IMAPサーバの設定を見てきました。次回はfmlを利用したメーリングリストの構築方法や qmailの簡単なチューニング方法について紹介します。
Linux Squareフォーラム サーバ構築・運用関連記事 |
![]() |
連載:Heartbeatでかんたんクラスタリング(連載中) オープンソースソフトウェアの「Heartbeat」を使ってHAクラスタを実現し、サービスを「落とさない」仕組みを実現します |
![]() |
特集:Apache 2.2でWebサイトをパフォーマンスアップ! 最新安定版Apache 2.2は、何が変わったのか? 最新のApacheを新機能の使い方とともに解説する |
![]() |
連載:実用 Apache 2.0運用・管理術(全8回) 本連載では、Apache 2.0の運用や管理方法を解説する。まず必須設定と基本的なセキュリティ対策を行い今後の運用に備える |
![]() |
連載:実用
BIND 9で作るDNSサーバ(全15回) 本連載では、BIND 9の構築/運用方法を解説していく。実際に役立つことを目的に、セキュリティや大規模運用などのテーマを取り上げていく |
![]() |
連載:実用qmailサーバ運用・管理術(全14回) 本連載を通して、qmailによるメールサーバの高度な構築・運用・管理術を紹介。SPAM対策やML管理からサーバでのウイルスチェックなどまで |
![]() |
特集:Samba
3.0の全貌 改訂版 Samba 3.0リリースから8カ月。ここであらためて、Samba 3.0系列の新機能、インストール方法、国際化の現状を解説する |
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
![]() |
|
|
|
![]() |