這裡將把Log資料儲存至遠端資料庫上並利用MySQL中Trigger的機制,在無須撰寫任何程式碼的前提下,完成一項可直接從資料庫層面自動回報Log紀錄中異常情況的功能。
rsyslog伺服器介紹
rsyslog早從2004年即開始進行開發,目的在於開發一個更強大的syslog伺服器來取代掉傳統的syslog伺服器,時至今日,大部分的Linux系統均已內建rsyslog來取代傳統的syslog伺服器。rsyslog伺服器是一個模組化的架構,它區分為三個模組(Module),如圖2所示。
|
▲圖2 rsyslog伺服器的三大模組。 |
其中,INPUT模組是指定資料來源,例如可指定syslog的資料來源為檔案或從Socket而來,而PARSE(解析)模組提供針對所接收到的syslog資訊再設定過濾條件以取得更精確的資訊,最後的OUTPUT模組則是指定要將最後的syslog資訊儲存到那裡(如資料庫或檔案或其他)。
在本文中將不管PARSE模組,而僅將所收到的主機紀錄(Log)傳遞至資料庫中,常用的模組說明如表4所示。
表4 常用模組功能介紹
在說明rsyslog的基本組態後,接下來說明如何編譯rsyslog。由於預設的rsyslog伺服器並未安裝支援MySQL資料庫的選項,所以這裡要重新以原始碼編譯。
在下載原始碼並解壓縮後,執行如下的指令(如下#為註解):
安裝成功後,在「<原始碼目錄>/plugins/ommysql」下的createDB.sql檔案內有記錄需建立的資料庫表格名稱。利用檔案內容來建立相關的資料庫表格。建立完成後,接著說明rsyslog伺服器組態檔(/etc/rsyslog.conf)的設定說明,如表5所示。
表5 rsyslog伺服器組態檔設定說明
接下來,設定rsyslog.conf來為rsyslog伺服器加上MySQL功能,基本上,只要在rsyslog所提供的預設組態檔內加入下列設定即可,如圖3所示:
|
▲圖3 在預設組態檔內加入新設定。 |
本例是將所有產生的Log紀錄置入本機內MySQL資料庫上名稱為syslog的資料庫,在設定完成後,利用「/usr/local/rsyslog/sbin/rsyslogd -f /etc/rsyslog.conf」來啟動rsyslog伺服器,如果一切正常,此時syslog的紀錄資訊應該會即時地匯入資料庫中。
Trigger簡介
觸發(Trigger)是MySQL提供的一種事件驅動的機制,它可在資料庫事件(例如新增或修改等動作)執行某些動作(最常見的是檢查資料庫資訊的正確性)。
在實務上,經常會有資料庫檢查的要求(如本文所要求的,當有登入事件發生時,就發出電子郵件通知管理者)。為解決此類問題,一般都會使用自行撰寫的程式,以輪詢(Pooling)的方式定時地對資料庫做檢查的動作,但如此的做法常會造成一些時間的落差(依輪詢所設定的檢查密度而定,如5分鐘檢查一次)。
另一種做法是可考慮在資料庫層面上解決,一旦資料庫發生相關的異動,就利用MySQL觸發機制來觸發,執行相關的指令或程式,本文就是採用此種解決方案。
利用觸發的方式,當資料庫接收到主機傳來的Log資訊時即觸發外部程式來執行相關動作。在本文中,希望達到的功能是,當資料庫接收到有登入事件時,就以電子郵件(E-mail)的方式通知管理者。接著,就來說明MySQL的觸發機制。
在MySQL 5.0.2版本之後,就支援觸發器的功能。觸發器是一種註冊在資料庫表格上的程式。當新增(Insert)資料、修改(Update)資料或刪除(Delete)資料等資料庫事件發生時,就可依相對應的觸發條件來處理,例如在新增資料後或新增資料前發生時觸發相關程式。所以,通常被應用在當資料新增或修改時來驗證資料的正確性,或者做相關的資料計算,以下說明觸發器的用法。