メールサーバの不正利用対策その3
メールサーバの不正利用対策その3前回のQmail編に引き続き,PostfixにおけるPOP Before SMTPの導入について解説する。Postfixについては,すでに前々回でSMTP Authenticationの導入方法について紹介しているが,POP Before SMTPを導入すれば,メールソフトがSMTP Authenticationに対応していないユーザーでも,メールアカウントさえ持っていれば利用できる。SMTP Authenticationと共に導入しておくとよいだろう |
●PostfixでのPOP Before SMTPの導入 |
PostfixでのPOP Before SMTPの導入にあたり,ここではDRAC(Dynamic Relay Authorization Control)というソフトウェアを利用した構築方法について解説する。DRACは,それ自体が認証を行うわけではなく,POPサーバへのアクセスがあったIPアドレスをデータベースとして登録し,一定の時間保持するものだ。MTA(ここではPostfix)はメール送信の依頼が来ると登録されたデータベースを参照し,登録されているIPアドレスからの接続であればメールの送信を許可し,登録されていない場合は送信を行わない(図1)。メールの送信が許可される時間はDRACで指定した時間内のみとなり,指定された時間がくるとデータベースに登録されたIPアドレスは自動的に消去され,それ以降はそのIPアドレスからのメール送信は拒否される。これにより,POPサーバへのアクセス認証で許可されたユーザー以外の,不正な第三者中継を防御することが可能になる。
図1■DRACを利用したPOP Before SMTPの導入![]() DRACはPOPサーバへのアクセスがあったIPアドレスをデータベースとして登録し,一定の時間保持する。Postfixは登録されたデータベースを参照し,登録されているIPアドレスからの接続であればメールの送信を許可し,登録されていない場合は送信を行わない |
今回はPOPサーバにQpopperを利用し,DRACを用いてPOP Before SMTPを構築する。利用したソフトウェアのバージョンはリスト1のようになっている。POP Before SMTP導入にあたり,Postfixの再コンパイルは必要ないが,QpopperはDRACを使用するために再度インストール作業を行う必要がある。
リスト1■インストールに利用した環境![]() ・RedHat Linux 7.2 ・Postfix-1.1.10(Official release) ・DRAC version 1.11 ・Qpopper 4.04 |
●DRACのインストール |
DRACはmakeを行う前に,Linux用にMakefileを修正する必要がある。修正内容についてはDRACのWebサイトおよびソースファイル内にある「INSTALL」ファイルへ,プラットホーム別に記載されている。FreeBSDなど,Linux以外のOSにインストールする場合は,記載されている修正箇所を参照してMakefileの編集を行っておこう。 まずは,「drac」というディレクトリを作成してそこにダウンロードし,解凍する。
$ mkdir drac $ cd drac $ wget ftp://ftp.cc.umanitoba.ca/src/drac.tar.Z $ gunzip drac.tar.Z $ tar xvf drac.tar |
●Makefileの修正 |
引き続いて,Makefileの修正だ。
$ vi Makefile |
としてMakefikeをエディタで開いたあと,下記の箇所を変更・修正し保存する。修正する箇所は,
INSTALL = install DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C CFLAGS = $(DEFS) -g LDLIBS = -ldb RPCGENFLAGS = -C -I MANADM = 8 |
の5か所だ(リスト2)。
リスト2■Makefileの内容
#### Makefile for drac ## Tuneables # Paths INSTALL = /usr/ucb/install ←修正:INSTALL = install EBIN = /usr/local/sbin MAN = /usr/local/man/man 〜中略〜 # Settings for postfix and exim # Do not set these for sendmail # -DREQ_HASH # requires hash format # -DCIDR_KEY # keys in CIDR format # -DTERM_KD # keys and data nul-terminated #DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO ←修正:DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C # Compiler flags CC = cc RANLIB = : #CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix ←修正:CFLAGS = $(DEFS) -g #CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix #CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include #LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb ←修正:LDLIBS = -ldb #LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb #LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb TSTLIBS = -L. -ldrac -lnsl #RPCGENFLAGS = ←修正:RPCGENFLAGS = -C -I #RPCGENFLAGS = -C # Man sections MANLIB = 3 #MANADM = 1m ←修正:MANADM = 8 〜省略〜 |
○DRACのインストール
Makefileの修正が終わったらインストール作業に移ろう。
$ make $ su password: # make install install -c -o bin -g bin -m 0755 rpc.dracd /usr/local/sbin # cp libdrac.a /usr/local/lib/ |
続けてマニュアルファイルのインストールを行うが,インストール時に下記のようなエラーが発生した場合は,ディレクトリを作成したあとに再度インストール作業を行えばよい。
# make install-man install -c -m 0444 rpc.dracd.1m /usr/local/man/man8/rpc.dracd.8 install -c -m 0444 dracauth.3 /usr/local/man/man3/dracauth.3 install: cannot create regular file `/usr/local/man/man3/dracauth.3': そのような ファイルやディレクトリはありません make: *** [install-man] エラー 1 |
![]() |
# mkdir
/usr/local/man/man3/ # make install-man install -c -m 0444 rpc.dracd.1m /usr/local/man/man8/rpc.dracd.8 install -c -m 0444 dracauth.3 /usr/local/man/man3/dracauth.3 |
以上でDRACの基本的なインストールは完了する。「/usr/local/sbin/」以下に「rpc.dracd」が作成されているか確認しておこう。
$ which rpc.dracd /usr/local/sbin/rpc.dracd |
○起動スクリプトのコピー
DRACを展開したディレクトリに起動スクリプトのサンプルファイル「dracd-setup.linux」があるので,修正する。
$ vi dracd-setup.linux # See how we were called. case "$1" in start) echo -n "Starting rpc.dracd daemon: " daemon rpc.dracd& ←修正:/usr/local/sbin/rpc.dracd echo touch /var/lock/subsys/rpc.dracd ;; stop) echo -n "Stopping rpc.dracd daemon: " killproc rpc.dracd ←修正:/usr/local/sbin/rpc.dracd echo rm -f /var/lock/subsys/rpc.dracd ;; *) echo "Usage: dracd {start|stop}" exit 1 esac exit 0 |
修正が完了したら起動スクリプトを「/etc/rc.d/init.d」へコピーする。
# cp ./dracd-setup.linux /etc/rc.d/init.d/dracd |
次に,DRACの許可するIPアドレスを「/etc/mail/」以下の「dracd.allow」というファイルへ,
255.255.255.255 メールサーバのIPアドレス(POP/IMAPサーバの稼動しているサーバのアドレス) 255.255.255.255 127.0.0.1 |
のように記述する必要がある。なお,DRACを展開したディレクトリに「dracd.allow-sample」というサンプルファイルがあるので,これに修正を加えて/etc/mailにコピーすればよい。基本的には上記のアドレスが記述されていればよいが,DRACとメールサーバが同じサーバ内のサービスとして稼動している場合は「255.255.255.255 127.0.0.1」のみでよいため,「255.255.255.255 192.168.16.8」をコメントアウトする。
# vi dracd.allow-sample # dracd.allow: clients trusted by rpc.dracd # # The format of this file is one of more lines of # # netmask netaddr # Both netmask and netaddr must be dotted quads. # 255.255.255.255 192.168.16.8 255.255.255.255 127.0.0.1 #### |
![]() |
# dracd.allow: clients trusted by rpc.dracd # # The format of this file is one of more lines of # # netmask netaddr # Both netmask and netaddr must be dotted quads. # #255.255.255.255 192.168.16.8 255.255.255.255 127.0.0.1 #### |
修正を行ったら/etc/mailにコピーする。
# cp dracd.allow-sample /etc/mail/dracd.allow |
○動作テスト
DRACの動作テストは,DRACを展開したディレクトリに移動し,make時に作成された「testing」を利用して行う。DRACを起動したあとに,以下のように入力してテストを行ってみよう。
# /etc/rc.d/init.d/dracd start # cd drac # ./testing localhost 130.179.18.188(任意のIPアドレスでよい) |
次に,上記でテストしたIPアドレスが,データベースに保存されているかを確認する。
# db_dump -p /etc/mail/dracd.db VERSION=3 format=print type=btree HEADER=END 130.179.18.188 ←testingで使用したIPアドレスが記述されているかを確認 1021687559 DATA=END |
このようにテストしたIPアドレスが記述されているかを確認する。testingで使用したIPアドレスが記述されていれば正常に動作している。
テストが完了したらデータベースからIPアドレスを消去しておこう。データベースの初期化は「-i」オプションで行う。
# rpc.dracd -i ←データベース初期化 # db_dump -p /etc/mail/dracd.db VERSION=3 format=print type=btree HEADER=END DATA=END ※IPアドレスが消去されているかを確認 |
◇rpc.dracd起動オプションについて![]()
![]() [-i] :データベースの初期化 [-e] :データベースからIPアドレスを消去する時間の指定(デフォルトでは30分) [dbfile] :データベースファイル(/etc/mail/dracd.db) |
●データーベースからIPアドレスを消去する時間を設定する |
DRACは初期設定のまま使用すると,IPアドレスは30分間保持される。この時間設定をユーザーの環境に合わせて変更しておく。さきほど/etc/rc.d/init.dへコピーした起動スクリプトを編集し,時間設定を行っておこう。たとえば5分間に設定するのであれば,「daemon /usr/local/sbin/rpc.dracd &」を「daemon /usr/local/sbin/rpc.dracd -i -e 5 &」と変更する。
$ vi /etc/rc.d/init.d/dracd # See how we were called. case "$1" in start) echo -n "Starting rpc.dracd daemon: " daemon /usr/local/sbin/rpc.dracd & ←修正:/usr/local/sbin/rpc.dracd -i -e 5 & echo touch /var/lock/subsys/rpc.dracd ;; stop) echo -n "Stopping rpc.dracd daemon: " killproc rpc.dracd echo rm -f /var/lock/subsys/rpc.dracd ;; *) echo "Usage: dracd {start|stop}" exit 1 esac exit 0 |
修正したら
# /etc/rc.d/init.d/dracd stop # /etc/rc.d/init.d/dracd start |
で再起動させよう。
●POPサーバの設定 |
QpopperでDRACを利用するのに特別な設定は必要なく,インストールすればPOP Before SMTPの利用ができるようになるはずだ。ただし,DRACを使用するためにはQpopperの再コンパイルが必要になる。QpopperでDRACを利用するためには,configure時のオプションで「--enable-drac」を指定しなければならないからだ(Qpopper3.1以上のバージョン)。ここでは,DRACの利用と同時に,APOP認証への移行も含めてインストールを行っておこう。
※Qpopperの現状のバージョンは4.04で,古いバージョンにはDoS攻撃などのセキュリティホールが発見されている。古いバージョンを利用している場合は必ずアップデートを行っておこう。また,現在のバージョン4.04にも「~/.qpopper-options」を利用するオプション設定を行っている場合,外部からではないものの,ローカルユーザーがバッファーオーバーフローを生じさせることができるセキュリティホールが発見されている。自宅であればローカルのユーザーは自分だけかもしれないが,「~/.qpopper-options」を利用しない(起動時に-uオプションを使用しない)ようにしておこう。 ◇参考1:Qpopperのセキュリティホール関連リンク(バージョン4.0〜4.03) ◇参考2:Qpopperのセキュリティホール関連リンク(バージョン4.03〜4.04) |
○Qpopperのインストール
はじめに,APOP認証用のアカウント「pop」の作成を行う
# groupadd pop # useradd -g pop -d /dev/null -s /bin/false pop $ wget ftp://ftp.qualcomm.com/eudora/servers/unix /popper/qpopper4.0.4.tar.gz $ tar xzvf qpopper4.0.4.tar.gz $ cd qpopper4.0.4 $ ./configure --enable-apop=/etc/pop.auth --with-popuid=pop --enable-drac $ make $ su password: # make install |
以上で完了する。もしconfigure時に
Can't use DRAC: dracauth not found in -ldrac |
というエラーが出る場合,さきほどのDRACインストール時に
# cp libdrac.a /usr/local/lib/ |
の作業を行っていない可能性がある。DRACの作業ディレクトリに戻り,「libdrac.a」をコピーしてから,再度インストールしよう。
○APOP認証用のパスワード設定
次に,APOP用の認証設定もしておこう。APOPは通常のPOPアクセスと異なり,パスワードを暗号化してやりとりできる。今回のPOP before SMTPとは主題が異なるが,セキュリティ強化のためにも設定しておいたほうがよい。まず,popauthの所有権とsetuidの設定を行い,データベースファイル「/etc/pop.auth」のパーミッションを「600」に設定する。
# chown pop /usr/local/sbin/popauth # chmod u+s /usr/local/sbin/popauth # chmod 600 /etc/pop.auth |
続いて,データベースを初期化する。
# popauth -init Really initialize POP authentication DB? ←「y」を入力 |
初期化したら,ユーザーパスワードを設定して,データベースへユーザーを追加しよう。
# popauth -user ユーザー名 Adding only APOP password for ユーザー名. New password: パスワードを入力 Retype new password: 再度パスワードを入力 |
※ユーザーが個別にパスワード設定するにはpopauthコマンドを利用する。![]() ![]()
※ユーザーの削除は ![]()
![]() とすれば,削除される。 |
○Qpopperの起動スクリプトの例
下記のような起動スクリプトを「/etc/xinetd.d」にpopperなどの名前で作成する。
# vi /etc/xinetd.d/popper service pop3 { disable = no socket_type = stream wait = no user = root server = /usr/local/sbin/popper server_args = -s } |
作成したら,xinetdを再起動する。
# /etc/rc.d/init.d/xinetd restart |
設定が完了したら,受信に利用しているメールソフトの設定をAPOPに変更し,実際に動作,認証するかテストを行っておこう。
●Postfixの設定 |
PostfixでのDRAC利用設定は,「/etc/postfix/main.cf」で行う。エディタで開き,送信時にDRACデータベースを参照するように設定を変更する(黄色の文字部分)。
# vi /etc/postfix/main.cf (前略) myhostname = mail.hogehoge.com mydomain = hogehoge.com mydestination = $myhostname, localhost.$mydomain, $mydomain, mail.$mydomain relay_domains = $mydestination smtpd_recipient_restrictions = permit_mynetworks, check_client_access btree:/etc/mail/dracd, check_relay_domains (後略) |
編集できたらPostfixを再起動し,変更を反映させておく。
# postfix reload |
●動作テスト |
すべての設定が完了し,再起動ができたら動作テストを行う。まず,メールソフトでPOPサーバへアクセスし,下記のようにデータベースが更新されているかを確認する。
# db_dump -p /etc/mail/dracd.db VERSION=3 format=print type=btree HEADER=END xxx.xxx.xxx.xxx ←POPアクセスを行ったクライアントのIPアドレス 1021778817 DATA=END |
次に
# rpc.dracd -i |
としてデータベースを初期化して,Postfixでメールが送信できないかを確認するとともに,ふたたびPOPアクセスしたあとにはメールが送信できるかをテストする。実際のテスト時は知人などに頼んで,外部からテストしてもらうほうがよいだろう。また,IPアドレスが指定した時間で削除されているかの確認を忘れないように行っておこう。
メールソフトのPOP before SMTP設定 ・Outlook Express ・Becky! Internet Mail |
●IMAPおよびほかのPOPサーバでの設定について |
今回は解説していないが,IMAPサーバやほかのPOPサーバでDRACを利用する設定については,DRACのWebサイトにある「POP/IMAP Server Modifications」を参照してほしい。ここから各サーバのパッチ類がダウンロードができる。
数回にわたり,SMTPサーバの不正利用対策ついて解説したが,サーバを外部に公開するのであれば,不正利用対策(メールサーバ以外にもプロキシサーバの不正利用などもある)とともに,運営しているサービスのセキュリティホール情報には常に気を配る必要がある。メールサーバやWebサーバは常に外部へ開かれているサービスであるため,重大なセキュリティホールが発見されれば,侵入や破壊などの攻撃だけでなく,踏み台として利用されて,ほかのサーバへ攻撃する手段となってしまう可能性がある。必要のないものは停止するか削除しておくことも重要だろう。