Как стать автором
Обновить

Журналирование Windows EventLog и система оповещения для администраторов

Время на прочтение 4 мин
Количество просмотров 18K
Некоторое количество времени(года три) назад, в попытке найти способ экспорта Windows EventLog, была найдена возможность в удобном виде осуществлять аудит различных событий происходящих на сервере.

Microsoft своими «добрыми» технологиями сделала Windows практически несовместимым со штатными системами журналирования событий(syslog), но оставила небольшую лазейку которую можно использовать.
Лазейка представляет собой комбинацию SNMP trap и программы экспорта системных событий evntwin.

Для работы связки нужен настроенный snmptrapd, а также активированный сервис SNMP на windows сервере (добавляется через «добавление/удаление компонентов»).

Первым делом нужно настроить сервер на который будут сбрасываться сообщения из Eventlog.

После того как сервис настроен, запускаем программу evntwin.exe
technet.microsoft.com/en-us/library/cc759390%28WS.10%29.aspx
Как она выглядит видно на следующем скриншоте.




Принцип использования evntwin прост. Вы выбираете категорию и код события которые Вас интересуют и добавляете их в список. При наступлении события сообщение одновременно будет сохранено в EventLog, а также будет «трапнуто» на сервер мониторинга.

На сервере мониторинга в snmptrapd.conf нужно добавить строку обработчика.
  1. authCommunity log,execute public
  2. format1 Trap from %B
  3. format2 Trap from %B
  4. traphandle default /usr/local/etc/trapd.pl


Сам обработчик написан мной на perl, код можно взять по ссылке trapd.pl(Не рекомендуется копипастить подсвеченный код из поста, лучше взять по ссылке). Он разбирает входящие trap сообщения и формирует письмо администраторам.

#!/usr/bin/perl<br/> <br/>use vars qw /$hostname $source $oid @data $trap $error/;<br/> <br/>my @indata = (<>);<br/>$trap->{hostname} = shift(@indata);<br/>$trap->{source} = shift(@indata);<br/>$trap->{uptime} = shift(@indata);<br/>(undef,$trap->{uptime}) = split (/ /,$trap->{uptime},2);<br/>$trap->{oid} = shift(@indata);<br/>open OUT,">>/var/log/snmptrapd.log";<br/>chomp($trap->{hostname});<br/>chomp($trap->{source});<br/>chomp($trap->{uptime});<br/>chomp($trap->{oid});<br/>print OUT "Hostname: $trap->{hostname}\n";<br/>print OUT "Source: $trap->{source}\n";<br/>print OUT "Uptime: $trap->{uptime}\n";<br/>$trap->{oid} =~ s/(.*)\.(\d+)$/$2/g;<br/>print OUT "OID: $trap->{oid}\n";<br/>my $str = join("",@indata);<br/>$str =~ s/\t+|\r+|\"//g;<br/>$str =~ s/\n+/\n/g;<br/>my @data = split (/SNMPv2\-SMI\:\:enterprises\.311\.1\.13\.1\.9999\.\d+\.0\s/,$str);<br/>undef $error;<br/>my $part = $data[1];<br/>my @str = split(/\n/,$part);<br/>$trap->{subject} = $str[0];<br/>$trap->{subject} =~ s/\:$//;<br/>$error = "Hostname: $trap->{hostname}\n";<br/>$error .= "Source: $trap->{source}\n\n";<br/>foreach my $line (@str)<br/>{<br/>  if($line =~ /^(.*)\:\-/)<br/>  {<br/>    next;<br/>  }<br/>  else<br/>  {<br/>    push(@arrout,$line);<br/>  }<br/>}<br/>$error .= join ("\n",@arrout);<br/>print OUT @data,"\n";<br/>&mail_send;<br/> <br/>close OUT;<br/>exit(0);<br/> <br/>sub mail_send<br/>{<br/>#  my @arr = shift;<br/>use Net::SMTP;<br/>$smtp = Net::SMTP->new('localhost');<br/>$smtp->mail('security@nagios.mydomain.ru');<br/>$smtp->to('account_admin@mydomain.ru');<br/>$smtp->data();<br/>$smtp->datasend("To: account_admin\@mydomain.ru\n");<br/>$smtp->datasend("Subject: $trap->{subject}\n");<br/>$smtp->datasend("\n");<br/>$smtp->datasend($error);<br/>$smtp->dataend();<br/>$smtp->quit;<br/>}<br/> <br/>

В итоге получаем вот такие красивые письма
Hostname: bdc.mydoman.ru
Source: UDP: [192.168.0.3]:1081

Change Password Attempt:
Target Account Name:pupkin_v
Target Domain:MYDOM
Target Account ID:%{S-1-5-21-1191404879-1933194844-817656539-2675}
Caller User Name:pupkin_v
Caller Domain:MYDOM
Caller Logon ID:(0x0,0x39B1BD)

Hostname: sadc.mydomain.ru
Source: UDP: [192.168.0.4]:1074

User Account Locked Out:
Target Account Name:ivanov_v
Target Account ID:%{S-1-5-21-1191404879-1933194844-817656539-5229}
Caller Machine Name:MX
Caller User Name:SADC$
Caller Domain:MYDOM
Caller Logon ID:(0x0,0x3E7)

Hostname: sadc.mydomain.ru
Source: UDP: [192.168.0.4]:1072

Logon Failure:
Reason:Unknown user name or bad password
User Name:Popov_V
Domain:MYDOM
Logon Type:3
Logon Process:Advapi
Authentication Package:Negotiate
Workstation Name:SADC
Caller User Name:SADC$
Caller Domain:MYDOM
Caller Logon ID:(0x0,0x3E7)
Caller Process ID:580
Source Network Address:192.168.0.20
Source Port:36018

Так как мы подписаны только на интересующие нас сообщения, мы не видим остального системного мусора из EventLog.
Очень удобна данная система при вирусных эпидемиях типа Kido, когда сразу нельзя понять откуда пошло всё размножаться или при брутфорсе системных паролей. Потому что чётко виден Logon Failure и имя машины с которой была неудачная попытка.

Спокойной Вам работы.
PS: готовый конфиг с представленными на скриншоте категориями лежит тут

(C) Aborche 2009
Теги:
Хабы:
+4
Комментарии 1
Комментарии Комментарии 1

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн