firewall
ファイアウォール

講義

組織の内側と外側をまたぐ通信のうち, 危険な通信,必要のない通信を遮断する技術がファイアウォールである. セキュリティ関連の話題の中でも特に広く使われ,重要な技術の一つである. IP 層の通信はパケットを単位として行われるが,個々のパケットについて 通過させるものと拒否するものに振り分ける処理を パケットフィルタリングとよぶ. ファイアウォールはパケットフィルタリングを用いて 実装されるものをさすことが多い.

現在の Linux OS は OS の本体であるカーネルの機能として パケットフィルタリングを行う能力をもっている.この機能は iptables というコマンドで利用することができる. 現在はどの Linux ディストリビューションでも iptables コマンドを用いてファイアウォールの設定を行うことが 一般的である.

iptables を理解するにはテーブルチェーンの概念 を理解する必要がある.iptables にはいくつかのテーブルが用意されている. このうち,本実習では filter テーブルの利用を説明する. filter テーブルはどのパケットを通過させ,どのパケットを遮断 するかの設定を行う目的で使うテーブルである.

各テーブルには複数のチェーンが用意されている. チェーンによってパケットが処理される過程のどのタイミングで フィルタリングを行うかが異なる.今回説明するのは filter テーブルの INPUT チェーンと OUTPUT チェーンである. INPUT チェーンはホストにパケットが入った時に行うフィルタリングを 記述し,OUTPUT チェーンはホストからパケットが出て行く時に行う フィルタリングを記述する.

チェーンと呼ばれる理由はその処理手順による. チェーンではルールは一直線に並んでおり, 上から順に処理され,マッチした時点で処理が決まる. このため,チェーン内の複数のルールにマッチするような パケットがあったとしても最も上に記述されている ルールに従って処理される.これは プログラムにおける if, elseif, elseif ... を 上から順に書いた場合の処理と同様である. iptabes ではチェーンの任意の位置にルールを追加することができるが チェーンの最後に追加する命令のみを使うことが多い. 計画した順にルールを設定するには,その順で チェーンの最後に追加していくスクリプトを記述すると 設置されたルールの順序がわかりやすいからである.

個々のパケットについて, チェーンの上から順に条件にマッチするかをテストし, 最初にマッチしたルールに従って処理するが, チェーンの最後までテストしてもマッチしなかった パケットについてのデフォルトの処理を指定することができる. これをそのチェーンのポリシー と呼ぶ.

安全性を重視するため,各チェーンのポリシーは拒否(DROP) に設定しておき,必要なパケットだけをルールとして明示する 手法が一般的である.以下,実習を行いながら iptables の利用法を理解する.

実習

一口にインターネットからのアクセスといっても, web, ping などいろいろな種類のアクセスがある. 接続元の IP アドレスごとに許可するアクセスの種類を 変える設定を行い,動作を確認する.

実習0

IP アドレス,DNS サーバの設定は 第 9 回実習の実習 1 の状態に設定せよ.DNS サーバは教卓のみで稼働している設定である. 01 班から 14 班までについて班番号の順に,班名を Aとする.

次に 第 8 回:ウェブ を参考に pcA4 に apache2 をインストールせよ. ここまでの設定は今回の実験を通して共通である.

実習 1

pcA4 のファイアウォールで, pcA3 からの ping のみを許可する設定にすることを目的とする.

実習 1.1

pcA4 で稼働しているウェブサーバに pcA3 からアクセスし,動作を確認せよ. これはpcA3 で firefox を起動し, アドレス欄にpcA4 のIPアドレスかドメイン名を 入力してウェブページが表示されることを確認すればよい.

pcA3 から pcA4 へ ping を実行し,接続していることを確認せよ.

実習 1.2

pcA4 での iptables の操作を行う. まず,以下のコマンドを実行し,iptable の初期状態を確認せよ.

nauser@na-160:~$ sudo iptables -nL

初期状態では上のコマンドの結果は図 12.1 のようになるはずである.

図 12.1 iptables の初期状態

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

iptables は,デフォルトではテーブルとして filter テーブルを 指定したことになる.図 12.1 よりfilter テーブルには 初期状態で INPUT, FORWARD, OUTPUT の 3 つのチェーンがあり, いずれもチェーンの内容が空で policy が ACCEPT であることから すべてのパケットを通す設定になっていることがわかる.

例えば pcA4 の IP アドレスが XXXX, 例えば pcA3 の IP アドレスが YYYY だったとすると, YYYY からの ping を拒否するためには 以下のコマンドを実行すればよい.

nauser@na-160:~$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -s YYYY -d XXXX -j DROP

コマンドを実行し,sudo iptables -nL の結果を確認せよ. pcA3 から pcA4 への ping が通らなくなっていることを確認せよ.

iptables -nL コマンドの結果より INPUT チェーンにルールが追加されていることがわかる.このように iptables -A ... というコマンドを実行するたびにチェーンの最後にルールが追加 されてゆく.ルールは上から実行され,マッチすると処理が実行される. どこにもマッチしないパケットは最後に policy に設定された処理を行う.

実習 1.3

policy はデフォルトの処理といえる.セキュリティを重視した iptables の設定の基本は デフォルトを DROP(破棄)にしておき,必要なもののみを明示して許可するという 方針である.この方針に従ってすべての policy を DROP に設定し, ping に必要なパケットを通過する設定を行う.

まず iptables -nL で現在の filter テーブルの状況を確認する.上で 設定したルールが INPUT チェーンに残っているので以下のコマンドでこれを 消去する.

nauser@na-160:~$ sudo iptables -F

今回は必要ないが,初期状態に戻すには以下のコマンドで 自作のチェーンを作っていた場合のための破棄, iptables のカウンターのリセットも行う.

nauser@na-160:~$ sudo iptables -X
nauser@na-160:~$ sudo iptables -Z

ルールが消去されていることを iptables -nL で確認せよ.

次にすべてのチェーンのポリシーを DROP に設定する. 以下のコマンドを順に入力すればよい.実行後,policy が DROP になっていることを確認せよ.

nauser@na-160:~$ sudo iptables -P INPUT DROP
nauser@na-160:~$ sudo iptables -P OUTPUT DROP
nauser@na-160:~$ sudo iptables -P FORWARD DROP

次に YYYY から XXXX への ping に必要な設定を行う.ping は通信が往復するので 往路用と復路用の設定が必要になる. 下のコマンドを実行せよ.

nauser@na-160:~$ sudo iptables -A INPUT -p icmp --icmp-type echo-request -s YYYY -d XXXX -j ACCEPT
nauser@na-160:~$ sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -s XXXX -d YYYY -j ACCEPT

iptables -nL で状況を確認し,もし間違ったルールを設定したら

nauser@na-160:~$ sudo iptables -F

コマンドでルールを破棄し,iptables -A の作業をやり直せ. 設定が終れば実際に pcA3 から pcA4 への ping が通ることを確認せよ.

毎回これらのことをタイプするのは大変なので iptables の設定は コマンドの系列をシェルスクリプトに書いておき.シェルスクリプトとして 実行することが一般的である.上記のことを行うシェルスクリプトは以下の ようになる.p34.sh という名前で保存せよ.

#!/bin/sh

iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -p icmp --icmp-type echo-request -s YYYY -d XXXX -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -s XXXX -d YYYY -j ACCEPT

図 12.2 YYYYからXXXXへの pingのみ許可

chmod 755 p34.sh で実行属性をつけ sudo ./p34.sh で実行せよ. iptables -nL による確認と,実際に pcA3 から pcA4 への ping を行い,ping が通ることを確認せよ.

実習 1.4

設定の試行錯誤中,たびたびファイアウォールを最初の状態に戻したいときが あるのでそのためのスクリプトを作っておくと便利である.以下のスクリプト を allaccept.sh として作成し.試してみよ.ルール,チェーンの破棄だけでは policy が初期化さないため,policy の再設定も必要なことに注意せよ.

#!/bin/sh

iptables -F
iptables -X
iptables -Z

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

図 12.3 allaccept.sh

実習 2

実習 1 に追加して, すべてのアドレスからのウェブのアクセスを許可する設定を行う. これはp34.sh を改良して行う.

実習 2.1

まず,allaccept.sh を実行し,フィルタリングをおこなっていない 状態で pcA1,2,3 のウェブブラウザから pcA4 のウェブサーバにアクセスし, アクセスが可能なことを確認せよ.

次に, pcA4 で p34.sh のフィルタリングを行った状態で, pcA1,2,3 のウェブブラウザから pcA4 がアクセスできないことを 確認する.キャッシュが残っていると接続できたように見えるので, pcA1,2,3 のウェブブラウザの 「ツール」→「最近の履歴を消去」から「すべての履歴を消去」 を行い,履歴を消去してからpcA4 に アクセスを試みよ.

ウェブのアクセスを許可するには 80 番ポートを指定してアクセスを許可すればよい. p34.sh を p34w.sh という名前でコピーし(cpコマンド),p34w.sh の最後に 以下の行を追加し,保存せよ.

iptables -A INPUT -p tcp -s 0.0.0.0/0 -d XXXX --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -s XXXX --sport 80 -d 0.0.0.0/0 -j ACCEPT

pcA4 で p34w.sh のフィルタリングを実行し,iptables -nL で確認し, 実際に pcA1,2,3 のウェブブラウザから pcA4 のウェブサイトにアクセスできることを確認せよ. pcA4 のウェブサーバのログ (第 8 回実習参照)のうち, このアクセスに対応するものを確認せよ.

実習 2.2

p34w.sh が実行されている状態では,ウェブについては全ての IP アドレスから許可, ping については pcA3 からのみ許可という 設定になっている.pcA2 の IP アドレスからは ウェブは接続できるが ping が通らない状態になっているはずである. 確認せよ.

実習 3

p34.sh や p34w.sh では IP アドレスの値が 行の中に散らばって書かれている. このように定数をプログラム中に埋め込むことをハードコーディングといい, IP アドレスの部分を変更する場合など,作業性が悪い.

シェルスクリプトの変数を使えば IP アドレスの指定部分を スクリプトの最初に集めることができる.変数の値を 設定するには,たとえば #!/bin/sh の後, 最初のコマンドが始まる直前に

myhost='XXXX'
trusted='YYYY'
all='0.0.0.0/0' 

として IP アドレスの文字列を 3 つの変数に設定しておき, 以下のコマンドの IP アドレスの部分をこの変数を使う形に 書き換えれば良い.p34.sh と p34w.sh をこの形式に書き換えよ.

課題

第 11 回課題「iptables」 を提出せよ.


Updated in July 4, 2010, index.html, Yamamoto Hiroshi