CACAnet福岡フリースクール
テーマ:FreeBSDによるFireWallの構築
発表者:花田 正勝(CACAnet福岡)
最終修正:2001年7月5日
1. FireWallの必要性
ファイアーウォールはインターネット(The Internet)に接続する時には必須なものであるといえます。以前は、企業が何百万、何千万という予算を組んでファイアーウォールを構築していました。確かに、企業はデータなどの重要性から信頼性のあるファイアーウォールが必要であると思います。
しかし、今日ではブロードバンド時代を背景に一般ユーザーが24時間常時接続という環境があたりまえの時代になりつつあります。24時間インターネットに接続できるということは、逆に24時間自分の大事なデータが保存されたパソコンを全世界にさらしていることになります。
このような状況から一般ユーザーでもファイアーウォールを構築することは必須な条件になりつつあります。ここでは、FreeBSDを利用した簡単なファイアーウォールの構築方法を考えていきます。
2. ネットワークを構成するTCP/IP
(ア) TCP/IPの世界ではデータを「パケット」とよばれる単位の小さなデータに分割して通信を行います。この、パケットの宛先、送り主の情報がかかれている部分をヘッダと呼びます。FireWallを構築する上で利用する情報としては以下のものがあげられます。
I. Destination address
宛先(到達先)のIPアドレスです。
II. Destination port
宛先(到達先)のポート番号です。
III. Source address
送り主のIPアドレスです。普通であれば自分自身です。
IV. Source port
送り主のポート番号です。普通であれば自分自身です。
(イ) コネクション型通信とコネクションレス型通信
I. コネクション型通信
代表的なものとしてはTCPが上げられます。これを利用するプロトコルとしてはHTTP,TELNET,FTP,があります。下図で示すように通信をはじめる前に宛先である通信相手を確認します。そうすることで信頼性のある通信が可能です。
TCPのコネクションの流れ
送り主 宛先
------------------SYN------------------->
<--------------SYN,ACK--------------- ↓時間の流れ
------------------ACK------------------>
↓データ
II. コネクションレス型
代表的なものとしてUDPが上げられます。これを利用するプロトコルとしてはTFTP、SNMPなどがあげられます。アプリケーションではNISやBINDのホスト解決などに利用されます。最近ではRealに代表されるような映像配信のアプリケーションでも利用されています。これは、TCPに比べてデータ伝送のスループットが10倍近くにもなるので大量のデータを一度に送信する場合は有用である。
3. パケットフィルタリングとアプリケーションゲートウェイ
(ア) パケットフィルタリング
マルチホームを構成するホストマシン上である規則にしたがってパケットを転送したり、ブロックする方法です。FreeBSDではKernelがこの機能をサポートしています。
I. FreeBSD
ipfw:ファーストマッチルール(基本)
ipf:ラストマッチルール(基本)
II. Linux
ipchains:ファーストマッチルール(基本)
(イ) アプリケーションゲートウェイ
Proxy(代理)サーバーとして一般的に利用されています。マルチホームを構成するホストマシン上でパケットのフォワーディング機能を停止して利用します。アプリケーションが一度パケットを受け取り、さまざまな処理、認証等を行い代理で外部へパケットを転送します。パケットフィルタリングよりは複雑なアクセス制御などが出来ますが、スループットが低下することが考えられます。
delegate,squid,apacheなどで実現できます。
4. 必要なもの
ファイアーウォールを構築するときに、どのような構成にするのかを十分吟味する必要がある。
(ア) ネットワークの構成やサーバーなどの配置
(イ) 許可するパケット
(ウ) 許可するアプリケーション
(エ) ログの監視方法
5. ファイアーウォールの構成
ファイアーウォールを構成する場合、フィルタリングだけではなくファイルシステムの意図しない更新や、ログの書き換えなどへの対処も必須な項目となります。また、トラフィックなどを計測することで大量のパケットを送信する攻撃などの発見にも対応が可能です。
(ア) フィルタリング
ipfw,ipf,ipchains,iptable
(イ) ファイルシステムの整合性
tripwire
(ウ) ログの整合性
swatch
(エ) パケットの参照
tcpdump,ethereal,tcpshow
(オ) SNMP
Ucd-snmp
6. フィルタリング
FreeBSDではIPFWというツールを利用して設定します。FireWallの機能自体はkernelに持たせることで対応していますが、/etc/rc.confに記述することでモジュールとして読み込むことも可能です。しかし、セキュリティー面を考慮するとkernelに設定しておいた方が良いと思います。
7. 設定例
(ア) OSのインストール
OSは「最小構成」でインストールすることで不要なアプリケーションなどを最小限にすることが出来ます。また、「カスタム」で必要なものだけインストールすることも可能です。ただし、bin(binary base distribution)は必ず必要です。これに、ipfwが含まれています。
ただし、カーネルの再構成をおこないますのでカーネルソースは必ずインストールしてください。
(イ) OSの設定
/sys/i386/config/GENERIC に以下の内容を追加します。(LINT参照)
options IPDIVERT
NAT機能を有効にする。
options IPFIREWALL
FireWall機能を有効にする
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
#options IPFIREWALL_DEFAULT_TO_ACCEPT
IPFIREALLを有効にするとデフォルトで通信は遮断されます。
IPFIREWALL_DEFAULT_TO_ACCEPTを有効にすることで全て許可することが出来ますがセキュリティー上は危険ですのでデフォルトは deny な設定が良いでしょう。
/etc/rc.conf
firewall_enable="YES" FireWall機能を有効にする
firewall_type="open" FireWallのタイプをopenにする
natd_enable="YES" NAT機能を有効にする
natd_interface="fxp0" NATを機能させるインターフェースの指定
natd_flags="-f /etc/natd.cf" NATの設定ファイルの指定
gateway_enable="YES" パケットフォワーディングの設定
/etc/natd.cf
log no ログの収集
deny_incoming no 入力パケットで内部変換テーブルにないものを拒否する
use_sockets no 予測できないポートへの接続のsocketを使って失敗を回避
same_ports no 出来るだけ同じポートになるように変換
verbose no 標準出力に全てのパケット変換を表示
unregistered_only yes プライベートアドレスのみを変換
redirect_address 172.19.1.7 xxx.yyy.zzz.52
redirect_address 172.19.1.8 xxx.yyy.zzz.53
外部(xxx.yyy.zzz.52)に来たパケットを内部(172.19.1.7)に転送する
port 8668 IPFWからdivertソケットに送られたパケットを受け取るポート番号
interface fxp0 NAT変換するインターフェース名
punch_fw 9000:100 FTPデータとIRC DCC接続の為に動的ルールを作製
(ウ) パケットフィルタリング
firewall_typeがopenの場合の例
ipfw add 50 divert natd all from any to any via fxp0
ipfw add 100 allow ip from any to any via lo0
ipfw add 200 deny ip from any to 127.0.0.0/8
ipfw add 300 deny ip from 127.0.0.0/8 to any
ipfw add allow ip from any to any
1. 2. 3. 4.
00050 1404 380170 divert 8668 ip from any to any via fxp0
00100 68 6928 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
65000 4014 887293 allow ip from any to any
65535 0 0 deny ip from any to any
1. ルール番号
2. ルールにマッチしたパケットの数
3. ルールにマッチしたパケットの合計バイト数
4. ルール
firewall_typeを独自に作製する。
/etc/rc.firewallを以下のように追加し新しくtypeを作製する。
[Cc][Aa][Cc][Aa][Nn][Ee][Tt])
基本的なサービスを通すフィルタリングルールです。(シングルホームの場合)
ipfw add 1000 allow tcp from any to any established
ipfw add allow tcp from any to xxx.yyy.zzz.1 25
ipfw add allow tcp from xxx.yyy.zzz.1 to any 25
ipfw add allow tcp from any to xxx.yyy.zzz.1 110
ipfw add allow tcp from any to xxx.yyy.zzz.1 53
ipfw add allow udp from any to xxx.yyy.zzz.1 53
ipfw add allow udp from xxx.yyy.zzz.1 53 to any
ipfw add allow udp from xxx.yyy.zzz.1 to any 53 keep-state
ipfw add allow tcp from any to xxx.yyy.zzz.1 80 setup
というようなルールを作製すると基本的なサービスを提供できるようになります。Kernelでデフォルトのパケットの扱いをdenyにしてあるので必要なポートのみを空けるだけでフィルタリングが可能です。
ipfw のオプション
IPFWの詳しい説明は以下のURLを参照してください。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ipfw&dir=jpman-4.3.0%2Fman§=0
EX)
ipfw add 100 allow ip from any to any
1 2 3 4 5 6
1. ルールの制御
add:ルールの追加をします。
delete:ルールを削除します。
flush:ルールをすべて削除します。
show:ルールの参照(カウント値含む)
list:ルールの参照
2. ルール番号
各ルールにルール番号を付加します。つけないと前行のルールの番号からカウントアップします。ルールの意味を理解して解釈のスピードを早くするために利用することも出来ます。
パケットの制御方法を記述します。
allow : マッチするパケットを通過させます。pass,permit,acceptでも可
deny : マッチするパケットを破棄し、マッチングを終了します。
reject : マッチするパケットを破棄し、ICMPのhost unreachableを送信しマッチングを終了します。
reset : TCPパケットのみ対象。パケットを破棄し、TCPのreset(RST)を送信しマッチングを終了します。
3. プロトコル
ip : 全てのプロトコルにマッチします。allも同じです。
tcp : TCPにのみマッチします。
udp : UDPにのみマッチします。
icmp : ICMPにのみマッチします。
4. ソースとディスティネーション
anyの部分は以下のように記述が可能です。
any:全てのIPアドレスにマッチします。
ipno:1.2.3.4の形式でアドレスを指定します。このアドレスのみにマッチします。
ipno/bits :1.2.3.4/24の形式で指定します。
ipno:mask:1.2.3.4:255.255.255.0の形式で指定します。1.2.3.4/24と同値です。
TCPとUDPではport番号の指定が可能です。ソース又はディスティネーションのポート番号を指定します。
EX) ipfw add 100 allow tcp from any to any 25 外部へのSMTP通信の許可
次の指定子を利用することも出来ます。
in:入力パケットのみにマッチします。
out:出力パケットのみにマッチします。
via:後述されるインターフェースまたはそのアドレスを持ったインターフェースにマッチします。
Optionとして以下のルールを摘要可能です。
Established:
パケットが既に確立されている TCP コネクションの一部であれば(つまり RST または ACK ビットがセットされていれば) マッチします. established ルールをチェーンの最初の方に置くことで, ファイアウォールのパフォーマンスを向上させることが できます.
Setup:
パケットが TCP コネクションを確立しようとするものであれば (SYN ビットがセットされ ACK ビットは
セットされていなければ) マッチします.
tcpflags flags:
TCP ヘッダが flags に指定された カンマで区切られたフラグの リストを含んでいればマッチします. サポ
ートされているフラグは,fin, syn, rst, psh, ack と urg です. 特定のフラグを含まないことを指定するには !
を先頭につけます.
icmptypes types
ICMP タイプが types リストに 存在していればマッチします. リストはタイプの範囲または個々のタイプを
カンマで区切った任意の組合せで指定できます. 一般的に使用されている ICMP タイプは: 0 エコーリプライ
(ping リプライ), 3 相手先到達不可能, 5 リダイレクト, 8 エコーリクエスト (ping リクエスト), そして 11
時間超過 (traceroute(8) で使用されているように, TTL 満了を示すのに使用されます) です.
8.IPF
ipfwの他にipfがFreeBSD-3.0から導入されました。Ipfwと違うのは
* ルールが複雑である
* 帯域制御が出来ない。
* ラストマッチなマッチングルール
* 入力と出力の2ルールがある
* ルールのテストが出来る
* NATが含まれている。
というのがあげられます。帯域制御が必要であればipfw利用することになります。
まとめ:
ファイアーウォールを作るときに大事なのは、何がどのようなことから危険なのかをきちんと把握することです。ただ、闇雲にフィルタリングを行っても必要なものまで通信を出来なくしてしまいます。個人で利用する上では良いのですが、これが企業などで利用する場合は業務を停止することにもなりかねません。
また、セキュリティーホールは日々新しいものが発見されています。ファイアーウォールで利用するOS、アプリケーションにとってセキュリティーホールは最大の脅威でもあります。セキュリティーホールなどの情報を日々収集することは大事なことだと思います。今回は、構築部分を中心に行いましたが情報の収集などは運用面で考えなくてはならないことのひとつだと思います。
ブロードバンド時代の24時間常時接続というサービスが増えています。自分のデータを自分で守る。これは、必須な時代がきているのかもしれません。
CACAnet福岡 フリースクール久留米