ファイル/フォルダのパーミションを整える

/var/qmail/
        \_ alias/内のdot-qmailファイル      root.qmail 644
           control/内のコントロールファイル  root.root  644
           users/内のファイル             root.root  644
/etc/poppasswd                      root.root  600
/usr/local/bin/
           \_ checklocalpwd            root.nofiles 4710(SUID)
              poppasswd_basic          root.root    750
              poppasswd_change         root.root    750
              mailquotacheck_jp        root.nofiles 755
              detectpid                root.root    755
              addpopuser               root.root    750
              rmpopuser                root.root    750
              qqclean                  root.root    700
$USER/
     \_ .qmail                      $USER.$USER  600
        Maildir/                    $USER.$USER  700
              \_ cur/                  $USER.$USER  700
                 new/                  $USER.$USER  700
                 tmp/                  $USER.$USER  700

$USER は各ユーザを表している。通常、上位の /home/$USER ディレクトリ自体がパーミション 600 であり、どうせ他人は見ることができないので、ここまでパーミションをしぼる必要もないと思うが、しぼるならここまで追い込んでもqmailの動作に支障はない。

checklocalpwd のセットUID root はやむを得ない。「checklocalpwd を呼び出して poppasswd を読む」 処理は、smtpd-auth を使う場合、実行権限の異なる qmail-smtpd と qmail-pop3d の両方が行うので、こうしないと poppasswd ファイルが読めない。もっと良い手があったら教えてほしい。

※ まだ登場していないファイルもあるが、後で出てくるので気にしないで。

spamフィルタリング

メールサーバを公開していると、虚偽の REPLY TO や MAIL FROM で送信された spam が、返信不能でスプールにたまったり、sales や info アカウント宛の不愉快な売り込みメールが来たりして嫌な思いをするので、導入することにした。完全防御とはいかないが、リストが充実してくれば、多少の防衛にはなるだろう。また、validrcptto はディクショナリーアタックを防止する。

badmailfrom

badmailfrom コントロールファイルは、smtpセッションの時点で拒否するエンベロープ FROM のフルアドレスまたは "@ドメイン名" を指定するファイル。qregex パッチで正規表現 (拡張正規表現) 対応に拡張したので、qmail 標準のものとは書き方が少し変わってくる。以下は、お勧めの記述例:

.*[%#:\*\^!].* : メールアドレスに使用できない文字を含むアドレス
.*[\(\)].* : () を含むアドレス
.*[\{\}].* : {}を含むアドレス
@.*@.* : @を2つ以上含むアドレス
@(.*\.)*freedeliveries\.net : @freedeliveries.net, @mail.freedeliveries.netなど。 ドットは正規表現で「任意の1文字」を表す特殊文字なので、文字通りのドットを指定したいときは"\"でエスケープしなければならない

うるさいメールが来たら、5番目の形式で、すかさずリストに足していけばよい。自動的に追加してくれるツールもあるようだが、正規表現には対応していないようなので、手動だが応用の利きそうな qregex のほうを選択した。

badmailto

qregex のさらにありがたいところは、ノーマルインストレーションの qmail には無い badmailto コントロールファイルが使えるようになる点だ。要領は badmailfrom と同じ。以下に挙げる例は "@" をふたつ以上含むアドレス (スパミングに利用されることがある)、info@hoge.cxm, sales@hoge.cxm, sales@mail.hoge.cxm, mail.sub.hoge.cxm など宛の spam を排除する:

@.*@.*
info@(.*\.)*hoge\.cxm
sales@(.*\.)*hoge\.cxm

validrcptto

validrcptto ファイルは validrcptto パッチによって利用可能になるコントロールファイルで、badmailto とちょうど反対の評価を行う。つまり、RCPT TO: で受け取りを許可するアドレスを書いておくファイルだ。qmail は本来、smtp セッションの段階では、自ドメイン宛かどうかは確認しても、@ より前のユーザ名が有効なものかどうかは確かめず、とりあえず受け取ってしまう。無作為なユーザ名で総当たり的な spam (ディクショナリーアタック) をやられたら大変だ。そこで威力を発揮するのが validrcptto だ。当ページに置いている qregex + validrcptto 統合パッチでは、このファイルでも正規表現を使う。

このファイルは、環境変数 RELAYCLIENT が未定義の場合にだけ評価される。つまり、SMTP-AUTH を正規に経たセッションや、tcpserver 経由で RELAYCLIENT が設定された接続においてはチェックされない。言い換えれば、 control/rcpthosts に書いてあるドメインに属するメールアドレスにだけ適用されるわけだ。また、評価の順序は badmailto の後なので、badmailtovalidrcptto の両方にマッチする記述があった場合には、badmailto の評価が優先される。

このファイルは必ず、このサーバで受け取るすべてのメールアドレスをカバーするように書いておかなくてはならない。極端に言えば、validrcptto ファイルが空だった場合、外部からこのサーバの利用ユーザに宛てたメールは、一切拒否されてしまう。では記述例を示そう:

^mailer-daemon@
^postmaster@
^root@
^webmaster@
^hoshu@
^hanako(-.*)*@

頭には行頭を示す " ^ " を付け、ユーザ名の後ろには @ も付けておこう (ドメインは control/rcpthots によって限定されるので不要)。123hoshu@hoge.cxm や hoshu1234@hoge.cxm をヒットさせないためだ。エンコードされたメールアドレスつまり <hoshu@hoge.cxm> といった宛先は整形されてから渡されるようなので " ^ " を使っても問題はない。また、qmail では各ユーザが hanako-sub@... のようなサブメールアドレスを持つこともできるので、それに対応しておきたい場合は、 hanako の定義例のように書けばサブアドレスまで全部列挙しなくて済む。

テスト

設定したら、意図したとおりに機能するかどうかテストしておこう。テスト方法は 動作テストのためのコマンド を参考に。また、リレー防止設定の検証を行う場合には、WEB 上からチェックできるサイトがある:

Muttのインストール

Maildir に対応しているテキストベースのMUA、Mutt をインストール。Fedora、RedHad標準のrpmがある。

設定

/etc/Muttrc

最低限修正必要な箇所は以下。RedHat Enterprise Linux 4.5 なら、オリジナルからの diff を採っておいたので これ (Muttrc.diff) が使えるだろう。

set folder="~/Maildir"
set mbox="~/Maildir"
set mbox_type=Maildir
set spoolfile="~/Maildir"

/root/.muttrc

root に "su -" したままメールの確認をしたいことがあるので、root の時 hoshu のメールボックスを読めるように。

set folder="~hoshu/Maildir"
set mbox="~hoshu/Maildir"
set spoolfile="~hoshu/Maildir"
set from="root@host1.hoge.cxm
set realname="root"
システムアカウントを増やさずにメールユーザを作る

Paul Gregg - Projects - Qmail Single UID Howto を参考にした。 qmail-vida を利用する場合は、以下のような作業を単純なコマンド一発で完了できるが、仕組みを理解するために一通り目を通しておくことをお勧めする。

方針:

標準的なインストールでは、メールユーザを作るたびに、正規のシステムアカウントを作らなければならない。しかし、アカウントを増やせばそれだけ、クラッカーの進入路を増やすことになるし、管理が面倒だ。このやり方では、個々のメールユーザは、いわば仮想的存在。メールのための実システムアカウントはひとつだけで、qmail の "assign" 機能によって仮想ユーザと実アカウント、メール配送ディレクトリを結びつける。ここでは、パスワード認証に DJB の checkpassword でなく、 メール専用のパスワードファイルが使える checklocalpwd を使っているものとして話を進める。

例で使用する設定 メール用実システムユーザ:
メール用実システムグループ:
メール配送ベースdir:
最初の一般メールユーザ:
popuser (UID:700)
popusers (GID:700)
/home/popusers
hanako

実ユーザ "popuser" はシェルを /sbin/nologin で潰すので、シェルにログインできない。以下設定はすべて root 権限で行う。

実アカウント作成

root# groupadd -g 700 popusers
root# useradd -u 700 -g popusers -d /home/popusers \
 -m -k /dev/null -s /sbin/nologin popuser

一般メールユーザhanakoのメールホーム作成

root# mkdir /home/popusers/hanako

一般メールユーザhanakoのMaildir整備

root# /var/qmail/bin/maildirmake /home/popusers/hanako/Maildir
root# echo ./Maildir/ > /home/popusers/hanako/.qmail
root# chown -R popuser.popusers /home/popusers/hanako
root# chmod -R 700 /home/popusers/hanako
root# chmod 600 /home/popusers/hanako/.qmail

結果はこうなっていればよい:

/home/popusers/             popuser.popusers  700
            \_ hanako/          popuser.popusers  700
                   \_ .qmail        popuser.popusers  600
                      Maildir/      popuser.popusers  700
                           \_ cur/      popuser.popusers  700
                              new/      popuser.popusers  700
                              tmp/      popuser.popusers  700

パスワードの発行

まず /etc/poppasswd に、当該ユーザのための行を以下のように足しておく。

hanako:x:popuser:/home/popusers/hanako

そして、パスワードを与える。poppasswd_changechecklocalpwd で提供される Perl スクリプト。

root# poppasswd_change hanako somepassword

/var/qmail/users/assignの編集とcdbへの変換

assignファイルの書式:

(=|+)ADDRESS:SYSユーザ:ユーザUID:GID:dot-qmail在処:dot-qmailデリミタ:修飾:

各フィールドの意味:

フィールド 意味
=ADDRESS
+ADDRESS
"=" は ADDRESS にフルマッチ
"+" は ADDRESSXX... にマッチ (ワイルドカード)
=hanako
SYSユーザ ADDRESS を扱う実ユーザ popuser
UID:GID 実ユーザのUID と GID。qmail-local は、そのディレクトリにメールを配送する都度、この UID, GID に化けてメールを配送する 700:700
dot-qmail在処 処理指示書を探す場所 /home/popusers/hanako
dot-qmailデリミタ:修飾 標準のデリミタは "-"。"-:ext" なら、 「 dot-qmail在処dir/.qmail-ext の指示に従え」 の意 (なし):(なし)

例なら、assign ファイルに以下の行を加える:

=hanako:popuser:700:700:/home/popusers/hanako:::
.

※ ファイルの最後に "." だけの1行が必要 (各ユーザの記述毎ではない)。

assignファイルからバイナリフォーマットcdbを生成

root# /var/qmail/bin/qmail-newu
実アカウント popuser さえ作成してあれば、メールユーザ追加時にやることはいつも同じなので、 shスクリプト addpopuser を作成した。引数を渡すのでなく対話式に組んだので、"addpopuser" とコマンドして質問に答えるだけで、メールユーザのホーム作成から qmail-newu まで全部完了。
逆にユーザを削除する場合のスクリプトはこれ ( rmpopuser) 。「本当に削除するか?」の確認が一度出る。

qmail の基本的なインストールはこれにて一応完了。