皆さん
お疲れサマンサ!
今回は、前回からの続きで、ラズパイにSnortを導入します!
もちろん一人の知識でできるものではなさそうなので、先人たちの知恵をお借りしましょう!
【参考サイト1】
Snort インストール
【参考サイト2】
RAPIT7 Blog
上記の参考サイトのいいとこどりをしながら、ラズパイにSnortを入れていきましょう。
では、最初からやっていきます。
前回までで、とりあえずミラー通信をラズパイに流すまでは出来ていますので、
この通信をSnortで監視してアレな感じのものが流れてきたらログに書かれるので、それをどこかに通知する感じにしましょう。
参考サイト1から少し古いルール(30日前のルール)を取得するには、ユーザ登録が必要なことを知りましたので、ユーザ登録をします。
参考サイト1を参考に、snortのグループとユーザを作成し、
ログ出力ディレクトリを作成しましょう。
1 2 3 4 |
groupadd snort useradd -c "Snort NIDS" -d /dev/null -s /usr/sbin/nologin -g snort snort mkdir /var/log/snort chown snort:snort /var/log/snort |
参考サイト2から必要なソフトが分かるので、インストールしていきます。
1 2 3 |
apt-get update -y apt-get upgrade -y apt-get install ethtool build-essential libpcap-dev libpcre3-dev libdumbnet-dev bison flex zlib1g-dev liblzma-dev libssl-dev |
※OpenSSLはインストール済みなので外しました。
どちらのサイトでも次のステップで、snortをインストールしているので、
snortをサイトからダウンロードしてインストールしましょう。
daq
1 2 3 4 |
wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz tar -zxf daq-2.0.6.tar.gz cd daq-2.0.6 ./configure && make && make install |
snort
1 2 3 4 |
wget https://www.snort.org/downloads/snort/snort-2.9.11.1.tar.gz tar -zxf snort-2.9.11.1.tar.gz cd snort-2.9.11.1 ./configure --enable-sourcefire && make && make install |
正常にインストールが完了していると「snort -V」の実行でブタさんが表示される
1 2 3 4 5 6 7 8 9 |
snort -V ,,_ -*> Snort! <*- o" )~ Version 2.9.11.1 GRE (Build 268) '''' By Martin Roesch & The Snort Team: http://www.snort.org/contact#team Copyright (C) 2014-2017 Cisco and/or its affiliates. All rights reserved. Copyright (C) 1998-2013 Sourcefire, Inc., et al. Using libpcap version 1.8.1 Using PCRE version: 8.00 2009-10-19 Using ZLIB version: 1.2.8 |
参考サイト1の通りに、いい感じに設定を進めていくと、起動のところで詰まりましたw
どうやらラズパイ君は、アラート出力設定をしていると設定ファイルパスを最後に指定しないと、起動に失敗するっぽい・・・
というより設定ファイルより後ろもファイルとして認識してる・・・?
なので、起動コマンドは以下のように変更する
変更前
1 |
snort -A fast -c /etc/snort/etc/snort.conf -l /var/log/snort --pid-path /var/log/snort -b -d -g snort -u snort -D |
変更後
1 |
snort -A fast -l /var/log/snort --pid-path /var/log/snort -b -d -g snort -u snort -D -c /etc/snort/etc/snort.conf |
起動用サービスも上記のように変更して「enable」しましょう。
起動するとアラートが上がるはずです!w
私の環境では、フィルタリングと相まってガンガンアラートを吐きますw
元気なブタさんですねー・・・w
今後ルールの整理をしよう・・・。
参考サイト1では、ルールファイルの自動更新の手順も完備されていますので、
これもインストールしておきましょう。
distro部分は、、、ラズパイが何に該当するのか不明ですが、
「Ubuntu-14-04」あたりでいいでしょうw
現に動いてますし。・・・WARNはいっぱい吐くけどね。w
アラート解析のコードも参考にして設定しましょう。
ここまででSnortがいい感じに起動しているので、参考は終わりにして、
次はどこかに通知するようにしましょう。
メールをこのためだけに使うのもあれなので443ポートで書き込めるSlackにPOSTしましょう。
コードは、今流行りのpythonで書きまっす。
postする内容は、アラート解析で出力されるhtmlファイルを書き込みます。
あまり行数がないので、そのまま記載しますー。
とりあえず、動くだけのコードですw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#!/usr/bin/python # -*- Coding: utf-8 -*- #import群 import sys, os, re import json import requests #Slack書き込み用URL msgUrl = 'https://slack.com/api/chat.postMessage' #Slack書き込み用パラメータ msgPayload = {'token':'', 'channel':'', 'text':'alert', 'attachments':[]} #htmlファイル用配列 msgAttachments = [] #htmlファイル用枠 workData = {'pretext':'index.html', 'text':'test'} htmlData = '' #ただただテキストを取得 with open('/index.html','r') as f: for line in f: htmlData += line.strip() + '\n' #辞書を更新 workData['text'] = htmlData msgAttachments.append(workData) msgPayload['attachments'] = json.dumps(msgAttachments) #SlackにPOST r = requests.post(msgUrl, data=msgPayload) #結果確認 jsonData = r.json() if not jsonData['ok']: print ('Error') print (str(jsonData['error'])) exit print ('sent slack done!') exit |
これでひとまずSlackに書き込まれます。
実際htmlファイルの内容をただ貼っただけでスクレイピングができていないので後でキレイにします。
また、これでは前回書き込みとの差分などについては考えていないのでそのあたりも改善していこうかと思いますー。
いい感じにsnortがNIDSが動いているので、また一つ安全になりました!
スクレイピングとかはまたの機会に書くかもしれませんー。
でゎでゎ、ヨロコ