電子メールはインターネットの代表的かつ重要なアプリケーショ ンですが、適切な管理が難しく、セキュリティの穴となりやすいもの です。この点に関して、代表的なメール配送エージェント(MTA)であ る sendmail よりも有利だといわれる qmail というMTAがあります。
インストールの前に
- 以下の方法では、hostname コマンドで自ホストの FQDN が返ることを前提 としています。そうでない場合は該当個所(config-fast)で正しい FQDN を 指定するか、あるいは起動の前にそれぞれのコントロールファイル (/var/qmail/control 以下のファイル)を正しく設定してください。
- qmail はインストールの基点となるディレクトリを決めてその下に全てのファ イルを配置するようになっており、このディレクトリは標準では /var/qmail となっています。別のディレクトリを基準とする場合には、こ の /var/qmail の部分を置き換えるようにしてください。
手作業でのインストール
qmail のバージョン 1.03 の配布物は、国内であれば
http://www.jp.qmail.org
のリンク先から入手することがで きます。入手した配布ファイル qmail-1.03.tar.gz を展開すると、 qmail-1.03 というサブディレクトリの中にドキュメントとソースのファイ ルが置かれます。この中の INSTALL というファイルにインストールの手順 が示されています。% tar xvfz qmail-1.03.tar.gz % cd qmail-1.03まず、INSTALL.ids に従ってユーザとグループを作成します。
# pw groupadd nofiles -g 81 # pw useradd alias -u 81 -g nofiles -d /var/qmail/alias -s /nonexistent # pw useradd qmaild -u 82 -g nofiles -d /var/qmail -s /nonexistent # pw useradd qmaill -u 83 -g nofiles -d /var/qmail -s /nonexistent # pw useradd qmailp -u 84 -g nofiles -d /var/qmail -s /nonexistent # pw groupadd qmail -g 82 # pw useradd qmailq -u 85 -g qmail -d /var/qmail -s /nonexistent # pw useradd qmailr -u 86 -g qmail -d /var/qmail -s /nonexistent # pw useradd qmails -u 87 -g qmail -d /var/qmail -s /nonexistentユーザとグループを作成したら、これらのユーザ、およびグループが conf-users、conf-groups に記述されていることを確認します。conf-usersの中身 alias qmaild qmaill root qmailp qmailq qmailr qmails conf-groupsの中身 qmail nofilesqmail の基準ディレクトリを /var/qmail 以外の場所にする場合 には、そのディレクトリを指定してやります。(例えば /usr/local/etc/qmailなら)
% echo /usr/local/etc/qmail > conf-qmailコンパイルし、指定したディレクトリ以下にプログラムなどのファイルを配置し、 キューのディレクトリを構築します。
% make # make setup # make check/var/qmail/control 以下にコントロールファイル群を作成します。
# ./config自ホストの FQDN が設定されていない場合は、以下によりホスト名を 明示的に指定します。
# ./config-fast hostname次に、postmaster , mailer-daemon , root 用に転送用のメールアド レスを用意します。
# (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root) # chmod 644 ~/alias/.qmail*ディレクトリ /usr/local/etc/qmail を作り、qmail の起動スクリプト /usr/local/etc/qmail/rc (モード:755)を以下の内容で準備します。
# mkdir /usr/local/etc/qmail # vi /usr/local/etc/qmail/rc 以下の内容のファイルを作成する #!/bin/sh exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Mailbox splogger qmail &このままではマニュアルページが読めませんので、環境変数の MANPATH に /var/qmail/man を追加するか、/etc/manpath.config に 次の指定を追加しておきます。
MANDATORY_MANPATH /var/qmail/man MANPATH_MAP /var/qmain/bin /var/qmail/man
インストールが済んだら qmail のデーモンを起動してみます。
# /usr/local/etc/qmain/rc
うまく起動すれば次のプロセスを確認できます。
% ps ax | grep qmail 15305 p6 I 0:00.07 qmail-send 15306 p6 I 0:00.02 aplogger qmail 15397 p6 I 0:00.01 qmail-lspawn 15308 p6 I 0:00.01 qmail-rspawn 15309 p6 I 0:00.01 qmail-clean
ここで試しに自分宛てにメールを送ってみます。
% /var/qmail/bin/qmail-inject (自分で入力する) To: sakai test ^D (Ctrl + D)
成功すればホームディレクトリに Mailbox というファイルが作ら れて、そこへメールが書き込まれます。
% cat Mailbox From sakai@oak.eg.t.kanazawa-u.ac.jp Sun May 16 12:26:57 1999 Return-Path: <sakai@oak.eg.t.kanazawa-u.ac.jp> Deliverd-To: sakai@oak.eg.t.kanazawa-u.ac.jp Received: (qmail 15523 invoked by uid 1001); 16 May 1999 12:26:57 -0000 Date: 16 May 1999 12:26:57 -0000 Message-ID: <199905161226:57.15522.qmail@oak.eg.t.kanazawa-u.ac.jp> From: sakai@oak.eg.t.kanazawa-u.ac.jp to: sakai@oak.eg.t.kanazawa-u.ac.jp test
付属のドキュメント REMOVE.sendmail に従って、sendmail に代 わってqmail が使われるように設定をします。
まず、/etc/rc で sendmail を起動している部分を次のように書き足します。 (`+'で始まる行を追加します)
if [ "X${sendmail_enable}" = X"YES" -a -r /etc/sendmail.cf]; then echo -n ' sendmail'; /usr/sbin/sendmail ${sendmail_flags} +elif [ "X${qmail_enable}" = X"YES" -a -f /usr/local/etc/qmail/rc ]; then +echo -n ' qmail'; /usr/local/etc/qmail/rc; fi echo '.'
/etc/rc.conf で、sendmail ではなく qmail を起動するように指定 します。(`-'で始まる行を削除します)
cron_enable="YES" # Run the periodic job daemon. lpd_enable="YES" # Run the line printer daemon. lpd_flags="" # Flags to lpd (if enabled). -sendmail_enable="YES" # Run the sendmail daemon (or NO). +sendmail_enable="NO" # Run the sendmail daemon (or NO). sendmail_flags="-bd -q30m" # -bd is pretty mandatory. +qmail_enable="YES" # Run the qmail daemon (or NO). dumpdev="NO" # Device name to crashdump to (if enabled). check_quotas="NO" # Check quotas (or NO).
次に、システムに導入されている sendmail と binmail を無効に し、代わりに qmail の wrapper が呼ばれるようにします。
# chmod 0 /usr/sbin/sendmail # mv /usr/sbin/sendmail /usr/sbin/sendmail.orig # chmod 0 /usr/bin/mail # ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
これを元に戻すときは、次のようにします。
# mv /usr/sbin/sendmail.orig /usr/sbin/sendmail # chmod 4555 /usr/sbin/sendmail # chmod 555 /usr/bin/mail
/etc/inetd.conf の #smtp で始まる行のコメントアウトを解除し ます。(一行で記述します)
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd
これで準備ができました。実際に sendmail を停止して qmail-smtpd を待機させるには、システムをリブートするか次のよう にします。
# killall -STOP sendmail # killall -HUP inetd
/var/qmail/control/ 以下のファイルで qmail の動作の設定をし ます。
% ls -la /var/qmail/control -rw-r--r-- 1 root qmail 22 May 20 13:54 defaultdomain -rw-r--r-- 1 root qmail 40 May 21 16:19 locals -rw-r--r-- 1 root qmail 30 May 21 16:19 me -rw-r--r-- 1 root qmail 6 May 20 13:54 plusdomain -rw-r--r-- 1 root qmail 40 May 21 16:20 rcpthosts
これらのファイルの中身は
% cat defaultdomain eg.t.kanazawa-u.ac.jp % cat locals oak.eg.t.kanazawa-u.ac.jp eg.t.kanazawa-u.ac.jp localhost % cat me oak.eg.t.kanazawa-u.ac.jp % cat plusdomain ac.jp % cat rcpthosts localhost oak.eg.t.kanazawa-u.ac.jp
以下にコントロールファイルの一部について紹介します。得に説 明がない項目では、そのファイルが存在しないときには me の内容と 同じであるとされ、me もないときにはファイル名そのものが使われ ます。詳しくは qmail-control(5) を参照して下さい。
常時稼働のメールサーバを構築します。安全のためユーザのメー ルボックスに Maildir 形式を使用し、PC などのクライアント機がメー ルを取得できるように POP サービスを用意します。
Maildir への配送
各ユーザは次のコマンドで自分の Maildir を用意できます。
% /var/qmail/bin/maildirmake ~/Maildir次に、qmail の起動スクリプト(/usr/local/etc/qmail/rc)を次の ように訂正して、Maildir への配送を標準動作とします。
% su # vi /usr/local/etc/qmail/rc 以下の内容の記述を追加する #!/bin/sh exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/ splogger qmail &これで、~/.qmail(メール転送用のファイル)のないユーザは Maildir でメールを受け取るようになります。各ユーザは自分の ~/.qmail を記述することでメール配送の動作を変更できます。
不正な中継の防止
qmail は /var/qmail/control/rcpthosts ファイルがあると、そこ に記述されたドメイン宛てのメールしか受け取りません。導入直後に はその状態になっていて、そのままでは外部ドメイン宛てのメールを 中継できません。しかし、だからといって rcpthosts を消してしま うと、インターネットに接続しているホストの場合は、SPAM や UBE と呼ばれる不正なメールの中継の足場にされてしまう可能性がありま す。そこで、ここでは特定のアドレス(=ローカルネットワーク)から のメールのみを外部ドメインへ中継するように設定します。
まず、tcpserver というソフトウェアをインストールします。 tcpserver は次の URL から入手できる ucspi-tcp というパッケージ に収められています。
ftp://koobera.math.uic.edu./www/ucspi-tcp.htmltcpserver は inetd に代わって TCP のサービスを受け付ける働 きをします。付属の INSTALL に従ってインストールを行います。
% tar xvfz ucspi-tcp-0.84.tar.gz % cd ucspi-tcp-0,84 % make % su # make setup # make checktcpserverでは、アクセス制御のルールをデータベースで管理しています。 この管理を行うのが cdb です。cdb は以下の URL よりダウンロードできます。
ftp://koobera.math.uic.edu./www/cdb.html
今回は、cdb-0.55.tar.gz をダウンロードしました。コンパイル及びインストールは 以下のように行います。% tar xvfz cdb-0.55.tar.gz % cd cdb-0.55 % make % su Password: # cp cdbget cdbmake cdbdump cdbstats cdbtest 12tocdbm /usr/local/bin/ # cp *.1 /usr/local/man/man1/ # cp *.3 /usr/local/man/man3/qmail-smtpd は起動したときに環境変数 RELAYCLIENT が定義され ていると、control/rcpthosts の内容にかかわらずメールを受け付け ます。そこで、指定したアドレスからの接続に限って RELAYCLIENT を定義するようにします。本研究室のメールサーバに登録してあるユー ザは、IP アドレスが 133.28.112.x 133.28.113.x 133.28.116.x 133.28.117.x のセグメントのマシンを使っているので、これらのホ ストからメールを中継させるには次のようにします。
# vi /etc/tcp.smtp 133.28.112.:allow,RELAYCLIENT 133.28.113.:allow,RELAYCLIENT 133.28.116.:allow,RELAYCLIENT 133.28.117.:allow,RELAYCLIENT 127.:allow,RELAYCLIENT # tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtpinetd から起動していた分については解除します。
# vi /etc/inetd.conf # smtp で始まる行をコメントアウト # killall -HUP inetdqmail の起動スクリプト /usr/local/etc/qmail/rc に次の内容を追加しま す。
/usr/local/bin/tcpserver -u 82 -g 81 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/ qmail-smtpd &POPサービス
- checkpassword というソフトウェアをインストールします。次の URL から 入手可能です。 ftp://koobera.math.uic.edu./www/checkpwd.html
付属の INSTALL に従ってインストールを行います。
% tar xvfz checkpassword-0.81.tar.gz % cd checkpassword-0.81 % make % su # make setup # make checkqmail の起動スクリプト /usr/local/etc/qmail/rc に POP サー ビスのための行を追加します。前項で紹介した tcpserver も必要で す。
/usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup `/bin/hostname` /usr/local/libexec/checkpassword /var/qmail/bin/qmail-pop3d Maildir &以上でインストールは終了です。システムをリブートして qmail のデーモンを起動させます。
配送経路
配送の経路についてはコントロールファイルの項で説明した control/smtproutes で設定します。例えば、自ドメイン外への メールを gateway.my.domain に中継させるためには control/smtproutes に次のように記述します。
:gateway.my.domain転送用アドレスの使用
存在しないユーザ USER 宛てのメールは、 /var/qmail/alias/.qmail-USER が存在した場合、その内容に従って 処理されます。.qmail-USER が無い場合は、.qmail-default があれ ばそれに従います。また、.qmail-USER に何も記述されていない(ファ イルのサイズが 0 である)場合、USER 宛てのメールは /var/qmail/alias/Mailbox や /var/qmail/alias/Maildir に送られ ます。
例えば、root 宛てのメールをユーザ sakai が受け取るには /var/qmail/alias/.qmail-root の内容を `&sakai' とします。
メールのエイリアスは /var/qmail/alias/ 以下のファイルに設定 します。例えば、m1 で ユーザ sakai , mats , ido にメールを出せ るようにするには、/var/qmail/alias/.qmail-m1 を以下のように記 述します。
&sakai &mats &ido~/.qmail の書き方
~/.qmail は基本的には ~/.forward と同じようなものですが、"|/usr/local/lib/mh/slocal -user user || exit 75"のように、" "(タブルクォテーション)があると動作しません。エラーコー ドも sendmail とは異なります。また、自分のところに配送するという意 味で\userやuser@oak.eg.t.kanazawa-u.ac.jpのような書き方もしてはいけません。/home/user/Maildir/等としてください。例えば ~/.forward がanother@another.domain.or.jp \userならば、これをanother@another.domain.or.jp /home/user/Maildir/のように修正し、そして、mv .forward .qmailとすれば良いでしょう。user 自身のアドレスを書くことは無限ループと なり、qmail はそれを検知して配送を中止します。~/.qmailの安全な編集方法
メールは、ランダムに届き、届く時間が決まっていません。そのため、~/.qmail ファイルを安全に編集するには以下のようにします。
ホームディレクトリのsticky bitをセットします。% chmod +t $HOMEこうすることで、ユーザへのメイルの配送を一時的に中止することができます。 ホームディレクトリがグループあるいはワールド(他人)で書き込み可能に なっている場合も同様です。
編集が終ったら、chmod -t $HOMEを忘れずに実行します。