пятница, 27 апреля 2012 г.

Начало.

  Добро времени суток, Всем!
  Вот наконец решился на первое сообщение в блоге, так как, это дело для меня непривычное.

  Хочу поделиться с Вами, и конечно услышать критику, практическими методами реализации мониторинга безопасности серверов и компьютерной сети штатными средствами + собственными разработками. Так как опыт в информационной безопасности у меня маленький, камни в мой адрес, критика, советы принимаются :-).

  Первая идея которая посетила голову - это реализация наблюдения за изменениями в Active Directory. Имеются куча инструментов, как платных так и бесплатных, но убеждение "Если сам не сделаешь, не узнаешь как работает" не даёт покоя. Или можно процитировать поговорку "Дурная голова рукам покоя не даёт" :-). Выбор пал на встроенный инструмент Windows Server 2008 - Power Shell. Кто не знает что такое Power Shell, милости просим - http://ru.wikipedia.org/wiki/Windows_PowerShell.

  Так как я и сам с ним (Power Shell) знаком 3 дня, красотой кода не блещу.
 
  Задача: необходим скрипт который бы анализировал EventLog Security по определённым ID и выводил бы список alert'ов в HTML страницу.

Листинг скрипта:

 
$Events = Get-EventLog security -InstanceId '5137','5141','5136','5138','5139'
#Проверяем EventLog на наличие определённых событий

$a=Get-Date -UFormat %Y.%m.%d.%H.%M
#Определяем переменную для названия файла (имя=дата)
$Data = New-Object System.Management.Automation.PSObject
 $Data | Add-Member NoteProperty Time ($null)
 $Data | Add-Member NoteProperty UserName ($null)
 $Data | Add-Member NoteProperty DN ($null)
 $Data | Add-Member NoteProperty Class ($null)
 $Data | Add-Member NoteProperty Info ($null)
$Events | %{
$Data.time = $_.TimeWritten
#Берем значение "время записи меседжа"



$message = $_.message.split(“`n”) | %{$_.trimstart()} | %{$_.trimend()}
#По строчный перебор логов
$Data.UserName = ($message | ?{$_ -like “Имя учетной записи:*”} | %{$_ -replace “^.+:.”} )
#Ищем и помещаем в Data.UserName имя пользователя сделавший изменения

$Data.DN = ($message | ?{$_ -like “DN:*”} | %{$_ -replace “^.+:.”} )
#Находим что именно измененно

$Data.Class = ($message | ?{$_ -like “Класс:*”} | %{$_ -replace “^.+:.”} )
#Определяем класс изменения

$Data.Info = ($message  | ?{$_ -like  $message.SyncRoot[0]}| %{$_ -replace “^.+:.”} )
#Отображаем информационную строку изменения
$Data




#Выводим значения
 }
#И соответственно конвертируем полученные данные в HTML
 | ConvertTo-Html > c:\$a.html


Так же можно дописать скрип чтобы этот файл приходил на почту.

$file = "C:\$a.html"
# Считаем что нам необходим файл $a.html
$mail = New-Object System.Net.Mail.MailMessage
$mail.From = New-Object System.Net.Mail.MailAddress("mail@domain.com")
$mail.To.Add("mail@domain.com")
$mail.CC.Add("mail@domain.com")
# Устанавливаем от кого и кому отправляем
$mail.Subject = "report";
# Устанавливаем тему сообщения
$att = new-object Net.Mail.Attachment($file)
# Создаем тело сообщения из файла
$smtp = New-Object System.Net.Mail.SmtpClient
# Создаем почтовое сообщение
$smtp.host = "10.0.10.20"
# Указываем хост через который будем отправлять
$Credentials = new-object System.Net.networkCredential
$Credentials.domain = "domain.com"
$Credentials.UserName = "username"
$Credentials.Password = "password"
$smtp.Credentials = $Credentials
# Задаем пользователя от имени которого будет происходить отправка
$mail.Attachments.Add($att)
$smtp.Send($mail)
$att.Dispose()
# Производим отправку письма
Remove-Item $file
} else {
Write-Host "File $file not found"
}
# В случае необходимости удаляем файл
  Вот такой скрипт получился за 3 дня.
  Надеюсь он кому-нибудь пригодиться!