搜尋此網誌

2012年3月29日 星期四

[工具介紹] 利用 rsyslog + mysql + loganalyzer 做好日誌管理 (下)

上一篇我談到有關日誌管理與 syslog 的一些特性,在這篇文章當中,我要介紹如何利用 rsyslog + mysql + loganalyzer 做出一個簡單的日誌管理系統。
在許多的 Linux 發行版本當中,預設的日誌記錄套件也叫做 syslog。 而這次我要介紹的 rsyslog 基本上就是強化版的 syslog 套件,支援自定的紀錄格式以及可以使用資料庫 (MySQL 與 PostgreSQL) 當做儲存的媒介。除此之外,rsyslog 也支援更為複雜的過濾條件,可以針對不同的日誌內容做出不同的行為。這次我使用的環境是 CentOS 6,已經改用 rsyslog 當做預設的日誌記錄套件,因此不需要另行安裝。對於使用其他發行版本的讀者,就請先自行安裝 rsyslog 這個套件了。
架構
測試架構
我將整個流程分成三個部分,第一個部分是設定 rsyslog 接受其他主機遞送過來的訊息,第二個部分是將這些訊息記錄到資料庫當中,最後則是安裝 loganalzyer 這個套件當做日誌的管理介面。環境的架構如圖中所示,設定完成後 ftp 主機 (192.168.1.2) 會將有關 ftp 的日誌透過 syslog 遞送到 logserver 這台主機 (192.168.1.1),並透過安裝於其上的 loganalyzer 加以查詢。

第一部分:使用 rsyslog 接受 ftp 主機 (192.168.1.2) 遞送過來的訊息

  1. 在 ftp 主機 (192.168.1.2) 進行下列動作:
    1. 修改 syslog 的設定擋 (/etc/syslog.conf),將 ftp 相關的訊息地送到 logserver 主機 (192.168.1.1) 
      # 
      # pure-ftpd 預設使用 facility ftp 
      # 
      ftp.*                                             @192.168.1.1
    2. 重新啟動 syslog 的服務,指令為
      service syslog restart
  2. 在 logserver 主機 (192.168.1.1) 進行下列動作:

    1. 修改 rsyslog 的設定檔 (/etc/rsyslog.conf),加入下列兩行 (或是取消註解)
      $ModLoad imudp.so 
      $UDPServerRun 51
    2. 在 rsyslog 的設定檔加入下列兩行規則
      :fromhost-ip, isequal, "192.168.1.2" -/var/log/pure-ftpd.log 
      & ~ 
      如果我們想要有關 ftp 的訊息只出現在 /var/log/pure-ftpd.log 這個日誌檔之中,需要將這兩行規則放在所有規則 (Rules) 的最前方,此外第二行 &~ 更是不可忽略。如果規則的位置擺放錯誤或是忘了加上 &~ 這行規則,相關的訊息將會同時記錄到其他的地方 (如 /var/log/message)。
    3. 重新啟動 rsyslog 的服務,指令為
      service rsyslog restart 
    4. 設定防火牆,讓日誌訊息 (UDP 514) 可以正常地遞送。
    5. 測試連結 ftp 主機,並查看 /var/log/pure-ftpd.log 是否出現相關訊息。
至此,我們已經完成初步的設定,讓 ftp 主機 (192.168.1.2) 可以正確無誤地遞送 syslog 訊息到 logserver 主機 (192.168.1.1)。

第二部分:設定 rsyslog 使用資料庫作為儲存的媒介

以下動作皆在 logserver 主機 (192.168.1.1) 進行。

  1. 安裝  rsyslog-mysql 套件,裡面包含 mysql 所需的 schema。指令為
    yum install rsyslog-mysql 
  2. 在 mysql 建立 syslog 專屬的帳號 (強烈建議不要與其他應用程式共用帳號,也不要使用預設的 root 帳號)
    mysql –uroot –p –h127.0.0.1 
    Enter password: 輸入root的密碼 
    mysql> create database syslogdb; 
    mysql> grant all on syslogdb.* to ‘syslog’@’127.0.0.1’ identified by ‘password’; 
    mysql > exit; 
    其中 password 請自行修改成你想要設定的密碼。
  3. 修改 schema 檔案,將下列兩行註解掉或是直接移除。我的檔案是在 /usr/share/doc/rsyslog-mysql-4.6.2/createDB.sql,請依據你的環境加以調整。
    CREATE DATABASE Syslog; 
    USE Syslog; 
  4. 根據 schema 檔案建立 mysql 資料表,指令為
    mysql –usyslog –p –h127.0.0.1 syslogdb </usr/share/doc/rsyslog-mysql-4.6.2/createDB.sql 
    Enter password: 輸入你設定的密碼 
  5. 修改 rsyslog 的設定檔,加上下列設定以啟用 mysql 的支援。
    $ModLoad ommysql 
  6. 修改 rsyslog 的設定檔,將我們在第一部分所設定的規則由
    :fromhost-ip, isequal, "192.168.1.2" -/var/log/pure-ftpd.log 
    & ~ 
    改為
    :fromhost-ip, isequal, "192.168.1.2" :ommysql:127.0.0.1, syslogdb, syslog, password
    & ~ 
    password 同樣請改成你所設定的密碼。
  7. 重新啟動 rsyslog 服務,指令為
    service rsyslog restart 
  8. 測試連結 ftp 主機 (192.168.1.2) ,並查看資料表 syslogdb.SystemEvents 是否出現相關訊息。
至此,我們已經成功地將有關 ftp 的日誌記錄到 mysql 資料庫當中。現在就剩下最後一個步驟了,Go!

第三部分:設定 loganalyzer

loganalyzer 是一個以 php 開發的 web 應用程式,可以用來查看與分析 syslog 的資料。

  1. 在 logserver 主機 (192.168.1.1) 進行下列動作

    1. 這裡下載 loganalyzer 的壓縮檔,我下載的是 v3.5.1 (v3-beta)。指令為
      wget http://download.adiscon.com/loganalyzer/loganalyzer-3.5.1.tar.gz
      解開壓縮檔,指令為 
    2. tar xvfz loganalyzer-3.5.1.tar.gz 
    3. 將程式目錄搬移到 Apache 的目錄下,指令為
      mv loganalyzer-3.5.1/src /var/www/html/loganalyzer-3.5.1 
    4. 建立連結,指令為
      ln –s /var/www/html/loganalyzer-3.5.1 /var/www/html/loganalyzer 
    5. 將檔案的擁有者改為 Apache 的帳號,指令為
      chown apache.apache –R /var/www/html/loganalyzer-3.5.1 

  2. 找任何一台擁有瀏覽器的電腦,連結 http://192.168.1.1/loganalyzer 並進行設定。

    1. 點選 “here” 開始安裝。
      001
    2. 按下“Next”。
    3. 檢查檔案的權限設定,正確無誤後同樣按下”Next”。002
    4. 將 loganalyzer 使用者的帳號與密碼存放在資料庫中以供驗證。除了資料庫之外,也可以選擇使用 ldap 的驗證方式。
      Database Host => 127.0.0.1
      Database Port => 3306
      Database Name => syslogdb
      Table prefix => logcon_
      Database User => syslog
      Database Password => 輸入你設定的密碼
      Require user to be logged in => Yes
      Authentication method => Internal authentication

      輸入完畢後按下”Next”。003
    5. 資料庫設定檢查無誤後,按下”Next”後開始建立資料表。004
    6. 建立資料表完畢,按下”Next”開始新增管理者帳號。005
    7. 輸入管理者的名稱與密碼,請務必牢記。輸入完畢後按下”Next”。006
    8. 帳號建立完畢,開始設定日誌資訊的來源與格式。除了從資料庫中讀取資料,loganalyzer 也可以直接存取檔案形式的日誌。
      Name of the Source => Pure-ftpd
      Source Type => MYSQL Native
      Select View => EventLog Fields
      Table type => MonitorWave
      Database Host => 127.0.0.1
      Database Name => syslogdb
      Database Tablename =>SystemEvents
      Database User => syslog
      Database Password => 輸入你設定的密碼
      Enable Row Counting => Yes 

      設定完畢後按下”Next”。007
    9. 按下”Finish”結束設定。008
    10. 輸入之前建立的管理者帳號與密碼,輸入完畢後按下”Anmelden”登入 loganalyzer。009
    11. 此時可以看到我們之前測試時所記錄的相關訊息。
      010
    12. 恭喜你,你已經建立了一個簡單卻完整的日誌管理系統。

不管對IT或是IS而言,日誌管理都是一個很重要的課題。秉持著有備無患的態度,才不會在日後發生”日誌用時方恨少”的憾事。

2012年3月28日 星期三

[工具介紹] 利用 rsyslog + mysql + loganalyzer 做好日誌管理 (上)

Questions and Answers signpost在上一篇的文章中,我提到 FIM 的建置可能是為了遵守法規的要求,而今天要分享的日誌管理 (Log Management, LM),更是許多法規中不可或缺的規範。尤其是在這一兩年嗆到不行新版個資法當中,日誌管理更是佔了相當重要的地位。

舉凡硬體設備、作業系統到應用系統,運行過程當中總會產生許許多多的紀錄,而這些記錄不管目的為何,都可以統稱為日誌 (Log)。而日誌管理大致上可以分為日誌的產生與收集、日誌的保護與日誌的應用幾個項目,其中日誌的應用是最為弔詭也可能是最為困難的一個項目。弔詭之處在於如果是為了遵守法規而建置日誌管理的機制,那麼就可能失去了真正應用的價值。而困難的地方在於,如何從眾多收集而來的日誌當中找出有用的資訊,甚至發現隱藏在當中的(可能)問題。這部份的技術門檻相當高,通常是智慧型分析工具或者是 SIEM 的強項,光靠人工或是一般日誌管理工具 (尤其是免費的工具) 就顯得較為無力了。

前面提到日誌有許多不同的來源,而這些來源可能因為需要記錄不同的內容而有不同的格式,這些不同的格式造成了日誌管理的第一個難題。在眾多的格式中,syslog 算是相當重要也普遍受到支援的一種格式,原因在於 syslog 的格式相當簡單。因為我要介紹的工具就是以 syslog 當做日誌的格式,所以在介紹工具之前我先花點時間說明一下有關 syslog 的注意事項。

首先我們看一下在 Linux 下實際 syslog 日誌的內容為何 (取自 /var/log/message):

Mar 28 04:16:21 www fail2ban.filter : INFO   Log rotation detected for /var/log/secure
Mar 28 04:18:33 www snmpd[1980]: Connection from UDP: [192.168.0.99]:32770

從例子中我們可以發現,即使是同屬 Linux 下的 syslog 訊息,也會有很大的差異。除了日期 (Mar 28 04:16:21) 與主機名稱 (www) 之外,後面的格式就開始出現不同之處了。第一行顯示了應用程式的名稱 (fail2ban.filter),但是第二行除了應用程式的名稱 (snmpd) 之外還多了一組數字,而這組數字通常是代表程序的ID (Process ID, PID)。在此之後就是 syslog 訊息的主體 (message),也就是一串任意組合的字串 (例如例子中的 INFO Log rotation detected for /var/log/secure)。這個幾乎沒有任何規範要求的字串,就是 syslog 簡單之所在,卻也是 syslog 應用上困難之所在。因為沒有規範,所以很難利用自動化的程式加以處理,尤其是面對多種不同來源的 syslog 時,問題將更加嚴重。除了日誌檔中可以看到的資訊,syslog 其實還定義了兩個很重要的屬性,那就是 facility 與 severity。簡單來說,facility 可以看成是分類,而 severity 則是表示訊息的重要程度。因為這兩個屬性的定義較為明確,也很容易判斷,所以很適合用來當做自動化判斷的依據。以早期 syslog 套件而言,都是利用這兩個屬性來決定相關訊息應該如何加以處理 (例如記錄到哪個日誌檔中)。嚴格來說,syslog 還定義了其他結構化的欄位用以表示其他資訊,但是因為並非強制性,所以很多實作就沒有提供相關的資訊了。而且這些結構化的資訊,還是不足以滿足所有系統的需求,所以造成了過多無結構化的資訊存放在訊息主體的現象。總的來說,syslog 解決了日誌格式混亂的問題,但是卻只解決了一部分。儘管如此,至少這是目前應用上較切合實際的方法。

syslog 除了支援本機的日誌,也支援透過網路來遞送日誌的內容。但是透過網路遞送日誌時有兩個問題需要特別注意,那就是 syslog 缺少對日誌來源的驗證,以及以明文方式傳送資訊。尤其是當使用預設的 UDP 方式傳送訊息時,這兩個問題將導致有心人士可以很容易地產生假冒或是竄改過的日誌內容。對此,IETF 另外訂定了簽章式的 syslog (RFC-5848 Signed Syslog Messages),以防範這類問題的產生,有興趣的朋友還請自行參閱。

講了這麼多,先休息一下,有關工具的操作就留待下篇吧。

2012年3月26日 星期一

[工具介紹] Linux 下的檔案完整性偵測工具 - afick

check_file-300x227俗話說,再密的鴨蛋也會有縫。同樣的,再厲害的駭客,也會在被侵入的系統中留下一定的”痕跡”。這些痕跡可能是有意的 (例如植入後門程式),也有可能是無意的 (例如被系統日誌所記錄)。而這些痕跡可能存在於檔案、機碼、各種形式的設定值、記憶體、甚至是低階的磁區中。在這些可能存在的地方中,檔案(或者說檔案系統,File System)算是最容易被利用的一種方式。檔案完整性監測 (File Integrity Monitoring, FIM) 主要就是用來找出這類的問題,而 FIM 基本上屬於偵測性的安全工具,也就是事後追查問題用的。也許是因為這樣,所以這類工具較不受到重視,通常是為了遵守法規的要求而建置,而建置後也可能只是閒置在一旁。不過以多層次防禦的觀念來看,FIM 不但有其必要性,甚至是不可或缺的安全機制。
概略來看,FIM 可以分成兩種運作模式,一種是即時監控,另外一種則是定期掃描。即時監控,顧名思義可以提供最即時的偵測能力,只要檔案一有變動,FIM 可以馬上得知並做出反應 (例如產生警示或是將有問題的檔案回復至”安全”的狀態)。但是即時監控通常需要作業系統或是檔案系統的支援,而且可能礙於作業系統/檔案系統的限制而無法同時監測”大量”的檔案。此外即時監控對於系統的效能,或多或少都會有一些不良的影響。相較於即時監控,定期掃描就簡單多了,不但不需要作業系統/檔案系統的額外支援能力,而且理論上也可以監測系統內所有的檔案。對於一個比較完整的 FIM 而言,可以同時提供即時監控與定期掃描。定期掃描可以用來執行較複雜的檢查,或者是作為即時監測漏失時的補救之方。除了監測檔案之外,這類工具通常也可以用來監測目錄,用以檢測目錄中是否有未經授權而新增/刪除的檔案。
FIM 所監測的屬性,至少包含檔案/目錄的日期 (建立日期、修改日期、讀取日期)、大小、內容 (雜湊值)、擁有者、權限等。其中針對檔案的內容,比較好的 FIM 還會區分出一般文字檔 (例如設定檔) 與二進位檔,對於一般文字檔的變動,可以明白的指出其差異處在哪,以供管理者做出正確的判斷。
FIM 通常會將檔案/目錄的基準值存放在一個(或多個)資料庫檔案中,而這個檔案正是整個機制是否有效的主要關鍵。一旦這個檔案可以讓人任意修改,整個 FIM 將形同廢物一般。一般的建議是將這個檔案寫入一次性的儲存設備,或者是存放在唯讀的磁區中。我的作法是將這個檔案傳到別的系統中,然後再利用程式自動加以比對。當然,這個額外的系統一定是需要特別的”關照”。
早期在 Linux 下,要達到 FIM 主要使用 Tripwire 這個工具。Tripwire 近幾年已經從單純的 FIM 變成了一系列的產品,功能相當強大,唯一的問題是 Tripwire 不再免費提供使用。所以,今天我要介紹另外一套工具 – afick (Another File Integrity ChecKer),採用 GNU GPLv2 的授權方式。afick 的安裝與設定都相當簡單,相關步驟如下:
  1. 從 rpmforge 安裝 afick 的 rpm 檔案。你可以選擇自行下載,也可以將 rpmforge 這個 repository 加入系統後使用套件管理工具 (如 yum) 加以安裝。
  2. afick 的設定檔是 /etc/afick.conf,你可以根據實際的狀況將需要監測的檔案加入設定檔之中,或是將不需要監測的檔案加以排除。
  3. 設定完畢後,執行 afick –i 以建立相關檔案的基準值。
  4. 我們可以透過 afick –k 來啟動掃描的動作,或是在必要時使用 afick –u 來更新基準值。
  5. rpm 安裝時會自動安裝每日的排程 (/etc/cron.daily/afick),但是預設卻是每天更新基準值,而這通常並非我們想要的行為。我們有兩個選擇,一個是直接停用自動安裝的排程,另外一個選擇則是修改排程的腳本 (/etc/cron.daily/afick),將
    # launch command
    nice -n $NICE $AFICK -c $CONFFILE -u >$LOGFILE 2>$ERRORLOG
    改為
    # launch command
    nice -n $NICE $AFICK -c $CONFFILE -k >$LOGFILE 2>$ERRORLOG
  6. afick 的基準值相關檔案存放在 /var/lib/afick 目錄下 (此目錄的位置可透過設定檔加以設定),請妥善加以保護。除了基準值之外,設定檔同樣需要妥善的保護。
afick 是一套相當簡單易用的 FIM 工具,可以透過設定檔指定需要監測或是不需要監測的檔案/目錄。不過 afick 對於一般文字檔並沒有辦法明白地指出變異的地方,因此增加了判斷的困難,算是其美中不足之處。afick 除了命令列模式外,也提供 gui 與 webmin 的管理方式。此外,afick 也開始提供即時監控的套件 (需另行安裝),不過因為還在早期開發階段,所以我在此就先不介紹了。

About