《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 基于Windows的Syslog日志系統(tǒng)設(shè)計與實現(xiàn)
基于Windows的Syslog日志系統(tǒng)設(shè)計與實現(xiàn)
來源:微型機(jī)與應(yīng)用2012年第4期
王春彥1, 朱 磊 2, 楊曉朋2
(1. 河南省電子產(chǎn)品質(zhì)量監(jiān)督檢驗所,河南 鄭州450003; 2. 河南省電力通信自動化公司,河南
摘要: 針對傳統(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)行檢測的目的。
Abstract:
Key words :

摘  要: 針對傳統(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.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。