Help us understand the problem. What is going on with this article?

【初心者向け】オープンソースのIPS「Suricata」をCentOSに構築した話

More than 3 years have passed since last update.

 以前、インフラの設計を担当していたとき、導入予定のファイアウォール、IPS、WAFの章の設計書レビューで「サイバー攻撃を受けた際は、どれにどのようなログが出力されて、攻撃を検知するのか。受けうる可能性のあるサイバー攻撃を全て列挙し、それぞれの攻撃を検知したときのログと、その攻撃に対する対策を設計書に記せ」と言われて途方にくれたことがあります。
 そこで、また同じ要望を受けたときのためにIPSの勉強をしようと思い、Suricataという、無料で構築できるオープンソースのIPSをサーバに導入してみました。この投稿では、Suricataの構築手順を順を追ってご紹介します。

 Suricataの公式サイトのDocsにあるQuick Start Guideを見ると、Suricataの構築手順が記載されていますので、Quick Start Guideに沿って構築を進めていきます。

Step0 FirewallとIDS/IPSとWAFの違いについて

 IPSを導入する前に、そもそもIPSとは何なのか、FirewallやWAFとはどこが違うのかをご説明します。
 一般的には、インターネット側からみて、一番手前にFirewallがあり、二番目にIDS/IPS、三番目にWAFがあって、最後にWebサーバにたどり着く構成になります。
 それぞれが防御できるレイヤや攻撃が違うので、どれか1つを入れたからサイバー攻撃への対策は十分というわけではありません。それぞれの違いは、以下の通りです。

WAF
引用元:ネットワークエンジニアとして | http://www.infraexpert.com/study/security17.html

  • Firewall
    送信元/送信先のIPアドレスやポート番号等をもとにアクセス制限を行って、ネットワークレベルでの防御を行う。
    ポートスキャンを防ぐが、80番ポートや443番ポートへの通信など、正常な通信を装った攻撃には対処できない。

  • IDS/IPS
    プラットフォーム(OSやミドルウェア)の脆弱性を悪用した攻撃や、ファイル共有サービスへの攻撃等を、シグネチャに基づいたパターンマッチングにより検知し、防御を行う。
    DoS攻撃、Synフラッド攻撃等を防ぐが、Webアプリケーションの脆弱性を利用した攻撃には対処できない。

  • WAF
    Webアプリケーションの防御に特化しており、Webサーバ(ApacheやIIS等)やミドルウェア(Tomcat等)、言語(PHP等)の脆弱性の防御にも効果がある。
    アクセス元とWebサーバ間の通信(HTTP/HTTPS)内容を検査して、シグネチャに基づき攻撃を検出し、防御を行う。また、ホワイトリストによる検査、画面遷移の正当性チェックとhiddenパラメータやCookieの保護なども行う。
    SQLインジェクション、クロスサイトスクリプティング、OSコマンドインジェクション、パスワードリスト攻撃、パラメータ改ざん等の攻撃を防ぐ。

※シグネチャ…不正な通信、攻撃パターンをまとめた定義ファイルのこと

Step1 Suricataのインストール

 Suricataの公式サイトのDocsにある「Installation guides」を見ると、Suricataのインストール方法がディストリビューションごとに記載されています。
 今回は、CentOS6にインストールしますので、CentOSのガイドに従って進めていきます。
 なお、このCentOS6は、VMware ESXi 6.0 Update2上の仮想マシンとして構築したものとなります。

# cat /etc/redhat-release
 CentOS release 6.8 (Final)
# arch
 x86_64

# useradd suricata
# passwd suricata
# visudo
 suricata ALL=(ALL) ALL ←追記
# su - suricata

$ pwd
 /home/suricata
$ sudo yum install epel-release
$ sudo yum install gcc libpcap-devel pcre-devel libyaml-devel file-devel zlib-devel jansson-devel nss-devel libcap-ng-devel libnet-devel tar make libnetfilter_queue-devel lua-devel
$ wget http://www.openinfosecfoundation.org/download/suricata-3.1.tar.gz
$ tar -xvzf suricata-3.1.tar.gz
$ cd suricata-3.1
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-nfqueue --enable-lua
$ make
$ sudo make install
$ sudo ldconfig

Step2 Suricataのセットアップ

 Suricataの公式サイトのDocsにあるBasic Setupを見ると、Suricataのセットアップ方法が記載されています。

$ sudo mkdir /var/log/suricata
$ sudo mkdir /etc/suricata
$ sudo chown -R suricata.suricata /var/log/suricata/
$ sudo chown -R suricata.suricata /etc/suricata/
$ sudo cp classification.config /etc/suricata
$ sudo cp reference.config /etc/suricata
$ sudo cp suricata.yaml /etc/suricata
$ sudo cp -p /etc/suricata/suricata.yaml /etc/suricata/suricata.yaml.org
$ sudo vi /etc/suricata/suricata.yaml

vars:
 address-groups:
 HOME_NET: "[192.168.10.0/24]" ←自分のネットワークを追記
 #HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]" ←コメントアウト

host-os-policy:
# Make the default policy windows.
# windows: [0.0.0.0/0] ←コメントアウト
windows: []
bsd: []
bsd-right: []
old-linux: []
linux: [192.168.10.0/24] ←自分のネットワークを追記
old-solaris: []
solaris: []
hpux10: []
hpux11: []
irix: []
macos: []
vista: []
windows2k3: []

 
 なお、Basic Setupの「Rule set management and download.」に記載のRule Management with Oinkmasterでは、Oinkmasterのインストール方法として、「sudo apt-get install oinkmaster」を実行するよう解説しています。
 今回は、CentOS6にインストールしますが、OinkmasterをCentOS6にインストールする方法が記載されていないので、sourceforge.netから最新版のtar.gzをダウンロードします。

$ wget https://sourceforge.net/projects/oinkmaster/files/oinkmaster/2.0/oinkmaster-2.0.tar.gz
$ tar -xvzf oinkmaster-2.0.tar.gz
$ cd oinkmaster-2.0
$ sudo cp -p oinkmaster.pl /usr/local/bin
$ sudo cp -p oinkmaster.conf /etc/
$ sudo cp -p oinkmaster.1 /usr/share/man/man1/
$ sudo cp -p /etc/oinkmaster.conf /etc/oinkmaster.conf.org
$ sudo vi /etc/oinkmaster.conf
 # Example for Community rules
 # url = http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules.tar.gz
  url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz ←追記 
$ cd /etc
$ sudo /home/suricata/suricata-3.1/oinkmaster-2.0/oinkmaster.pl -C /etc/oinkmaster.conf -o /etc/suricata/rules

$ cd /etc/suricata
$ sudo wget http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
$ sudo tar -xvzf emerging.rules.tar.gz
$ sudo chown -R suricata.suricata /etc/suricata/rules

$ sudo vi /etc/suricata/suricata.yaml

 # - http-events.rules    # available in suricata sources under rules dir ←コメントアウト
 # - smtp-events.rules    # available in suricata sources under rules dir ←コメントアウト
 # - dns-events.rules     # available in suricata sources under rules dir ←コメントアウト
 # - tls-events.rules     # available in suricata sources under rules dir ←コメントアウト

 # classification-file: /etc/suricata/classification.config ←コメントアウト
 # reference-config-file: /etc/suricata/reference.config ←コメントアウト
 classification-file: /etc/suricata/rules/classification.config ←追記
 reference-config-file: /etc/suricata/rules/reference.config ←追記

$ sudo suricata -c /etc/suricata/suricata.yaml -i eth0
 10/11/2016 -- 09:12:01 - <Notice> - This is Suricata version 3.1 RELEASE
 10/11/2016 -- 09:12:07 - <Warning> - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Using AF_PACKET     with GRO or LRO activated can lead to capture problems
 10/11/2016 -- 09:12:07 - <Notice> - all 2 packet processing threads, 4 management threads initialized, engine started.
 10/11/2016 -- 09:12:07 - <Error> - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Coudn't set fanout mode, error Protocol not available
 10/11/2016 -- 09:12:07 - <Error> - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Couldn't init AF_PACKET socket, fatal error
 10/11/2016 -- 09:12:07 - <Notice> - Signal Received.  Stopping engine.
 10/11/2016 -- 09:12:07 - <Error> - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Coudn't set fanout mode, error Protocol not available
 10/11/2016 -- 09:12:07 - <Error> - [ERRCODE: SC_ERR_AFP_CREATE(190)] - Couldn't init AF_PACKET socket, fatal error
 10/11/2016 -- 09:12:07 - <Notice> - Stats for 'eth0':  pkts: 0, drop: 0 (-nan%), invalid chksum: 0

 エラーを回避する方法を探すために、以下の対応を行いました。
 なお、suricata.yamlに「threads: 1」を追記する回避策は、suricataのRedmineに記載されています。

$ sudo ethtool -K eth0 gro off
$ sudo ethtool -K eth0 lro off

$ sudo vi /etc/suricata.yaml

 # Linux high speed capture support
 af-packet:
    - interface: eth0
      # Number of receive threads. "auto" uses the number of cores
      # threads: auto ←コメントアウト
      threads: 1 ←追記

$ sudo suricata -c /etc/suricata/suricata.yaml -i eth0 --init-errors-fatal
 10/11/2016 -- 10:28:38 - <Notice> - This is Suricata version 3.1 RELEASE
 10/11/2016 -- 10:28:43 - <Notice> - all 1 packet processing threads, 4 management threads initialized, engine started.

 こちらの記事によると、これで成功しているようです。

Step3 Suricataのログを確認する

$ cd /var/log/suricata
$ sudo tail -n 50 stats.log
 tcp.synack                                 | Total                     | 1
 flow.spare                                 | Total                     | 10000
 tcp.memuse                                 | Total                     | 393216
 tcp.reassembly_memuse                      | Total                     | 12320544
 dns.memuse                                 | Total                     | 920
 flow.memuse                                | Total                     | 7155784
 ------------------------------------------------------------------------------------
 Date: 11/10/2016 -- 10:30:03 (uptime: 0d, 00h 01m 20s)
 ------------------------------------------------------------------------------------
 Counter                                    | TM Name                   | Value
 ------------------------------------------------------------------------------------
 capture.kernel_packets                     | Total                     | 474
 decoder.pkts                               | Total                     | 475
 decoder.bytes                              | Total                     | 60408
 decoder.ipv4                               | Total                     | 426
 decoder.ethernet                           | Total                     | 475
 decoder.tcp                                | Total                     | 419
 decoder.udp                                | Total                     | 7
 decoder.avg_pkt_size                       | Total                     | 127
 decoder.max_pkt_size                       | Total                     | 1158
 tcp.sessions                               | Total                     | 1
 tcp.syn                                    | Total                     | 1
 tcp.synack                                 | Total                     | 1
 flow.spare                                 | Total                     | 10000
 tcp.memuse                                 | Total                     | 393216
 tcp.reassembly_memuse                      | Total                     | 12320544
 dns.memuse                                 | Total                     | 920
 flow.memuse                                | Total                     | 7156080
 ------------------------------------------------------------------------------------
 Date: 11/10/2016 -- 10:30:11 (uptime: 0d, 00h 01m 28s)
 ------------------------------------------------------------------------------------
 Counter                                    | TM Name                   | Value
 ------------------------------------------------------------------------------------
 capture.kernel_packets                     | Total                     | 535
 decoder.pkts                               | Total                     | 535
 decoder.bytes                              | Total                     | 67588
 decoder.ipv4                               | Total                     | 481
 decoder.ethernet                           | Total                     | 535
 decoder.tcp                                | Total                     | 474
 decoder.udp                                | Total                     | 7
 decoder.avg_pkt_size                       | Total                     | 126
 decoder.max_pkt_size                       | Total                     | 1158
 tcp.sessions                               | Total                     | 1
 tcp.syn                                    | Total                     | 1
 tcp.synack                                 | Total                     | 1
 flow.spare                                 | Total                     | 10000
 tcp.memuse                                 | Total                     | 393216
 tcp.reassembly_memuse                      | Total                     | 12320544
 dns.memuse                                 | Total                     | 920

Step4 Snorbyのインストール・設定

 SuricataのログをGUIで確認するために「Snorby」をインストールします。
 インストールと設定は、こちらのサイトを参考にして行っています。

 なお、CentOS6のデフォルトのリポジトリからyumでRubyをインストールすると、1.8.7が入ります。
 こちらのサイトによると、Snorbyをインストールする場合、Ruby 2.X系をインストールした方がよいと書いているので、rbenvを用いてRuby 2.X系をインストールします。
 rbenvを用いてRuby 2.X系をインストールする方法は、こちらのサイトを参考にしました。

 構築途中ですので、完了次第、追記します。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away