管理者若能找到一個可以即時監控系統狀態和網路服務的自動化監控軟體,肯定能夠大幅減輕工作負擔並避免無謂疏失。為此,這裡將介紹開源碼社群中著名的服務監控解決方案Icinga2,協助管理者迅速完成即時監控及顯示網路服務狀態的工作。
對系統管理者而言,相信一套能夠即時監控系統或網路服務並顯示監控狀態的自動化監控軟體是不可或缺的工具。因此,本文將介紹開源碼社群中一套有名的服務監控解決方案Icinga2(官方網址為「https://github.com/Icinga」,來完成即時監控及顯示網路服務狀態的工作。
什麼是Icinga2
Icinga2是一套早從2009年即開始發展的開源碼主機及網路服務監控的軟體,除了核心監控程式外,更提供由PHP語言所撰寫網頁管理程式(icingaweb2)讓管理者能夠透過此管理介面即時地取得監控的服務狀態。在安裝Icinga2之前,先簡單說明在Icinga2上所運用的常見角色。
主機(Host)
可視為監視的主體,除了包括一般伺服器或電腦主機外,另外如路由器、Switch、Printer等網通設備,也同樣可視為主機的角色。
Icinga2針對主機及服務等對象定義了相關的狀態,在主機監控上定義了如表1所示的狀態。
服務(Service)
在此泛指為網路服務,例如網站或FTP等網路服務,通常一個主機可運作多個網路服務。而Icinga2可針對主機上的網路服務,設定個別的監控指令來監視服務的運作狀態。為了確認被監控服務的狀態,在服務監控上,定義了如表2所示的狀態。
指令(Command)
主要是用來監控主機或服務所使用的程式指令,例如監控網站服務的check_http等等。
Plugin
除了自行提供的核心監控程式外,Icinga2也提供Plugin的機制,支援第三方所開發的監控程式,只要符合相關規範的監控程式,即可被使用來增強相關的監控能力,本文中即會導入「https://www.monitoring-plugins.org/」所開發的監控程式(以下簡稱Plugin程式)。Icinga2並為相關的Plugin程式定義回傳值的意義,如表3所示。
監控期間(Time Period)
可設定監控主機或服務的時間區段,例如僅於朝9晚5進行監控。
除了上述傳統中的主機或服務等狀態外,Icinga2另外定義了較特別Soft State(軟狀態)和Hard State(硬狀態)。一般而言,在監控主機或服務時,通常會設定一個容忍值。
以監控主機為例,會以ping的方式來確認主機是否還活著,但考量到網路或主機運作繁忙等因素,通常不會設定單次主機未回覆即判定為主機停止服務,不然管理者可能會接到很多誤判的資訊。而比較合理的方式,即是設定一個容忍值,例如設定3次主機未回覆才判定為主機停止服務,若主機在3次測試以內未回覆,即將此狀態稱為軟狀態。
在此狀態中,Icinga並不會執行通知管理者或執行指令等相關動作。但是,一旦主機超過3次未回覆,便會進入硬狀態,正式判定主機停止服務並執行相關的預定指令。
安裝Icinga2
接下來安裝Icinga2,首先安裝icinga2核心程式。由於安裝icingaweb2要求icinga2須支援資料庫功能(在本文將使用MySQL),因此將另外安裝icinga2-ido-mysql。其中ido(Icinga Data Output)表示支援資料庫功能,表示可將icinga2相關的組態或輸出儲存於資料庫中,而icinga2-ido-mysql代表支援MySQL的資料庫功能。
由於icinga2並不是CentOS官方標準的收錄軟體,因此將另外建立相關的儲存庫(Reposity),執行如下指令(其中#為註解):
#安裝epel套件 dnf -y install https://dl.fedoraproject. org/pub/epel/epel-release-latest-8. noarch.rpm #匯入Icinga2所提供的公開金鑰(Public Key) rpm --import https://packages.icinga.com/ icinga.key
接著建立icinga2的儲存庫(其檔名為/etc/yum.repos.d/icinga2.repo),其設定內容如下:
[icinga2] name=Icinga 2 Repository baseurl=https://packages.icinga.com/ epel/8/release enabled=1
最後再執行下列指令,更新相關環境:
dnf makecache
接著,就透過如下的指令直接安裝icinga2及icinga2-ido-mysql:
yum install icinga2 #安裝icinga主程式 yum install icinga2-ido-mysql #安裝支援MySQL資料庫的icinga2模組 icinga2 feature enable ido-mysql #啟動icinga2的MySQL功能
常見組態檔說明
安裝完成icinga2等軟體後,將會產生一個名稱為「icinga2」的主程式及相關的組態檔資訊。
icinga2.conf是icinga2主要的組態檔,這個檔案並不會實際地設定組態細項,而是以包括(Include)的型式,引進其他的組態檔來進行設定。如下為常用的組態檔,分別加以說明:
constants.conf
此組態檔主要是定義相關icinga2使用到的重要組態設定值,例如以PluginDir組態設定Plugin程式的所在目錄。
features-enabled/*.conf
在此目錄下,主要是設定icinga2所啟用的特色(Features)功能的組態設定,在本文會啟用支援MySQL功能,因此須設定features-enabled/ido-mysql.conf中的相關組態。
conf.d/*.conf
此目錄主要設定所要監控的對象,例如主機、網路服務等資訊。常用的組態檔如下所示:
在此組態中,主要將一些通用的設定以樣式(Templates)的形式表示。以簡化使用者的設定,以下為通用檢測服務樣式的範例(其中#為註解符號):
template Service "generic-service" #名稱 { #表示最多進行5次的重新檢查,如果5次檢查 都未收到 #服務的正常回覆,即會判定服務停止服務 max_check_attempts = 5 #設定每次檢查均須間隔1分鐘 check_interval = 1m #當偵測結果有異常時,再重新檢查的時間間 隔為30秒 retry_interval = 30s
在此組態檔中,主要是設定時間的樣式,管理者可利用此樣式來設定欲監控的時間區間。以下範例為名稱「24x7」的全天候時間樣式設定:
object TimePeriod "24x7" { display_name = "Icinga 2 24x7 TimePeriod" ranges = { "monday" = "00:00-24:00" "tuesday" = "00:00-24:00" "wednesday" = "00:00-24:00" "thursday" = "00:00-24:00" "friday" = "00:00-24:00" "saturday" = "00:00-24:00" "sunday" = "00:00-24:00" } }
此組態檔主要是用來定義欲監控主機的相關資料及附屬於該主機上的服務等資料,如下為一設定監控主機及其所屬網站服務監控的設定:
object Host "myWeb" { #監控主機的名稱 address = "主機IP" #欲監控主機的IP位址資訊 check_command = "hostalive" #以hostalive 命令來監測myWeb的主機是否仍然存活 } object Service "http" { host_name = "myWeb" #表示屬於myWeb主機的 服務 import "generic-service" #使用generic- service樣式中的設定 check_command = "http" #使用HTTP命令來 監測網站服務是否還存活 vars.http_ssl = "0" #表示該服務不使用 SSL功能 }
設定欲監控服務的相關資料,如下範例即是以http監控指令監控虛擬主機(host.vars.http_vhosts),並使用generic-service樣式的組態:
apply Service for (http_vhost => config in host.vars.http_vhosts) { import "generic-service" check_command = "http" vars += config }
設定所需資料庫及表格
在簡單了解icinga2的組態設定後,接著繼續設定icinga2-ido-mysql所需要的資料庫及相關表格等資訊。
在此將建立一個名稱為「icinga2db」的資料庫及名稱為「icinga2user」的資料庫使用者,最後再依據「/usr/share/icinga2-ido-mysql/schema/mysql.sql」檔案中的內容,匯入相關的資料庫表格。在匯入完成後,即可繼續設定icinga2-ido-mysql的組態檔(檔名為「/etc/icinga2/features-available/ido-mysql.conf」),其設定內容如下:
object IdoMysqlConnection "ido-mysql" { user = "icinga2user" #資料庫使用者名稱 password = "密碼" #資料庫使用者密碼 host = "localhost" #資料庫主機所在位置 database = "icinga2db" #資料庫名稱 }
安裝plugin程式
至此已安裝完成icinga2,接下來即可繼續來安裝plugin程式,請至「https://www.monitoring-plugins.org/」取得最新的版本(本文使用2.3.1版本),在此會將plugin程式安裝至「/usr/lib64/nagios/plugins/libexec」,執行如下指令:
tar xvzf monitoring-plugins-2.3.1.tar.gz cd monitoring-plugins-2.3.1/ ./configure --prefix=/usr/lib64/nagios/ plugins/ #設定安裝目錄 make make install #安裝相關程式
在此所安裝的plugin檢查程式均為獨立的可執行檔,可直接應用來檢查相關的主機或服務狀態。在此簡單說明檢查主機狀態(check_ping)及網站伺服器狀態(check_http)的用法,如下所述:
check_ping
這是利用發送icmp訊息來監控待測主機是否還存活,常用的參數如下:
-H:設定欲監控的主機網域名稱或主機IP。
-p:設定欲監控主機的埠資訊(預設為22)。
-4:使用IPv4的方式進行測試。
-6:使用IPv6的方式進行測試。
-t:設定連接測試的逾時時間(Timeout),其單位為秒,預設為10秒,這表示若10秒內無法跟對方建立連線即判定對方無法連線。
-w:設定警告(Warn)的封包丟失率(丟包率,Packet Lose)的門檻值,其格式為[毫秒],[丟包門檻比率%],例如設定為100,20%,代表在100毫秒內如果丟包率超過20%就表示為警告情況。
-c:設定嚴重(Critical)情況的丟包率門檻值,其格式為[毫秒],[丟包門檻比率%],例如設定100,20%,如設定為100,20%,就是在100毫秒內如果丟包率超過20%即表示為嚴重情況,一般來說,在設定時,嚴重情況的丟包率門檻值須高於或等於警告情況的丟包率門檻值,可利用「check_ping -H 主機 -w 200,70% -c 200,70%」來檢查網站伺服器是否存活,相關回應(包含丟包率等資訊)如圖1所示。
如果check_ping回覆PING CRITICAL,表示待測主機的丟包率高於所設定的嚴重程度丟包率門檻,通常代表待測主機已無法連線。除此之外,如果回覆PING OK訊息,則表示待測主機目前處於正常存活的情況。
check_http
此程式被用來檢查網站伺服器的運作狀態,常用的參數如下:
-H:設定欲監控的網站網域名稱。
- I:設定欲監控的網站主機IP資訊。
-p:設定欲監控的通訊埠資訊(預設為80)。
-u:設定欲監控該網站的URL位址,預設為根目錄。
-w:設定警告狀態的封包丟包率。
-c:設定嚴重狀態的封包丟包率。
-t:設定連接測試的逾時時間,單位為秒,預設為10秒。
-P:以POST方法(Method)發出參數資訊來進行與網站伺服器的連線測試。
-r:以正規表示法設定比對樣式,並與網站伺服器回覆內容(Response Body)進行比對。若符合即表示正常連線,例如設定網站伺服器的首面回覆須符合index的字樣,方可確認網站伺服器正常地運作,如此的測試將會比單純地以通訊埠測試來的精準。同樣地,可利用「check_http -I 140.117.72.191 -w 200,50% -c 200,60%」來檢查網站伺服器的運作狀態,相關回覆訊息如圖2所示。
如果check_http回覆HTTP CRITICAL,表示待測網站伺服器的丟包率高於所設定的嚴重程度丟包率門檻,通常代表待測網站伺服器已停止服務,若回覆HTTP OK的訊息,則代表網站伺服器正常地服務中。
完成安裝檢查程式後,最後還須設定「/etc/icinga2/constants.conf」中的PluginDir組態值,使其對應到正確的目錄:
const PluginDir = "/usr/lib64/nagios/ plugins/libexec" conf:const ManubulonPluginDir = "/usr/ lib64/nagios/plugins/libexec"
啟動icinga2
至此,已安裝完成icinga2,接著以下列指令啟動:
systemctl start icinga2
在啟動後,可使用下列指令來確認執行狀態,如圖3所示:
systemctl status icinga2 #檢查執行狀態
安裝icingaweb2
接下來安裝icingaweb2,在本文中假設已安裝PHP(版本需PHP 7.3以上)和MySQL資料庫,並且使用Apache網站伺服器。可利用如下指令進行安裝:
dnf install icingaweb2 icingacli #安裝 相關軟體 #設定icingaweb2使用者權限加入網站伺服器 使用者群組,不然在使用時,可能會出現權限不 符的狀況 usermod -a -G icingaweb2 [網站伺服器的使用 者群組]
接著,利用「/etc/httpd/conf.d/icingaweb2.conf」來取得相關的組態設定,並將icingaweb2.conf內的相關設定加進Apache的組態檔(httpd.conf)或利用include方式將該檔案包含進來,並確認mod_rewrite模組已啟用,設定內容如下:
LoadModule rewrite_module modules/mod_ rewrite.so # include /etc/httpd/conf.d/icingaweb2. conf
完成網站伺服器的設定後,即可繼續建立所需要的資料庫。
在此建立資料庫名稱為「icingaweb2」及資料庫使用者名稱為「icingaweb2user」,並準備使用icingaweb2的線上設定功能進行後續的設定,在使用線上設定功能之前,首先要產生認證Token,可使用如下指令來產生一組認證的Token值:
icingacli setup token create
也可以利用下列的指令,來顯示認證Token值:
icingacli setup token show
透過網頁進行設定
接著,利用瀏覽器連線至「http://[SERVER-IP]/icingaweb2/setup」,並依照以下步驟進行後續的設定:
STEP 1 輸入認證Token的資訊,如圖4所示。
STEP 2 選擇所需要的模組。主要必選Monitoring模組,其餘的模組,可視使用者的需求而定,如圖5所示。
STEP 3 在此環境狀態檢查步驟中,將檢查環境是否有不符合需求的事項,通常是檢查PHP的版本以及是否有安裝相關的模組,如圖6所示。
STEP 4 選擇認證的方式,如圖7所示,這裡以資料庫(Database)方式認證。
STEP 5 設定儲存icingaweb2相關使用者與群組資料的資料庫資訊,如圖8所示。
STEP 6 如圖9所示,設定要icingaweb2登入使用的帳號與密碼資訊。
STEP 7 設定要記錄(Log)的層級,使用預設值即可,如圖10所示。
STEP 8 然後,便會顯示安裝成功的相關設定資訊,如圖11所示。
STEP 9 設定Monitoring Module中的IDO所使用的資料庫資訊,如圖12所示。
STEP 10 設定當監控主機或服務發現異常時所要執行的動作,如圖13所示,在此將執行icinga2.cmd指令。
STEP 11 設定欲使用的安全選項,如圖14所示,使用預設即可。
STEP 12 至此即已設定完成,並顯示相關的設定資料,如圖15所示。
STEP 13 如圖16所示,安裝完成後就會出現Web管理介面。
安裝完成進行測試
在安裝完成後,實際以監控HTTP網站伺服器為例進行測試。
先修改「/etc/icinga2/conf.d/hosts.conf」,加入欲監控的主機與服務設定:
object Host "myWeb" { address = "欲監控的主機IP" check_command = "hostalive" } object Service "http" { host_name = "myWeb" #表示附屬於myWeb主 機的服務 import "generic-service" check_command = "http" vars.http_ssl = "0" }
接著,可試著停止myWeb主機上的網站服務,如果一切設定正常,應可從管理介面上顯示如圖17所示的狀態,告知網站服務已停止。
進行至此,就大功告成了!
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>