TIS FWTK(FireWall ToolKit)は ftp://ftp.tis.com/ から入手でき ます。
私と同じ失敗をしないように、TIS からファイルを ftp する際には、まず README ファイルを読んでください。TIS fwtk はサーバの隠しディレクトリに 収めてあり、入手するためには fwtk-request@tis.com に本文に SEND と だけ書いたメールを送る必要があります。サブジェクト行は不要です。 メールを送ると自動的に(12 時間有効な)ソースコードをダウンロードするた めのディレクトリ名が返信されます。
この HOWTO を書いている時点では TIS は FWTK バージョン 2.0(beta)をリリー スしています。このバージョンは(少しの例外をのぞいて)ちゃんとコンパイル でき、手元ではきちんと動いています。以下の説明もこのバージョンを元にし ます。彼らが最終版をリリースすれば、この HOWTO も update します。
FWTK をインストールするためには fwtk-2.0 というディレクトリを /usr/src ディレクトリに作ります。FWTKのソースコード(fwtk-2.0.tar.gz)をこのディ レクトリに移して展開してください(tar zxf fwtk-2.0.tar.gz)。
FWTK には WWW の SSL をサポートする機能はありませんが、Jean-Christophe Touvet が addon ソフトを書いています。このソフトは ftp://ftp.edelweb.fr/pub/contrib/fwtk/ssl-gw.tar.Z から入手で きます。ただし Touvet はこのコードをサポートしていません。
私は Eric Wedel 作の Netscape secure news servers 用に改造したバージョ ンを使っています。これは ftp://mdi.meridian-data.com/pub/tis.fwtk/ssl-gw/ssl-gw2.tar.Z から入手できます。
以下の例では Eric Wedel 版を使います。
このプログラムをインストールするには、単に /usr/src/fwtk-2.0 の下に ssl-gw ディレクトリを作り、ファイルをそこに置くだけです。
私がコンパイルした時はいくつかの修正が必要でした。
最初の修正は ssl-gw.c に行います。ssl-gw.c では必要なファイルをインク ルードし忘れていました。
#if defined(__linux) #include <sys/ioctl.h> #endif
二つめの修正は、ssl-gw に Makefile が無いことでした。私は他の gateway ディレクトリにある Makefile をコピーして、gateway 名を ssl-gw に変更す ることでしのぎました。
FWTK のバージョン 2.0 は以前のバージョンに比べてずっと簡単にコンパイル できるようになりましたが、BETA 版をきれいにコンパイルするにはまだいく つかの修正が必要でした。最終版までにこれらの修正が行なわれることを期待 しています。
修正するためには /usr/src/fwtk/fwtk ディレクトリに移動して、まず Makefile.config.linux を Makefile.config ファイルにコピーします。
FIXMAKE を動かしてはいけません。 インストラクションには FIXMAKE するように書いてありますが、FIXMAKE すると、それぞれのディレク トリの Makefile が破壊されてしまいます。
私は fixmake を以下のように修正しました。問題は sed スクリプトがそれぞ れの Makefile の include 行に対して '.'と '' を付け加える処理の部分で した。以下のようにしておけば fixmake もちゃんと動きます。
sed 's/^include[ ]*\([^ ].*\)/include \1/' $name .proto > $name
次に Makefile.config ファイルを修正します。このファイルには 2 箇所の修 正が必要です。
付属のドキュメントの著者は自分のホームディレクトリにソースコードを置い ていますが、私たちの例では /usr/src でコンパイルしようとしていますので、 FWTKSRCDIR を以下のように設定します。
FWTKSRCDIR=/usr/src/fwtk/fwtk
次に、Makefile.config では dbm を使うようになっていますが、いくつかの Linux システムでは gdbm データベースを使うので以下のように設定しました。 私の環境は RedHat 3.0.3 です。
DBMLIB=-lgdbm
最後の修正は x-gw です。私の試した BETA バージョンには socket.c コード にバグがありました。修正するには、以下の行を削除してください。
#ifdef SCM_RIGHTS /* 4.3BSD Reno and later */ + sizeof(un_name->sun_len)+ 1 #endif
ssl-gw が必要ならば、Makefile のディレクトリリストに ssl-gw のディレク トリも加えます。
DIRS= smap smapd netacl plug-gw ftp-gw tn-gw rlogin-gw http-gw x-gw ssl-gw
これで make してください。
インストールするには make install してください。
配布時の設定では /usr/local/etc にインストールされますが、これを別のよ り安全なディレクトリに移しても構いません(私はやっていませんが)。私はこ のディレクトリのパーミッションを 'chmod 700' にしました。
後は firewall の設定を行うだけです。
いよいよ佳境に入ってきました。まず、インストールした新しいサービスにつ いてシステムに教え、新しい機能を設定するための表を作らなければいけませ ん。
ここで TIS FWTK のマニュアルを繰り返すつもりはありませんので、以下では 手元で動いた設定を示すと共に、私がぶつかった問題について説明し、どうやっ て正しい設定を見つけたかを述べます。
TIS FWTK を制御するためのファイルは以下の 3 種です。
FWTK を機能させるためには以上のファイルを逆順に修正しなければいけませ ん。netperm-table や inetd.conf を正しく設定せずに services ファイルを 修正するとシステムが使用不能になる可能性があります。
このファイルは TIS FWTK のサービスを誰が使えるかを指定します。 設定の 際には firewall の両側のネットワークのトラフィックを充分考慮してくださ い。今回はプライベートネットワークの外からアクセスするには自らを認証す るようにして、ネットワークの内側にいる人は自由に外部へアクセスできるよ うな設定にしましょう。
外部の人の認証用に firewall では authsrv というプログラムを使 います。このプログラムはユーザ ID とパスワードのデータベースを使います。 netperm-table の認証セクションはデータベースがどこにあって誰がアクセス できるかを指定します。
私はこの接続を制限する際に多少のトラブルを経験しました。以下に示す
permit-hosts 行の '*' では誰でもアクセスできてしまいます。この行の正し
い設定は authsrv: permit-hosts localhost
でした。
# # Proxy configuration table # # Authentication server and client rules authsrv: database /usr/local/etc/fw-authdb authsrv: permit-hosts * authsrv: badsleep 1200 authsrv: nobogus true # Client Applications using the Authentication server *: authserver 127.0.0.1 114
データベースを初期化するには、su で root になって /usr/local/etc ディ レクトリで ./authsrv コマンドを起動して管理用のユーザレコード を作ります。以下に例を示します。
ユーザやグループの追加方法については FWTK のドキュメントを読んでくださ い。
# # authsrv authsrv# list authsrv# adduser admin "Auth DB admin" ok - user added initially disabled authsrv# ena admin enabled authsrv# proto admin pass changed authsrv# pass admin "plugh" Password changed. authsrv# superwiz admin set wizard authsrv# list Report for users in database user group longname ok? proto last ------ ------ ------------------ ----- ------ ----- admin Auth DB admin ena passw never authsrv# display admin Report for user admin(Auth DB admin) Authentication protocol: password Flags: WIZARD authsrv# ^D EOT #
telnet 用ゲートウェイ(tn-gw)が最も簡単なので、これから設定を始めましょ う。
以下に示す例では、内部のネットワーク上のホストからの telnet は認証無し で許可しています(permit-hosts 196.1.2.* -passok)。一方、その他のユーザ がプロキシサーバを使う場合はユーザ ID とパスワードが必要です (permit-hosts * -auth)。
もう一箇所 196.1.2.202 からのアクセスも認証なしで直接 firewall にアク セスできるようにしています。netacl-in.telnetd のある行がそのための指定 です。この行の詳細については後述します。
telnet のタイムアウトは短めにしておくべきです。
# telnet gateway rules: tn-gw: denial-msg /usr/local/etc/tn-deny.txt tn-gw: welcome-msg /usr/local/etc/tn-welcome.txt tn-gw: help-msg /usr/local/etc/tn-help.txt tn-gw: timeout 90 tn-gw: permit-hosts 196.1.2.* -passok -xok tn-gw: permit-hosts * -auth # Only the Administrator can telnet directly to the Firewall via Port 24 netacl-in.telnetd: permit-hosts 196.1.2.202 -exec /usr/sbin/in.telnetd
rlogin など r- 系のコマンドも telnet と同じ設定になります。
# rlogin gateway rules: rlogin-gw: denial-msg /usr/local/etc/rlogin-deny.txt rlogin-gw: welcome-msg /usr/local/etc/rlogin-welcome.txt rlogin-gw: help-msg /usr/local/etc/rlogin-help.txt rlogin-gw: timeout 90 rlogin-gw: permit-hosts 196.1.2.* -passok -xok rlogin-gw: permit-hosts * -auth -xok # Only the Administrator can telnet directly to the Firewall via Port netacl-rlogind: permit-hosts 196.1.2.202 -exec /usr/libexec/rlogind -a
FTP などで直接ファイアウォールに接続すべきではないので、ファイアウォー ルではFTP サーバを起動してはいけません。
繰り返しますが、以下の例の permit-hosts 行は内部のネットワークから誰で もインターネット上のホストへ FTP 接続できる一方で、その他のユーザには 認証を求めるという設定です。私は(-log {retr stor })行でやりとりした ファイルの記録をとるようにしています。
FTP の timeout の設定は接続状態が悪い場合などに接続を切るための時間と データをやりとりしないまま接続を開いている時間を制御するために設定して います。
# ftp gateway rules: ftp-gw: denial-msg /usr/local/etc/ftp-deny.txt ftp-gw: welcome-msg /usr/local/etc/ftp-welcome.txt ftp-gw: help-msg /usr/local/etc/ftp-help.txt ftp-gw: timeout 300 ftp-gw: permit-hosts 196.1.2.* -log { retr stor } ftp-gw: permit-hosts * -authall -log { retr stor }
Web や gopher、ブラウザ経由の ftp などは http-gw が制御します。以下に 示す例の最初の 2 行で firewall ごしにやりとりした ftp と web の文書を 蓄えておくディレクトリを指定します。私はこれらのファイルをルートの所有 とし、ルートしかアクセスできないディレクトリに置きました。
Web の接続は短く制限すべきです。timeout の設定は反応の無い接続先を待つ 時間です。
# www and gopher gateway rules: http-gw: userid root http-gw: directory /jail http-gw: timeout 90 http-gw: default-httpd www.afs.net http-gw: hosts 196.1.2.* -log { read write ftp } http-gw: deny-hosts *
ssl-gw は全てを通過させますので注意が必要です。以下の例では内部のネッ トワークの全てのホストが 127.0.0.* と 192.1.1.* 以外、加えてポート番号 の 443 から 563 の外部のネットワーク全てにアクセスできるようにしていま す。443 から 563 までが SSL が使うポートです。
# ssl gateway rules: ssl-gw: timeout 300 ssl-gw: hosts 196.1.2.* -dest { !127.0.0.* !192.1.1.* *:443:563 } ssl-gw: deny-hosts *
次に示す例が plug-gw を使って news サーバに接続するという場合です。こ の例では、内部のネットワークの誰でもが特定のマシンの news ポートにのみ 自由にアクセスできるようにしています。
3 行めは news サーバからのデータがファイアウォールを越えるためのもの です。
ユーザがニュースを読んでいる間、サーバと接続していることを仮定している ニュースリーダが多いので、ここでの timeout は長めに設定しておきます。
# NetNews Pluged gateway plug-gw: timeout 3600 plug-gw: port nntp 196.1.2.* -plug-to 199.5.175.22 -port nntp plug-gw: port nntp 199.5.175.22 -plug-to 196.1.2.* -port nntp
finger のゲートウェイは簡単です。内部のネットワークのユーザはいったん firewall にログインしてから finger を使うようにしています。それ以外の 人が finger しようとしても finger.txt が送られるだけです。
# Enable finger service netacl-fingerd: permit-hosts 196.1.2.* -exec /usr/libexec/fingerd netacl-fingerd: permit-hosts * -exec /bin/cat /usr/local/etc/finger.txt
Mail と X-windows 用のサービスは設定していないので例は示しません。誰か うまく行く例をご存知の方は私まで e-mail で連絡してください。
以下に /etc/inetd.conf ファイルを示します。不要なサービスは全てコメン トアウトしています。何をコメントアウトして、ファイアウォール上で動かし てもいいサービスは何かを示すために全文を示します。
#echo stream tcp nowait root internal #echo dgram udp wait root internal #discard stream tcp nowait root internal #discard dgram udp wait root internal #daytime stream tcp nowait root internal #daytime dgram udp wait root internal #chargen stream tcp nowait root internal #chargen dgram udp wait root internal # FTP firewall gateway ftp-gw stream tcp nowait.400 root /usr/local/etc/ftp-gw ftp-gw # Telnet firewall gateway telnet stream tcp nowait root /usr/local/etc/tn-gw /usr/local/etc/tn-gw # local telnet services telnet-a stream tcp nowait root /usr/local/etc/netacl in.telnetd # Gopher firewall gateway gopher stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw # WWW firewall gateway http stream tcp nowait.400 root /usr/local/etc/http-gw /usr/local/etc/http-gw # SSL firewall gateway ssl-gw stream tcp nowait root /usr/local/etc/ssl-gw ssl-gw # NetNews firewall proxy (using plug-gw) nntp stream tcp nowait root /usr/local/etc/plug-gw plug-gw nntp #nntp stream tcp nowait root /usr/sbin/tcpd in.nntpd # SMTP (email)firewall gateway #smtp stream tcp nowait root /usr/local/etc/smap smap # # Shell, login, exec and talk are BSD protocols. # #shell stream tcp nowait root /usr/sbin/tcpd in.rshd #login stream tcp nowait root /usr/sbin/tcpd in.rlogind #exec stream tcp nowait root /usr/sbin/tcpd in.rexecd #talk dgram udp wait root /usr/sbin/tcpd in.talkd #ntalk dgram udp wait root /usr/sbin/tcpd in.ntalkd #dtalk stream tcp waut nobody /usr/sbin/tcpd in.dtalkd # # Pop and imap mail services et al # #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d #imap stream tcp nowait root /usr/sbin/tcpd imapd # # The Internet UUCP service. # #uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l # # Tftp service is provided primarily for booting. Most sites # run this only on machines acting as "boot servers." Do not uncomment # this unless you *need* it. # #tftp dgram udp wait root /usr/sbin/tcpd in.tftpd #bootps dgram udp wait root /usr/sbin/tcpd bootpd # # Finger, systat and netstat give out user information which may be # valuable to potential "system crackers." Many sites choose to disable # some or all of these services to improve security. # # cfinger is for GNU finger, which is currently not in use in RHS Linux # finger stream tcp nowait root /usr/sbin/tcpd in.fingerd #cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd #systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx #netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat -f inet # # Time service is used for clock syncronization. # #time stream tcp nowait root /usr/sbin/tcpd in.timed #time dgram udp wait root /usr/sbin/tcpd in.timed # # Authentication # auth stream tcp wait root /usr/sbin/tcpd in.identd -w -t120 authsrv stream tcp nowait root /usr/local/etc/authsrv authsrv # # End of inetd.conf
/etc/services が全ての始まりです。クライアントがファイアウォールの well known port(1024 以下のポート)に接続してきた時、〜例えば telnet な ら 23 番のポートに接続します〜、inetd デーモンがその接続を聞きつけて、 まず /etc/services ファイルで起動すべきサービス名を調べます。次に、そ の名前に従って /etc/inetd.conf ファイルで必要なプログラムを見つけて、 そのプログラムを起動することになります。
全てのサービスが /etc/services ファイルに含まれているわけではありませ ん。いくつかのサービスは自由にポートを割りあてることも可能です。私は、 管理者用の telnet(telnet-a)のポートを 24 番に割りあてましたが、これを 2323 にすることも可能です。telnet-a のポートを 24 番にしておけば、管理 者(あなた)が firewall にアクセスする際には 23 番ではなく 24 番のポート を使うようになります。加えて、私がしているように netperm-table ファイ ルを設定すれば、内部のネットワークからのみこの接続が可能になります。
telnet-a 24/tcp ftp-gw 21/tcp # this named changed auth 113/tcp ident # User Verification ssl-gw 443/tcp