/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 ファイルが読めない。もっと良い手があったら教えてほしい。
※ まだ登場していないファイルもあるが、後で出てくるので気にしないで。
メールサーバを公開していると、虚偽の REPLY TO や MAIL FROM で送信された spam が、返信不能でスプールにたまったり、sales や info アカウント宛の不愉快な売り込みメールが来たりして嫌な思いをするので、導入することにした。完全防御とはいかないが、リストが充実してくれば、多少の防衛にはなるだろう。また、validrcptto はディクショナリーアタックを防止する。
badmailfrom コントロールファイルは、smtpセッションの時点で拒否するエンベロープ FROM のフルアドレスまたは "@ドメイン名" を指定するファイル。qregex パッチで正規表現 (拡張正規表現) 対応に拡張したので、qmail 標準のものとは書き方が少し変わってくる。以下は、お勧めの記述例:
.*[%#:\*\^!].* | : メールアドレスに使用できない文字を含むアドレス |
.*[\(\)].* | : () を含むアドレス |
.*[\{\}].* | : {}を含むアドレス |
@.*@.* | : @を2つ以上含むアドレス |
: @freedeliveries.net, @mail.freedeliveries.netなど。 ドットは正規表現で「任意の1文字」を表す特殊文字なので、文字通りのドットを指定したいときは"\"でエスケープしなければならない |
うるさいメールが来たら、5番目の形式で、すかさずリストに足していけばよい。自動的に追加してくれるツールもあるようだが、正規表現には対応していないようなので、手動だが応用の利きそうな qregex のほうを選択した。
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 パッチによって利用可能になるコントロールファイルで、badmailto とちょうど反対の評価を行う。つまり、RCPT TO: で受け取りを許可するアドレスを書いておくファイルだ。qmail は本来、smtp セッションの段階では、自ドメイン宛かどうかは確認しても、@ より前のユーザ名が有効なものかどうかは確かめず、とりあえず受け取ってしまう。無作為なユーザ名で総当たり的な spam (ディクショナリーアタック) をやられたら大変だ。そこで威力を発揮するのが validrcptto だ。当ページに置いている qregex + validrcptto 統合パッチでは、このファイルでも正規表現を使う。
このファイルは、環境変数 RELAYCLIENT が未定義の場合にだけ評価される。つまり、SMTP-AUTH を正規に経たセッションや、tcpserver 経由で RELAYCLIENT が設定された接続においてはチェックされない。言い換えれば、 control/rcpthosts に書いてあるドメインに属するメールアドレスにだけ適用されるわけだ。また、評価の順序は badmailto の後なので、badmailto と validrcptto の両方にマッチする記述があった場合には、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 上からチェックできるサイトがある:
Maildir に対応しているテキストベースのMUA、Mutt をインストール。Fedora、RedHad標準のrpmがある。
最低限修正必要な箇所は以下。RedHat Enterprise Linux 4.5 なら、オリジナルからの diff を採っておいたので これ (Muttrc.diff) が使えるだろう。
set folder="~/Maildir" set mbox="~/Maildir" set mbox_type=Maildir set spoolfile="~/Maildir"
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
root# mkdir /home/popusers/hanako
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_change は checklocalpwd で提供される Perl スクリプト。
root# poppasswd_change hanako somepassword
(=|+)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在処 | 処理指示書を探す場所 | |
標準のデリミタは "-"。"-:ext" なら、 「 dot-qmail在処dir/.qmail-ext の指示に従え」 の意 | (なし):(なし) |
例なら、assign ファイルに以下の行を加える:
=hanako:popuser:700:700:/home/popusers/hanako::: .
※ ファイルの最後に "." だけの1行が必要 (各ユーザの記述毎ではない)。
root# /var/qmail/bin/qmail-newu
qmail の基本的なインストールはこれにて一応完了。