連載
» 2001年10月05日 00時00分 公開

実用qmailサーバ運用・管理術(2):POP/IMAPサーバの構築と不正中継対策 (2/3)

[鶴長鎮一,@IT]

POPの導入とPOP Before SMTPによる不正中継対策

POP3の導入

 まず、POP3を導入してみましょう。

 POP3デーモン自体はすでに前回のqmailのインストールと同時にインストールされています。/var/qmail/bin/qmail-pop3dがそれに当たります。しかし、このデーモン自体には認証を行う機能がないため、認証機能を補う必要があります。平文パスワードによる最も簡単な認証確認の手段としては、D. J. Bernstein氏がqmailとともに提供しているcheckpasswordがあります。

をダウンロードし、ソースを展開します。

$ tar xvfz checkpassword-0.90.tar.gz
$ cd checkpassword-0.90

 デフォルトのインストール先は、/binになります。インストール先を/usr/local/binなどに変更する場合は、conf-homeファイルに

/usr/local

と書き込んでおきます()。

注:conf-homeファイルに記述されたディレクトリ+/binがインストール先になります。

 続いてコンパイルとインストールを行います。

$ make
# make setup check

 これで/bin/checkpasswordがインストールされました。前回のqmailのインストール同様、起動はtcpserverを使用します。qmailスクリプトのstartブロックに以下の行を追加します。

  start) 
    〜省略〜 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] /bin/checkpassword \ 
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜
注:[サーバのFQDN]:サーバ名をドメイン名部分の省略をせずに記述したもの。例:mail.example.jp

 /etc/servicesにpop3の記述がない場合は、

       tcpserver -v 0 110 /var/qmail............

のように直接使用するリスニングポート110番をtcpserverの引数に指定してください。110番以外を使用したい場合も同様に指定します。続いて後半のパイプ処理(| /var/qmail/bin/splogger pop3d 3)で/var/log/messagesにログを出力できるため、今後のサーバ運用で活用できます。

 ではPOP3/IMAP4導入の前にで紹介した手順に従ってqmailを再起動し、POP3の動作確認を行ってください。

APOPの導入

 続いて、APOPを導入してみましょう。APOP自体はPOP3のログイン認証を行うコマンドにすぎません。ここでもPOP3同様qmail-pop3dを使用しますが、認証機能を付加するにはAPOPに対応しているものを選択する必要があります。ここでは、OHIRA, Shinya氏が提供しているcheckpwを使用します。

 先ほどのcheckpasswordでは/etc/shadowに登録されているパスワードを基に認証(PAM)を行いましたが、checkpwではパスワードを管理するために外部ファイルを用いているのがポイントです。こうすることで、仮にPOPパスワードが漏れてしまってもシステムのパスワードまで盗まれるのを防げるため、ほかのサービスへの被害を最小限に抑えられます。

 また、checkpwの場合、ユーザーのPOPパスワードはユーザーが各自で管理できるように、ユーザーのMaildir/下にファイルを保存します。パスワード変更のたびにスーパーユーザーの手を煩わせる必要がなくなります。その代わり、telnetでサーバにログインするなど、ユーザーに要求するスキルも上がるため、現実的にはWebサービスとCGIを使ってパスワードの変更を行えるようにするといった手段が必要となる場合もあります。

 では作業にかかりましょう。

からcheckpw-0.80.tar.gzをダウンロードして展開します。

$ tar xvfz checkpw-0.80.tar.gz
$ cd checkpw-0.80/

 checkpassword同様に、インストール先を変更するにはconf-homeを編集します。デフォルトでは/binがインストール先になります。ここではそのまま使用します。ほかにもさまざまなconf-*ファイルが用意されています。

  • conf-home
     インストール先。実際にはbinを付加したものになります。/usr/localを指定した場合は/usr/local/binにインストールされます。デフォルトは「/」。
  • conf-qmail
     qmailがインストールされているディレクトリ。デフォルトは「/var/qmail」。
  • conf-maildir
     Maildirディレクトリ名。デフォルトは「Maildir」。
  • conf-password
     平文パスワードを収めたファイル名。デフォルトはユーザーごとの「~/Maildir/.password」。

 続いてcheckpwのコンパイルとインストールを行います。

$ make
# make setup check

 これで/bin/checkapoppw/bin/checkpw/bin/selectcheckpwがインストールされました。先ほどのPOP導入時に変更したqmailスクリプト中の/bin/checkpasswordを/bin/checkapoppwに置き換えます。

  start) 
    〜省略〜 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] /bin/checkapoppw \ 
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜

 次に各ユーザーにパスワードファイルを用意します。

$ echo 'パスワード' > ~/Maildir/.password
$ chmod 600 ~/Maildir/.password

 必ずファイルパーミッションを変更しておいてください。これが正しく設定されていないと、パスワードが合っていてもAPOP認証に失敗します。

 先ほどのインストールで、一般的なPOP3を行う/bin/checkpwもインストールされました。checkpasswordと大きく違うのは、/etc/shadowを使わずに外部ファイルによるパスワード管理が行えるという点です。

 qmail起動スクリプトを修正します。

  start) 
    〜省略〜 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] /bin/checkpw \ 
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜

 ところで、APOPとPOP3を同時に使うことはできないのでしょうか? クライアント全員にAPOPを強制できる環境であればAPOPのみでサーバを構築することも可能ですが、それでもユーザー全員がAPOPに対応したメールソフト(MUA)を使用しているとは限りません。やはりPOP3とAPOP両方のサービスを用意する必要があります。POP3とAPOPをそれぞれ違うサービスポートで立ち上げれば、簡単にそれを実現できます。

  start) 
    〜省略〜 
        tcpserver -v 0 110 /var/qmail/bin/qmail-popup [サーバのFQDN]  /bin/checkpw \ 
           /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                | /var/qmail/bin/splogger pop3d 3 & 
        tcpserver -v 0 1100 /var/qmail/bin/qmail-popup [サーバのFQDN]  /bin/checkapoppw \ 
           /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜

 qmailスクリプトを上記のようにすることで、APOPを使用するユーザーには1100番、POP3を使用する場合には従来どおり110番でメールの受信を行うようにできます。ただし、ユーザー全員に周知させる必要があり、あまり優れた設計とはいえません。そこでqmailにパッチを当て、同じポートで両方のサービスを提供できるようにします。前回のqmailのインストールに戻り、qmail-date-localtime.patchを当てたように、checkpwに含まれるqmail-popup-auth.patchを当てます。

 qmail-1.03のソースを展開したディレクトリでもう一度コンパイル・インストールを行います。

$ patch -p1 < checkpw-0.80を展開したディレクトリ/qmail-popup-auth.patch
$ make
# make setup check

 次に、qmailスクリプト中でcheckpwやcheckapoppwdを記述していた個所をselectcheckpwに変更します。selectcheckpwスクリプトを使えば、クライアントの要求に応じてcheckpwとcheckapoppwを切り替えて起動できます。

  start) 
    〜省略〜 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN]  /bin/selectcheckpw \ 
           /var/qmail/bin/qmail-pop3d Maildir 2>&1 \
                   | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜

 APOP認証に対応しているメールソフトを使用し、両方の認証に対応していることを確認してみましょう。

POP Before SMTPの導入

 前回、tcpserverは動作に必要なホスト名やIPアドレスなどの情報を環境変数から取り出し、接続の許可を行うと説明しました。SMTP接続許可は、使用するIPブロックまたはドメインを環境変数RELAYCLIENTに登録することで行います。

 では、出張など出先でメールを送信したい場合はどうすればいいのでしょうか。あらかじめ使用するIPが分かっていれば登録しておくこともできますが、プロバイダから与えられるIPアドレスは接続ごとに変わります。かといって、Open RelayにしておけばSPAMメールの踏み台に利用されてしまいます。

 送信の前に何らかの手段を使ってクライアントのIPアドレスをサーバに通知すれば、局所的なRelayの許可を行って送信を可能にできるはずです。都合のいいことに、メールの受信にはユーザーの認証が行われ、適切なユーザーかどうかを判断できます。同時にクライアントに割り当てられているIPアドレスをサーバに通知することも可能です。さらに都合がいいことに、環境変数を収めるcdbデータベースの更新にtcpserverの再起動は必要ありません。これで、既存のサービスに大きな変更を施すことなくPOP Before SMTPが導入できます。

 さまざまなRelayコントローラがありますが、ここでは導入が比較的簡単なrelay-ctrlを使用します。http://untroubled.org/relay-ctrl/からrelay-ctrl-2.5.tar.gzをダウンロードして展開します。

$ tar xvfz .relay-ctrl-2.5.tar.gz
$ cd relay-ctrl-2.5/

 インストール先を変更する場合はdefines.hを編集します。ここではデフォルトのままにし、引き続きmakeとインストールを行います。

$ make
# make root-install

 続いて設定ファイルを作成します。

# mkdir /etc/relay-ctrl
# mkdir /var/qmail/relay-ctrl
# mkdir /var/qmail/relay-ctrl/spool
# cd /etc/relay-ctrl/
# echo '900' > expiry
# echo ":allow,RELAYCLIENT=''" > rule (*)
# echo '/etc' > rulesdir
# echo 'tcp.smtp.cdb' > smtpcdb
# echo 'tcp.smtp' > smtprules
# echo '/var/qmail/relay-ctrl/spool' > spooldir
# echo '/usr/local/bin/tcprules' > tcprules
* ダブルクオートを使用している点に注意

 /etc/relay-ctrl下に生成されたファイルには、次のような意味があります。

  • expiry
     RealyをオープンにしたIPアドレスを記録したファイルの寿命。デフォルトは900秒。
  • rule
     POPで接続してきたIPアドレスに付加するルール。当然Relayを許可しなくてはいけないので「:allow,RELAYCLIENT=''」となります。
  • rulesdir
     cdbファイルとその基になるテキストファイルが収められているディレクトリ。デフォルトは「/etc/tcpcontrol」。
  • smtpcdb
     更新するcdbファイル名。デフォルトは「smtp.cdb」。
  • smtprules
     cdbの基になるテキストファイル。前回tcpserverのインストール時に使用したtcp.smtpに当たります。デフォルトは「smtp.rules」。
  • spooldir
     Relayを許可したIPアドレスを記録しておくスプール。デフォルトは「/var/spool/relay-ctrl」。
  • tcprules
     tcprulesコマンドのパス。デフォルトは「/usr/bin/tcprules」。

 次に、spoolにたまったIPアドレスの記録を定期的に削除する指示をcrontabに追加します。

# crontab -e

として、下記の行を追加します。

* * * * * /usr/sbin/relay-ctrl-age

 これで、記録を整理するプログラムを毎分起動するようになります。このプログラムにより、expiryで指定された保存期間を過ぎた記録を消去できます。

 次にqmailスクリプトを変更します。

  start) 
    〜省略〜 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup  [サーバのFQDN] [認証プログラム] \ 
           /usr/sbin/relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜
注:[認証プログラム]には、ここで紹介した
/bin/checkpassword
/bin/checkpw
/bin/checkapoppw
/bin/selectcheckpw
を用途によって指定します。

 また、ここでは/usr/sbin/relay-ctrl-allowがroot権限で起動されていますが、さらにセキュリティを高めるため、専用のユーザーを使用することをお勧めします。その場合は下記の作業を行います。

 /var/qmail/relay-ctrlをホームディレクトリに持つユーザーrelay-ctrlを作成し、ホームディレクトリのオーナーを変更します。

# adduser -d /var/qmail/relay-ctrl -s /bin/false relay-ctrl
# chown -R relay-ctrl /var/qmail/relay-ctrl

 relay-ctrl-allowコマンドの所有者を変更し、もう一度setuidします。

# chown relay-ctrl /usr/sbin/relay-ctrl-allow
# chmod u+s /usr/sbin/relay-ctrl-allow

 cdbファイルもユーザーrelay-ctrlによって上書きできる必要があるため、/etc/tcp.cdbから書き込み可能な/var/qmail/relay-ctrl/tcp.smtp.cdbに変更します。

# cp /etc/tcp.smtp /var/qmail/relay-ctrl/.
# echo '/var/qmail/relay-ctrl' > /etc/relay-ctrl/rulesdir

 cdbファイルのパスが変更になるため、qmail-smtpを起動するtcpserverの起動方法も変更する必要があります。

  start) 
    〜省略〜 
     tcpserver -v -u[qmaildのUID] -g[nofilesのGID] -x /var/qmail/relay-ctrl/tcp.smtp.cdb 0 smtp \ 
        /var/qmail/bin/qmail-smtpd 2>&1  | /var/qmail/bin/splogger smtpd 3 & 
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup [サーバのFQDN] [認証プログラム] \ 
           /usr/sbin/relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 & 
        echo 
        touch /var/lock/qmail 
        ;; 
  stop) 
    〜省略〜

 qmailを再起動し動作の確認を行いましょう。受信を行う前に送信を行ってみたり、受信・送信を順番に行うなど、POP Before SMTPの挙動を確認してみましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。