II-20-1. パケットフィルタリングによるセキュリティ確保

Netfilterやiptablesなどのソフトウェアを利用したパケットフィルタリングによりセキュリティを確保する方法について解説する。また、xinetdのフィルタリング設計や、実際のtelnetサーバでフィルタリングをどのように設定するかといった具体的な手法を説明する。

【学習の要点】

* Linuxのネットワークシステムにはnetfilterと呼ばれるサブシステムが含まれ、これはパケットフィルタリングとNAT機能を提供する。

* netfilterは、通過するパケットのヘッダを見て、そのパケットをアクセプトするかドロップするかを決定するカーネル内のフレームワークである。iptablesはフィルタリングまたはNATルールを読みこんで、netfilterを制御するツールである。

* xinetdは、ACL (Access Control List) により自ホストへの接続を制御する。また、特定のホストからの同時接続数や接続率を制限することにより、応答機能の停止を狙った攻撃に対処することができる。

図II-20-1. iptablesとnetfilterを用いてパケットフィルタリングを行なう例

【解説】

1) netfilterとは

* netfilterは、Linuxカーネル内のネットワークサブシステムに対して、一連のフック関数を定義するカーネル内のフレームワークである。

* netfilterの定義するフック関数は、Linuxカーネルモジュールから利用できる。これを利用したカーネルモジュールはいくつかあるが、最も知られた実装には、パケットフィルタリングモジュールやNATモジュールがある。

2) iptablesとは

* iptablesは、Linuxカーネル内のネットワークサブシステムに対してパケットフィルタリングルールとNATルールを指定するためのコマンドラインツールである。

* iptablesは、同コマンド(とそれに対応するカーネル内のサブシステム)の実現できるパケットフィルタリング機能を指して、カーネル内ファイアウォールの呼称として用いられることがある。

* 使用方法

- iptablesコマンドで、パケットフィルタリングルールとNATルールを指定する。これは即座に反映されるが、OSの再起動によりリセットされる。 例えばtelnetの使用するポート23への接続を拒否するには以下のようにする。

iptables –A INPUT –p tcp –dport 23 –j DROP

- iptables-saveコマンドで、現在カーネルに対して指定されているルールをダンプすることができる。これをファイルに出力することでルールを永続化することができる。

- iptables-saveコマンドにてダンプしたルールは、iptables-restoreコマンドにて再度カーネルに指定することができる。一部のディストリビューションでは、デフォルトで用意されている起動スクリプトにてiptables-restoreコマンドを実行する(ルールは指定の書式でファイルとして予め記述しておく)。

3) xinetd

* xinetdは、各種デーモンプロセスが自身でポートをリッスンする代わりに、xinetdが代表して必要なポートをすべてリッスンすることでシステムのリソースを節約することを目的に設計されたデーモンである。前身としてinetdがあるが、xinetdはこれを改良したものであり、共にスーパーサーバと呼ばれることがある。

* 各種デーモンプロセスの代わりにxinetdがこれを代表することで、接続制御やログ機能をxinetdが一手に引き受けることができる。xinetdは、予め指定されたACL(アクセスコントロールリスト)を読み込んで、接続制御を行なう。

* 特定のサービスに対する接続要求が来ると、xinetdは対応するサーバを起動する。各種サーバの設定は、/etc/xinetd.confにて行なう。一部のディストリビューションでは、/etc/xinetd.d/ディレクトリ内にサービス毎のファイルを用意し、デフォルトでこれらをすべて読み込むよう構成されているものもある。

* xinetdの制御は、同時接続数や接続率を基に行なうことができる。この機能によって、DoS(Denial of Services)攻撃からの被害を抑えることができる。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。