Snort 3.0に挑戦 (失敗)

Snort 3.0

FreeBSDのportsのSnort 3.0は暫くビルドできない状態で放置されていたが、3月20日に更新されてビルドできるようになったようなのでインストールして試してみた。(ただし題名のとおり今回は意図したようには動かなかった)

インストール

portsのビルドオプションは初期値+Hyperscanにチェックした。

# cd /usr/ports/security/snort3
# make install

# which snort
/usr/local/bin/snort
# snort -V

   ,,_     -*> Snort++ <*-
  o"  )~   Version 3.0.0 (Build 243) FreeBSD
   ''''    By Martin Roesch & The Snort Team
           http://snort.org/contact#team
           Copyright (C) 2014-2018 Cisco and/or its affiliates. All rights reserved.
           Copyright (C) 1998-2013 Sourcefire, Inc., et al.
           Using DAQ version 2.2.2
           Using LuaJIT version 2.0.5
           Using OpenSSL 1.0.2o  27 Mar 2018
           Using libpcap version 1.8.1
           Using PCRE version 8.40 2017-01-11
           Using ZLIB version 1.2.11
           Using Hyperscan version 4.6.0 2018-04-06
           Using LZMA version 5.2.3

ビルドできたし一応動いた。

動作準備

# bash                      #←以下はbshやbashで実施
# export LUA_PATH=/usr/local/include/snort/lua/\?.lua\;\;
# export SNORT_LUA_PATH=/usr/local/etc/snort
# env | grep LUA
LUA_PATH=/usr/local/include/snort/lua/?.lua;;
SNORT_LUA_PATH=/usr/local/etc/snort
~/.profileや ~/.bashrcに2行追記
1
2
export LUA_PATH=/usr/local/include/snort/lua/\?.lua\;\;
export SNORT_LUA_PATH=/usr/local/etc/snort

動作試験

# mv /usr/local/etc/snort/snort.lua /usr/local/etc/snort/snort_local.lua      #portsを更新するとsnort.luaが強制的に上書きされるのでこうしておく(こちらを使う)
# /usr/local/bin/snort -c /usr/local/etc/snort/snort_local.lua
--------------------------------------------------
o")~   Snort++ 3.0.0-243
--------------------------------------------------
Loading /usr/local/etc/snort/snort_local.lua:
FATAL: /usr/local/include/snort/lua/snort_config.lua:88: Undefined symbol "set_string"
Fatal Error, Quitting..

早くもここでエラーになるとはイヤな予感。

/usr/local/include/snort/lua/snort_config.lua
1
2
3
4
5
6
7
8
--    elseif ( what == 'string' ) then
--        ffi.C.set_string(name, val)

--    elseif ( what == 'table' ) then
--        if ( ffi.C.open_table(name, idx) ) then
--            snort_traverse(val, name)
--            ffi.C.close_table(name, idx)
--        end

後のことは考えずにとりあえず、 88〜94行目の行頭に -- を付ける

再度実行

# /usr/local/bin/snort -c /usr/local/etc/snort/snort_local.lua
--------------------------------------------------
o")~   Snort++ 3.0.0-243
--------------------------------------------------
Loading /usr/local/etc/snort/snort_local.lua:
Finished /usr/local/etc/snort/snort_local.lua.
--------------------------------------------------
pcap DAQ configured to passive.

Snort successfully validated the configuration (with 0 warnings).
o")~   Snort exiting

警告が出たりエラーにならずに正常に終了した。

ルールファイルの使用

コミュニティ版のルールファイルを取得する。

# mkdir /usr/local/etc/snort/rules
# cd ~
# fetch https://www.snort.org/downloads/community/snort3-community-rules.tar.gz
# tar -zxvf snort3-community-rules.tar.gz
# mv snort3-community-rules/snort3-community.rules /usr/local/etc/snort/rules/
# mv snort3-community-rules/sid-msg.map /usr/local/etc/snort/rules/

コミュニティルールのファイルは大きいけど中身は殆どの行がコメントになっているのでルールとして成立しているのは数行だけ。
必要に応じてコメントを外すみたい。動作試験の段階なのでコメントを外さずに試す。

# snort -c /usr/local/etc/snort/snort_local.lua -R /usr/local/etc/snort/rules/snort3-community.rules
--------------------------------------------------
o")~   Snort++ 3.0.0-243
--------------------------------------------------
Loading snort_local.lua:
Finished snort_local.lua.
Loading rules:
Loading snort3-community.rules:
ERROR: snort3-community.rules:389 Undefined variable in the string: $SQL_SERVERS.
ERROR: snort3-community.rules:389 undefined variable in the string: $EXTERNAL_NET.
ERROR: snort3-community.rules:389 invalid argument classtype: = unsuccessful-user
ERROR: snort3-community.rules:1777 Undefined variable in the string: $HOME_NET.
ERROR: snort3-community.rules:1777 undefined variable in the string: $EXTERNAL_NET.
FATAL: snort3-community.rules:1777 ***PortVar Lookup failed on '$HTTP_PORTS'.
Fatal Error, Quitting..

変数が全部取れてない。\(^o^)/オワタ
$SQL_SERVERS, $HOME_NET, $EXTERNAL_NET, $HTTP_PORTSはsnort_local.lua(snort.lua)またはsnort_defaults.luaで定義済みの筈なのでこれがダメだと何もできない。
snort_config.luaでエラーになってコメント化した部分を直さないとマズいのかしら。それか根本的なところが解ってなくて見当違いなことをしているか。

Dovecot 2.2系から2.3系への更新

FreeBSDのportsでもDovecotの標準バージョンが2.3系になった。2.3系では設定項目の一部が2.2系とは異なるので本番稼働しているDovecotをいきなり更新するのは(動かなくなるリスクがあるので)怖い。そこで更新のトラブル情報やTipsが出回るまで暫く放置することを考えたが、他のportsを更新したときに依存関係でつられて意図せずに2.3系に更新されてしまう可能性があり、そうすると心の準備が出来てない中で慌てて設定を直すハメになるかも。それはそれで非常に怖い。

仕方がないので放置せずに更新することに。

Dovecotの更新

# cp -pR /usr/local/etc/dovecot /usr/local/etc/dovecot.BK2235
# portupgrade -fr dovecot-2.2.35

これで更新される筈。2018年4月6日現在だとDovecotは2.3.1、Sieveプラグインのdovecot-pigeonholeは0.5.1になった。
設定を変更するまでDovecotを再起動しないこと。(動かなくなる可能性あり)

SSL周りの設定変更

2.3系での変更の主なのはSSLの設定。
/usr/local/etc/dovecot/conf.d/10-ssl.conf (変更)
1
2
3
4
5
# ssl_dh_parameters_length = 2048             #この設定は廃止
ssl_dh = /usr/local/etc/dovecot/ssl/dh.pem    #DH鍵交換のパラメータファイルを作って指定

# ssl_protocols = !SSLv3                      #ssl_protocolsはssl_min_protocolに変更で書く内容も変わった
ssl_min_protocol = TLSv1.2                    #TLSv1, TLSv1.1, TLSv1.2のどれかを書く SSLv3というのはもう無しだろう

最低限ここだけは直さないとDovecotが起動しなくなるらしい。

Dovecotの推奨のDH鍵交換のパラメータファイル作成方法
# dd if=/var/db/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /usr/local/etc/dovecot/ssl/dh.pem

その他の変更は、そこを変えなかったからDovecotが動かなくなるとかはなさそう。

正直2.3系への変更はもっと大変かと思ったが、全然そうじゃなかった。

Up