现行的防火墙每天都会将日誌发送到 FortiAnalyzer 进行网路事件分析,不过 FortiAnalyzer 能存放的日誌天数有限。根据资通安全署指引表示,资通系统日誌应保留六个月以上,确保有足够的迹证来进行事件根因分析。
通常我们希望日誌至少保留一年以上,才能满足完整的年度稽核抽查,今天就来教大家如何使用 Grafana Loki 收集与分析 FortiGate 防火墙日誌。
Promtail AgentPromtail 为 Grafana Loki 专门打造的日誌抓取程式,通常部署到需要监视的应用程式伺服器,负责将本地日誌的内容传送到 Grafana Loki 实例。
Promtail 除了能够抓取本地的日誌之外,也可以化身一变成为 Syslog Receiver,支援 从 TCP 或 UDP 所发送的 IETF Syslog (RFC5424) 日誌格式。
sudo nano /etc/promtail/promtail-local-config.yaml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://your_grafana_loki_ip:3100/loki/api/v1/push
scrape_configs:
- job_name: syslog
syslog:
listen_address: 0.0.0.0:1514
listen_protocol: tcp
idle_timeout: 60s
label_structured_data: yes
labels:
job: "syslog"
relabel_configs:
- source_labels: [\'__syslog_message_hostname\']
target_label: \'host\'
主要填写 scrape_configs 的相关资讯
- listen_address:唯一必填的栏位,需要提供一个有效的网路位址。
- listen_protocol:预设为 TCP 协定。可改成 UDP,但就不支援 TLS。
- idle_timeout:用于清理闲置的 syslog 连线
- label_structured_data:将标头中的结构化资料转换为内部标籤。例如,将来自 syslog 日誌的 __syslog_message_hostname 栏位透过 relabel_configs 被转换为名为 host 的标籤。
记得重启 promtail 服务
sudo service promtail restart
确定 Syslog Receiver 服务的 1514 埠号是否正常启动
sudo netstat -ano | grep 1514
tcp6 0 0 :::1514 :::* LISTEN off (0.00/0/0)
Promtail 的安装介绍可以参考之前的文章,这边就不再说明了。
- 如何在 Ubuntu 22.04 安装 Promtail Agent 收集日誌
- 如何将 Windows 安装 Promtail Agent 收集日誌
FortiGate Firewall接着就是到 FortiGate 将日誌传送给 Promtail,在记录设置的远端日誌和存档,可以启用传送日誌到 Syslog。
由于图形介面下只能设定 Syslog 的 IP 地址 / FQDN,预设使用 UDP 与 514 埠号进行日誌传送。
预设使用 Syslog 日誌格式
因此,我们需要透过 CLI 的方式进行设定。
config log syslogd setting
set status enable
set server "your_promtail_ip"
set mode reliable
set format rfc5424
set port 1514
end
Grafana Dashboard我们就可以到 Grafana Dashboard 的 Explore,透过 LogQL 来查询 Loki 的日誌了。
接收到的 RFC5424 日誌格式如下
eventtime=1732693258947845175 tz=”+0800" logid=”0001000014" type=”traffic” subtype=”local” level=”notice” vd=”root” srcip=xxxx::xxxx:xxxx:xxxx:xxxx srcport=5353 srcintf=”FortiSwitch” srcintfrole=”lan” dstip=xxxx::xx dstport=5353 dstintf=”root” dstintfrole=”undefined” sessionid=56970439 proto=17 action=”deny” policyid=0 policytype=”local-in-policy6" service=”udp/5353" trandisp=”noop” app=”udp/5353" duration=0 sentbyte=0 rcvdbyte=0 sentpkt=0 rcvdpkt=0 appcat=”unscanned” srchwvendor=”Sharp” osname=”Linux” mastersrcmac=”xx:xx:xx:xx:xx:xx” srcmac=”xx:xx:xx:xx:xx:xx” srcserver=0
透过 logfmt 解析器,我们可以很轻鬆地将日誌行的资料提取到标籤中。
{host="your_fortigate_hostname"} | logfmt
就是那么厉害,不需用到任何的 Regex Parser。
LogQL 的介绍可以参考之前的文章,这边就不再说明了。
- Loki LogQL Query Examples 简介
接下来就是依照自己的需求来绘制仪表板了
Syslog Forwarder由于 Promtail 只支援 RFC5424 日誌格式,建议在 Promtail 前面部署专用的 Syslog 转发器,例如 syslog-ng 或者 rsyslog,透过转发器我们就可以接收处理现有的各种日誌格式和传输。
透过下列指令安装 syslog-ng
sudo apt install syslog-ng
编辑组态设定
sudo nano /etc/syslog-ng/syslog-ng.conf
来源端使用 UDP 协定与 514 埠号进行日誌接收
########################
# Sources
########################
# This is the default behavior of sysklogd package
# Logs may come from unix stream, but not from another machine.
#
source s_src {
system();
internal();
};
# If you wish to get logs from remote machine you should uncomment
# this and comment the above source line.
#
source s_net { udp(ip(0.0.0.0) port(514)); };
目的端使用 TCP 协定与 1514 埠号进行日誌转发
########################
# Destinations
########################
# First some standard logfile
#
destination d_loki { syslog("your_promtail_ip" transport("tcp") port(1514)); };
透过 Log Paths 将来源与目的端串起来
########################
# Log paths
########################
log { source(s_net); destination(d_loki); };
重启 syslog-ng 服务
sudo service syslog-ng restart
确定 syslog-ng 服务的 514 埠号是否正常启动
sudo netstat -ano | grep 514
udp 0 0 0 0.0.0.0:514 0.0.0.0:* off (0.00/0/0)
再将 FortiGate 的日誌传送给 syslog-ng 即可
config log syslogd setting
set status enable
set server "your_syslog-ng_ip"
set mode udp
set port 514
end
今天的分享就到这边,感谢收看。
参考文件