作成開始 : 平成20年12月09日(火)  最終更新 : 平成23年02月02日(水) 

tcp wrapper を試す。

1.tcp wrapperとは

色んなネットワークサービスに対してアクセス制御を行うためのものです。
inetd から起動されるプログラムに対して、どこからサービス要求が出されたか調べ、ログを記録すると共に、アクセス制御を行うための仕組みです。
FreeBSDのあるバージョンまでは別途インストールが要ったようですが、現在は 標準で使えるようです。
inetd から起動されるプログラムだけを監視対象としているので万全とは言えませんが、主要なサービスに対するアクセス制御を手軽に実現するためのセキュリティツールとして使うとよいでしょう。
(inetd.conf に追加して他のソフトウェアを起動して tcp wrapper で制限することもできるようですがここでは省略します)
ルータでのフィルタリング、ソフトウェアごとのセキュリティ設定と組み合わせると結構いいかもしれません。
/etc/inetd.conf に記述あるものが対象ですが、ここに記載のない ssh や sendmail にも制限をかけることができます。

下はFreeBSDインストール時のディフォルトの /etc/inetd.conf です。

2.試してみた背景

私のサイトでは、「ルータによるフィルタ(基本設定->全部遮断[LAN->WAN、WAN->LAN]で必要なのだけ開放)」「各サーバーでは必要最小限のデーモンのみ起動」「各アプリケーションのフィルタ設定」というセキュリティ設定をしています。
ところが、先日の朝に起床して一服していたらメール、DNS、NTPの各サーバーを動かしている PC-9821Ne が妙な動きをしていました。
HDDにアクセスしっぱなしでコンソールで Enter してもプロンプトすら返ってきませんでした。
こうなるともうどうしようもないので、リセット・スイッチを「ぷちっ」とするしかないのです。
そして、OS起動後に shutdown -r now でもう一度起動して起動メッセージの正常性を確認しました。
とりあえず、その時は時間が無かったのでそのままにしておきましたが、夜にログを色々と調べました。
そしたら、/var/log/messages に次のようなログが見つかりました。

12月04日(木) 4:50:18 〜 4:52:59 の間です。
プロトコルは POP3 でプログラムは popper です。
実際は気がついた時間まで続いていたのでしょう。

support@wvps212-241-221-73.vps.webfusion.co.uk: -ERR Password supplied for "support" is incorrect.
test@wvps212-241-221-73.vps.webfusion.co.uk:-ERR Password supplied for "test" is incorrect.
spam@wvps212-241-221-73.vps.webfusion.co.uk:-ERR Password supplied for "spam" is incorrect.
info@wvps212-241-221-73.vps.webfusion.co.uk:-ERR Password supplied for "info" is incorrect.
help@wvps212-241-221-73.vps.webfusion.co.uk:-ERR Password supplied for "help" is incorrect.
temp@wvps212-241-221-73.vps.webfusion.co.uk:-ERR Password supplied for "temp" is incorrect.

どうやら、スパムメールか何かの攻撃のようです。
ネットで調べるとこの vps.webfusion.co.uk ってのはフィッシング詐欺サイトとしても検索されてました。

これではいかんと思い tcp wrapper を試してみようと思いました。

3.設定

私のところでは、FreeBSD は基本的に ssh, ftp, sendmail だけは動かすようにしています。

・ssh -> クライアントPC からログインしてメンテナンスするため。
・ftp -> ソースからコンパイルする必要がある時にソース転送するため。
・sendmail -> メールサーバーの管理者メールアドレスあてに、day, weekly, month, security のチェックメールを送信するため。
 (ssh, sendmail は /etc/inetd.conf に記述ありませんが wrapper で制限可能です)
 (sendmail は /etc/mail/access.db で LAN内だけ RELAY 許可しています)

上記に加えメールサーバーでは POP3 として qpopper も動かしています。

今回は qpopper の制限をメインに実施したいのとログを取得したいので次のように /etc/inetd.conf の qpopper記述を変更しました。

#pop3 stream tcp nowait root /usr/local/libexec/popper popper
         ↓
pop3 stream tcp nowait root /usr/local/libexec/popper popper -s -t /var/log/popper.log

・・・で、kill -HUP `cat /var/run/inetd.pid` (もしくは、ps ax で inetd の pid 取得して kill -HUP 取得したpid) とすると inetd が再起動するらしいのですが、私のでは inetd の新たな pid は生成されませんでした。
なので、サーバーを shutdown -r now で再起動しました。

OS再起動後にクライアントPCからメーラでアクセスすると確かに /var/log/popper.log にログ出力しました。

さらに、ログファイルの肥大化を防止したかったので、/etc/newsyslog.conf に以下を記述して gz圧縮で履歴ファイルを作成するようにし newsyslog しました。

/var/log/popper.log                        660  7     *    @T00  Z

次はいよいよ tcp wrapper の設定です。前は /etc/hosts.allow に許可設定を /etc/hosts.deny に禁止設定を書いていたそうですが、今は /etc/hosts.allow への記述に一本化されたそうです。
ディフォルトの /etc/hosts.allow は次のようになっていました。



ssh, sendmail, ftp, popper ともに接続できていたのは 上の方にある ALL : ALL : allow が利いているためですね。
まずは、現在の /etc/hosts.allow のバックアップを /etc/hosts.allow.org とかで保存しておきます。
そして、vi で /etc/hosts.allow を開き一旦全ての記述を dd で削除します。

私のサイトにあるメールサーバーのポリシーは・・・・

ssh, ftp は自分( localhost )と自ドメイン( .takaq.jp -> LAN内にDNSが無い時は例えば 192.168.0.0/16 とかです) にあるクライアントからだけ受け付ける。
sendmail は全てから受け付ける (RELAY制限は /etc/mail/access.db で行う)
popper は自分( localhost )と自ドメイン( .takaq.jp )およびインターネット上の特定ドメインからのクライアントから受け付ける。
前記以外は全て拒否する。
・・・とすると非常に簡単な設定ができてしまいます。

ALL : localhost : allow
ALL : .takaq.jp : allow

sendmail : ALL : allow

popper : .internet.co.jp : allow     -> .internet.co.jp は例です。

ALL : ALL : deny

設定文を書いてファイルに書き込んだだけで即反映されます。
基本はIPアドレスで書きますが、名前解決できていればドメイン名で書いてもOKです。

4.テスト

tcpdmatch で動作の確認ができます。例えば・・・・

# tcpdmatch popper internet.co.jp

warning: popper: service possibly not wrapped
client: hostname internet.co.jp
client: address ***.***.***.***
server: process popper
matched: /etc/hosts.allow line 8
option : allow
access: granted

# tcpdmatch popper test.internet.or.jp

warning: popper: service possibly not wrapped
client: hostname test.internet.or.jp
client: address ***.***.***.***
server: process popper
matched: /etc/hosts.allow line 13
option : deny
access: denied

・・・・とまぁ、こんな感じです。
動いていないデーモンを指定すると「動いてないよぉー」みたいに帰ってきます。

5.感想

最初、/etc/hosts.allow の「 sendmail : ALL : allow 」を書かないで、さらにテストもしないで眠ってしまい、朝メールチェックしたら一通も届いていませんでした。
/var/log/maillog を見たらインターネットからの全てのメールが reject されていました。
そうです。sendmail の /etc/mail/access.db でのチェックは tcp wrapper の後で行われるようです。
気をつけましょう。
/etc/hosts.allow に 「 sendmail : ALL : allow 」 を追加して tail -f /var/log/maillog していたらキチンと reject されずに入ってきました。

間違っていたらコメントいただければ幸いです。

平成21年04月12日(日) 追記

上で書いた設定では、LAN内でDHCPサーバーからIPアドレスを取得した場合、名前解決できないため接続拒否されてしまいます。
そのため、ALL に LAN内のネットワークアドレスを追記しました。
下のようになります。
ALL : PARANOID : RFC931 20 : deny

# Allow anything from localhost & mydomain
ALL : localhost : allow
ALL : .takaq.jp : allow
ALL : 192.168.0.0/255.255.0.0 -----> 192.168.1.0/255.255.255.0でもよいのですが、実験で使ったりするので ・・・。
                         (でも、これだけで上の 「ALL : .takaq.jp : allow」はまかなえちゃうんですけどね)
# Popper is Senka Company allow
qpopper : .internet.co.jp : allow

# sendmail
sendmail : ALL : allow

ALL : ALL : deny
もしくは、IPアドレスでの記述追加をやめて DHCP で配布するだけの IPアドレスとhost名を LAN内DNS に追記してもいいでしょう。
究極はLAN内に Dynamic DNS 作ってしまえばいいのですが、それはまた別の機会にします。
 ↓
平成21年04月14日(火) 結局 tinydns に DHCP で払い出される分の記述を追加しました。
tinydns には ddns-update 機能が無いようです。(Perl とか C で更新スクリプト作ってもいいのですが・・・)
したがって、ALL : 192.168.0.0/255.255.0.0 はリマークしました。
 ↓
平成21年04月23日(木) dhcp_dns で isc-dhcpd と djbdns を連携してみました。ここに資料あります。

平成23年02月02日(水) 追記 RFC931についての考察

アドレス詐称とかの不正なアクセスを防ぐものらしい。
まず、アクセスしてきた IPアドレス から 逆引きをして名前を取得、次に取得した名前から IPアドレス を正引きして一致しないものをはじく仕組みのようです。
ですが、この頃ではレンタルサーバやホスティングなどで必ずしも前記の条件が成り立たない時があります。
私がお世話になっているお客様の環境がまさしくそれです。
ALL : PARANOID : RFC931 20 : deny
これに引っかかって、qpopper : .internet.co.jp : allow を書いているのに、お客様のインターネット環境からアクセスすると「サーバから切断されました」になっていました。
tcpdmatch では grant になるのに、実際にアクセスすると拒否されるのです。

ALL : PARANOID : RFC931 20 : deny を外したら OK になりました。


戻る

サイトトップへ