インターネットからの攻撃を防ぐには、ファイアウォールが必要となる。外部からの接続をうけるコンピュータは、ファイアウォールがどう設定されているのか把握することが重要。
ファイアウォールとDMZ
ファイアウォールは、パケットの(送信元IPアドレス,送信元ポート番号)、(宛先IPアドレス,宛先ポート番号)を見て、通信を制限するルータであり、専用のファイアウォールではさらに細かい制限を加えたり、通信履歴を保存することができる。
組織向けの外部公開のWebサーバやメールサーバを持つ組織では、外部からの接続をうける必要があり、脆弱性があればサーバは乗っ取りなどの被害に会いやすい。サーバが被害を受けたらファイアウォール内部のコンピュータに被害が広がる(トロイの木馬)のは危険であることから、(1) DMZ(非武装地帯)内部に外部公開のサーバを置き、(2) 対外FireWallで外部からのパケットはすべてDMZだけに通す。(3) 内部FireWall では、DMZ の特定の受信パケットだけ流す様にする。
DMZ内部のサーバは、外部からの攻撃をうけるため、極めて慎重にセキュリティ対策を行う必要がある。
iptables
Linux で FireWall を構築するときには、iptables を用いる。iptables では、主に以下の3つのルール(チェイン)でパケットを制限できる。
- コンピュータに入ってくるパケットに対するルール(INPUT チェイン)、
- コンピュータから出ていくパケットに対するルール(OUTPUTチェイン)、
- コンピュータで中継するパケットに対するルール(FORWARDチェイン)
iptables の設定を見るには、iptables -L を実行する。
$ sudo iptables -L # すべてのルールを表示 Chain INPUT (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 192.168.11.0/24 anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https : Chain FORWARD (policy DROP) target prot opt source destination DROP all -- anywhere anywhere state INVALID ACCEPT all -- 127.0.0.0/8 anywhere ACCEPT all -- 192.168.11.0/24 anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
iptables で制限のための設定を間違えると、通信ができなくなるので、基本的な考え方だけを紹介する。
「条件にマッチしたパケットをどうするのか」というルールを、チェインに並べておき、パケットが届くとチェインの先頭からルールを適用し、ACCEPT/REJECT/DROPなどの対応を決める。
iptables でルールを登録する場合は、一般的に以下の書式で、条件1,条件2… をすべて満たすパケットをどうするのかのラベルを最後に記載する。
$ iptables -A チェイン 条件1 条件2 … -j ラベル
$ iptables -P INPUT DROP # デフォルトポリシーの設定 # INPUT のルールにどれもマッチしない場合はDROP(パケット廃棄) $ iptables -P OUTPUT ACCEPT # OUTPUT のどのルールにもマッチしなければACCEPT(受信許可) $ iptables -A INPUT -s 127.0.0.1 -j ACCEPT # INPUT の末尾に、"送信元IPが 127.0.0.1 ならACCEPT" を追加 $ iptables -A INPUT --dport 80 -j ACCEPT # INPUT の末尾に、"宛先ポートが 80 ならACCEPT" を追加 $ iptables -A INPUT -s 11.22.33.44 -j DROP # INPUT の末尾に、"送信元IPが 11.22.33.44 ならDROP" を追加 iptablesのオプション引数 -P デフォルトポリシーの設定 -A 末尾にルールを追加 -s 送信元IPアドレスの条件指定 -d 宛先IPアドレスの条件指定 --sport 送信元ポート番号の条件指定 --dport 宛先ポート番号の条件指定 -j 指定ラベルに移動 INPUT chain | <送信元IPが127.0.0.1なら>----ACCEPT | <宛先ポートが80なら>----------ACCEPT | <送信元IPが11.22.33.44なら>--DROP | DROP