1. 程式人生 > >Windows事件日誌寫入SQL Server並PowerBI統計分析

Windows事件日誌寫入SQL Server並PowerBI統計分析

subscript dev ignore otto tegra new 命令 comm run

在這裏我準備了2臺系統,一個Windows Server 2012 R2的域控服務器DC01,一臺SQL on CentOS7的SQL數據庫服務器

技術分享圖片

首先我使用SQL Manager Studio連接到SQL數據庫服務器創建需要存放Windows轉發事件日誌的數據庫“EventCollections”

CREATE DATABASE EventCollections

GO

USE EventCollections

GO

-- the table name loosely relates to the name of my Win Event Subscription name

CREATE TABLE [dbo].[GeneralEvents](

[Id] [int] NULL,

[LevelDisplayName] [varchar](255) NULL,

[LogName] [varchar](255) NULL,

[MachineName] [varchar](255) NULL,

[Message] [varchar](max) NULL,

[ProviderName] [varchar](255) NULL,

[RecordID] [bigint] NULL,

[TaskDisplayName] [varchar](255) NULL,

[TimeCreated] [smalldatetime] NULL

)

-- Create Unique Clustered Index with IGNORE_DUPE_KEY=ON to avoid duplicates in sqlbulk imports

CREATE UNIQUE CLUSTERED INDEX [ClusteredIndex-EventCombo] ON [dbo].[GeneralEvents]

(

[RecordID] ASC,

[MachineName] ASC,

[LogName] ASC

) WITH (IGNORE_DUP_KEY = ON)

GO

技術分享圖片

為了避免後面每小時導入一次日誌數據時出現重復,對RecordID,MachineName和LogName使用IGNORE_DUPE_KEY=ON創建唯一的聚集索引

接下來回到DC服務器配置事件服務

首先需要配置WinRM,顯示可用的偵聽器

winrm e winrm/config/listener

技術分享圖片

執行winrm get winrm/config

檢查

allowremoteAccess = true

技術分享圖片

在日誌源服務器(我們只有DC一臺服務器,使用這臺既是源也是收集日誌服務器)把network Service加入到Event Log Readers組裏

技術分享圖片

然後在日誌源服務器和收集日誌服務器執行如下命令:

wevtutil sl security /ca:O:BAG:SYD:(A;;0xf0005;;;SY)(A;;0x5;;;BA)(A;;0x1;;;S-1-5-32-573)(A;;0x1;;;S-1-5-20)

技術分享圖片

接下來打開事件查看器,點擊訂閱,這是會出現提示,是否啟用Windows事件收集器服務,點擊“是”

之間轉發使用的HTTP端口是5985

然後創建一個新的訂閱,指定需要收集的計算機,這裏輸入DC01

技術分享圖片

選擇需要訂閱哪些日誌,這裏我選擇System

技術分享圖片

選擇收集的事件級別

技術分享圖片

在高級裏指定收集日誌的帳戶為域管理員帳戶,然後確定

技術分享圖片

點擊用戶名密碼進行輸入

技術分享圖片

正常:每15分鐘

最小化帶寬:每6小時

最小化延遲:每30秒

確定

技術分享圖片

這樣就創建好一個收集系統日誌的訂閱了

技術分享圖片

按照同樣的方法再創建一個安全日誌的訂閱

技術分享圖片

如果要執行命令的審計日誌,可以開啟下面2個位置的組策略,然後通過事件ID4688查看

計算機配置 > 策略 > Windows 設置 > 安全設置 > 高級審核配置 > 詳細跟蹤>審核創建進程

技術分享圖片

管理 模板\系統\審核創建的進程\在創建事件的過程中包含命令行

技術分享圖片

備註:Microsoft不建議永久啟用命令行審核。啟用此功能後,對Windows安全事件的讀取訪問權限的任何用戶將能夠讀取任何成功創建的進程的命令行參數。請記住,命令行命令可能包含機密信息,包括密碼和其他用戶數據

等待15分鐘後事件查看器的已轉發事件裏就出現了我們訂閱的安全和系統日誌了

技術分享圖片

最後我在DC上執行如下PowerShell命令,將已轉發事件的日誌寫入SQL裏

  • 如果SQL是臺Windows並且加域,那麽可以采用集成身份驗證方式登陸,執行下面腳本

# While this script is intended to run on an hourly basis, the filter is set for going back 65 minutes.

# This allows the script to run for 5 minutes without any missing any events. Because we setup the

# table using the IGNORE_DUPE_KEY = ON, duplicate entries are ignored in the database.

$xml = @‘

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

‘@

$events = Get-WinEvent -FilterXml $xml | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

$connectionString = "Data Source=sqlserver;Integrated Security=true;Initial Catalog=EventCollections;"

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString

$bulkCopy.DestinationTableName = "GeneralEvents"

$dt = New-Object "System.Data.DataTable"

# build the datatable

$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name

foreach ($col in $cols) {$null = $dt.Columns.Add($col)}

foreach ($event in $events)

{

$row = $dt.NewRow()

foreach ($col in $cols) { $row.Item($col) = $event.$col }

$dt.Rows.Add($row)

}

# Write to the database!

$bulkCopy.WriteToServer($dt)

  • 如果是采用sa帳戶登陸就執行如下:

$xml = @‘

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

‘@

$events = Get-WinEvent -FilterXml $xml | Select-Object ID, LevelDisplayName, LogName, MachineName, Message, ProviderName, RecordID, TaskDisplayName, TimeCreated

$connectionString = "Data Source=sqlserver;user id=sa;pwd=password@1;Initial Catalog=EventCollections;"

$bulkCopy = new-object ("Data.SqlClient.SqlBulkCopy") $connectionString

$bulkCopy.DestinationTableName = "GeneralEvents"

$dt = New-Object "System.Data.DataTable"

# build the datatable

$cols = $events | select -first 1 | get-member -MemberType NoteProperty | select -Expand Name

foreach ($col in $cols) {$null = $dt.Columns.Add($col)}

foreach ($event in $events)

{

$row = $dt.NewRow()

foreach ($col in $cols) { $row.Item($col) = $event.$col }

$dt.Rows.Add($row)

}

# Write to the database!

$bulkCopy.WriteToServer($dt)

其中上面這段:

<QueryList>

<Query Id="0" Path="ForwardedEvents">

<Select Path="ForwardedEvents">*[System[TimeCreated[timediff(@SystemTime) &lt;= 3900000]]]</Select>

</Query>

</QueryList>

取自於已轉發事件的“篩選當前日誌”

技術分享圖片

XML內容

技術分享圖片

執行完成以後可以到SQL去檢查日誌是否已經寫進SQL

select * from GeneralEvents

可以看到日誌成功寫入SQL裏

技術分享圖片

最後就是做一個Windows計劃任務把上面的Powershell腳本每隔1小時自動執行一次了

把上面成功執行的腳本保存成ps1文件,並把這個文件剪切到C盤根目錄下

技術分享圖片

打開任務計劃程序,創建一個基本任務

技術分享圖片

下一步

技術分享圖片

選擇每天

技術分享圖片

下一步

技術分享圖片

啟動程序

技術分享圖片

在程序裏選擇powershell的啟動路徑C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

參數添加-command ". ‘c:\event-into-sql.ps1‘"

技術分享圖片

勾選“但單擊“完成”時,打開此任務屬性的對話框”,然後完成

技術分享圖片

設置執行該計劃任務的帳戶,以及權限

技術分享圖片

在觸發器裏修改每日為如下圖所示

技術分享圖片

確定,創建完成

技術分享圖片

到這裏就大功告成了。既然事件日誌都寫入SQL了,那麽就可以利用PowerBI Desktop去讀取SQL的數據進行事件日誌統計分析了,如下圖:

技術分享圖片

Windows事件日誌寫入SQL Server並PowerBI統計分析