在这里我准备了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) <= 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) <= 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;[email protected];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) <= 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的数据进行事件日志统计分析了,如下图:
原文地址:http://blog.51cto.com/rdsrv/2130456