2011年7月23日土曜日

オープンソースで構築する仮想ファイアーウォール IPS編

前回の記事でVyattaのF/Wの基本的な使い方を解説いたしましたが、今回はより強固なネットワークを実現させるためにIPSを使ってみます。

VyattaのIPSはLinuxでも頻繁に使われているSnortを使っています。

Vyatta自体は非常に軽量で高速に動作しますがSnort(IPS)を利用する場合はパケットを転送するだけのルータではなく、パケットの中身を見てシグネチャと照らし合わせ、Vyattaで設定したポリシーと照らし合わすなどのプロセスがあるためメモリを多めに積んだマシンが必要になります。
また今回は紹介していないですがNATを利用する場合も同様でパケットを書き換え再度checksumする必要があるためCPUパワーが必要になります。

Snortのおさらい
Snortはオープンソースの侵入検知システム(IDS)と言われるもので、ネットワークに流れるパケットをキャプチャーし不正なパケットを検出します。

通常IDSは不正なパケットを検出し警告を出すにとどまりますが、IPSは検出し遮断します。

VyattaはSnortでこれを実現します。

不正アクセスする手法やシステムの脆弱性は常につきまとうので、Snortは定期的にルールセット(シグネチャ)を更新しています。


Snortにユーザ登録

Snortのシグネチャを定期的に更新するためにSnortにユーザ登録しoink-codeを取得します。

http://www.snort.org/


Snortの設定

早速、VyattaでIPSの設定をしてみましょう。

まず、Snortのシグネチャを取得します。

$update ips rules oinkcode ****


Snortのサーバが少し遅いので時間がかかるかもしれません。

updateを先しないとError: Missing Snort Rulesと出たりするので必ず先にUpdateしてください。

ログを見ると更新されたのかわかります。

$show ips update-log



自動アップデートとLANの設定

Snortは定期的にシグネチャを更新する必要があるので自動アップデートの設定を行い定期的にシグネチャを更新したいと思います。


$configure
#set content-inspection ips auto-update oink-code ****
#set content-inspection ips auto-update update-hour 2


この設定でAM2時に自動的に更新されます。


次にLANのネットワークを予め指定することでSnortによる誤検知を防ぐ事ができます。

$configure
#set content-inspection ips modify-rules internal-network 192.168.1.0/24


IPSの設定

VyattaのIPSではパケットをチェックする経路を選択できます。

  1. 全てのパケットをチェック

  2. 特定のインタフェースのパケットをチェック

  3. 特定のゾーン間のパケットをチェック



IPSは負荷が高いのでできるだけパケットチェック対象を絞るべきですが今回は1の全チェックで検証したいと思います。


$configure
#set content-inspection inspect-all enable



次にチェックするプロトコルを指定します。これでも同様に全チェックだと負荷が高くなります。ICMPやF/Wで既にdropしているプロトコルなどは省くべきです。


$configure
#set content-inspection traffic-filter preset all



ここでshowして設定を確認してみましょう。

$configure
#show content-inspection



+inspect-all {
+ enable
+}
+ips {
+ auto-update {
+ oink-code ***
+ update-hour 2
+ }
+ modify-rules {
+ internal-network 192.168.1.0/24
+ }
+}
+traffic-filter {
+ preset all
+}



最後にVyattaでデフォルトルールで設定されている警告レベルの設定を行います。

デフォルトルールには4つのプライオリティが準備されています。
priority-1が最も危険度が高いイベントになりpriority-3が通常の通信でも発生するようなイベントになります。
Otherはルールにマッチしなかった場合に適応されます。


  1. priority-1

  2. priority-2

  3. priority-3

  4. Other




例えば各priorityには次のようなルールがセットされています。

priority-1 trojan-activity トロイなどによるバックドアを検知します
priority-2 successful-dos DoSを検知します
priority-3 icmp-event Pingを検知します

その他にも多くあるのでドキュメントを参照してください。
show ips rulesでも確認できます。


$ show ips rules


Vyattaではこれらのpriority別に検知時の動作を指定します。

  1. alert:通信を許可しログにAlertとして記録します

  2. drop:通信を遮断しログにAlertとして記録します

  3. pass:通信を許可しそれ以外の動作をしません

  4. sdrop:通信を遮断しログには記録しません(silent drop)





今回は実験的に全てのpriorityをdropとして指定したいと思います。


$configure
#set content-inspection ips actions priority-1 drop
#set content-inspection ips actions priority-2 drop
#set content-inspection ips actions priority-3 drop
#set content-inspection ips actions other pass


そして一旦、ローカルネットワークの設定を削除してみます。


$configure
#delete content-inspection ips modify-rules internal-network 192.168.1.0/24
#commit


削除した事で全てのネットワークがIPSの対象になりました。


別のマシンからこのVyattaにPingを打ちます。

$ping 192.168.1.2
PING 192.168.1.1 (192.168.250.1) 56(84) bytes of data.

--- 192.168.250.1 ping statistics ---
16 packets transmitted, 0 received, 100% packet loss, time 15086ms



全てPingが失敗したのが確認できたと思います。

この原因を調べてみます。


$show ips log
---------------------------------------------------------------------------
2011-07-22 16:51:15.540325 {ICMP} 192.168.1.2 -> 192.168.1.3
(misc-activity) Misc activity (priority 3)
[1:382:7] ICMP PING Windows
---------------------------------------------------------------------------
2011-07-22 16:51:15.540325 {ICMP} 192.168.1.2 -> 192.168.1.3
(misc-activity) Misc activity (priority 3)
[1:384:5] ICMP PING
---------------------------------------------------------------------------


priority-3のルールによって遮断されていることがわかりました。

Pingを通すためにルールを変更したいと思います。

Pingを防いでいるルールはicmp-info.rulesですので、このルールだけを除外します。

$configure
#set content-inspection ips modify-rules exclude-category icmp-info.rules
#commit


再度Pingを実行するとPingが通ると思います。

最後に変更したローカルネットワークの設定を元に戻しておいてください。

$configure
#set content-inspection ips modify-rules internal-network 192.168.1.0/24


priority-1以外はAlertで大丈夫だと思いますが利用するネットワーク形態によって調節してみてください。

IPS導入時はこまめにログを見てフォールスポジティブとフォールスネガティブが無いかチェックし適宜ポリシーを変更する必要があります。

0 件のコメント:

コメントを投稿