Installing FreeBSD

初心者のFreeBSD導入記


tcp_wrapper導入編


tcp_wrapper導入

 本校では、iij-pppにNAT(Network Address Translator) のパッチをあてて、ダイヤルアップでもLAN上のどのマシンからでもインターネットに出ていけるようにしています。

※参考
NAT on iij-ppp
On Demand Dialup IP[目次]
 ところが、ダイヤルアップとはいえ、グローバルなIPアドレスを使っている以上、外部から不正に侵入される危険性はあるわけです。(図1参照

※こういう場合、huck あるいは hucker という言葉が一般に通用していますが、cruck あるいは attack というのが正確です。
 プロバイダから割り振られる IP アドレスは電話をかけて回線をつなげる度に違います。しかし、その範囲は限られたもので、何度もつなげていると、中には同じアドレスが割り振られていることもあります( ppp で show ipcp してみるとわかる)。
 たとえば、授業で生徒にアクセスさせようとしたばあい、小1時間はつなぎっぱなしになりますから、その間に偶然、割り振られた IP アドレスにぶつかることもなきにしもあらず。
 もしそのアドレスで telnet してくる人がいたら、Server は LAN 内からのアクセスと区別できずに login の画面を出してしまいます。そうすると、燃えて来る人もいるわけで……(^-^ゞ

<図1>
Foreign-host
Server inetd
(アクセス制限
無し)

telnetd

LAN

 そこで……許可されたホスト以外から telnet, ftp, finger, rlogin, POP などでのアクセスを制限するプログラム tcp_wrapper ( tcpd ) を入れることにしました。(図2参照)
 tcpd は inetd と telnetd etc. の間に入り、アクセスを許可されたホストからのものかどうかチェックして、その後のプロセスを立ち上げます。
 これだと、不正なアクセスを拒否するばかりでなく、もし不正なアドレスがあった場合、どこからアタックをかけられたか知らせてくれます。

<図2>
Foreign-host
Server inetd

tcpd
(アクセス制限を
チェック)

telnetd

LAN
NG!
OK!

 可能性は低いとはいえ、安全策を講じておくにしくはありませんね。

設定

 インストールは ports から行いました。2.2.1R の CD には tcp_wrappers_7.4.tar.gz が収録されています。
 /usr/ports/security/tcp_wrapper の下で make install を実行するだけです。

 この後で、各種の設定にはいるわけですが、ここで注意しなければならないことがあります。
 ports でインストールすると、README とは違ったディレクトリ設定になるのです。具体的には、アクセスを許可 or 拒否するホストの情報を、ディフォルトでは

/etc/hosts.allow
/etc/hosts.deny
に書くことになっていますが、ports でだと、
/usr/local/etc/hosts.allow
/usr/local/etc/hosts.deny
に書き込むように、Makefile ではなっています。

 tcp_wrapper を動かすには /etc/inetd.conf を書き換えます。
 ftp, telnet, rlogin, pop3 を制限してみます。それらの行を以下のように書き換えました。

#ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
ftp stream tcp nowait root /usr/local/libexec/tcpd ftpd -l
#telnet stream tcp nowait root /usr/libexec/telnetd telnetd
telnet stream tcp nowait root /usr/local/libexec/tcpd telnetd
#login stream tcp nowait root /usr/libexec/rlogind rlogind
login stream tcp nowait root /usr/local/libexec/tcpd rlogind

#pop3 stream tcp nowait root /usr/local/libexec/popper popper
pop3 stream tcp nowait root /usr/local/libexec/tcpd popper

※注意!

 もし、popper を ports からインストールしてあれば、そのバイナリの置き場が tcpd の想定している場所と違っていますので、以下のようにしてリンクしておきましょう。

# cd /usr/libexec
# ln -s /usr/local/libexec/popper
 次に、/usr/local/etc/hosts.allow と /usr/local/etc/hosts.deny を次のようにします。
/usr/local/etc/hosts.allow
ALL: 192.168.0.
/usr/local/etc/hosts.deny
ALL: ALL
 最初の「ALL」は制限するデーモンの名前を書くのですが、これだと /etc/inetd で tcpd をかましてある全てのものが対象になります。次の「ALL」あるいは IP アドレスは拒否、あるいは許可するホストの情報です。IP アドレスではなく、ドメインでも書き込めます。
 いったん、hosts.deny で全てのホストからのアクセスを拒否しておいて、hosts.allow に許可するホストを書き込むようにしています。
 上の書き方だと「192.168.0.」というネットワークにつながったホスト(つまりローカルの…)からは全部アクセスできますが、外部からのアクセスはできません。
 他にもワイルドカードを使って、いろんな表記の仕方ができるみたいです。詳しくは
man 5 hosts_access
してください。
 で、kill -HUP (inetd の プロセス番号)とすれば、動き始めます。

不正アクセスの知らせをメールで受け取るには

 もし、許可していないホスト以外から不正にアクセスがあった場合、/var/log/messages に

Sep 25 12:54:53 white telnetd[252]: refused connect from bad.host
Sep 25 12:55:02 white telnetd[256]: refused connect from bad.host
というようなログが残ります。
 しかし、いちいちこのファイルを見にいくのは面倒なので、不正アクセスの知らせをメールで受け取れるようにすれば便利です。

 man 5 hosts_access によると /usr/local/etc/hosts.deny 等で

daemon_list : client_list [ : shell_command ]
の書式で書けばいいとあるのですが、この shell_command のところにどう書くかが問題 になります。
 どうも、man のままではうまくないようです。昔は確かにこれで動いたそうですが、今は以下のように書かないと、だめなようです。
--------------------------- hosts.deny ---------------------------------
ALL EXCEPT fingerd: ALL: spawn = (/usr/local/bin/safe_finger -l @%h | \
                        /usr/bin/mail -s %d-%h root) &
ALL: ALL: spawn = (/usr/bin/mail -s %d-%h root) &
------------------------------------------------------------------------
man 5 hosts_access に出ている例には spawn = の表現が抜けてますね。(man 5 hosts_options にはちょっとだけ書かれています。)
※自白

このことを発見したのは私ではなく、ある人がソースを読んでいて気が付きました。私はそれを教えてもらっただけ……(^-^ゞ
私にはソースを読む力なんてありませんからねえ……(^-^ゞ

注意すべきは、2つあって、 だそうです。
 もちろん、上記のメールの宛先を root 以外、他の管理者のメールアドレスでもいいわけです。

 これらのファイルの記述ミスとかは、実験してみて messages を見てもいいのですが、効率が悪いので

# /usr/local/sbin/tcpdchk
とやって、警告がなければ OK です。

これで、不正アクセスをすると以下のようなメールが届きます。

   From daemon Fri Sep 26 11:11:24 1997
   Date: Fri, 26 Sep 1997 11:11:24 +0900 (JST)
   From: Charlie Root 
   To: root
   Subject: telnetd-badhost

   [badhost]
   Login name: hoge                     In real life: hoge hoge
   Directory: /home/hoge         Shell: /bin/tcsh
   On since Sep 26 09:39:54 on ttyp0 from host_name
   No Plan.

これで、安心ですね\(^0^)/

※参考

許可するホストに関しては、domain name よりも IP アドレスの列挙の方がより頑丈だそうです。

ALL: 10.0.0.0/255.255.255.0 10.0.1.100
hosts.allow でこうすると 10.0.0.0 から 10.0.0.254 までの client と 10.0.1.100 が入れます。ネットワーク表現をうまく使えるといいですね。
 name を使わない方がいいのは DNS サーバーをだまして入る事が不可能ではないからです。古いバージョンの DNS を参照するとだまされやすいので。

tcp_wrapper に付属するツール

 上記で使った

もそうですが、tcp_wrapper を make すると、いくつかのバイナリができています。
 他に便利なものとして、tcpdmatch がありますので、ちょっとご紹介。

 許可ルールの確認に便利なコマンドです。

(1)アクセスが許される例

# /usr/local/sbin/tcpdmatch ftpd goodhost
client:   hostname goodhost
client:   address  xxx.yyy.zzz.aaa
server:   process  ftpd
matched:  /usr/local/etc/hosts.allow line 1
access:   granted
(2)アクセスが許されない例
# /usr/local/sbin/tcpdmatch ftpd badhost
client:   hostname badhost
client:   address  ppp.qqq.rrr.sss
server:   process  ftpd
matched:  /usr/local/etc/hosts.deny line 2
option:   spawn (/usr/local/bin/safe_finger -l @badhost | 
                      /usr/bin/mail -s ftpd-badhost root) &
access:   denied
こうすると、実際にそのマシンに入らずにルールの正当性の確認ができます。どのルールで、OK なのか NG なのかも確認できます。
 もちろん、可能ならば外のマシンから確かに出来ない事を確認するのは重要です。


  1. 初心者のFreeBSD導入記・準備編
  2. 初心者のFreeBSD導入記・インストール編
  3. 初心者のFreeBSD導入記・設定編
  4. 初心者のFreeBSD導入記・SAMBA導入編
  5. 初心者のFreeBSD導入記・CAP60導入編
  6. 初心者のFreeBSD導入記・POP3導入編
  7. 初心者のFreeBSD導入記・tcp_wrapper導入編
  8. 初心者のFreeBSD導入記・メーリングリスト導入編
  9. 初心者のFreeBSD導入記・HDD 増設編