CACAnet福岡フリースクール

テーマ:FreeBSDによるFireWallの構築

発表者:花田 正勝(CACAnet福岡)

最終修正:200175


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が上げられます。これを利用するプロトコルとしてはTFTPSNMPなどがあげられます。アプリケーションではNISBINDのホスト解決などに利用されます。最近では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_typeopenの場合の例

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&sect=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 : マッチするパケットを破棄し、ICMPhost unreachableを送信しマッチングを終了します。

reset : TCPパケットのみ対象。パケットを破棄し、TCPreset(RST)を送信しマッチングを終了します。

3. プロトコル

ip  : 全てのプロトコルにマッチします。allも同じです。

tcp  : TCPにのみマッチします。

udp : UDPにのみマッチします。

icmp ICMPにのみマッチします。

4. ソースとディスティネーション

anyの部分は以下のように記述が可能です。

any:全てのIPアドレスにマッチします。

ipno1.2.3.4の形式でアドレスを指定します。このアドレスのみにマッチします。

ipno/bits 1.2.3.4/24の形式で指定します。

ipno:mask1.2.3.4:255.255.255.0の形式で指定します。1.2.3.4/24と同値です。

  

  TCPUDPでは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の他にipfFreeBSD-3.0から導入されました。Ipfwと違うのは

* ルールが複雑である

* 帯域制御が出来ない。

* ラストマッチなマッチングルール

* 入力と出力の2ルールがある

* ルールのテストが出来る

* NATが含まれている。

というのがあげられます。帯域制御が必要であればipfw利用することになります。

 

まとめ:

ファイアーウォールを作るときに大事なのは、何がどのようなことから危険なのかをきちんと把握することです。ただ、闇雲にフィルタリングを行っても必要なものまで通信を出来なくしてしまいます。個人で利用する上では良いのですが、これが企業などで利用する場合は業務を停止することにもなりかねません。

また、セキュリティーホールは日々新しいものが発見されています。ファイアーウォールで利用するOS、アプリケーションにとってセキュリティーホールは最大の脅威でもあります。セキュリティーホールなどの情報を日々収集することは大事なことだと思います。今回は、構築部分を中心に行いましたが情報の収集などは運用面で考えなくてはならないことのひとつだと思います。

ブロードバンド時代の24時間常時接続というサービスが増えています。自分のデータを自分で守る。これは、必須な時代がきているのかもしれません。

 

CACAnet福岡 フリースクール久留米