14 марта 2013

Забиваем тестовый ящик спамом

Сто лет не работал с Exchange. Но тут подвернулся случай. Итак задача. необходимо забить тестовый ящик данными, метров на 500 примерно. Максимальный размер сообщения - 5 мб. Так что нам нужно, конечно же нам нужен файл, благо в windows создать файл нужного размера совсем легко:

fsutil file createnew testattach.zip 5000000

Обратите внимание на размер файла - в байтах. Далее - воспользуемся следующей командой:

for($i = 1; $i -le 100; $i++) { Send-MailMessage -Attachments "testattach.zip" -Body "This is test message" -From "matrenin@gmail.com" -SmtpServer -Subject "Test message $i" -To "test@test.test"
Start-Sleep -s 10}


Ну собственно разбирать-то тут нечего, стандартный цикл, далее не менее стандартный командлет для отправки сообщения и пауза, для того чтобы не перегрузить сервер. Естественно  что данная команда подходит только для отправки почты без авторизации.

01 марта 2012

RRAS NAT + Firewall

Понадобилось тут настроить обратный NAT. Но с тем чтобы через него могли ходить только определенные ip. Поскольку в качестве роутера у меня сейчас Windows RRAS сервер пришлось познакомиться с его оснасткой. Оснастка по ходу не менялась со времен 2003. Ну да ладно. Идем в раздел NAT, выбираем внешний интерфейс - сервисы, добавляем нужные порты и адрес behind the wall.
Отлично. Идем в параметры firewall на NAT сервере и создаем там подходящие правила. Пока все логично и как бы даже nix-like.
Проверяем с разрешенного IP, отлично, it works! Идем с запрещенного ip, отлично... эээээ... - it works! Проверяю правила, вроде нигде не накосячил. Идем на машину behind the wall и настраиваем firewall на ней. Проверка - отлично.

Итого NAT сервис на RRAS срабатывает до firewall.

09 марта 2011

Vkontakte спамеры о_О

Пришло письмо от вконтакта.
Уведомление о новом сообщении, все бы ничего, но в теле письма содержалась ссылка (напомню вконактик уведомляя о новых письмах никогда не пишет что внутри):

http://volodinagoro1.ru/a26puionhyzxj.htm

Ходить по ссылке не стал, скачал html

Там такое:

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('4 10="18";4 7=2;4 0=6.8.5.9=7+1;11 3(){14(0!=1){0-=1;6.8.5.9=0}19{16.17=10;15}12("3()",13)}3();',10,20,'currentsecond|||countredirect|var|redirect2|document|countdownfrom|redirect|value|targetURL|function|setTimeout|1000|if|return|window|location|blog?rid=9201820481|else'.split('|'),0,{}))



Кому не лень может разобрать куда именно оно редиректит и что юзер поймает в итоге =)


Но интересно не это, читаем заголовки письма:

Delivered-To: matrenin@gmail.com
Received: by 10.224.3.3 with SMTP id 3cs54330qal;
Tue, 8 Mar 2011 08:49:21 -0800 (PST)
Received: by 10.213.103.142 with SMTP id k14mr2937695ebo.37.1299602960094;
Tue, 08 Mar 2011 08:49:20 -0800 (PST)
Return-Path:
Received: from cs26.vkontakte.ru (cs26.vkontakte.ru [87.240.186.17])
by mx.google.com with ESMTP id u13si2142877eeh.3.2011.03.08.08.49.19;
Tue, 08 Mar 2011 08:49:20 -0800 (PST)
Received-SPF: pass (google.com: domain of admin@vkontakte.ru designates 87.240.186.17 as permitted sender) client-ip=87.240.186.17;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of admin@vkontakte.ru designates 87.240.186.17 as permitted sender) smtp.mail=admin@vkontakte.ru
Received: from localhost.localdomain (localhost [127.0.0.1])
by cs26.vkontakte.ru (Postfix) with ESMTP id 5DF2F1ED1
for ; Tue, 8 Mar 2011 19:49:19 +0300 (MSK)
Date: Tue, 8 Mar 2011 19:49:19 +0300


ип по рипну принадлежит

inetnum: 87.240.160.0 - 87.240.191.255
netname: VKONTAKTE-SPB-NET
descr: Vkontakte Ltd
country: RU
admin-c: PVD90-RIPE
tech-c: PVD90-RIPE
status: ASSIGNED PA
mnt-by: VKONTAKTE-NET-MNT
source: RIPE # Filtered

person: Pavel V Durov
address: 8-B, Tverskaya str.,
address: 191015 Saint Petersburg, Russia
e-mail: cfo@vkontakte.ru
phone: +7 812 449 5670
fax-no: +7 812 449 2287
mnt-by: VKONTAKTE-NET-MNT
nic-hdl: PVD90-RIPE
source: RIPE # Filtered



Т.е. письмо отправлено с валидного сервера. А вот это уже интересно, админы спят и судя по всему сосут лапу.

25 ноября 2010

Аудит команд запущенных на Exchange

В любой организации где используется Exchange или любое ПО подобного класса требуется вести документацию. К сожалению мы часто забываем это делать. Что приводит порой к самым интересным ситуациям, когда каждые полгода ты тратишь от часа до недели на задачу которую ты уже решал, но не помнишь как.
По идее надо записывать каждую команду которую ты запускаешь, но это сильно замедляет скорость работы, к счастью мы можем автоматизировать слежку за изменениями в конфигурации Exchange используя встроенные средства.
В 2010 Exchange все действия выполняются через вызов powershell команды или скрипта, даже если вы работаете через EMC или ECP
В Exchange 2010 разработчики позаботились о нас следующим образом. При вызове Exchange snapin и запуске команды параллельно подгружается агент Admin Audit Log Agent который записывает данные о том что и как было запущено. Посмотреть логи можно с любого сервера, но их распространение завязано на репликацию в AD.

Итак самое важное:


что он логит по умолчанию - все командлеты изменяющие свойства объектов Exchange;

чего он не логит по умолчанию - Get-*, Search-*, Test-* командлеты;

чего он не логит в принципе - если выполнение команды было прервано ДО старта Admin Audit Log Agent; запуск скриптов и команд в Exchange 2007.

Поля которые они использует можно посмотреть тут. Там же можно посмотреть и другие параметры настроенные "по умолчанию". Например узнать что события хранятся 90 дней.

Ключевой момент - в SP1 из аудита убрали возможность настроить AdminAuditLogMailbox, этот параметр позволял настроить отправку отчетов при каждой выполненной команде в определенный ящик Exchange.

С одной стороны это ооочень плохо, т.к. нельзя больше одной командой посылать себе уведомления. Взамен можно отправить себе отчет через ECP. НО! Кроме того что ты получаешь отчет в "сыром" XML, так ты еще не можешь получить к нему доступ в OWA, т.к. по умолчанию XML документы в файлах блокируются. *wallbash*
Люблю M$ за нестандартные решения.

С другой стороны это хорошо. Так как позволяет определить какие конкретно уведомления ты хочешь и должен получать. Ну и немного попрактиковаться в PowerShell.

Первое - определим цели.

1. Мы хотим получать отчет о командах запущенных за последний час.
2. Мы не хотим получать отчеты о командах запущенных внутренними системными пользователями, все сервисы запускающие их ведут лог в Application.
3. Отчет должен приходить в удобочитаемом виде.
4. В отчете должно быть отражено следующее: кто, что, над кем, когда, с какими параметрами.


Второе - средства:
1. PowerShell v 2.0 + Exchange 2010 management tools
2. TaskScheduler
3. Командлет Search-AdminAuditLog
4. Командлет Send-MailMessage
Собственно все.

Ну приступим.


#добавляем snapin Exchange 2010, без этого наши exchange командлеты работать не будут
add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010;

#период за который хотим получить отчет
$date = (Get-Date).AddHours(-1);

#собственно массив с отчетом, фильтруем по параметру Caller.
$report = Search-AdminAuditLog -StartDate $date | where {$_.Caller -notlike "SystemUser"};

<# т.к. полученный объект является массивом проще всего - посчитать количество элементов и определить надо ли делать что-то еще или нет#>
if ($report.Count -gt 0) {

#запускаем цикл для каждого элемента в массиве
foreach ($answer in $report)
{
<#свойство CmdletParameters является вложенным массивом, который содержит название и значение параметра (не поверите Name и Value), записываем их в строку#>
foreach ($parametr in $answer.CmdletParameters)
{
<#откуда взялись br? письмо будет отправлено как html, чтобы можно было все красиво отформатировать.#>
$stringParam += "Name: " + $parametr.Name + "<br>Value: " + $parametr.Value + "<br>";
}
#тело отчета, в конец добавляем список переданных параметров
$messageBody += "<br>User: " + $answer.Caller + "<br><font color=red> Launch cmdlet: " + $answer.CmdletName + "</font><br><font color=green>On object: " + $answer.ObjectModified + "</font><br>At time: " + $answer.RunDate.ToString() + "<br>Used params: <br>" + $stringParam;
#не забываем очистить строку содержащую параметры
$stringParam = "";
}

<#если хочется чтобы каждый отчет приходил отдельным письмом убираем этот цикл и помещаем отправку письма внутрь предыдущего. В противном случае - проверяем размер $messageBody и если он больше 0 то отправляем письмо. Передаваемые параметры не привожу.#>
if ($messageBody.Length -gt 0)
{
Send-MailMessage $mailTo $mailSubject $messageBody $mailSmtp -From $mailFrom -Encoding $encoding -BodyAsHtml;
}
<#не забываем очистить строку содержащую тело письма, если для каждого отчета отправляется отдельное письмо помещаем команду внутрь первого цикла.#>
$messageBody = "";
}


Письмо которое получается на выходе




User: Admin (на самом деле здесь путь к объекту в AD ;) )
Launch cmdlet: Set-CASMailbox
On object: mailbox (на самом деле здесь путь к объекту в AD ;) )
At time: 25.11.2010 10:45:07
Used params:
Name: ImapEnabled
Value: False
Name: Identity
Value: mailbox (на самом деле здесь путь к объекту в AD ;) )



PS: пока писал нашел "более красивый" вариант тут, хнык.

29 октября 2010

Логи SMTP чанги

Лог установки соединения лежит в
"C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\Connectivity"
Лог исходящей сессии
"C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\ProtocolLog\SmtpSend"
Лог входящей сессии
"C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\ProtocolLog\SmtpReceive"

Логи отработки антиспам агента
C:\Program Files\Microsoft\Exchange Server\V14\TransportRoles\Logs\AgentLog

Млять, с одной стороны удобно что не все в кучу, с другой стороны чтобы найти что-то про сессию надо вытаскивать инфу сразу со всех каталогов и сортировать