現行的防火牆每天都會將日誌發送到 FortiAnalyzer 進行網路事件分析,不過 FortiAnalyzer 能存放的日誌天數有限。根據資通安全署指引表示,資通系統日誌應保留六個月以上,確保有足夠的跡證來進行事件根因分析。
通常我們希望日誌至少保留一年以上,才能滿足完整的年度稽核抽查,今天就來教大家如何使用 Grafana Loki 收集與分析 FortiGate 防火牆日誌。
Promtail Agent
Promtail 為 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 的相關資訊
記得重啟 promtail 服務
sudo service promtail restart
確定 Syslog Receiver 服務的 1514 埠號是否正常啟動
sudo netstat -ano | grep 1514
tcp6 0 0 :::1514 :::* LISTEN off (0.00/0/0)
Promtail 的安裝介紹可以參考之前的文章,這邊就不再說明了。
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 的介紹可以參考之前的文章,這邊就不再說明了。
接下來就是依照自己的需求來繪製儀錶板了
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
今天的分享就到這邊,感謝收看。
參考文件