qmail でメールサーバを構築しているのだが、SMTP の不正リレー防止のためには、POP before SMTP を設定して使っていた。確かにこれはある程度安全な訳だが、一つのグローバル IP を複数の PC 等で共有している環境(ようするにローカル IP なサブネットを切ってルータを挟んでいるような)では、サブネットの PC すべてに SMTP 送信が許可されてしまうので、場合によってはまずいこともある。
一番安全なのは、やはり SMTP 時に認証することだと思う。ということで、以前導入したはずなのにまともに動いていなかった qmail での SMTP 認証をきちんと設定してみた。詳細は、qmail SMTP Auth 辺りで検索すると色々出てくると思う。ので、要点だけ羅列。
ベースは qmail で、qmail-smtpd-auth-0.31.tar.gz という SMTP-Auth 対応パッチを当てた。qmail-smtpd-relay-reject 不正中継拒否パッチも当てないといけないかも。後、ついでに日本標準時間対応パッチも当てる。
パスワードの認証には、cmd5checkpw を使う。CRAM-MD5 というのが使えるようになるっぽい。パスワードは /etc/poppasswd に平文で入る。ちょっと注意が必要。流出すると結構えらいことかも。
後は、/etc/init.d/qmail とかに、tcpserver 経由で起動するスクリプトを書いておけば OK。
引っかかったのは、tcpserver の tcp.smtp.cdb 等に、RELAYCLIENT="" の設定を入れていると、認証自体がスルーされてしまうこと。例えば、LAN 内の IP アドレスは RELAYCLIENT を定義するようにする事も多い。また、POP before SMTP でも、POP してきた IP アドレスは、RELAYCLIENT が定義されるので、認証スルーになるので注意。
SMTP 認証するポート番号は、POP before SMTP するのとは別に用意した方がいい。最初に書いたサブネットの PC を信頼しない状況ではもちろんである。専用の tcpserver の cdb ファイルも用意する。とりあえず deny 以外のエントリは入れなくていいかと思う。逆に、ブラックリストや tarpit の仕組みも要らない気がする。SMTP にも SSH みたいなログインアタックがあったりするのかも知れないが。
テストとしては、認証なしでは、メール送信(リレー)できないこと、正しいユーザ名とパスワードならメール送信(リレー)できること。間違ったパスワードだと出来ないこと。後は、POP before SMTP が効かないことか。
結構面倒なもんだ。