第11回 NETMARKで不正な通信をシャットアウト

面 和毅
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
シニアマネージャ
2006/10/5

 前回はvsftpdを例にして、LIDSのACL/ケーパビリティを設定する方法をステップバイステップで紹介しました。今回は、LIDS-1系列で説明していなかったもう1つの機能「NETMARK」の説明と、実際の応用例をお見せします。

 今回も説明のためにVMwareイメージを用いて解説を行いますので、実際に手元で設定ファイル等を確認したい場合には以下のURLからVMwareイメージをダウンロードしてください。

【atmarkIT VMware Images】
http://www.selinux.gr.jp/LIDS-JP/atmarkit.html
(第10回と同じVMwareイメージを利用します

 iptablesとMARKマッチ

  Linuxではiptablesを用いてパケットフィルタリングなどを行っていますが、そのiptablesに「MARKマッチ」という機能があります。

 iptablesチュートリアルにはMARKマッチのことが説明されています。MARKはカーネルの中でのみ維持管理できる特別なフィールドで、パケットがコンピュータの中を通過している間だけ、識別に利用することができます。MARKマッチ機能は、mangle テーブルのみで定義されていますので、通常iptablesで-t mangleとして設定を行います。

【Iptablesチュートリアル 1.2.0】
Table 10-16. Markマッチオプション

 例えば図1のようなiptablesの設定を行います。

/sbin/iptables -t mangle -P OUTPUT DROP
/sbin/iptables -t mangle -A OUTPUT -p tcp -d 192.168.0.1 --dport 22 -j MARK --set-mark 1
/sbin/iptables -t mangle -A OUTPUT -m mark --mark 1 -j ACCEPT
図1
  1. 1行目で、すべてのOUTPUTチェーンのパケットをDROPにしています。
  2. 2行目で、あて先が192.168.0.1、あて先ポートが22番のものに関しては「1」というMARKを付けます。MARKフィールドは符号なしの整数で、4294967296通りの値を取ることができます。
  3. 3行目で、MARKフィールドが「1」になっているOUTPUTチェーンのパケットを許可しています。これにより、あて先が192.168.0.1:22となっているパケットのみを送ることが可能となります。

 上述の例は簡単なものですので、MARKを使っていない場合と大差がないと思われるかもしれませんが、このMARKマッチ機能をiproute2と組み合わせることにより、動的にルーティングを変更したり、帯域制限やClass Based Queuingに使用することができます。

 NETFILTERはパケットをmangle tableを通して制御するという、とても良い方法を提供してくれます。mangle tableでは、NETFILTERがパケットをフックして変更したり、パケットに値をラベルし、特別な値に適合するパケットに対して動作を決めることができます。また、PID、UID、GID、あるいはセッションベースでのマッチングも提供します。NETFILTERを使うことにより、LIDSが提供する動作にとてもよく似た動作を提供できますが、サポートするためのダイナミックルールがいくつか必要になります。

 このようなMARKマッチ機能に関しては、@ITの以下の記事でも取り上げられています。

【習うより慣れろ! iptablesテンプレート集(3)】
iptablesによる負荷分散とDoS対策

 LIDSとMARKマッチ機能

 LIDS-1系列では、このMARK機能をサポートしており、特定のプロセスがソケットを生成した際にMARKフィールドにMARKを付けることができます。これにより、プロセスが生成したパケットを、iptablesなどを用いて制御することができます。

 実際には、LIDS-1系列では図2のようにlinux/net/socket.cにパッチが当たっており、ソケットを生成した後にCONFIG_LIDS_NETWORKが指定されていた場合には「lids_socket_post_create()」関数を呼び出します。この「lids_socket_post_create()」関数の中で、markinfoにあらかじめACLで指定した(tsk_sys_acl構造体中の)MARKを代入することにより、ソケット生成後にMARKを付けています。

linux/net/socket.c)
   840 int sock_create(int family, int type, int protocol, struct socket **res)
   841 {
   842     int i;
   843     struct socket *sock;
  
   ・
   ・
   ・
   917 #ifdef CONFIG_LIDS_NETWORK
   918     lids_socket_post_create(sock, family, type, protocol);
   919 #endif

linux/kernel/lids_socket.c)
   62 lids_socket_post_create(struct socket *sock, int family, int type, int p
rotocol)
   63 {      
   64 #ifdef CONFIG_LIDS_NF_MARK
   ・
   ・
   ・
   76                 markinfo->mark = tsk_sys_acl->mark;

図2

 このMARKの値も、lidsconfコマンドで設定することができ、

# lidsconf -A [ステート] -s [サブジェクト] -o LIDS_SOCKET_NF_MAEK [MARK] -j DISABLE

として設定します。

 例えば、図3のように、httpdに対してパケットに「MARK 3」が付くようにします。このhttpdは、mysqlと連携しているとします。

lidsconf -A -s /usr/sbin/httpd -o LIDS_SOCKET_NF_MARK 3 -j DISABLE
iptables -A OUTPUT -t mangle -j MARK --set-mark 0
iptables -A OUTPUT -d 10.0.0.2 --protocol tcp --destination-port 3306 -m --mark 3 -j ACCEPT
iptables -A OUTPUT -m mark --mark 3 -j DROP
図3
  1. 1行目で、httpdがソケットを作成した際に、パケットに「MARK 3」が付くように設定します
  2. OUTPUTチェーンで、すべてのパケットには「MARK 0」が付くようにします
  3. httpdが出した「MARK 3」が付いているパケットでも、mysql(ポート番号3306/TCP)へのOUTPUTは許可します
  4. それ以外の「MARK 3」が付いているパケットはDROPします

 これを用いることにより、例えばApacheのSSL Slapperワームなどが拡散していくことを阻止することができます。Slapperワームなどは、攻撃先コンピュータの侵入に成功した場合、遠隔シェルを起動してUDP ポート 2002 経由で連絡できるバックドアを開きます。しかし、LIDSとiptablesを用いて上述のように設定をしておけば、httpd経由でプログラムを実行してソケットを作成しようとした際には、パケットのMARKが「3」になります。外部に接続しようとする際にはmysqlあて以外のものはすべてDROPされますので、結果として不正な通信を遮断することが可能となります。

 後ほど例でお見せしますが、そのほかにもsshd経由でログインしたユーザーと、ローカルにログインしたユーザーのそれぞれで異なったルーティングを提供するといったこともできます。

 LIDSでMARKマッチ機能を使うためには

 LIDSでMARKマッチ機能を使うためには、カーネルオプションで、

[*] Linux Intrusion Detection System support (EXPERIMENTAL)
    [*] Enable security network
        [*] Enable NETFILTER MARK

を選択します。

 また、lids-1.2.2-2.4.30とlids-1.2.2-2.4.31-skではバグがあり、このままではMARKが使えませんので、ここからパッチをダウンロードして使用してください(この問題はすでに報告済みですので、次回のリリースでは修正されると思います)。

【lids_nfmark.patch】
http://www.selinux.gr.jp/LIDS-JP/patch.download.html

 なお、LIDS-JPサイトからダウンロードできるVMwareイメージでは、この問題が修正されています。

1/3

Index
NETMARKで不正な通信をシャットアウト
Page1
iptablesとMARKマッチ
LIDSとMARKマッチ機能
LIDSでMARKマッチ機能を使うためには
  Page2
sshdでの実例
  Page3
sshdでの実験


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間