搜尋此網誌

2012年7月17日 星期二

[工具介紹] 利用 Splunk 收集與分析 fail2ban 的相關數據 (下)


logo_splunk_black_mini
上一篇文章中,我分享了如何利用 Splunk 來收集本機的 fail2ban 相關訊息。我想除非是很特殊的環境,不然絕對不會只有一台提供服務的主機。如果我們有多台需要管理的主機,在每台主機上安裝 Splunk 並分別管理聽起來絕不是一件會令人感到愉快的事情。好在 Splunk 支援許多彈性的佈署方式,而我們今天要介紹的是其中最單純的一種方式,一個 Indexer 加上一個(或多個) Forwarder。
Indexer,就是我們在前一篇文章中所安裝的系統。它會分析收集進來的資料,並透過 Splunk Web 提供使用者操作。Indexer 除了可以收集本機檔案內的資料外,也可以透過其他方式收集遠端的資料。像是我們之前介紹過的 syslog,也是 Splunk 所支援的一種收集方式。除了 syslog 之外,Splunk 還支援自己原生的網路協定,用以收集更多樣化的資訊。為了讓 Indexer 能夠接收到使用原生網路協定遞送的資料,就必須有對應的程式從遠端丟資料到 Indexer,而這個遠端的程式就稱之為 Forwarder。Forwarder 的資料可能來自於本機上的檔案 (或其他本機資源,如機碼),也可能來自於其他的 Forwarder,形成一個資料傳遞的多點路徑。更甚者,Forwarder 也可以將資料丟往多個 Indexer,達到分散處理的效果。
在今天的分享中,我們將會完成下列目標:
  • 安裝一個 Forwarder,並將資訊傳到之前已經安裝完畢的 Indexer。
  • 利用設定檔指定 Forwarder 收集 fail2ban 的訊息。
  • 透過查詢條件過濾非封鎖的相關訊息。
  • 利用查詢時間的限制,即時顯示被封鎖的 IP。
  • 完成儀表板。
在開始今天的步驟前,請先完成上一篇文章中 Indexer 的安裝。除了之前的設定之外,我們還必須進行額外的設定以便讓 Indexer 接受來自 Forwarder 的資料:
  1. 點選 "管理員" –> "資料" –> "轉送與接收"。
    1001
  2. 點選 "新增"。
    1002
  3. 在 "在此連接埠上監聽" 填入你希望 Splunk 使用的 TCP 埠號,我在此使用的是 9997。輸入完成後點選 "儲存"。
    1003
  4. 確認接收程式正確執行
    在 shell 下執行下列指令
    netstat -nlp|grep splunkd
    應該看到下列資訊
    tcp        0      0 0.0.0.0:9997                0.0.0.0:*                   LISTEN      4565/splunkd 
    tcp        0      0 0.0.0.0:8089                0.0.0.0:*                   LISTEN      4565/splunkd 
    tcp        0      0 0.0.0.0:514                 0.0.0.0:*                   LISTEN      4565/splunkd 
    udp        0      0 0.0.0.0:514                 0.0.0.0:*                               4565/splunkd
    其中 9997 是我們剛剛設定使用的 TCP Port。

  5. 設定防火牆。
    為了讓 Forwarder 可以傳送資料到 Indexer,我們必須解除網路的存取限制。以我們的例子而言,就是要讓 Forwarder 可以連接到 Indexer 的 TCP Port 9997。
Indexer 的設定到此告一段落,接下來就輪到 Forwarder 了。Forwarder 需要與 Indexer 安裝在不同的機器上,所以我們需要準備另外一台機器 (我選擇安裝了 CentOS 6.2  的機器),並進行下列設定:
  1. 安裝 fail2ban,並將訊息的輸出方式設定為 /var/log/fail2ban.log。
    這部份可以參考上一篇文章中有關 Indexer 的 fail2ban 安裝說明。

  2. 下載 Splunk Forwarder 安裝程式。
    Splunk Forwarder 安裝程式與 Splunk 不同,必須另外下載。同樣有不同的格式可供下載,請選擇適合你的格式。下載網址是
    http://www.splunk.com/download/universalforwarder/

  3. 安裝 RPM 套件。
    指令是
    rpm –ivh splunkforwarder-4.3.3-128297-linux-2.6-x86_64.rpm
    請把 splunkforwarder-4.3.3-128297-linux-2.6-x86_64.rpm 替換成你實際下載的檔案名稱。預設安裝路徑為 /opt/splunkforwarder。

  4. 修改資料輸入來源的設定檔,檔案名稱是 /opt/splunkforwarder/etc/system/local/inputs.conf。
    加上下列設定
    [monitor:///var/log/fail2ban.log] 
    disabled = false 
    followTail = 0 
    sourcetype = fail2ban 

  5. 修改資料輸出的設定檔,檔案名稱是  /opt/splunkforwarder/etc/system/local/outputs.conf 。
    加上下列設定
    [tcpout] 
    defaultGroup=default_group 
    
    [tcpout:default_group] 
    compressed=false 
    server=192.168.0.100:9997
    其中 192.168.0.100 請改為 Indexer 的 IP 位址。

  6. 啟動 Splunk Forwarder 程式。
    指令為
    /opt/splunkforwarder/bin/splunk start
    第一次執行時請選擇接受授權。

  7. 確認 Forwarder 與 Indexer 已經正確地連接。
    我們可以查看 Splunk Forwarder 的日誌檔,檔案位置是 /opt/splunkforwarder/var/log/splunkd.log。
    如果看到類似下列的訊息,表示 Forwarder 已經正確地連接上 Indexer。
    07-12-2012 13:22:25.816 +0800 INFO  TailingProcessor - Parsing configuration stanza: batch://$SPLUNK_HOME/var/spool/splunk/...stash_new. 
    07-12-2012 13:22:25.816 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/etc/splunk.version. 
    07-12-2012 13:22:25.816 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/var/log/splunk. 
    07-12-2012 13:22:25.816 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/var/log/splunk/splunkd.log. 
    07-12-2012 13:22:25.817 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor:///var/log/fail2ban.log. 
    07-12-2012 13:22:25.817 +0800 INFO  BatchReader - State transitioning from 2 to 0 (initOrResume). 
    07-12-2012 13:22:25.818 +0800 INFO  WatchedFile - Will begin reading at offset=806 for file='/var/log/fail2ban.log'. 
    07-12-2012 13:22:25.831 +0800 INFO  TcpOutputProc - Connected to idx=192.168.0.100:9997
    但是如果看到類似下列訊息,則表示連接失敗。通常比較有可能的原因是防火牆的設定錯誤,請仔細檢查後修改相關設定。
    07-12-2012 13:03:14.453 +0800 INFO  TailingProcessor - Parsing configuration stanza: batch://$SPLUNK_HOME/var/spool/splunk/...stash_new. 
    07-12-2012 13:03:14.453 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/etc/splunk.version. 
    07-12-2012 13:03:14.453 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/var/log/splunk. 
    07-12-2012 13:03:14.453 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor://$SPLUNK_HOME/var/log/splunk/splunkd.log. 
    07-12-2012 13:03:14.453 +0800 INFO  TailingProcessor - Parsing configuration stanza: monitor:///var/log/fail2ban.log. 
    07-12-2012 13:03:14.453 +0800 INFO  BatchReader - State transitioning from 2 to 0 (initOrResume). 
    07-12-2012 13:03:14.467 +0800 INFO  TcpOutputProc - Connected to idx=192.168.0.100:9997 
    07-12-2012 13:03:14.467 +0800 INFO  TcpOutputProc - Connection to 192.168.0.100:9997 closed. Connection closed by server. 
    07-12-2012 13:03:14.541 +0800 INFO  TcpOutputProc - Connected to idx=192.168.0.100:9997 
    07-12-2012 13:03:14.541 +0800 INFO  TcpOutputProc - Connected to idx=192.168.0.100:9997 
    07-12-2012 13:03:14.543 +0800 WARN  TcpOutputProc - Write to 192.168.0.100:9997 failed. Write failed. Broken pipe 
    07-12-2012 13:03:14.543 +0800 WARN  TcpOutputProc - Applying quarantine to idx=192.168.0.100:9997 numberOfFailures=2 
    07-12-2012 13:03:44.375 +0800 INFO  TcpOutputProc - Removing quarantine from idx=192.168.0.100:9997

  8. 尋找另外一台機器,並嘗試錯誤登入 Forwarder 一直到被 fail2ban 封鎖為止。
    請勿從 Indexer 嘗試登入錯誤,否則 Indexer 的 IP 會被封鎖掉,資料也就送不過去了。

Forwarder 至此已經設定完畢,我們回到安裝於 Indexer 的 Splunk Web 上進行後續的操作。例如當我們下了 sourcetype="fail2ban" 的查詢條件後,應該就可以看到剛剛 fail2ban 封鎖的相關訊息了。在實務的應用上,我們可以在所有需要管理的主機上安裝 Forwarder,並將這些 Forwarder 的資訊通通丟向 Indexer。除非你有大量的數據需要分析,否則一個 Indexer 就可以滿足需求了。

fail2ban 的日誌內容除了封鎖的訊息之外,還包含了解除封鎖以及運作時的狀態訊息。後面這些資料並不是我們目前感到興趣的,我們可以利用查詢條件過濾掉這些不感興趣的資訊:
sourcetype="fail2ban" Ban | rex field=_raw "Ban (?<client_ip>.*)" | rename client_ip as ClientIP
透過這些條件,我們可以過濾出封鎖的訊息,並取出被封鎖 IP 的資訊 (client_ip)。

除了取出被封鎖的 IP,我們還可以進一步針對個別 IP 被封鎖的次數做個排名:
sourcetype="fail2ban" Ban | rex field=_raw "Ban (?<client_ip>.*)" | stats count BY client_ip | sort -count | rename client_ip AS '遠端IP', count AS '數量'

如果我們要列出封鎖次數的趨勢,也可以透過下列查詢指令:
sourcetype="fail2ban" Ban | timechart count | rename count AS '數量'

不管我們輸入的條件為何,我們都可以透過查詢欄位後方的時間選擇器來指定我們想要查詢的時間區段。除了可以用來指定過去某段時間之外,更可以用來指定 "即時" 的時間區段 (例如 "即時1分鐘間隔")。透過這樣的指定,Splunk 將會隨時更新符合條件的資訊,並立即顯示於查詢結果當中。

透過這些查詢條件的應用,我們可以產生極具使用價值的 fail2ban 儀表板 (儀表板的設定並不複雜,但是步驟較多,所以我在此就先略過了)。在第一個範例中,包含了總共發生封鎖的次數、封鎖事件趨勢圖、主機觸發封鎖次數的排行榜、以及被封鎖 IP 的排行榜等資訊。
1004

在第二個儀表板的範例中,列出的資訊類型與第一個儀表板大同小異,只是把資料的時間限定於當日之內,並把排行榜用其他方式(如長條圖與圓餅圖)的方式加以呈現。只要透過簡單的設定,Splunk 就可以將查詢到的資料就不同的方式加以呈現,在製作儀表板時確實相當的方便。在第二個儀表板範例中,最值得注意的是我們加入了兩個 "即時" 資訊,一個是 "即時" 封鎖的資訊,一個是 "即時" 的日誌記錄。透過這個儀表板,我們就可以隨時掌握環境中有關 fail2ban 的最新狀況,不再發生對環境毫無掌握的窘境。
2006

透過 Splunk 的儀表板,我們不但可以即時掌握最新的攻擊狀態,還可以了解過去的趨勢。這些數據對於建置一個完整且主動的防禦機制,都將是不可或缺的寶貴資訊。

About