zoukankan      html  css  js  c++  java
  • iptables介绍

    監控惡意行為並呼叫防火牆阻斷來源 自建開源碼網路攻擊阻擋系統

    老薯條
    從系統日誌檔的例行檢視中可以發現許多攻擊行為如最常見的SSH暴力攻擊,其實以Linux上的開放原始碼方案即可建立一套即時偵測阻擋惡意攻擊的監控系統,本文示範了如何運用SSHGuard監控SSH等網路服務的日誌檔,偵測出可疑的攻擊行為並即時呼叫netfilter/iptables防火牆阻擋惡意來源,同時以Logfmon將惡意來源主機資訊記錄在MySQL資料庫供日後稽核追查之用。
    相信一個有經驗的網管人員,在每天例行檢視系統日誌檔時,必然會發現其中有很多關於攻擊的日誌資訊(最常見的應為SSH暴力攻擊),此時如果有一個系統能夠即時偵測相關的攻擊事件,並即時呼叫防火牆來阻擋該惡意攻擊來源位址,事後還能利用資料庫來記錄該筆惡意攻擊來源位址以供稽核,相信對於網管人員會有相當大的助益。 

    因此,本解決方案將利用開源碼社群中的SSHGuard軟體搭配netfilter/iptables及Logfmon來實作一個可即時監測與阻擋惡意來源,並將惡意來源主機資訊記錄在資料庫的監控系統。該監控系統所需要的套件如下表所示。
     




    實作系統架構說明 

    本解決方案將利用SSHGuard、Logfmon和netfilter等相關軟體架構出一套監控系統,可即時偵測惡意攻擊行為,並能將相關的資訊寫入日誌檔及資料庫,然後呼叫防火牆軟體來阻擋惡意來源,相關架構圖如下:
     




    相關流程說明為,當SSHGuard啟動後,就會即時地監控系統的日誌檔如「/var/log/secure」。當SSHGuard軟體發現相關的攻擊樣式時,便會將相關攻擊資訊寫入日誌檔,而後呼叫防火牆軟體來阻擋惡意的來源,本解決方案將採用Linux系統下最有名的防火牆軟體netfilter/iptables。 

    當SSHGuard記錄相關的攻擊資訊到日誌檔時,利用另外一個開源碼程式Logfmon來即時監控SSHGuard軟體所寫入的日誌檔,並從中解析出相關的攻擊資訊,再將相關的攻擊資訊寫入遠端主機資料庫。在完成相關的記錄後,再利用防火牆軟體來阻擋該惡意來源。接著,說明本系統所使用的各相關套件。
     

    簡述SSHGuard 

    SSHGuard是一種監控軟體,使用即時監控相關的日誌檔方式,一旦發現有相關的攻擊樣式出現,即可利用相關防火牆軟體來阻擋並記錄相關的事件。根據SSHGuard官方網站的說明,目前SSHGuard支援日誌檔格式包括Syslog、syslog-ng、Metalog、multilog、RAW Message。 

    此外,SSHGuard也支援相當多種類的防火牆,如IBM AIX Firewall、PF、netfilter/iptables、IPFW、IP Filter。本解決方案中將使用其中的netfilter/iptables防火牆軟體。 

    接著安裝SSHGuard。先至SSHGuard的官方網站下載最新版本的軟體。至截稿為止,筆者所取得的最新版本為1.5版。下載後將其解壓縮,然後依序下達下列指令:
     




    安裝完成後,即會產生一個名稱為sshguard的主程式,SSHGuard常用的參數說明如下表所示: 



    在完成編譯安裝後,讀者可利用下列指令啟動SSHGuard(為了測試方便,這裡設定只要SSH登入兩次錯誤,即封鎖該惡意來源): 



    啟動SSHGuard程式後,可利用SSH登入至該台主機上,並故意輸入錯誤密碼兩次,即可從「/var/log/messages」日誌檔發現如下圖的記錄: 



    圖中的訊息表示,SSHGuard軟體已經正常運作,但因為尚未正常地設定防火牆軟體來阻擋該惡意攻擊來源位址,所以出現「Blocking command failed」等錯誤訊息(因為SSHGuard軟體無法正常呼叫iptables)。 

    雖然本套軟體名稱為SSHGuard,但事實上它除了可偵測SSH的惡意行為外,也可偵測Sendmail、Dovecot等網路服務的攻擊行為,詳細的資訊可參考網址「http://www.sshguard.net/docs/reference/attack-signatures/」的說明。接下來,說明netfilter/iptables防火牆的架構。
     

    何謂netfilter/iptables防火牆 

    自從Kernel 2.4版本出現netfilter以來,發展至今,netfilter挾著其優異的功能,已成為Linux系統防火牆的代名詞。 

    netfilter採用規則表格(Table)與規則鏈(Chain)的方式來制定過濾規則,架構如下圖所示。
     




    相關的規則表格包括Filter Table、Mangle Table、Nat Table,說明如下: 

    ‧Filter Table 
    過濾規則表格,主要的防火牆過濾規則大多設定在此規則表格中。包含input、output、forward等規則鏈;可利用封包的通訊協定,來源目的IP與埠等資訊來進行過濾;可利用封包MAC資訊進行過濾;並可限制最大封包流量(如每分鐘最多能通過多少的封包流量),以避免拒絕服務(Denial Of Service)攻擊。 

    ‧Mangle Table 
    修改規則表格,主要可用來修改來往封包的內容。包含prerouting及output等規則鏈;可修改封包的TTL MARK TOS等資訊;通常用來辦別網路服務的種類。 

    ‧Nat Table 
    NAT規則表格,主要用來實作SNAT、DNAT等功能,包含prerouting、output、postrouting等規則鏈;支援SNAT DNAT等功能。 

    了解netfilter的規則表格後,以下說明netfilter過濾網路封包的流程,如下圖所示,其中各規則鏈的說明如下:
     




    ‧PREROUTING 
    觸發時機為當封包剛流進網卡時,此規則鏈負責封包的前置處理。若判別封包目的位址為本機(若為本機,即將封包傳遞至input規則鏈處理)或需要轉發(將封包傳遞至FORWARD規則鏈處理),一般封包目的IP資訊的轉換(DNAT,亦即虛擬伺服器功能)會在這個規則鏈中完成。 

    ‧INPUT 
    當封包進入本機時,即由input規則鏈進行後續的處理。 

    ‧FORWARD 
    如果進入封包的目的位址不是本機,即將封包傳遞至FORWARD規則鏈進行後續處理。 

    ‧OUTPUT 
    當封包從本機端發出時,即觸發此規則鏈。 

    ‧POSTROUTING 當封包要送出前,即交由POSTROUTING規則鏈進行後續的處理,一般熟知的SNAT功能的處理,例如利用一個公共IP,可以提供給多個內部主機來使用(利用更改來源位址轉換來完成),就是在此規則鏈中完成。
     

    簡介iptables 

    iptables是netfilter的管理程式,使用者可利用此程式來設定防火牆規則,以下簡略說明iptables的語法結構,語法結構如下:
     




    ‧[- t table]:用來指定要設定那個規則表格的規則。若未指定,即預設為filter規則表格。 

    ‧command:命令,通常後面會接規則鏈名稱。常用命令包括-A(在指定的規則鏈之後新增一個規則)、-D(在指定的規則鏈之後刪除一個規則)、-F(清除規則鏈中的規則,如「iptables -F」即清除NAT規則表格內所有規則鏈的規則)、-L(顯示規則鏈內的所有規則)以及-I(在規則鏈插入規則)。 

    ‧[match]:比對條件。常用的比對條件包括: 
    -d:指定套用規則的目的主機或IP位址。 
    -i :指定套用規則的網路介面名稱,如eth0。 
    -p:提供比對通訊協定功能,主要比對TCP、UDP及ICMP三種通訊協定的封包,以下舉例說明:
     


    (當TCP封包的目的埠為22至110的範圍時即接受該封包,其中M:N指的是連續的埠) 

    (不允許ICMP封包探測,例如將進入本機的ICMP封包過濾掉。使用此過濾條件,別台主機即無法以ping指令來探測自己主機的存活狀態) 

    -m:主要提供MAC資訊比對(即是一般常說的鎖MAC),如下例:
     


    (允許MAC資訊為XX:XX:XX的封包通過,在IP分享器或無線網路分享器均會有相關的選項,建議設定此選項,以MAC資訊過濾會比用IP資訊過濾安全許多) 

    (限制每秒僅允許10個封包通過,以避免遭受洪水封包的攻擊,其中的時間單位可利用「/minute(每分鐘)/hour(每小時)/day(每天)」來設定) 

    (允許目的埠為220或110的封包通過,這與上述m:n的格式不同,m:n意謂從m至n的連續埠,而multiport可個別表示不連續埠) 

    ‧[-j]:目標(表示如符合條件時須執行的動作),常用動作選項如下: 
    ACCEPT:符合條件的封包允許通過。 
    DROP:將符合條件的封包丟棄。 
    RETURN:直接離開目前規則,直接跳到下個規則比對。 
    QUEUE:將封包重導到本機的佇列(Queue)中,通常用來供其他應用程式處理。 
    MASQUERADE:將封包來源的IP位址改為防火牆傳送封包的網路介面的IP位址,此選項在撥接連線上特別有用,因為在撥接連線後,每次所得到的IP均不同,因此無法使用靜態的方式指定來源IP,此時即可用此選項來動態指定來源IP。 
    LOG:在核心記錄檔中,記錄封包連線相關記錄。可利用dmesg指令查看相關記錄。 
    ULOG:將相關的封包連線資訊透過ulogd程式儲存至資料庫上。 

    在說明netfilter/iptables系統後,即繼續設定netfilter以供SSHGuard軟體使用。先下達下列指令:
     




    在設定完成後,可重新啟動SSHGuard程式: 

    (此設定為監控「/var/log/secure」檔案,並設定只要符合錯誤樣式兩次,即將該惡意來源封鎖30秒) 

    此時,可利用SSH登入,故意登入錯誤兩次,即會發現惡意攻擊來源位址已被記錄到「/var/log/messages」日誌檔中,且已呼叫netfilter封鎖該惡意攻擊來源位址,而封鎖時間為30秒。 

    實作至此,已經可以利用SSHGuard程式來偵測惡意攻擊來源,並記錄在日誌檔中,另一方面也會即時地呼叫netfilter來進行封鎖。接下來,繼續利用Logfmon監控「/var/log/messages」日誌檔。並將SSHGuard寫入的資訊儲存至MySQL資料庫。
     

    安裝使用Logfmon 

    Logfmon是一種即時監控Linux系統檔案變動情況的程式,在Windows系統上也有相關類似軟體,最有名的是FileMon。Logfmon軟體主要利用正規表示法(Regular Expression,RE)來設定規則樣式,當所監控的檔案內容發生變動時,就與此規則樣式進行比對。 

    如果比對成功,亦即檔案變動的內容樣式符合使用者自行定義的樣式規則,便執行使用者自行定義的指令或程式。Logfmon運作流程如下圖所示:
     




    由於Logfmon軟體是利用正規表示法來設定比對的條件式,以下簡單介紹一下正規表示法。本方案僅需使用模式比對即可達成要求,所以這裡只介紹模式比對,其餘更進階的用法就留待讀者自行研究。 

    正規表示法是利用一些含有特殊符號的字串,來描述或匹配(match)符合某種句型的句子。如下表說明正規表示法所使用的特殊符號及模式比對。




    接著開始安裝Logfmon程式,先連結至網址「http://sourceforge.net/projects/logfmon/」取得最新版本(筆者使用的版本為1.1版)。解壓縮後,可直接使用make指令編譯。 

    在編譯的過程中,可能會發生找不到y.tab.h的錯誤訊息而無法編譯成功。可先利用「make y.tab.c y.tab.h」指令產生y.tab.h,再重新使用「make && make install」指令來編譯Logfmon,並將Logfmon安裝到系統上。 

    完裝完成之後,接著設定相關的設定檔「/etc/logfmon.conf」。logfmon.conf參數意義如下表所示。
     




    由於SSHGuard在偵測到惡意攻擊行為時,所記錄的格式如下圖所示: 



    因此針對此格式可定義如下的正規表式法樣式: 



    只要列資料中含有Blocking 樣式字串,就符合比對條件,其中$3表示惡意來源的IP資訊。在確定正規表式法規則樣式後,接下來即是當觸發相關規則時,所要執行的自定義指令。 

    在本解決方案中,希望當SSHGuard偵測到惡意的來源IP時,能夠即時地將相關的資訊寫入到遠端的資料庫主機中,所以將自行撰寫一個寫入資料庫的簡單程式,而此程式將以C語言來撰寫。 

    首先,建立下列的資料庫表格,在此不多談相關的資料庫SQL語法,請讀者參閱相關的資料。假設資料庫名稱為sshguard,以下列SQL語法建立表格:
     




    MySQL官方網站上有提供C語言的API,以供開發者利用C語言來存取MySQL資料庫,以下僅說明會使用到的API。可至網頁「http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html」取得更為詳盡的資訊。一般在連接資料庫的時候,必須執行下列幾個步驟: 

    1. 初始化MySQL(利用mysql_init API) 
    2. 連接資料庫(利用mysql_real_connect API) 
    3. 執行sql指令(利用mysql_query API) 
    4. 關閉MySQL(mysql_close) 

    以下為程式原始碼(檔名為sqlinsert.c),使用方式為「sqlinsert“sql執行碼”」,即可將相關sql指令傳遞到遠端資料庫主機執行,原始碼如下:
     




    編譯方式很簡單,下達以下的指令即可完成。其中,mysqlclient為MySQL的程式庫,須先確認系統上是否有libmysqlclient.so檔案,若確認一切無誤,即可進行編譯。 



    在成功編譯後,就會產生sqlinsert的執行檔。可利用「sqlinsert "insert into guard set happentime=now(), sip='0.0.0.0'"」指令來確認是否可正常執行SQL指令。 

    在完成程式後,繼續設定Logfmon設定檔「/etc/logfmon.conf」,設定內容如下:
     




    結語 

    設定完成後,執行Logfmon即可監控「/var/log/messages」日誌檔,一旦發現該日誌檔內容中含有Blocking樣式的字串(被SSHGuard軟體偵測到),就會將該惡意來源資訊儲存至遠端的資料庫中。至此,一個具有即時監測惡意攻擊、能即時呼叫防火牆阻擋該惡意來源攻擊來源,並以資料庫記錄該惡意來源攻擊來源的監控系統,就宣告完成了。
  • 相关阅读:
    一道题
    Codeforces679C. Bear and Square Grid
    CF671C. Ultimate Weirdness of an Array
    CF899F. Letters Removing
    BZOJ5089: 最大连续子段和
    BZOJ2388: 旅行规划
    Vue用v-for实现结构、数据、样式分离(示例2)
    java-JSON的生成与解析
    Vue用v-for实现结构、数据、样式分离(示例1)
    08.记录操作CURD(增删改查)
  • 原文地址:https://www.cnblogs.com/jjkv3/p/3190980.html
Copyright © 2011-2022 走看看