FreeBSDを使って、侵入(Intrusion)検知(Detection)生活(SeikatsuSystem)していきます。
この分野だと Snort が最も有名ですが、今回は使ったことのない Suricata を試してみます。
環境
- OS: FreeBSD 11.2-RELEASE
- ネットワークインターフェース名: em0
インストール
準備
IPSとして動かす場合にはipfw
が必要です。
IPSとして動かす予定はないですが、一応入れておきます。
それぞれファイルに追記します。
firewall_enable="YES" # Set to YES to enable firewall functionality
firewall_type="open" # Firewall type (see /etc/rc.firewall)
ipfw_load="YES"
ipfw_nat_load="YES"
ipdivert_load="YES"
dummynet_load="YES"
libalias_load="YES"
Suricataをインストール
pkg
を使ってさっくりと入れます。
pkg install suricata
とりあえず動かしてみる
-i
オプションにネットワークインターフェース名を渡します。
--init-errors-fatal
オプションを付けて、ルールにエラーがあったら落ちるようにします。
# suricata -i em0 --init-errors-fatal
22/7/2018 -- 14:11:03 - <Warning> - [ERRCODE: SC_WARN_FASTER_CAPTURE_AVAILABLE(275)] - faster capture option is available: NETMAP (--netmap=em0). Use --pcap=em0 to suppress this warning
22/7/2018 -- 14:11:03 - <Notice> - This is Suricata version 4.0.4 RELEASE
22/7/2018 -- 14:11:03 - <Warning> - [ERRCODE: SC_ERR_NO_RULES(42)] - No rule files match the pattern /usr/local/etc/suricata/rules/botcc.rules
ルールファイルがなくて落ちちゃいました。
ルールファイルを取得
oinkmasterをインストール
ルールをダウンロードするため、oinkmasterを使います。
pkg install oinkmaster
oinkmasterを設定
url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz
path = /bin:/usr/bin:/usr/local/bin
update_files = \.rules$|\.config$|\.conf$|\.txt$|\.map$
oinkmasterを実行
oinkmaster
を実行します。
oinkmaster -o /usr/local/etc/suricata/rules
/usr/local/etc/suricata/rules
にファイルが保存されました。
# ls /usr/local/etc/suricata/rules/
BSD-License.txt emerging-dns.rules emerging-rpc.rules files.rules
app-layer-events.rules emerging-dos.rules emerging-scada.rules gen-msg.map
botcc.portgrouped.rules emerging-exploit.rules emerging-scan.rules gpl-2.0.txt
botcc.rules emerging-ftp.rules emerging-shellcode.rules http-events.rules
ciarmy.rules emerging-games.rules emerging-smtp.rules modbus-events.rules
classification.config emerging-icmp.rules emerging-snmp.rules rbn-malvertisers.rules
compromised-ips.txt emerging-icmp_info.rules emerging-sql.rules rbn.rules
compromised.rules emerging-imap.rules emerging-telnet.rules reference.config
decoder-events.rules emerging-inappropriate.rules emerging-tftp.rules sid-msg.map
dns-events.rules emerging-info.rules emerging-trojan.rules smtp-events.rules
drop.rules emerging-malware.rules emerging-user_agents.rules stream-events.rules
dshield.rules emerging-misc.rules emerging-voip.rules suricata-2.0-enhanced-open.txt
emerging-activex.rules emerging-mobile_malware.rules emerging-web_client.rules tls-events.rules
emerging-attack_response.rules emerging-netbios.rules emerging-web_server.rules tor.rules
emerging-chat.rules emerging-p2p.rules emerging-web_specific_apps.rules unicode.map
emerging-current_events.rules emerging-policy.rules emerging-worm.rules
emerging-deleted.rules emerging-pop3.rules emerging.conf
とりあえず動かしてみる(2)
ルールファイルができたのでまた動かしてみます。
em0
は--pcap
オプションを使ったほうがよいらしいので、そうします。
# suricata --pcap=em0 --init-errors-fatal
22/7/2018 -- 14:27:47 - <Notice> - This is Suricata version 4.0.4 RELEASE
22/7/2018 -- 14:27:57 - <Notice> - all 3 packet processing threads, 4 management threads initialized, engine started.
いい感じに動きました。
/var/log/suricata
にファイルができています。
# ls /var/log/suricata/
eve.json fast.log stats.log suricata.log
Suricataの初期設定
使いながらおいおい煮詰めていくことにして、とりあえずHOME_NET
だけ設定しました。
vars:
address-groups:
HOME_NET: "[10.1.1.0/24]"
ログのローテート
newsyslog
任せにします。
次のファイルを作りました。
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num]
/var/log/suricata/*.log root:wheel 644 3 100 * GJC /var/run/suricata.pid
これは、3世代保存、100kb超えたらローテート、bzip2で圧縮し、ファイルがなければ作成、/var/run/suricata.pid
ファイルに書かれているプロセスIDにSIGHUPを送る、という意味です。
flagsにG
を付けないと、ワイルドカードを使えません。
起動設定
OS起動時にsuricata
も起動するようにします。
次のファイルに追記しました。
## Suricata the IDS
##
suricata_enable="YES" # Set to YES to enable suricata
suricata_interface="em0" # Network interface(s) to sniff
確認
起動するか確認します。
/usr/local/etc/rc.d/suricata start
# ps axww | grep suricata
2843 - Ss 0:07.75 /usr/local/bin/suricata -D --pcap=em0 --pidfile /var/run/suricata.pid -c /usr/local/etc/suricata/suricata.yaml
設置
IPSとして動かすのであれば、ブリッジにしたりしますが、今回はIDSにするだけなので、ルータかスイッチのポートをミラーリングしてパケットを拾います。
自分のとこでは、YAMAHA RTX1200を使っていました。
YAMAHA RTX1200の場合
SuricataをインストールしたマシンをLAN1のポート8に接続しました。
監視対象はLAN1のポート5です。
RTX1200へログインし、管理者モードで以下のコマンドを入力します。
lan port-mirroring lan1 8 out 5 in 5
ポート5への入出力双方をポート8へミラーリングします。
em0から伸びたケーブルをRTX-1200のLAN1ポート8に挿します。
トラブルシューティング
何も記録されいないときは、パケットが流れていないか拾えていないのかもしれません。
tcpdump -i インターフェース名
として、何かパケットキャプチャできるか見てみてください。何かキャプチャできるときは、suricataの設定がおかしいです。
もしかすると、インターフェースが寝ているのかもしれません。
ifconfig インターフェース名 up
として、インターフェースを起こしてください。
次は?
何か可視化ツールをインストールしてみます。
可視化の結果を見ながら、設定やルールを詰めていきます。