Linuxで作るファイアウォール[準備編]:ゼロから始めるLinuxセキュリティ(3)(2/2 ページ)
前回まででホストレベルのセキュリティ対策を行った。今回からはネットワークレベルに目を向けよう。まずはiptablesを使ったパケットフィルタリング機能でファイアウォールを構築する。今回はiptablesを使うための準備について解説する。
ファイアウォールのための基本設定
これからファイアウォールを構築していくわけですが、その前にいくつかやっておかなければならない作業があります。
カーネルの再構築
Red Hat Linux 7.1 Jのカーネルは2.4系なのでiptablesに対応しているのですが、デフォルトではモジュールが組み込まれていないため再構築する必要があります。また、せっかくカーネルを再構築するのですから、ついでに最新版にしておきましょう。
カーネルの最新版は、
からダウンロードできます(編注)。2001年10月11日現在の最新版はkernel 2.4.12です。
ダウンロードしたら、カーネルのアップグレード作業を行います。以下に再構築の例を挙げますが、必ずしもここ例と同じ手順で行う必要はありません。重要なのは、iptablesを使うのに必要なモジュールをカーネルに組み込むことです(編注)。
$ tar -zxvf linux-2.4.12.tar.gz $ cd linux $ make menuconfig
make menuconfigを実行すると、カーネルの設定画面になります。iptablesを組み込むには、まず「Networking options --->」を選択します。
次に、「Network packet filtering(replaces ipchains)」にチェックを入れます。
下の方にある「IP: Netfilter Configuration --->」を選択します。
ここから、iptablesに必要なモジュールを選択していきます。すべて選択しておけばよいでしょう。
ここではiptablesに関連する部分だけを紹介しましたが、もちろん必要に応じてデバイスそのほかの設定も行っておいてください。設定が終わったらセーブします。これでカーネルをコンパイルする用意が整いました。
次にコンパイル/インストール作業を行います。以下に手順の一例を挙げます。
# make dep; make clean # make modules # make modules_install # installkernel 2.4.12 arch/i386/boot/bzImage System.map
カーネルのコンパイルが正常に終了したら、新しいカーネルで起動するように/etc/lilo.confファイルを修正します。
boot=/dev/hda map=/boot/map install=/boot/boot.b prompt timeout=50 message=/boot/message linear default=linux image=/boot/vmlinuz-2.4.12 label=linux read-only root=/dev/hda2 image=/boot/vmlinuz-2.4.2-2 label=linux.old read-only root=/dev/hda2
/etc/lilo.confを書き換えただけでは有効になりません。ファイルの編集後、以下のコマンドを実行してLILOの新設定を有効にします。
# /sbin/lilo
以上で、iptablesを組み込んだカーネルが起動するようになりました。
# reboot
などでファイアウォール用マシンを再起動します。
再起動したら、新カーネルでフィルタリング機能とNAT機能が有効になっているかを確認します。以下のようにオプション付きでiptablesを実行します。
# iptables -L 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 -L -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
以上のように出力されればカーネルの再構築は完了です。うまくいかない場合は、もう一度カーネルを再構築してみてください。
仮想IPアドレスの割り当て
図1からも分かるように、NIC(Network Interface Card)が2枚挿入されているマシンをファイアウォールにします。NICはLinuxに対応しているものを用意してください。eth0がグローバルアドレス側、eth1がプライベートアドレス側になります。ここでは、外側のインターフェイス(eth0)に仮想IPアドレスを割り当てます。
Red Hat Linux 7.1Jの場合、NICの設定などは/etc/sysconfig/network-scripts以下のファイルで行います。ここにはifcfg-eth0というファイルが存在します。このファイルを起動時に読み込むことにより、インターフェイスにIPアドレスが割り当てられます。内容は次のようなものになります。
# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="none" ONBOOT="yes" IPADDR="172.16.0.100" NETMASK="255.255.0.0" IPXNETNUM_802_2="" IPXPRIMARY_802_2="no" IPXACTIVE_802_2="no" IPXNETNUM_802_3="" IPXPRIMARY_802_3="no" IPXACTIVE_802_3="no" IPXNETNUM_ETHERII="" IPXPRIMARY_ETHERII="no" IPXACTIVE_ETHERII="no" IPXNETNUM_SNAP="" IPXPRIMARY_SNAP="no" IPXACTIVE_SNAP="no"
では、OS起動時にeth0に対して仮想IPアドレスが割り当てられるようにしましょう。ifcfg-eth0を参考にして、/etc/sysconfig/network-scripts以下に新しいファイルを作成します。以下はifcfg-eth0:1の例です。
# cd /etc/sysconfig/network-scripts # vi ifcfg-eth0:1 DEVICE=eth0:1 ONBOOT=yes BOOTPROTO=static IPADDR=172.16.0.10 NETMASK=255.255.0.0
ファイルを作成したら、Linuxを再起動して仮想IPアドレスが割り当てられているかどうかを確認します。
# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:01:02:87:70:6A inet addr:172.16.0.100 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:143 errors:0 dropped:0 overruns:1 frame:0 TX packets:55 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:5 Base address:0xe800 eth0:1 Link encap:Ethernet HWaddr 00:01:02:87:70:6A inet addr:172.16.0.10 Bcast:172.16.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:5 Base address:0xe800 eth1 Link encap:Ethernet HWaddr 00:D0:B7:6B:89:00 inet addr:192.168.1.1 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:11 Base address:0xe400 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
以上のようになっていれば成功です。試しに、仮想IPアドレスに対してpingを打ってみて応答があるか確認してみましょう(注)。同様にして、ほかのサーバに対する仮想IPアドレスも割り当てます。
ルールの設計
以上で、カーネルとNICの準備は完了しました。後はiptablesの設定を残すのみとなったわけですが、どのような設定を行うのかが問題です。ルールの設計が不十分だと、せっかくのファイアウォールも無意味になってしまいます。また、セキュリティを強くしすぎて必要なサービスまで使えなくしてしまうと、不便な環境になってしまいます。何を何から守るのか、何が必要で何が不要なのかをしっかり検討して、各自の環境に最適なルールを設計しましょう。
まず、どのようなルールにするのかを書き出してみます。実際に図に書き起こすと分かりやすくなります。対象ホストを書き、パケットの経路を矢印で表します。こうすると、パケットの流れがとても分かりやすくなるのでルールの設計が容易になります。
フィルタリングルール
今回は、例として以下のようなフィルタリングルールを作成しました。図1と見比べてみてください。
- Webサーバに対しては、どこからでも80/TCPによるアクセスを許可
- メールサーバに対しては、どこからでも25/TCPによるアクセスを許可
- DNSサーバに対しては、どこからでも53/UDPによるアクセスを許可
- 各サーバ、ファイアウォールのメンテナンスを行うため、メンテナンス用ホストからの22/TCPによるアクセスを許可
- 各サーバからファイアウォールの内側のインターフェイス(eth1)へのicmp echo-requestと、それに対するecho-replyを許可
- 各サーバ、ファイアウォールの外側のインターフェイス(eth0)に対して、メンテナンス用ホストからのicmp echo-requestと、それに対するecho-replyを許可
- ファイアウォールの外側のインターフェイス(eth0)へのicmp echo-requestと、それに対するicmp echo-replyを許可
- 各サーバからの、ファイアウォールを介したSYNパケットのみでは外に出さない
- 各サーバは同一セグメント上のホストに直接アクセスできず、必ずファイアウォールを通過させる
- 上記以外はすべて不許可
NATルール
もう1つ、NATルールも作成します。ここのポイントは、eth0に割り当てた仮想IPアドレスと、各サーバの実IPアドレスを結び付けていることです。これによって仮想IPアドレスによるアクセスが各サーバに転送されるようになります。
- D-Address172.16.0.10は192.168.0.10に変換
- D-Address172.16.0.20は192.168.0.20に変換
- D-Address172.16.0.30は192.168.0.30に変換
- S-Address192.168.0.10は172.16.0.10に変換
- S-Address192.168.0.20は172.16.0.20に変換
- S-Address192.168.0.30は172.16.0.30に変換
D-Address:Destination IP Address
S-Address:Source IP Address
以上でルールの設計は終わりです。次回は、このルールに従ってiptablesの設定を行います。
Copyright © ITmedia, Inc. All Rights Reserved.