UJP - 技術情報1

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

relay-ctrl3.1.1のインストールと設定

relay-ctrl3.1.1のインストールと設定


0.改訂履歴

  • 2006.08.11 新規作成
  • 2007.01.22 誤字修正.

1.はじめに

 このドキュメントでは,relay-ctrlのインストール手順を説明する. このツールも長い間バージョンアップされていない模様.

 relay-ctrlとは,qmail上でPOP before SMTPを実現するツールで,qmail-popupとqmail-pop3dの組み合わせで使用する. qmail-popup以外のPOPサーバでは利用できないが,Courier-IMAPサーバとは共存できる.

 POP before SMTPとは,POP認証が成功したユーザに対して,一定時間メール送信(SMTP接続)を許可する仕組みで,そのサイトのユーザ以外は送信できないようにする方法の1つである.

 今回は,qmailとtcpserverを組み込んでいる環境に,このrelay-ctrlを組み合わせる事とする.

 なお,使用しているOSは,RedHat Linux ES上で稼働している.

2.動作原理について

  • 動作原理を知っておくと良いので,箇条書きで簡単に説明する.
    1. メールクライアントが,POPでメールを取得するために接続する.
    2. POP3サーバは,POPで認証を行う.
    3. 成功したらRELAY_CTRL_DIRで指定したディレクトリに接続してきたクライアントのIPアドレスを記録する.
      1. このドキュメントでは,RELAY_CTRL_DIR=/var/spool/relay-ctrl/allow
      2. ファイル名がIPアドレスのファイルが格納される.
    4. クライアントが,メールを送信する為にSMTPサーバに接続する.
    5. SMTPサーバは,接続してきたクライアントのIPアドレスがRELAY_CTRL_DIRに保存されているものだったら,送信を許可する.
    6. 送信を許可する時間は,RELAY_CTRL_EXPIRYで指定された時間内.
    7. relay-ctrl-ageコマンドをcronで定期的に動作させることによって,保存期間を過ぎた記録を削除する.

3.モジュールの入手とインストール

[root@jupiter Download]# curl -O http://untroubled.org/relay-ctrl/relay-ctrl-3.1.1.tar.gz
  % Total    % Received % Xferd  Average Speed          Time             Curr.
                                 Dload  Upload Total    Current  Left    Speed
100 35046  100 35046    0     0  27209      0  0:00:01  0:00:01  0:00:00 56076
[root@jupiter Download]#
  • ダウンロードしたファイルを確認する.
[root@jupiter Download]# ls -la relay-ctrl-3.1.1.tar.gz
-rw-r--r--    1 root     root        35046 Aug 11 15:46 relay-ctrl-3.1.1.tar.gz
[root@jupiter Download]#
  • アーカイブを展開する.
[root@jupiter Download]# tar xfz relay-ctrl-3.1.1.tar.gz
[root@jupiter Download]#
  • 展開したファイルを確認する.
[root@jupiter Download]# cd relay-ctrl-3.1.1
[root@jupiter relay-ctrl-3.1.1]# ls
ANNOUNCEMENT     direntry.h1  packet.html            setenv.c
COPYING          direntry.h2  relay-ctrl-3.1.1.spec  setenv.h1
FILES            fork.h1      relay-ctrl-age.8       setenv.h2
Makefile         fork.h2      relay-ctrl-age.c       touch.c
NEWS             installer.c  relay-ctrl-allow.8     trydirent.c
README           installer.h  relay-ctrl-allow.c     trypoll.c
TARGETS          instcheck.c  relay-ctrl-chdir.c     trysetenv.c
TODO             insthier.c   relay-ctrl-check.8     trysysel.c
VERSION          instshow.c   relay-ctrl-check.c     trysystime.c
authenticated.c  iobuf        relay-ctrl-send.8      trytime.c
chdir.c          iopoll.c     relay-ctrl-send.c      tryvfork.c
choose.sh        iopoll.h1    relay-ctrl-udp.8       validate_ip.c
conf-bin         iopoll.h2    relay-ctrl-udp.c       warn-auto.sh
conf-cc          misc         relay-ctrl.h
conf-ld          msg          select.h1
conf-man         net          select.h2
[root@jupiter relay-ctrl-3.1.1]# 
  • このモジュールはconfigureをするタイプではない為,makeを実行する.
[root@jupiter relay-ctrl-3.1.1]# make
( echo '#!/bin/sh';¥
  echo 'main="$1"; shift';¥
  echo exec `head -1 conf-ld` '-o "$main" "$main.o" ${1+"$@"}';¥
) >load
chmod 755 load
( echo '#!/bin/sh'; ¥
  echo 'source=$1; shift'; ¥
  echo 'base=`echo "$source" | sed -e s:¥¥¥¥.c$::`'; ¥
  echo exec `head -1 conf-cc` '-I. -o ${base}.o -c $source ${1+"$@"}'; ¥
) >compile
chmod 755 compile
( ( ./compile trysystime.c >/dev/null 2>&1 && ¥
    echo '#include <sys/time.h>' ); ¥
  ( ./compile trytime.c >/dev/null 2>&1 && ¥
    echo '#include <time.h>' ) ) >systime.h
rm -f trysystime.o trytime.o
./compile relay-ctrl-allow.c
( echo '#!/bin/sh'; ¥
  echo 'main="$1"; shift';¥
  echo 'rm -f "$main"';¥
  echo 'ar cr "$main" ${1+"$@"}';¥
  echo 'ranlib "$main"';¥
) >makelib
chmod 755 makelib
./compile authenticated.c
./compile chdir.c
./compile touch.c
./compile validate_ip.c
./makelib relay-ctrl.a authenticated.o chdir.o touch.o validate_ip.o
./compile misc/strtou.c
./compile misc/utoa.c
./compile misc/utoa2.c
./makelib misc/misc.a misc/strtou.o misc/utoa.o misc/utoa2.o
./compile msg/common.c
./compile msg/debug.c
./compile msg/die.c
./compile msg/error.c
./compile msg/warn.c
./makelib msg/msg.a msg/common.o msg/debug.o msg/die.o msg/error.o msg/warn.o
./compile iobuf/iobuf_close.c
./compile iobuf/iobuf_copy.c
./compile iobuf/iobuf_init.c
cat warn-auto.sh choose.sh >choose
chmod 755 choose
./choose clr trypoll iopoll.h1 iopoll.h2 > iopoll.h
./compile iobuf/iobuf_timeout.c
./compile iobuf/ibuf_getc.c
./compile iobuf/ibuf_gets.c
./compile iobuf/ibuf_getu.c
./compile iobuf/ibuf_init.c
./compile iobuf/ibuf_open.c
./compile iobuf/ibuf_peek.c
./compile iobuf/ibuf_read.c
./compile iobuf/ibuf_refill.c
./compile iobuf/ibuf_seek.c
./compile iobuf/ibuf_status.c
./compile iobuf/ibuf_stdin.c
./compile iobuf/ibuf_tell.c
./compile iobuf/obuf_close.c
./compile iobuf/obuf_endl.c
./compile iobuf/obuf_flush.c
./compile iobuf/obuf_init.c
./compile iobuf/obuf_open.c
./compile iobuf/obuf_pad.c
./compile iobuf/obuf_put2s.c
./compile iobuf/obuf_put3s.c
./compile iobuf/obuf_put4s.c
./compile iobuf/obuf_put5s.c
./compile iobuf/obuf_put6s.c
./compile iobuf/obuf_put7s.c
./compile iobuf/obuf_putc.c
./compile iobuf/obuf_putiw.c
./compile iobuf/obuf_putnetstring.c
./compile iobuf/obuf_putsflush.c
./compile iobuf/obuf_putuw.c
./compile iobuf/obuf_seek.c
./compile iobuf/obuf_stderr.c
./compile iobuf/obuf_stdout.c
./compile iobuf/obuf_sync.c
./compile iobuf/obuf_write.c
./makelib iobuf/iobuf.a iobuf/iobuf_close.o iobuf/iobuf_copy.o iobuf/iobuf_ini
t.o iobuf/iobuf_timeout.o iobuf/ibuf_getc.o iobuf/ibuf_gets.o iobuf/ibuf_getu.
o iobuf/ibuf_init.o iobuf/ibuf_open.o iobuf/ibuf_peek.o iobuf/ibuf_read.o iobu
f/ibuf_refill.o iobuf/ibuf_seek.o iobuf/ibuf_status.o iobuf/ibuf_stdin.o iobuf
/ibuf_tell.o iobuf/obuf_close.o iobuf/obuf_endl.o iobuf/obuf_flush.o iobuf/obu
f_init.o iobuf/obuf_open.o iobuf/obuf_pad.o iobuf/obuf_put2s.o iobuf/obuf_put3
s.o iobuf/obuf_put4s.o iobuf/obuf_put5s.o iobuf/obuf_put6s.o iobuf/obuf_put7s.
o iobuf/obuf_putc.o iobuf/obuf_putiw.o iobuf/obuf_putnetstring.o iobuf/obuf_pu
tsflush.o iobuf/obuf_putuw.o iobuf/obuf_seek.o iobuf/obuf_stderr.o iobuf/obuf_
stdout.o iobuf/obuf_sync.o iobuf/obuf_write.o
./choose c trysysel select.h1 select.h2 > select.h
./compile iopoll.c
./load relay-ctrl-allow relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a iopol
l.o 
./choose cl trysetenv setenv.h1 setenv.h2 > setenv.h
./compile relay-ctrl-check.c
relay-ctrl-check.c: In function `main':
relay-ctrl-check.c:87: warning: implicit declaration of function `do_chdir'
relay-ctrl-check.c:75: warning: unused variable `dir'
./compile setenv.c
./load relay-ctrl-check relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a iopol
l.o setenv.o 
( ./compile trydirent.c >/dev/null 2>&1 ¥
  && cat direntry.h2 || cat direntry.h1 ) > direntry.h
rm -f trydirent.o
./compile relay-ctrl-age.c
./load relay-ctrl-age msg/msg.a iobuf/iobuf.a iopoll.o 
./compile relay-ctrl-udp.c
./compile net/ipv4_addr.c
./compile net/ipv4_format.c
./compile net/ipv4_parse.c
./makelib net/ipv4.a net/ipv4_addr.o net/ipv4_format.o net/ipv4_parse.o
./compile net/accept4.c
./compile net/acceptu.c
./compile net/bind4.c
./compile net/bindu.c
./compile net/broadcast.c
./compile net/connect4.c
./compile net/connected.c
./compile net/connectu.c
./compile net/cork.c
./compile net/getaddr4.c
./compile net/linger.c
./compile net/listen.c
./compile net/pair.c
./compile net/recv4.c
./compile net/recvu.c
./compile net/reuse.c
./compile net/send4.c
./compile net/sendu.c
./compile net/shutdown.c
./compile net/tcp.c
./compile net/udp.c
./compile net/uncork.c
./compile net/unixdgm.c
./compile net/unixstr.c
./makelib net/socket.a net/accept4.o net/acceptu.o net/bind4.o net/bindu.o net
/broadcast.o net/connect4.o net/connected.o net/connectu.o net/cork.o net/geta
ddr4.o net/linger.o net/listen.o net/pair.o net/recv4.o net/recvu.o net/reuse.
o net/send4.o net/sendu.o net/shutdown.o net/tcp.o net/udp.o net/uncork.o net/
unixdgm.o net/unixstr.o
./load relay-ctrl-udp relay-ctrl.a misc/misc.a msg/msg.a iobuf/iobuf.a net/ipv
4.a net/socket.a iopoll.o 
( ( ./compile tryvfork.c && ./load tryvfork ) >/dev/null 2>&1 ¥
  && cat fork.h2 || cat fork.h1 ) > fork.h
rm -f tryvfork.o tryvfork
./compile relay-ctrl-send.c
./load relay-ctrl-send relay-ctrl.a msg/msg.a iobuf/iobuf.a net/ipv4.a net/soc
ket.a iopoll.o 
./compile relay-ctrl-chdir.c
./load relay-ctrl-chdir misc/misc.a msg/msg.a iobuf/iobuf.a setenv.o iopoll.o 
./compile installer.c
head -1 conf-bin | ¥
  sed -e 's/"/¥¥"/g' ¥
      -e 's/^/const char conf_bin[] = "/' ¥
      -e 's/$/";/' >conf_bin.c
head -1 conf-man | ¥
  sed -e 's/"/¥¥"/g' ¥
      -e 's/^/const char conf_man[] = "/' ¥
      -e 's/$/";/' >conf_man.c
./compile insthier.c
./load installer insthier.o
./compile instcheck.c
./load instcheck insthier.o
./compile instshow.c
./load instshow insthier.o

[root@jupiter relay-ctrl-3.1.1]#
  • インストールを行う.
[root@jupiter relay-ctrl-3.1.1]# ./installer
[root@jupiter relay-ctrl-3.1.1]# 
  • 素っ気ないが,これで終了.

3.設定

  • 接続許可IPアドレスのリストを置くためのディレクトリを作成する.
[root@jupiter relay-ctrl-3.1.1]# mkdir -p /var/spool/relay-ctrl/allow
[root@jupiter relay-ctrl-3.1.1]# chmod 700 /var/spool/relay-ctrl/
[root@jupiter relay-ctrl-3.1.1]# chmod 777 /var/spool/relay-ctrl/allow
[root@jupiter relay-ctrl-3.1.1]# 
  • 環境設定を保存するディレクトリを作成する.
[root@jupiter relay-ctrl-3.1.1]# mkdir /etc/relay-ctrl
[root@jupiter relay-ctrl-3.1.1]# 
  • 起動時にセットする環境変数を設定する.
[root@jupiter relay-ctrl-3.1.1]# cd /etc/relay-ctrl
[root@jupiter relay-ctrl]# echo /var/spool/relay-ctrl/allow > RELAY_CTRL_DIR
[root@jupiter relay-ctrl]# echo 900 > RELAY_CTRL_EXPIRY
[root@jupiter relay-ctrl]#
  • 環境変数RELAY_CTRL_DIRが,接続元IPアドレスを格納するディレクトリを示す.
  • 環境変数RELAY_CTRL_EXPIRYで指定した数値は,秒数で有効時間となる.
コピペ用
mkdir -p /var/spool/relay-ctrl/allow
chmod 700 /var/spool/relay-ctrl/ 
chmod 777 /var/spool/relay-ctrl/allow 
mkdir /etc/relay-ctrl
cd /etc/relay-ctrl
echo /var/spool/relay-ctrl/allow > RELAY_CTRL_DIR
echo 900 > RELAY_CTRL_EXPIRY
  • POP3デーモンの起動スクリプトを探す.
[root@jupiter relay-ctrl]# locate run | grep pop3d
/var/qmail/supervise/pop3d/run
[root@jupiter relay-ctrl]# 
  • 起動スクリプトの内容を次のように変更する.
変更前
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/pop3d/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" /usr/local/bin/tcpserver -v -x /etc/tcp
server/pop3_rules.cdb -R -H 0 pop3 /var/qmail/bin/qmail-popup jupiter /bin/che
ckpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1
[root@jupiter relay-ctrl]# 
変更後
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/pop3d/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" /usr/local/bin/envdir /etc/relay-ctrl 
relay-ctrl-chdir /usr/local/bin/tcpserver -v -x /etc/tcpserver/pop3_rules.cdb -
R -H 0 pop3 /var/qmail/bin/qmail-popup jupiter /bin/checkpassword
 relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 
[root@jupiter relay-ctrl]# 
  • ここでは,ログインが成功したときにralay-ctrl-allowコマンドが呼び出される.
  • 次に,SMTPDの起動スクリプトを探す.
[root@jupiter relay-ctrl]# locate run | grep smtpd
/var/qmail/supervise/smtpd/run
[root@jupiter relay-ctrl]# 
  • POP3と同じように追加する.
変更前
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/smtpd/run
#!/bin/sh
exec env -  PATH="/var/qmail/bin:/usr/local/bin:/bin:/usr/bin" /usr/local/bin/
tcpserver -v -x /etc/tcpserver/smtpd_rules.cdb -R -H -lo -u 712 -g 710 0 smtp 
/var/qmail/bin/qmail-smtpd 2>&1   
[root@jupiter relay-ctrl]# 
変更後
[root@jupiter relay-ctrl]# cat /var/qmail/supervise/smtpd/run
#!/bin/sh
exec env -  PATH="/var/qmail/bin:/usr/local/bin:/bin:/usr/bin"
 /usr/local/bin/envdir /etc/relay-ctrl relay-ctrl-chdir 
/usr/local/bin/tcpserver -v -x /etc/tcpserver/smtpd_rules.cdb -R -H -lo -u 712
 -g 710 0 smtp relay-ctrl-check /var/qmail/bin/qmail-smtpd 2>&1 
[root@jupiter relay-ctrl]# 
  • SMTP通信する前に,relay-ctrl-checkプログラムが呼び出される.
  • これで設定終了

3.動作を確認してみる

  • 許可リストを確認してみる.
[root@jupiter root]# cd /var/spool/relay-ctrl/allow
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 19:55 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 19:55 192.168.123.128
[root@jupiter allow]#
  • 現在192.168.123.128のアドレスが許可されている.
  • このファイルを消す.
[root@jupiter allow]# rm 192.168.123.128 
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx    2 root     root         4096 Aug 15 20:00 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
[root@jupiter allow]#
  • ファイルが消えたので,メーラを使って送信を行う.
  • すると,次のようなダイアログが表示される.

  • 無理矢理ファイルを作成してみる.
[root@jupiter allow]# touch 192.168.123.128
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx    2 root     root         4096 Aug 15 20:03 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-r--r--    1 root     root            0 Aug 15 20:03 192.168.123.128
[root@jupiter allow]# 
  • この状態で送信が可能となる.
  • また,このファイルは削除してメールソフトで受信すると,(たとえメールの受信が無くても)新たにファイルが作成されていることが確認できる.
[root@jupiter allow]# rm 192.168.123.128 
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx    2 root     root         4096 Aug 15 20:07 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 20:07 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 20:07 192.168.123.128
[root@jupiter allow]# 
  • なお,このファイルはクライアントがPOPで受信を行う都度,最新のタイムスタンプに更新される.
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 20:12 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 20:12 192.168.123.128
[root@jupiter allow]# 
  • これでコントロールされていることが確認できた.

4.許可リストをメンテナンスする

  • このままで運用すると,allowディレクトリにファイルができたままとなり許可しっぱなしとなる.
  • よって,許可リストを定期的に削除する必要がある.
  • relay-ctrl-ageコマンドを使うことで,期限が切れたファイルを削除することができる.
  • つまり,このrelay-ctrl-ageコマンドをcronで定期的に実行することで目的が達成できる.
  • まずは,動作を確認する.
  • デフォルトの900秒(15分)では長いので,期限を1分に設定する.
[root@jupiter allow]# echo 60 > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
[root@jupiter allow]# cat /etc/relay-ctrl/RELAY_CTRL_EXPIRY
60
[root@jupiter allow]# 
  • ファイルを確認し,消す.
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 20:33 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 20:33 192.168.123.128
[root@jupiter allow]# rm 192.168.123.128 
rm: remove regular file `192.168.123.128'? y
[root@jupiter allow]#
  • メールクライアントでメール受信を行い,新たにファイルができていることを確認する.
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 21:02 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 21:02 192.168.123.128
[root@jupiter allow]# date
Tue Aug 15 21:02:54 JST 2006
[root@jupiter allow]# 
  • 即座に実行してみる.
[root@jupiter allow]# /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
[root@jupiter allow]# date                                                               
Tue Aug 15 21:03:21 JST 2006
[root@jupiter allow]# ls -la
total 12
drwxrwxrwx    2 root     root         4096 Aug 15 21:02 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
-rw-rw-rw-    1 support  ujpjp          13 Aug 15 21:02 192.168.123.128
[root@jupiter allow]# 
  • 経過時間が30秒弱なので,ファイルが残っている.
  • もうしばらく待って,実行してみる.
[root@jupiter allow]# date
Tue Aug 15 21:05:40 JST 2006
[root@jupiter allow]# /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
[root@jupiter allow]# date
Tue Aug 15 21:05:44 JST 2006
[root@jupiter allow]# ls -la
total 8
drwxrwxrwx    2 root     root         4096 Aug 15 21:05 .
drwx------    3 root     root         4096 Aug 11 16:13 ..
[root@jupiter allow]# 
  • ファイルが消えていることがわかる.
  • 期限切れ時間を元に戻しておく.
[root@jupiter allow]# echo 900 > /etc/relay-ctrl/RELAY_CTRL_EXPIRY
[root@jupiter allow]#
  • 以下のような設定を,crontabに登録する.
*/10 * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
  • 以上で終了.


広告スペース
Google