特徴
    ・IDS機能をもつソフトウェアとして有名だがインラインモードで動かせばIPSとして利用することもできる。
    ・内部ではlibpcapライブラリとtcpdumpが使用されている。                                  
    ・Snortはインターネットから追加、更新が可能な攻撃データベースを常に更新している。
      ユーザーは新しいネットワーク攻撃に基づいて署名を作成しSnort署名メーリングリストに提出することができるため、全てのSnortユーザーがその恩恵を受けられる。
    
    導入
    公式サイトを見るとCentOSへの導入用パッケージが用意されていることが確認できる。
    
    
    今回はパッケージインストールではなく、ソースからビルド&インストールすることにし、インライン型IPSとしての導入を試みる。
    
    環境
    CentOS-6.9-x86_64-minimal.iso(CentOS7でも似た手順で導入可)
    
    (1) 必要なライブラリをインストール                                                                          
                                                                                                                
    # yum -y install 
    bison
    flex
    libpcap-devel
    libdnet-devel
    zlib-devel
    pcre-devel
    gcc-c++
    
    (2) SELinux の無効化とカーネルのIP転送有効化
    
      # vim /etc/selinux/config
    
      SELINUX=disabled
    
      # vim /etc/sysctl.conf
    
      net.ipv4.ip_forward = 1
    
    (3) libdnetをインストール
    
      # wget http://prdownloads.sourceforge.net/libdnet/libdnet-1.11.tar.gz
      # tar xvzf libdnet-1.11.tar.gz
      # cd libdnet-1.11
      # ./configure --with-pic && make && make install
                                                                                                                                         
    (4) Snort2.9以降からDAQ(Data Acquisition:データ収集)システムのためのDAQライブラリが用意されているため、ソースをダウンロードしてビルド&インストール                                        
                                                                                                                
    # wget https://www.snort.org/downloads/snort/daq-2.0.6.tar.gz                                           
    # tar xvzf daq-2.0.6.tar.gz                                                                             
    # cd daq-2.0.6                                                                                          
    # ./configure && make && make install                                                              
                                                                                      
    
                              
    (5) Snortのソースをダウンロードしてビルド&インストール                                                                              
                                                                                                     
    # wget https://distfiles.macports.org/snort/snort-2.9.8.3.tar.gz                                   
    # tar xvzf snort-2.9.8.3.tar.gz                                                                         
    # cd snort-2.9.8.3.tar.gz                                                                       
    # ./configure --enable-sourcefire && make && make install
    
    
    (6) 設定ファイル、ログの置き場などを作成
      
      # mkdir /etc/snort
      # mkdir -p /etc/snort/rules/iplists
      # mkdir /etc/snort/preproc_rules
      # mkdir /usr/local/lib/snort_dynamicrules
      # touch /etc/snort/so_rules
      # touch /etc/snort/rules/iplists/black_list.rules
      # touch /etc/snort/rules/iplists/white_list.rules
      # touch /etc/snort/rules/local.rules
      # touch /etc/snort/sid-msg.map
      # mkdir /var/log/snort
      # mkdir /var/log/snort/archived_logs
      # mkdir -p /etc/snort/rules/{"iplists"},preproc_rules,so_rules
    
    (7) 設定ファイルをダウンロードしたソースフォルダからコピー
    
      # cp /usr/local/src/snort/snort-2.9.8.3/etc/*.conf* /etc/snort
      # cp /usr/local/src/snort/snort-2.9.8.3/etc/*.map /etc/snort
      # cp /usr/local/src/snort/snort-2.9.8.3/etc/*.dtd /etc/snort
    
    様々なルールセット
    
    Snortの公式サイトでは次の3パターンのルールセットが用意されている。
    
    
    
    
    [ Community rules ]
     GPLの下、会員登録無しで誰でも自由にフリーで使用できるルールセット。いくつか制限あり。
    
    [ Registered rules ]
     会員登録することで受け取ることができるルールセット。下記の”加入者ルールセット”が配布されてから30日後に配布される。
    登録すると個人コードに代わるoinkコードが渡され、それをパラメータとしてwgetすることで”登録ルールセット”が受け取れる。ちなみにoinkは英語圏における豚の鳴き声の擬音語とのこと。
    
    [ Subscriber rules ]
     シスコの顧客として加入した場合に受け取ることができるルールセット。(Snortを開発したSourcefire社は2013年にシスコシステムズに買収されている)最新のものがリアルタイムで配布される。もちろん有償。
    
    今回は会員登録をすると利用できる Registered rules を使用する。
    
    (1) https://www.snort.org/users/sign_up で会員登録(無料)
    
    
    (2) 登録が完了するとユーザー毎のOinkコードが割り振られる
    
    ※公式サイトにサインアップすることで自動的にあなたのOinkコードを付加したURLを表示してくれる。ここではダウンロード作業は飛ばして下のルールファイルの自動更新のところで自動ダウンロード設定を行う。
    
    
    (3) Snortの設定ファイルを編集
    
    # vim /etc/snort/snort.conf
    
    監視対象とするネットワークアドレスを指定
    
      # Setup the network addresses you are protecting
      ipvar HOME_NET <監視対象ネットワークアドレス>/<サブネットマスク>
    
    
    外部のネットワークアドレス(攻撃元)を指定。
    
      # Set up the external network addresses. Leave as "any" in most situations
      ipvar EXTERNAL_NET !$HOME_NET
    
    残りの ipvar で始まる行は適宜指定。今回はデフォルトのまま。
    
    
    portvarで始まる行はポート毎の監視を設定できる。今回はデフォルトのまま
    
    
    ルールセットが格納されているパスを指定
    
      # Path to your rules files (this can be a relative path)
      var RULE_PATH /etc/snort/rules
      var SO_RULE_PATH /etc/snort/so_rules
      var PREPROC_RULE_PATH /etc/snort/preproc_rules
    
    ホワイトリストファイルとブラックリストファイルのパス指定
    
      # If you are using reputation preprocessor set these
      var WHITE_LIST_PATH /etc/snort/rules/iplists
      var BLACK_LIST_PATH /etc/snort/rules/iplists
    
      今回はDAQのafpacketを使用するので以下の設定
    
      config daq: afpacket
      config daq_dir: /usr/local/lib/daq
      config daq_mode: inline
      config daq_var: buffer_size_mb=512
    
    unified2 の行でログファイル形式を指定できるが今回はデフォルトのまま。
    
    
    ルールファイルの自動更新
    
    Snortの公式サイトではルールファイルを更新するためのツールにPulledPorkというPerlスクリプトが紹介されている。ちなみにPulledPorkとは南米スタイルBBQの代表的なメニューとのこと。以下導入手順。
    
    
    (1) 必要なPerlモジュールをインストール
    
      # yum -y install 
      perl-Crypt-SSLeay
      perl-libwww-perl
      perl-Archive-Tar
      perl-Sys-Syslog
      perl-LWP-Protocol-https
    
    (2) ルールファイルの更新を行うPerlスクリプトを取得して任意配置
    
      # git clone https://github.com/shirkdog/pulledpork.git /usr/local/pulledpork
    
    
    (3) pulledporkの設定ファイルを編集
    
      # vim /usr/local/pulledpork/etc/pulledpork.conf
    
    pulledporkがルールファイル更新を行うためのURL指定
    
    rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<あなたのOinkコード>
    
      上記以外の rule_url で始まる行は全てコメントアウト
    
      ルールファイルのパス指定
    
      rule_path=/etc/snort/rules/snort.rules
    
      ローカルルールファイルのパス指定
    
    local_rules=/etc/snort/rules/local.rules
    
      sid-msg.mapファイルのパス指定
    
      sid_msg=/etc/snort/sid-msg.map
    
    Snortの設定ファイルのパス指定
    
      config_path=/etc/snort/snort.conf
    
      ディストリビューションを指定
    
      distro=RHEL-6-0
    
    (4) Snortの設定ファイルの中の$RULE_PATH配下の各ファイルのincludeを削除し、snort.rules、local.rules、so_rules.rulesファイルのみincludeするように変更。これは自動更新用のルールファイルは全てのルールがsnort.rulesファイル1つにまとめられるため。
    
    # sed -i "s/include \$RULE\_PATH/#include \$RULE\_PATH/" /etc/snort/snort.conf
      # echo "include \$RULE_PATH/snort.rules" >> /etc/snort/snort.conf
      # echo "include \$RULE_PATH/local.rules" >> /etc/snort/snort.conf
      //# echo "include \$RULE_PATH/so_rules.rules" >> /etc/snort/snort.conf
    
    (6) PulledPorkによるルールファイル更新
    
    # /usr/local/pulledpork/pulledpork.pl -c /usr/local/pulledpork/etc/pulledpork.conf
    
    ※このスクリプトを短い間隔で実行すると429番エラーが返るようにPulledPorkのチームが制限しているので注意。 再実行には15分の経過が必要。
    
    
    スクリプト実行に成功すると羽根つき豚が表示され、
    末尾に「Fly Piggy Fly!」と表示される。
    
    
    (7) PulledPorkスクリプトが3時間ごとに実行されるように設定
    
      # crontab -e
    
    0 3 * * * /usr/local/pulledpork/pulledpork.pl -c /usr/local/pulledpork/etc/pulledpork.conf
    
    
    
    /etc/snort/rules/snort.rulesファイルの中身をみると、現時点(2017/06/20)で約32000行に渡ったルール設定が行われている。ファイル内で”zeus”や”sqlmap”などのマルウェアやペンテストツールの名前で文字列検索を行うとヒットすることが確認できる。
    
    
    動作確認
    
    
    まずはSnortのオプション群を確認。
    たくさんあるため、代表的なものを取り上げる
    
    
    -A	アラートのモードを(fast,full,none,unsock,console,cmg)から選択して指定
      
    デフォルトは full。
    
    -u	起動するユーザーを指定
    -g	起動するユーザーの属するグループを指定
    -T	テストモード。オプションやルールファイルの確認を行う
    -Q	インラインモードで起動。
    -c	設定ファイルを指定
    -h	自分の属するネットワークを指定 snort.confのvar HOME_NETと同値
    -D	デーモンモードでSnortを起動。特に指定がなければ/var/log/snort/alert  
    ファイルにログ出力をする
    -d	アプリケーションレイヤーのデータもログに記録する
    -l	ログディレクトリを指定
    -b	ログをtcpdumpのフォーマットで保存
    -i	パケットをスニッフィングするネットワークインターフェイスを指定
    -v	コンソールにパケットを表示する
    
    
    詳しい内容はこちら	http://books.gigatux.nl/mirror/snortids/0596006616/snortids-CHP-3-SECT-3.html
    
    
    ・起動テスト
    
      # snort -T -c /etc/snort/snort.conf
    
    起動に成功すると豚のアスキーアートと「Snort successfully validated the configuration!」というメッセージが出力される。うまく起動しない場合は/var/log/messages等で確認
    
    ・ eth0とeth1の間にインラインモードIPSとして起動。結果は標準出力。
         ※今回はDAQモジュールのafpacketを使うので二つのインターフェースを跨ぐ       
             必要がある。
      
    # snort -c /etc/snort/snort.conf -i eth0:eth1 -Q -A console
    
    
    次はSnortの検知力について記載。
    
    Snortの検知力
    
    ここまでの作業でSnortのビルド、インストール、ルールファイルの取得、自動更新の設定、Snortの自動起動設定が完了した。また、IDS/IPSとして動作するSnortには様々な追加機能を加えることが可能。リアルタイム警告を行うためのSwatchやログファイルをHTMLファイルに変換してブラウザで閲覧可能にするSnortSnarfなど、Snortには様々な便利ツールが用意されている。今回はそれらの便利ツールの導入は割愛し、最後にSnortに闘いを挑んでみようと思う。
    が、既にSnortとNmap(ネットワークスキャナー)とMetasploit(exploitコードの作成や実行を行うためのフレームワーク)を使った検知実験資料が見つかったのでこちらを確認。
    https://www.cscan.org/download/?id=918
    (クリックするとpdfファイルがダウンロードされる)
    中身をみるとわかるが、やはりIDSに見つからない方法の1つはプローブ(送信パケット)の間隔の設定がある。
    Nmapでは -T オプションでプローブの間隔を指定できる。
    Nmapの使い方はこちらで確認できる。
    
    ちなみにSnortはデフォルトではポートスキャンの対応を行わない。
    https://www.snort.org/faq/readme-sfportscan
    こちらのURL(Snort公式サイト)を参照しながら、検知したいスキャンのタイプやプロトコルの種類等を自身で設定する必要がある。
    
    
    
    SnortのFAQ(日本語版)
    
    Snortに関して何か疑問が湧いた場合は、
    下のサイトがあなたの助けとなるでしょう。
    
    http://www.yk.rim.or.jp/~shikap/security/awacs/snort-faq-J.html
トップへ