Snort 3.0.2を使いましょう。
問題
OSSのNIDSであるSnortを公式のドキュメント通りにUbuntu 18.04で動かそうとしたが失敗。
具体的にはRegisteredのルールセットを使ったところsnort -c /usr/local/etc/snort/snort.lua
でundefined variable name: RULE_PATH
などとエラーが出る。おそらくこの記事の症状と同じだろう。
原因
Snortのコード(masterの最新)を見ると、src/parser/vars.cc
のVarSearch()
で変数の名前解決が行われているようだ。
変数のテーブルとしては、get_ips_policy()
で得られたIpsPolicy
から以下の3つが参照されている。
var_table
portVarTable
ip_vartable
最も一般的らしきvar_table
について探ると、同じファイルのParsePathVar()
で値を設定している。これはIpsModule::set
だけが呼んでいいて、設定ファイルのipsブロック下のvariables.paths
内で定義されたものが渡されているようだ。
実際、snort.lua
のips
へ以下のようにvariables
を追加するとRULE_PATH
のエラーは解消された。
ips =
{
variables = {
paths = {
RULE_PATH = '../',
}
},
rules = [[
-- ...
]]
}
lua
ディレクトリ下のファイルを見てもRULE_PATH
などをグローバル変数ではなくこのように設定していて、3.0.3で変更が加えられている。
一方でSnort 3.0.2-6のコードを見ると、src/managers/module_manager.cc
のset_string()
などがLuaでの変数定義を処理している(finalize.lua
でLua側から各グローバル変数についてこうした関数を呼んでいるようだ)。
ここからset_value() -> set_var() -> SetVar()
と流れて、RULE_PATH
の場合はPATH
のサフィックスによりAddVarToTable() -> VarDefine()
となってvar_table
へ追加されるのが確認できる。