Criando Auditoria de Logon de usuários na Rede

Posted on 19 de maio de 2016

0


Olá Pessoal,

É uma dúvida bem comum; Como faço para registrar o horário de Logon\logoff do usuário ?
Por padrão é registrado o EventID 4624/4634 no DC

Porém, o Visualizador de eventos tem suas limitações.

Desenvolvi uma GPO de Script de Logon, para salvar as informações em um arquivo de texto no compartilhamento de rede. A cereja do bolo é o Orchestrator que armazena essas informações no Banco de Dados(SQL) e a consulta das informações, eu faço através do Excel.

Para funcionar não é necessário ter o Orchestrator, vou colocar o passo a passo e o Orchetrator no final. Porém,  você vai ficar limitado a consulta apenas do arquivo de texto.

1 – Crie um compartilhamento de Rede, nesse compartilhamento vai ficar armazenado um arquivo de LOG com as informações de Logon. As permissões serão explicadas no passo 3

1.2  – Através do Notepad,  crie dois arquivos  logon.LOG e logoff.LOG e salve no compartilhamento.
Para o Script VBS funcionar é necessário que já exista os arquivos.

1.3 – Crie um arquivo VBS com o conteúdo abaixo:

Salve o arquivo como logon.vbs (esse arquivo será usado na criação da GPO)

Option Explicit
Set objShell=CreateObject("WScript.Shell")
Set FileSysObj = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("\\SERVIDOR\COMPARTILHAMENTO$\logon.LOG", ForAppending, True)
Dim objWMIService, objItem, objService, objShell
Dim strComputerName, strService, colServiceList, FileSysObj, WSHShell, objFSO, objTextFile, strDate, strTime, strUserName, strSessionName, strLogonServer, DateInfo
'strDate = wshShell.ExpandEnvironmentStrings( "%Date%" )
'strTime = wshShell.ExpandEnvironmentStrings( "%time%" )
strComputerName = wshShell.ExpandEnvironmentStrings( "%ComputerName%" )
strUserName = wshShell.ExpandEnvironmentStrings( "%Username%" )
strSessionName = wshShell.ExpandEnvironmentStrings( "%sessionname%" )
strLogonServer = wshShell.ExpandEnvironmentStrings( "%logonserver%" )
DateInfo = DateInfo & Now & VbCrLf
'DateInfo = DateInfo & Date & VbCrLf
'DateInfo = DateInfo & Time & VbCrLf

Const OverWriteFiles = True
Const ForAppending = 8

objTextFile.WriteLine("Logon Realizado:" & ";" & strUserName & ";" & strComputerName & ";" & DateInfo)

 

1.4 – Crie um novo arquivo .vbs

Option Explicit
Set objShell=CreateObject("WScript.Shell")
Set FileSysObj = CreateObject("Scripting.FileSystemObject")
Set WSHShell = WScript.CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("\\SERVIDOR\COMPARTILHAMENTO$\logoff.LOG", ForAppending, True)
Dim objWMIService, objItem, objService, objShell
Dim strComputerName, strService, colServiceList, FileSysObj, WSHShell, objFSO, objTextFile, strDate, strTime, strUserName, strSessionName, strLogonServer, DateInfo
'strDate = wshShell.ExpandEnvironmentStrings( "%Date%" )
'strTime = wshShell.ExpandEnvironmentStrings( "%time%" )
strComputerName = wshShell.ExpandEnvironmentStrings( "%ComputerName%" )
strUserName = wshShell.ExpandEnvironmentStrings( "%Username%" )
strSessionName = wshShell.ExpandEnvironmentStrings( "%sessionname%" )
strLogonServer = wshShell.ExpandEnvironmentStrings( "%logonserver%" )
DateInfo = DateInfo & Now & VbCrLf
'DateInfo = DateInfo & Date & VbCrLf
'DateInfo = DateInfo & Time & VbCrLf

Const OverWriteFiles = True
Const ForAppending = 8

objTextFile.WriteLine("Logoff Realizado:" & ";" & strUserName & ";" & strComputerName & ";" & DateInfo)

Salve o arquivo como logoff.vbs

2 – Crie uma GPO de Logon\Logoff e coloque os arquivos para serem executados com seus respectivos nomes.

GpoLogon_1
Pronto agora vou começar a registrar todas as informações de Logon e Logoff dos usuários em um arquivo de  texto, onde tudo mundo tem acesso ?

Sim, porém precisamos dificultar um pouco acesso e melhorar a segurança
(você pode criar uma politica de auditoria de acesso a esse compartilhamento também)

3 – No Compartilhamento que você criou (De preferencia oculto), você precisa definir permissões NTFS para o compartilhamento e para os arquivos.

No compartilhamento de Rede, deixe a permissão para Todos Leitura e Escrita

NTFS deixe o acesso Full Control para SYSTEM, Administrator e Domain Admins

GpoLogon_2

3.1 No Arquivo crie um novo arquivo logon.log e logoff.log
Defina a permissão apenas para os usuários do Domínio, nesses arquivos criados.

GpoLogon_3

3.2 Se você quiser mais segurança , você pode definir as permissões especificas para apenas o usuário Escrever no arquivo. Vai do tipo de segurança que você precisa.

GpoLogon_4

4 – Conforme os usuários vão logando o arquivo de texto, vai registrar as informações.
O Formato do arquivo é separado por ponto é virgula, o que facilita na hora de importar ou trabalhar no Excel.

Se você preferir, pode usar o mesmo arquivo para registrar a informações de Logon/Logoff.
GpoLogon_5

5 – A Partir desse ponto é a importação para o SQL, utilizando um Script PowerShell usando o Orchestrator

GpoLogon_6

5.1 A Rotina Executa todo dia as 22:00
5.2 Segunda atividade é Copiar do Servidor para um área temporária do RunBook Server
GpoLogon_7
5.3 Crie um novo arquivo de Script PowerShell (ImportCSV.ps1) e salve em um diretório do Runbook Server

#################################################### 
# 
# PowerShell CSV to SQL Import Script 
# 
#################################################### 
 
# Database variables 
$sqlserver = "SERVIDOR" 
$database = "DATABASE" 
$table = "TABELA" 
 
# CSV variables 
$csvfile = "C:\temp\logon.LOG" 
$csvdelimiter = ";" 
$FirstRowColumnNames = $false 
 
################### No need to modify anything below ################### 
Write-Host "Script started..." 
$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
[void][Reflection.Assembly]::LoadWithPartialName("System.Data") 
[void][Reflection.Assembly]::LoadWithPartialName("System.Data.SqlClient") 
 
# 50k worked fastest and kept memory usage to a minimum 
$batchsize = 50000 
 
# Build the sqlbulkcopy connection, and set the timeout to infinite 
$connectionstring = "Data Source=$sqlserver;Integrated Security=true;Initial Catalog=$database;" 
$bulkcopy = New-Object Data.SqlClient.SqlBulkCopy($connectionstring, [System.Data.SqlClient.SqlBulkCopyOptions]::TableLock) 
$bulkcopy.DestinationTableName = $table 
$bulkcopy.bulkcopyTimeout = 0 
$bulkcopy.batchsize = $batchsize 
 
# Create the datatable, and autogenerate the columns. 
$datatable = New-Object System.Data.DataTable 
 
# Open the text file from disk 
$reader = New-Object System.IO.StreamReader($csvfile) 
$columns = (Get-Content $csvfile -First 1).Split($csvdelimiter) 
if ($FirstRowColumnNames -eq $true) { $null = $reader.readLine() } 
 
foreach ($column in $columns) { 
 $null = $datatable.Columns.Add() 
} 
 
# Read in the data, line by line, not column by column 
while (($line = $reader.ReadLine()) -ne $null) { 
 
 $null = $datatable.Rows.Add($line.Split($csvdelimiter)) 
 
# Import and empty the datatable before it starts taking up too much RAM, but 
# after it has enough rows to make the import efficient. 
 $i++; if (($i % $batchsize) -eq 0) { 
 $bulkcopy.WriteToServer($datatable) 
 Write-Host "$i rows have been inserted in $($elapsed.Elapsed.ToString())." 
 $datatable.Clear() 
 } 
} 
 
# Add in all the remaining rows since the last clear 
if($datatable.Rows.Count -gt 0) { 
 $bulkcopy.WriteToServer($datatable) 
 $datatable.Clear() 
} 
 
# Clean Up 
$reader.Close(); $reader.Dispose() 
$bulkcopy.Close(); $bulkcopy.Dispose() 
$datatable.Dispose() 
 
Write-Host "Script complete. $i rows have been inserted into the database." 
Write-Host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 
# Sometimes the Garbage Collector takes too long to clear the huge datatable. 
[System.GC]::Collect()

 

5.4 Crie a próxima atividade no Orchestrator, para executar o Script PowerShell

GpoLogon_8

5.5 A Atividade é semelhante das 5.2, 5.3 e  5.4, com as seguintes modificações.
Salve o arquivo com o nome diferente do importCSV.ps1 no mesmo diretório.
Altera a variável do CSV

$csvfile = "C:\temp\logoff.LOG"

 

6  – Banco de Dados é bem simples, crie uma tabela com 4 Colunas (ACAO USUARIO SERVIDOR DATAHORA)

7 – É necessário substituir os arquivos que foram importados no banco.
Acesse o Servidor que você criou o compartilhamento (passo 1)
E acesse o diretório que foi compartilhado.
Crie 2 arquivos sem conteudo .log (logon1.log logoff1.log)

7.1 – Crie um arquivo GPO.BAT com o conteúdo abaixo

copy logon1.log logon.log /y
copy logoff1.log logoff.log /y
cscript XCACLS.vbs E:\DIRETORIO\logon.log /g "dominio\Domain Users":f /f /t /e
cscript XCACLS.vbs E:\DIRETORIO\logoff.log /g "dominio\Domain Users":f /f /t /e

7.2 – Utilize o XCACLS para definir as permissões NTFS que foram feitas no passo 3
How to use Xcacls.vbs to modify NTFS permissions
https://support.microsoft.com/en-us/kb/825751)

No final vai ficar assim;

GpoLogon_10

8  – Essa atividade do Orchestrator, vai executar a .BAT que criamos no passo 7

GpoLogon_9

9 – Na ultima atividade, será enviado um e-mail informando que a importação ocorreu com sucesso.

10 – Abra o Excel e crie uma conexão de dados com o SQL
GpoLogon_11

Você também pode substituir o Orchestrator pelo Task Schedule do Windows, porém é assunto para outro post.

Abraço

Referencias

https://blogs.msdn.microsoft.com/ericfitz/2008/08/20/tracking-user-logon-activity-using-logon-events/

https://technet.microsoft.com/en-us/library/hh420377(v=sc.12).aspx