
| Snortとは? |
Snortとは、ネットワーク型の侵入検知システム(NIDS)です。
これを導入すれば、ローカルネットワーク内に入ってきた不正なパケットを検知することができます。
そしてどのような攻撃が行われたのか、ログに記録することができます。
Snortについて1つ注意点があります。それはあくまでも不正なパケットを検知するだけであって、
防御などはしないということです。なのでこれを導入したから安全ということは決してありません。
Windowsでは市販ソフトで代表的なものにNorton Internet Securityというソフトがあります。
Nortonは不正アクセスを検出して、ブロックするという役目を持っています。しかし、Snortには
ブロックという機能はありません。
普段からSnortのログをしっかりと見て、どのような攻撃が多いのか勉強していきましょう。
Snortのログは膨大になりがちで見づらいので、当サイトではSnortsnarfというツールを利用して、
ログの集計結果をHTML化して見やすくします。あと最後に1点ですが、Snortは各ルールと照らし合わせて、
攻撃パターンを判断します。この際、誤報もしばしばあります。なので不要なルールは無効化し、
誤報を減らすような設定まで行っていきたいと思います。
| Snortの導入 |
Snortを導入するには、libpcapとlibpcreという2つのライブラリが必要です。
先ずはこれらの導入からしていきます。先ずはlibpcapがインストールされているか確認します。
| # rpm -q libpcap libpcap-0.8.3-6.FC2.1 ←応答があればインストールされてる |
上のような表示が返って来ない場合は、インストールされていませんので、インストールします。
yumからインストールすることができます。
| # yum -y install libpcap |
次に同じように、libpcreがインストールされているか確認します。
| # rpm -q libpcre |
これはインストールされていませんでしたので、下記のようにインストールしました。
| $ wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-5.0.tar.gz $ tar zxvf pcre-5.0.tar.gz $ cd pcre-5.0 $ ./configure ←Makefileの作成 $ make ←コンパイル $ su ←rootにチェンジ # make install ←インストール |
続いて、シンボリックリンクの作成を行います。
| # ln -s /usr/local/lib/libpcre.so.0 /usr/lib/libpcre.so.0 ←/usr/libディレクトリに |
なお、wgetからの操作は一般ユーザで、/tmpディレクトリでやるのが好ましいです。
これでライブラリの準備ができましたので、Snortのインストールをしたいと思います。
| $ wget http://www.snort.org/dl/current/snort-2.3.3.tar.gz $ tar zxvf snort-2.3.3.tar.gz $ cd snort-2.3.3 $ ./configure $ make $ su # make install |
続いて、Snortの設定ファイルとルールセットを、/usr/local/以下にコピーします。
またSnortのログファイルを格納するディレクトリを作成します。
| # pwd /tmp/snort-2.3.3 ←現在、snort-2.3.3に居ることを確認 # cp -a ./etc /usr/local/snort # cp -a ./rules /usr/local/rules # mkdir /var/log/snort |
次にSnortの設定ファイルを編集します。
| # vi /usr/local/snort/snort.conf var HOME_NET any ←44行目 ↓ var HOME_NET 192.168.1.0/24 ←LAN内を監視 var EXTERNAL_NET any ←47行目 ↓ var EXTERNAL_NET !$HOME_NET ←LAN内マシンからのパケットは除外 |
192.168.1.0/24の部分は自分の環境に合わせてください。以上が終わったらSnortを起動させます。
| # snort -D -c /usr/local/snort/snort.conf ←バックグラウンドで実行 |
またコンピュータ起動時に自動で実行するようにします。
| # vi /etc/rc.d/rc.local /usr/local/bin/snort -D -c /usr/local/snort/snort.conf ←追加 |
以上で準備完了です。ちゃんとSnortが起動しているか確認してみましょう
| # ps -C snort PID TTY TIME CMD 13238 ? 00:00:00 snort ←このような1行が出ればOK |
続いて、Snortを再起動してみましょう。上記のpsコマンドでsnortのPIDは13238と分かりましたので、
| # kill -HUP 13238 |
これで再起動することができます。
| Snortのログの見方とルールの無効化 |
続いて、Snortのログファイルを見てみます。ここでは1つの攻撃を例に上げてみます。
| # tail -100 /var/log/snort/alert [**] [1:469:3] ICMP PING NMAP [**] [Classification: Attempted Information Leak] [Priority: 2] 01/31-01:50:25.033046 192.168.1.12 -> 192.168.1.11 ICMP TTL:52 TOS:0x0 ID:27974 IpLen:20 DgmLen:28 Type:8 Code:0 ID:58418 Seq:0 ECHO [Xref => http://www.whitehats.com/info/IDS162] |
上記では、nmapというポートスキャンをされました。この攻撃のPriorityは2と書いています。
数字は小さいほど深刻です。また、192.168.1.12 -> 192.168.1.11という部分は、IPアドレスが
192.168.1.12から192.168.1.11に対して行われたということになります。
次に不要なルールの無効化をしてみます。Snortのログを見ていると無駄に多く記録されるものが
あったりします。特に害の無いものならそれは無効化しておき、ログに記録されないように
することができます。例えば、MISC UPnP malformed advertisementというルールを無効化して
みたいと思います。ルールセットは先ほど、/usr/local/rules/以下に置きました。
なので、先ずMISC UPnP malformed advertisementがどのルールセットに記述されているのかを
見つけます。以下のコマンドを打ってみてください。
| # grep -n "MISC UPnP malformed advertisement" /usr/local/rules/* /usr/local/rules/misc.rules:25:#alert・・・(省略) |
長いので結果は省略しました。一番上の行のすぐ先頭に/usr/local/rules/misc.rules:25とあります。
これは、MISC UPnP malformed advertisementが/usr/local/rules/misc.rulesの25行目にある
という意味です。
それでは早速このルールを無効化してみましょう。
| # vi /usr/local/rules/misc.rules alert udp ・・・(msg:"MISC UPnP malformed advertisement"・・・ ←25行目 ↓ #alert udp ・・・(msg:"MISC UPnP malformed advertisement"・・・ ←コメントアウト |
以上でこのルールは無効となりましたので、ログに記録されなくなります。
ルールを無効化したら設定を反映させる為にSnortを再起動します。
先にも書きましたが、もう1度確認の為、再起動手順を書きます。
| # ps -C snort 13238 ? 00:00:00 snort ←PIDは13238(この場合) # kill -HUP 13238 |
以上で、設定が反映されます。
| ルールファイルの更新、ルールファイルを自動で更新するスクリプトの作成 |
ルールファイルの更新を行います。Snortはルールと照らし合わせて攻撃を検知します。
ルールが古いままでは、新しい攻撃手法に対応できません。なので、ルールは更新をしなくては
いけません。以下のように更新することができます。
| # wget http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules.tar.gz # tar zxvf Community-Rules.tar.gz (rulesとdocsというディレクトリが出来上がる) # mv -f rules/* /usr/local/rules/ ←古いルールを上書き |
以上で、ルールファイルの更新は終わりです。Snortを再起動すれば反映されます。
なお、このルール更新を自動化する為にシェルスクリプトを作成しました。
ここでは、snortrules.shという名前で、/rootに作成しました。以下内容を貼り付けます。
| # vi snortrules.sh #!/bin/sh # 変数の設定 COMMU=/root/Community-Rules.tar.gz RULES=/root/temp/rules/* TEMP=/root/temp # ルールのDLから、更新まで wget http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules.tar.gz mkdir $TEMP tar zxvf $COMMU -C $TEMP mv -f $RULES /usr/local/rules/ # 設定を反映させる為、snortを再起動 killall -HUP snort # サクサクと後片付け rm -rf $COMMU $TEMP |
この記述通りにする場合は、snortrules.shは/rootに作成してください。
なお、このスクリプトはwgetで取得することも可能です。
このsnortrules.shのハッシュ値は、0b5a116033bd19f41fc49647d45a4be4 です。
wgetで入手後は、ハッシュ値が一致するか確認してください。
| # wget http://chibi.name/script/snortrules.sh # md5sum snortrules.sh |
続いて、このスクリプトに実行権を与え、cronに登録します。
| # chmod 700 snortrules.sh # crontab -e 30 00 * * 1,4 /root/snortrules.sh > /dev/null 2>&1 |
ここでは、月曜と木曜の0時30分に、このスクリプトを実行するようにしました。
また、Cronに登録する前に実行してみて、ちゃんと動作するかの確認もしておいてください。
| # ./snortrules.sh |
最終更新 : 06/17/2005