.. _lua-output:
Lua输出¶
Suricata提供了通过可插拔的lua脚本获取特定类型网络流量更详细输出的功能。您可以自行编写这些脚本,只需定义四个钩子函数即可。
对于lua输出脚本,Suricata提供了丰富的lua函数集。这些函数都能返回关于引擎内部特定细节和网络流量各方面的信息。下文将按事件/流量类型分组进行描述。但让我们先从一个示例开始,解释四个钩子函数以及如何让Suricata加载lua输出脚本。
脚本结构¶
一个lua输出脚本需要定义4个钩子函数:init()、setup()、log()、deinit()
init() -- 注册脚本挂载到输出引擎的位置
setup() -- 执行每个输出线程的初始化设置
log() -- 日志记录函数
deinit() -- 清理函数
示例:
local config = require("suricata.config")
local logger = require("suricata.log")
function init (args)
local needs = {}
needs["protocol"] = "http"
return needs
end
function setup (args)
filename = config.log_path() .. "/" .. name
file = assert(io.open(filename, "a"))
logger.info("HTTP日志文件名 " .. filename)
http = 0
end
function log(args)
http_uri = HttpGetRequestUriRaw()
if http_uri == nil then
http_uri = "<unknown>"
end
http_uri = string.gsub(http_uri, "%c", ".")
http_host = HttpGetRequestHost()
if http_host == nil then
http_host = "<hostname unknown>"
end
http_host = string.gsub(http_host, "%c", ".")
http_ua = HttpGetRequestHeader("User-Agent")
if http_ua == nil then
http_ua = "<useragent unknown>"
end
http_ua = string.gsub(http_ua, "%g", ".")
timestring = SCPacketTimeString()
ip_version, src_ip, dst_ip, protocol, src_port, dst_port = SCFlowTuple()
file:write (timestring .. " " .. http_host .. " [**] " .. http_uri .. " [**] " ..
http_ua .. " [**] " .. src_ip .. ":" .. src_port .. " -> " ..
dst_ip .. ":" .. dst_port .. "\n")
file:flush()
http = http + 1
end
function deinit (args)
logger.info ("记录的HTTP事务数: " .. http);
file:close(file)
end
YAML配置¶
要启用lua输出,需添加'lua'输出模块并配置一个或多个脚本如下:
outputs:
- lua:
enabled: yes
scripts-dir: /etc/suricata/lua-output/
# 默认情况下Lua模块搜索路径为空。如果计划使用外部模块,
# 则需要设置这些路径。以下示例适用于64位Linux系统中
# 通过包管理器安装的模块查找,但可能需要调整。
#path: "/usr/share/lua/5.4/?.lua;/usr/share/lua/5.4/?/init.lua;/usr/lib64/lua/5.4/?.lua;/usr/lib64/lua/5.4/?/init.lua;./?.lua;./?/init.lua"
#cpath: "/usr/lib64/lua/5.4/?.so;/usr/lib64/lua/5.4/loadall.so;./?.so"
scripts:
- tcp-data.lua
- flow.lua
scripts-dir选项是可选的。它指定Suricata从该目录加载脚本。若不设置则从当前工作目录加载。
开发lua输出脚本¶
您可以使用 Lua函数 中描述的函数进行开发