4.1 系統實作成果
4.1.2 自動事件偵測與組態管理
因功能或應用軟體的限制,一般的企業 IT 服務皆非全然為單一作業 系統環境,故事件偵測程式必須能夠處理各種系統平台,而一般常用 的伺服器作業系統為 IBM AIX、HP-UX、Linux 與 Windows 等。本研 究自動事件偵測與組態管理之運作流程如圖 19 所示。
圖 19 自動事件偵測與組態管理流程 資料來源:本研究
如圖 19,自動事件偵測步驟為:
1. 透過事件偵測程式,依排程定期偵測事件。
2. 偵測到異常事件後,將事件訊息傳送到事件關聯伺服器,儲 存至事件訊息檔案。
而組態管理運作步驟為:
1. 透過組態管理程式,依排程定期收集組態資料,並存放至組
態管理資料庫中。
ChkCpuUsage.pl 偵測伺服器 CPU 使用狀況是否有超過設定標 準值。
ChkDiskQuota.pl 偵測伺服器 DISK 使用是否在安全的臨界值。
ChkFileCount.pl 偵測目錄中的檔案總數,是否超過設定臨界 值。
ChkOracleAPLog.pl 檢查 Oracle ERP AP 的 errorlog 內容,取得有
“error”的訊息資訊。
ChkOracleDBLog.pl 檢查 Oracle database 的 alertlog 內容,取得有
“ORA-” 錯誤訊息的資訊。
ChkOsEvent.pl 檢查 Windows 伺服器的 eventlog 內容,取得類 型為“錯誤”的訊息資訊。
ChkOsMessages.pl 檢查 UNIX 伺服器的 messages log 內容,取得
“Crit、Warning”的訊息。
ChkPingServer.pl 利用 ping 伺服器方式,偵測伺服器回應狀態。
ChkProcess.pl 偵測各種重要的 Process 是否存在於 UNIX 系 統中,如 Oracle 資料庫的 ora_smon process。
ChkService.pl 偵測 Windows 伺服器中的重要的服務狀態是 否正常,如 MSSQL 資料庫的服務狀態必須為
“啟動”狀態。
ChkMssqlLog.pl 檢查 MSSQL database 的 errorlog 內容,取得“錯 誤”或“error”訊息內容資訊。
ChkWebStatus.pl 偵測網頁的資料回應內容,確認 Web-based 系
程式名稱 程式功能說明
CmChangeAudit.pl 比對各新、舊組態資料內容,若有異動則記錄 至組態異動資料表中,並保存組態異動資訊內
CmOracleDB.pl 取得 Oracle 資料庫的組態資料,如資料庫參數 與設定值。
CmUnixOS.pl 取得 UNIX 伺服器上,包含 CPU、記憶體、磁 碟、作業系統版本與 Kernel 參數設定值等等組 態資料。
CmService.pl 取得 Windows 伺服器上的所有服務資料與其 設定值,如啟動模式與登入帳號等等。
CmWindowsOS.pl 取得 Windows 伺服器上,包含 CPU、記憶體、
磁碟、作業系統版本等組態資料。
$avg_cpu_usage 乃取得平均的 CPU 使用率,若超過設定上線便執行 寫出訊息的副程式,第二十一行至第三十一行副程式是將事件訊息,
傳遞到事件伺服器的網路埠(Port)20097,由事件伺服器接收處理。本 研究建構了 EventStoreListener.pl 程式在事件伺服器上,用來接收所 有程式所傳遞的事件訊息,EventStoreListener.pl 使用網路埠(Port) 20097 來接收資料,再將收到的事件訊息資料存至檔案,由事件關聯 進行後續的事件關聯處理。
表 9 ChkCpuUsage.pl 程式內容
use Win32::OLE qw(in with);
my $host= $ARGV[0];
my $threshold= $ARGV[1];
$WMI = Win32::OLE->new('WbemScripting.SWbemLocator');
$Services = $WMI->ConnectServer($host);
$processor_set = $Services->InstancesOf("Win32_Processor");
$proc_count=0;
$total_proc_perf=0;
foreach $proc (in($processor_set)) {
$proc_perf = $proc->{'LoadPercentage'};
$proc_count =$proc_count+1;
$total_proc_perf=$total_proc_perf+$proc_perf;
}
$avg_cpu_usage=int($total_proc_perf/$proc_count);
if ($avg_cpu_usage > $threshold) {
&write_msg();
}
sub write_msg { use IO::Socket::INET;
my $MySocket=new IO::Socket::INET->new(PeerPort=>20097, Proto=> 'udp',PeerAddr=>'192.168.2.222');
my $passstr;
my ($sec,$min,$hour,$day,$mon,$year,$wday) = localtime;
$year +=1900;
$mon +=1;
my $logmoddate="$year/$mon/$day $hour:$min:$sec";
$passstr="$logmoddate|$host|OS|CPU|OVER THRESHOLD
$threshold\% ,CURRENT USAGE IS $avg_cpu_usage\%";
$MySocket->send($passstr);
}
資料來源:本研究
組態收集程式會定期執行收集組態設定資訊,以收集 MSSQL 資 料庫參數與設定值的 CmMssql.pl 程式為例,詳細內容如表 10 所示,
其中第一行為欲收集組態資料的資料庫伺服器 IP,第二行為管理者名
稱,第四行到第六行是用 ADODB 建立與本研究中 MySQL 組態資料 庫的連線,第七行到第九行是建立欲收集組態資料的 MSSQL 資料庫 連線,第十六行到二十一行是執行 MSSQL 上的 sp_configure 預存程 序,取得 MSSQL 整體資料庫於伺服器上的組態設定值,第二十二到 第三十一行是將執行 sp_configure 所取得組態資料,交給 insert_data 副程式進行將資料存入 MySQL 組態資料庫動作,第三十二行到第三 十七行是透過 MSSQL 的系統表 sysdatabases,取得在此資料庫伺服 器的所有資料庫清單,第三十八到第五十八行是將所取得的資料庫清 單,依序執行 sp_dboption 預存程序獲取各資料庫有啟動的資料庫組 態設定值,第六十行到第七十二行是 insert_data 副程式內容,用來將 取得的組態資料存入組態資料庫。
my $admin= $ARGV[1];
use Win32::OLE;
my $connCMDBstr="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.2.222; PORT=3306;DATABASE=sec;
USER=root; PASSWORD=; OPTION=3;";
my $connCMDB = Win32::OLE-> new('ADODB.connection');
$connCMDB-> Open($connCMDBstr);
my $connstr="driver={SQL Server};server=$host;AutoTranslate=
No;Trusted_connection=yes;Network=dbnmpntw;Database=master
;";
my $conn = Win32::OLE-> new('ADODB.connection');
$conn-> Open($connstr);
my $err = Win32::OLE::LastError();
if (not $err eq "0") {
print"FATAL: no connection, OLE error : $err\n";
exit;
}
my $server_cfg = "sp_configure";
if(! ($rsserver = $conn->Execute($server_cfg)))
18
print Win32::OLE->LastError();
exit;
}
while (! $rsserver->EOF) {
$object_type="DATABASE";
$object_category="SQLSERVERDB";
$object_name="SYSTEM_CONFIG";
$configure_name= $rsserver->Fields('name')->value;
$configure_value= $rsserver->Fields('run_value')->value;
&insert_data($object_type,$object_category,$object_name,$co nfigure_name,$configure_value);
$rsserver->MoveNext;
}
my $serverlist="select * from sysdatabases";
if(! ($rsdblist = $conn->Execute($serverlist))) {
print Win32::OLE->LastError();
exit;
}
while (! $rsdblist->EOF) {
my $dbname=$rsdblist->Fields('name')->value;
my $dboption="sp_dboption $dbname";
if(! ($rsdboption = $conn->Execute($dboption))) {
print Win32::OLE->LastError();
exit;
}
while (! $rsdboption->EOF) {
$object_type="DATABASE";
$object_category="SQLSERVERDB";
$object_name=$dbname;
$configure_name= $rsdboption->Fields(0)->value;
$configure_value="ON";
&insert_data($object_type,$object_category,$object_name,$config ure_name,$configure_value);
$rsdboption->MoveNext;
}
$rsdblist->MoveNext;
59
sub insert_data {
my $object_type=shift;
my $object_category=shift;
my $object_name=shift;
my $configure_name=shift;
my $configure_value=shift;
my $insertstr="insert into new_mo_config(host_ip,administrator, object_type,object_category,object_name,config_name,config_valu e) values('" . $host . "','" . $admin . "','" . $object_type . "','" .
$object_category . "','" . $object_name . "','" . $configure_name .
"','" . $configure_value . "')";
if(! $connCMDB->Execute($insertstr)) {
print Win32::OLE->LastError();
exit;