摘 要: 針對傳統(tǒng)的單一設(shè)備和人工管理方式不能應(yīng)對日益復(fù)雜的網(wǎng)絡(luò)威脅和挑戰(zhàn),不能及時發(fā)現(xiàn)和準(zhǔn)確定位網(wǎng)絡(luò)安全事件,也不能對安全事件可能造成的后果進(jìn)行準(zhǔn)確評估的問題,本文主要討論如何基于標(biāo)準(zhǔn)Syslog協(xié)議,通過對網(wǎng)絡(luò)設(shè)備大量網(wǎng)絡(luò)日志數(shù)據(jù)的集中采集,通過SQL代理處理后進(jìn)行分析,構(gòu)造一套日志系統(tǒng),以達(dá)到對網(wǎng)絡(luò)運(yùn)行狀況進(jìn)行檢測的目的。
關(guān)鍵詞: Syslog;日志系統(tǒng); SQL代理; 網(wǎng)絡(luò)安全
日志一直都是網(wǎng)絡(luò)管理人員在檢查故障、排除網(wǎng)絡(luò)錯誤時, 查找“病源”的有利原始資料。通過對網(wǎng)絡(luò)設(shè)備和主機(jī)系統(tǒng)的日志分析, 可以快速了解網(wǎng)絡(luò)上的活動, 并對剛剛發(fā)生的或者正在進(jìn)行的事件進(jìn)行快速響應(yīng)。隨著網(wǎng)絡(luò)規(guī)模的不斷擴(kuò)大和網(wǎng)絡(luò)應(yīng)用的不斷增多,網(wǎng)絡(luò)中也越來越多地面臨各種安全威脅的困擾,傳統(tǒng)的依靠單一設(shè)備或者人工管理的方式已不能應(yīng)對日益復(fù)雜的網(wǎng)絡(luò)威脅的挑戰(zhàn),不能及時發(fā)現(xiàn)和準(zhǔn)確定位網(wǎng)絡(luò)安全事件,也不能對安全事件可能造成的后果進(jìn)行準(zhǔn)確評估。
1 Syslog協(xié)議簡述
Syslog是一種工業(yè)標(biāo)準(zhǔn)協(xié)議,可用來記錄設(shè)備的日志。在Unix系統(tǒng)的路由器、交換機(jī)等網(wǎng)絡(luò)設(shè)備中,Syslog記錄系統(tǒng)中的任何事件,管理者可以通過查看系統(tǒng)記錄,隨時掌握系統(tǒng)狀況。除了可以把日志信息保存在日志文件中之外,Syslog協(xié)議還允許設(shè)備把日志信息通過網(wǎng)絡(luò)傳遞給日志服務(wù)器[1]。
2 日志采集和存儲
現(xiàn)在大多數(shù)Syslog日志系統(tǒng)均采用Linux服務(wù)器,針對某企業(yè)的設(shè)備情況,這里建設(shè)一套Windows下的日志系統(tǒng)[2],本文采用Kiwisyslog日志采集軟件來收集需要的系統(tǒng)日志,Kiwisyslog遵循標(biāo)準(zhǔn)的日志協(xié)議(RFC 3164),并支持UDP/TCP/SNMP幾種方式的日志輸入,且它自帶發(fā)送模擬器﹑日志瀏覽器等實用工具。
對于Kiwisyslog收集到的日志,選擇實時存入數(shù)據(jù)庫syslogd,日志格式如圖1所示。
由于本企業(yè)上網(wǎng)用戶超過3 000人,每天日志量非常龐大。在這個日志內(nèi)容中,主要對Message字段進(jìn)行分析,但是此字段內(nèi)容較多且復(fù)雜,后期的日志統(tǒng)計分析非常困難,這里采用對syslogd數(shù)據(jù)庫進(jìn)行每天作業(yè)處理,將Message字段按照規(guī)律進(jìn)行字段劃分, Message_A字段是日志類型,Message_B字段是訪問時間,Message_C字段是源地址和目的地址,Message_D和Message_E字段是流入和流出流量,結(jié)果如圖2所示。
具體操作如下:
打開SQL企業(yè)管理器,進(jìn)入服務(wù)器名下的“管理”,啟動SQL Server代理。然后查看服務(wù)器屬性,選中“自動啟動SQL Server代理”。
接下來進(jìn)入SQL Server代理下的“作業(yè)”,在右邊點(diǎn)右鍵選“新建作業(yè)”。
在“常規(guī)”里,輸入一個作業(yè)名“syslogd每日處理”,分類選最后一項“數(shù)據(jù)庫維護(hù)”。
在“步驟”里,點(diǎn)“新建步驟”,隨便輸入一個步驟名如“每日備份”,數(shù)據(jù)庫選syslogd,命令里輸入需要處理的SQL語句,之后分析一下,沒有問題再繼續(xù)添加下一個。在“高級”里將“失敗時的操作”改成“轉(zhuǎn)到下一步”。
在“調(diào)度”里,點(diǎn)“新建調(diào)度”,隨便輸入一個調(diào)度名,點(diǎn)“更改”,“發(fā)生頻率”選每天,“一次發(fā)生于”里設(shè)置00:00:01,然后點(diǎn)“確定”,再點(diǎn)“確定”,配置完成。詳細(xì)SQL語句如下[3]:
(1) 日志備份
--獲取昨日日期形成日期字符串
declare @tbName varchar(100),@sql varchar(2000),@date datetime
select @tbName = convert(varchar(10),getdate()-1,112)
--修改表syslogd表名為日期字符串名字
EXEC sp_rename 'syslogd',@tbName
--刪除三個月前的表
select @date=dateadd(month,-3,getdate())
declare cur cursor for select name from sysobjects where crdate<@date and xtype='U'
open cur
fetch next from cur into @tbName
while @@fetch_status=0
begin
select @sql='drop table '+@tbName
exec(@sql)
fetch next from cur into @tbName
end
close cur
deallocate cur
--生成新的syslogd數(shù)據(jù)表并創(chuàng)建索引
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[syslogd]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[syslogd]
GO
CREATE TABLE [dbo].[syslogd] (
[MsgDate] [varchar] (10) COLLATE Chinese_PRC_
CI_AS NOT NULL,
[MsgTime] [varchar] (8) COLLATE Chinese_PRC_
CI_AS NOT NULL ,
[MsgPriority] [varchar] (50) COLLATE Chinese_PRC_
CI_AS NULL ,
[MsgHostname][varchar] (255) COLLATE Chinese_
PRC_CI_AS NULL,
[MsgText] [varchar] (900) COLLATE Chinese_PRC_
CI_AS NOT NULL
) ON [PRIMARY]
GO
CREATE INDEX [IX_syslogd] ON [dbo].[syslogd]([Msg-
Text]) ON [PRIMARY]
GO
(2) 劃分字段
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_GetStr]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_GetStr]
GO
--分段截取函數(shù)
CREATE FUNCTION dbo.f_GetStr(
@s varchar(8000), --包含多個數(shù)據(jù)項的字符串
@pos int, --要獲取的數(shù)據(jù)項的位置
@split varchar(10) --數(shù)據(jù)分隔符
)RETURNS varchar(100)
AS
BEGIN
IF @s IS NULL RETURN(NULL)
DECLARE @splitlen int
SELECT @splitlen=LEN(@split+'a')-2
WHILE @pos>1 AND CHARINDEX(@split,@s+@split)>0
SELECT @pos=@pos-1,
@s=STUFF(@s,1,CHARINDEX(@split,@s+@split)+@splitlen,'')
RETURN(ISNULL(LEFT(@s,CHARINDEX(@split,@s+@split)-1),''))
END
GO
--獲取昨日日期形成日期字符串
declare @tbName varchar(100),@sql varchar(2000),@date datetime
select @tbName = convert(varchar(10),getdate()-1,112)
select @sql=′select MsgDate, MsgTime,
dbo.f_GetStr([MsgText],1,′′′′) MsgText_A,
dbo.f_GetStr([MsgText],2,′′′′) MsgText_B,
dbo.f_GetStr([MsgText],3,′′′′) MsgText_C,
dbo.f_GetStr([MsgText],4,′′′′) MsgText_D,
dbo.f_GetStr([MsgText],5,′′′′) MsgText_E,
dbo.f_GetStr([MsgText],6,′′′′) MsgText_F
into syslogd_′+@tbName+′ FROM′+quotename(@tbName)
exec(@sql)
--在新表的MsgText_C字段建立索引
exec(′CREATE INDEX [IX_syslogd] ON [dbo].[syslogd_′+@tbName+′]([MsgText_C]) ON [PRIMARY]')
GO
(3) 日志篩選
--獲取昨日日期形成日期字符串
declare @tbName varchar(100),@sql varchar(2000),@date datetime
select @tbName = convert(varchar(10),getdate()-1,112)
--獲取昨日http日志存入log_http_昨日日期日志庫
select @sql=′select * into log_http_′+@tbName+′FROM syslogd_′+@tbName+′where MsgText_C =′′get′′or MsgText_C=′′post′′′
exec(@sql)
exec(′CREATE INDEX [IX_syslogd] ON [dbo].[log_http_′+@tbName+′]([MsgText_D]) ON [PRIMARY]′)
GO
(4) 其他類型日志
按照以上方法同樣可以獲取session日志、qq日志、msn日志等。
(5) 刪除無用數(shù)據(jù)表
declare @tbName varchar(100),@sql varchar(2000),@date datetime
select @tbName = convert(varchar(10),getdate()-1,112)
--刪除1天前的syslogd_2010xxxx表
select @sql='drop table syslogd_'+@tbName
exec(@sql)
3 日志分析
通過系統(tǒng)采集的日志,可選擇不同的日期或日期區(qū)間進(jìn)行日志檢索并進(jìn)行分析。通過C#語言開發(fā)查詢工具,查詢界面如圖3所示。
查詢工具的關(guān)鍵代碼如下[4]:
string sql = "";
DateTime dtbegin = dateTimePicker1.Value; //開始時間
DateTime dtend = dateTimePicker2.Value; //結(jié)束時間
if (this.comboBoxTableName.Text.Contains("http"))
//查詢log_http_2010xxxx
{
while ((dtend-dtbegin ).Days >= 0)
{
string dbtablename="log_"+comboBoxTable-
Name.Text + "_" + dtbegin.ToString("yyyy
MMdd");
if (sql == "")
sql="select MsgDate as 日期,MsgTime
as 時間,MsgText_B as 源IP,MsgText_
C as 訪問方式,MsgText_D as 目的網(wǎng)
址 from"+dbtablename;
else
sql = sql + " union all select MsgDate
as 日期,MsgTime as 時間,MsgText_B as
源IP,MsgText_C as 訪問方式,MsgText_D
as 目的網(wǎng)址 from " + dbtablename;
if (this.checkBoxText.Checked)
sql = sql + " where MsgText_D like
′%" + this.textBoxMsgText.Text + "%
′or MsgText_B like ′%" + this.
textBoxMsgText.Text + "%′";
dtbegin = dtbegin.AddDays(1);
}
}
通過日志查詢工具,輸入日志服務(wù)器IP、數(shù)據(jù)庫名和登錄信息,點(diǎn)擊連接數(shù)據(jù)庫,連接無誤后即可選擇日志類型、開始及結(jié)束日期,可以查詢某一時間段內(nèi)相關(guān)關(guān)鍵字的所有日志,并可以選擇導(dǎo)出記錄到Excel,達(dá)到詳細(xì)分析的目的。
本文在對網(wǎng)絡(luò)設(shè)備日志分析的基礎(chǔ)上為網(wǎng)絡(luò)管理提供了一種較為簡單的方法,但這些研究與實現(xiàn)只是一些基礎(chǔ)性工作,在該架構(gòu)和基礎(chǔ)上還可以做進(jìn)一步開發(fā),為企業(yè)提供更多的便利:(1)網(wǎng)絡(luò)計費(fèi)是網(wǎng)絡(luò)管理中的一個重要環(huán)節(jié),利用本文提供的準(zhǔn)確的進(jìn)出口流量數(shù)據(jù),配合計費(fèi)策略信息庫,可以構(gòu)建比較完善的網(wǎng)絡(luò)計費(fèi)系統(tǒng)。(2)目前用戶行為分析是企業(yè)關(guān)注的一項課題,可以利用建立的部分IP地址同域名的對照關(guān)系以及建立URL與網(wǎng)頁內(nèi)容關(guān)鍵字的映射關(guān)系,分析出用戶的興趣愛好。
參考文獻(xiàn)
[1] 張永生,譚成翔,汪海航.Linux環(huán)境下構(gòu)建安全的日志服務(wù)器[J].計算機(jī)安全,2006(12):6-8.
[2] 劉合富. syslog日志數(shù)據(jù)采集實現(xiàn)[J]. 中國網(wǎng)絡(luò)教育,2007(8):50-51.
[3] 鄭阿奇.SQL SERVER實用教程[M].北京:電子工業(yè)出版社,2005:261-282.
[4] CSDN社區(qū) [EB/OL].(2010-04-28).http://topic.csdn.net/u/20100428/22/64b61824-973b-4acd-b420-3bbe39793b65.html.