Kozupon.com    
 
 pop before smtpの意味を理解してセキュアーなMTAを作ろう!


pop before smtpでセキュアーなMTAを運用する。ここでは、pop-before-smtp-1.33-1.noarch.rpm を使ってPostfixでセキュリティガチガチのメールサーバを作ったので紹介する。
pop before smtpは、MTAの送信のリレー動作に制限をかける方法でpop3の受信を行った後、一定時間(自由に設定可能) 送信を許可して、送信が終わった後リレーを拒否する方法である。 セットアップの他に動作確認方法も記載するので参考にされたい。 pop before smtpと言うと動作を勘違いしてる方も多いと思う。名前を聞くと単純にpop3認証をクリアすれば送信が可能となる。 このように思ってる方が居るのではないだろうか? 間違ってはいないが、pop3認証をクリアするとそのホストのIPドレスがMTA側に登録される。そしてそこで初めてホストがメールサーバを中継す る権利が与えられた訳である。だから、pop3認証にクリアするのが目的でなくクリアしてIPアドレスを登録して送信する権利をゲットするのが 目的である。だから、「pop before smtpの定義は、IPアドレスによるアクセス制御により不正中継を防止する機能である。」と言える。


■ pop before smtpをバイナリでインストールする

1.pop-before-smtpのインストール

1)サイトからpop-before-smtpをゲットして展開する

このサイト( http://popbsmtp.sourceforge.net/ )から pop-before-smtp-1.33-1.noarch.rpm (2004/2現在最新)をダウンロードする。

# rpm -Uvh pop-before-smtp-1.33-1.noarch.rpm

2)pop-before-smtpに必要なPerlモジュール群をインストールする

# cd /usr/share/doc/pop-before-smtp-1.33
# ./getfromcpan

3)DB_Fileのインストール

Vine Linux 2.xでは、別途PerlモジュールDB_Fileftp://ftp.jaist.ac.jp/pub/lang/perl/CPAN/modules/by-module/DB_File/DB_File-1.808.tar.gz (2004/2現在最新)が必要である。

# tar zxvf DB_File-1.808.tar.gz
# cd DB_File-1.808
# perl Makefile.PL
# make
# make install

注:libdbをバージョンアップした場合は、DB_Fileを再コンパイル&リンクすること。


2.pop-before-smtpの設定

1)マッチングの設定

設定は、直接pop-before-smtpの実行ファイルを訂正する。Perlスクリプトになっている(訂正個所のみ記載)。

注1:POP3の正規表現は、デフォルトで uw ipop3d の設定になっている。

# Default values, possibly overridden in the config file.
$pat = '^(... .. ..:..:..) \S+ (?:ipop3s?d|imaps?d)\[\d+\]: ' .
   
'(?:Login|Authenticated|Auth) user=\S+ ' .
    'host=(?:\S+ )?\[(\d+\.\d+\.\d+\.\d+)\](?: nmsgs=\d+/\d+)?$';

この要領で、qpoperを使っている場合など、正規表現で書くと、
Feb 5 12:08:35 mt-bsd in.qpopper[3267]: Stats: mity 0 0 0 0 vine 192.168.0.171

$pat = '^(... .. ..:..:..) \S+ (?:in\.q|q)?popper\[\d+\]: Stats: \S+ ' .
    '\d+ \d+ \d+ \d+ (?:\S+ )?(\d+\.\d+\.\d+\.\d+)';

このようになる。モジュール名がin.qpopperの場合も有るし、popperの場合も有るのでこのような表現になる。 そして、必要ない正規表現はコメントしよう。 さらに、qpopperでも以下のようにフルパスのモジュール名の場合は、 Feb 5 12:08:35 mt-bsd /usr/local/sbin/popper[3267]: Stats: mity 0 0 0 0 192.168.0.171 この場合の正規表現は、 $pat = '^(... .. ..:..:..) \S+ [^p]*popper\[\d+\]: Stats: ' . '\S+ \d+ \d+ \d+ \d+ (\d+\.\d+\.\d+\.\d+)'; となる。

注2:maillogのpop3の吐き出したログの行からマッチングさせるため正規表現が間違ってると旨く動かないので注意すること。

# vi /usr/sbin/pop-before-smtp

省略

# Default values, possibly overridden in the config file.
#$pat = '^(... .. ..:..:..) \S+ (?:ipop3s?d|imaps?d)\[\d+\]: ' .              ← ipop3dをコメントする
# '(?:Login|Authenticated|Auth) user=\S+ ' .
# 'host=(?:\S+ )?\[(\d+\.\d+\.\d+\.\d+)\](?: nmsgs=\d+/\d+)?$';

$pat = '^(... .. ..:..:..) \S+ (?:in\.q|q)?popper\[\d+\]: Stats: \S+ ' . ← qpopperの場合の正規表現
    '\d+ \d+ \d+ \d+ (?:\S+ )?(\d+\.\d+\.\d+\.\d+)';

$logto = '/var/log/pop-before-smtp';                   ← ログの出力先を指定
$write = 1; # open and change the DB
$flock = 1; # we do the exclusive file-locking when updating
$debug = 0; # no debug messages
$reprocess = 0; # no debug reprocessing of watchlog
$dbfile = '/etc/postfix/pop-before-smtp'; # DB hash to write  
← MTAで使うDBファイルのパス
$dbvalue = 'ok';
$grace = 5 * 60; # 5-minute grace period               
 ← 送信可能時間(ここでの設定は5分)

省略

2)起動スクリプトの追加

# chkconfig --add pop-before-smtp


3.起動と動作確認

1)スクリプトの起動

# /etc/rc.d/init.d/pop-before-smtp start
# ps axw | more

省略

3497 ? S 0:00 /usr/bin/perl -wT /usr/sbin/pop-before-smtp --daemon=/var/run/pop-before-smtp.pid

省略


4.Postfix側の設定

# vi /etc/postfix/main.cf

省略

smtpd_recipient_restrictions = permit_mynetworks,
                    reject_non_fqdn_recipient,
                  check_client_access hash:/etc/postfix/pop-before-smtp,      ← ここを追加
                  
check_relay_domains

省略


5.pop-before-smtpの動作確認

pop-before-smtpの動作は、/var/log/maillogを監視してPOP3やIMAPホストのIPアドレスを/etc/postfix/pop-before-smtp.dbに書き込む事により、そのIPアドレスをPostfixが見てどこからでもdbに存在するIPアドレスであれば中継を許可する。 その後数分経過してからIPアドレスをdbから削除する。 削除することとは中継は拒否状態になることである。許可にするには、再度pop3で受信動作を行うことで送信可能となる。 詳しく説明すると、以下のようになる。
/var/log/pop-before-smtpをtail -fでウォッチすると、

# tail -f /var/log/pop-before-smtp

Feb 5 13:14:12 added 192.168.0.171 to DB                 ← MUAで受信を行った(IPアドレス登録・送信許可)
Feb 5 13:20:03 removed 192.168.0.171 from DB             
← メール送信を行った(5分過ぎて送信動作を行ったのでIP削除・拒否状態)
Feb 5 13:26:13 added 192.168.0.171 to DB                 
← 再度受信を行った(IPアドレス登録・送信許可)

尚、このような場合もある。

Feb 5 13:44:50 starting up                           ← pop-before-smtp再起動
Feb 5 13:44:51 added 192.168.0.171 to DB                 
← 再起動と同時にIPアドレス登録・送信許可状態
Feb 5 14:29:16 removed 192.168.0.171 from DB             
← 一定時間経っても送信が行われないのでIPアドレス削除・送信拒否状態

pop before smtpモードを持ってるメーラーの場合のログ、削除とクリエートが交互に発生している。
(この設定は、必ずpop3認証を行ってから送信動作を行う)

Feb 5 00:26:43 caught SIGTERM -- exiting
Feb 5 20:41:33 starting up Feb 5 20:43:34 added 192.168.255.10 to DB Feb 5 20:50:35 removed 192.168.255.10 from DB
Feb 5 20:50:35 added 192.168.255.10 to DB Feb 5 21:02:26 removed 192.168.255.10 from DB
Feb 5 21:02:26 added 192.168.255.10 to DB Feb 5 21:11:14 removed 192.168.255.10 from DB
Feb 5 21:11:14 added 192.168.255.10 to DB

 


■ pop before smtpをソースからインストールする

6.インストールする前に

一部perlモジュールライブラリ等が必要であるためゲットする。
次の Perl モジュールを以下のサイトでいただいてきてインストール。

http://www.t.ring.gr.jp/pub/lang/perl/CPAN/modules/by-module/

★ File-Tail-0.98.tar.gz
★ Time-HiRes-01.20.tar.gz
★ Net-Netmask-1.9002.tar.gz
★ TimeDate-1.11.tar.gz
(何れも2004/2現在最新)

Perl モジュールのインストールは、何れも展開した各ディレクトリで次のようにする。

# perl Makefile.PL
# make
# make install


7.pop-before-smtp のインストール

Pop-before-smtp home( http://popbsmtp.sourceforge.net/から pop-before-smtp-1.34.tar.gz(2004/2現在最新) をいただいてきて展開。

# tar zxvf /tmp/pop-before-smtp-1.34.tar.gz
# chown -R root.root pop-before-smtp-1.34
# cd pop-before-smtp-1.34
# pod2man pop-before-smtp > /usr/man/man8/pop-before-smtp.8
もしくは /usr/local/man/man8/pop-before-smtp.8
# mv pop-before-smtp.init /etc/rc.d/init.d/pop-before-smtp
# mv pop-before-smtp /usr/sbin/

/etc/rc.d/init.d/pop-before-smtp のシェルスクリプトの訂正。 また、これは次のような行を含む。

# vi /etc/rc.d/init.d/pop-before-smtp

省略

pid=/var/adm/$progname.pid

省略

このadm → run に直す。

次に起動ランレベルに登録する。

# chkconfig --add pop-before-smtp


8.pop before smtpの設定

前述のバイナリインストールの2項と同じ。 基本的に、 /usr/sbin/pop-before-smtp perlスクリプトを編集する。


9.pop-before-smtpを起動する

起動は、以下のようにする。

# /etc/rc.d/init.d/pop-before-smtp start


10.Potfix 側の設定

前述のバイナリインストールの4項と同じ。

以上


 
 
 



Copyright 2005 Kozupon.com.