Audit Logging в Exchange 2010
Для успешной настройки логирования необходимо выполнить следующие действия. Для большинства из них мы будем использовать командлет Set-AdminAuditLogConfig.
Первым шагом для выполнения нашей задачи нам нужно создать ящик, в котором будут храниться логи аудита.
Аудит администратора по умолчанию выключен. Запустите командлет Get-AdminAuditLogConfig | fl для проверки:
Для включения аудита запустите следующий командлет:
Set-AdminAuditLogConfig –AdminAuditLogEnabled $true
Для настройки агента аудита, отсылающего почту на выбранный нами ящик выполните следующую команду:
Set-AdminAuditLogConfig –AdminAuditlogMailbox “AuditMailbox@mail.local”
Вы можете выбрать командлеты, которые будут подвергаться аудиту. К примеру вы можете логировать выполнение любых командлетов, связанных с транспортными функциями и почтовыми ящиками, использовав маску *mailbox* и *transport*.
Set-AdminAuditLogConfig –AdminAuditLogCmdlets *mailbox*, *transport*
Таким же способом мы можем отбирать логируемые параметры командлетов.
Set-AdminAuditLogConfig –AdminAuditLogParameters database, server
Cron и почта. Красивые и правильные отчёты о выполнении скриптов
Я использую планировщик сron в повседневно практике как средство резервного копирования, как средство мониторинга логов и выполнения других скриптов =). И в этом случаем для меня очень важен результат таких действий. Ведь может закончится место на диске, не правильно выставиться права на файлы после перезагрузки да и просто «коллеги» могу напакостить.
Сразу оговорю условия. Я буду рассматривать задачу с точки зрения шлюза в интернет, так как в этом случае наличие на нём установленного и настроенного почтовика стремится к нулю.
Так вот, cron по умолчанию отсылает результаты выполнения команд (проще говоря, то что должно выводится в консоль) на локальную почту пользователя. Пользы от такого довольно мало. Что бы поменять почту, на которую будут отсылаться письма, нужно определить переменную MAILTO в crontab'е:
$ crontab -e
MAILTO = user@ya.ru
# m h dom mon dow command
*/1 * * * * echo "123"; date
Однако, подождав, мы не получим ничего на нашу почту. Почта не ушла потому что у нас нет настроенного smtp сервера. И устанавливать такие монстры как sendmail, postfix и exim мы не будем. Зачем нам всё это на маленьком роутере, да и безопасности эти демоны ни капельки не добавят.
В этом случае лучшим решением, на мой взгляд, является msmtp. Маленькая программка, единственным назначением которой, является пересылка почты используя «большие» smtp сервера, к примеру gmail. Ставим:
$ sudo apt-get install msmtp
Конфигурируем на использование учётки на gmail:
$ nano ~/.msmtprc
defaults
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account gmail
host smtp.gmail.com
port 587
protocol smtp
auth on
from user@gmail.com
user user@gmail.com
password passWoRd
# Set a default account
account default : gmail
Не забываем права:
$ chmod 600 ~/.msmtprc
От этой учётки (той, которую указали в конфиге) мы будем получать письма.
Тепрь делаем финт ушами и создём симлинк на sendmail:
$ sudo ln -s /usr/bin/msmtp /usr/sbin/sendmail
Сейчас при выполнении команды из crontab'а к нам на почту (ту что мы указали в MAILTO) благополучно приходит почта с того адреса, который мы указали в конфиге msmtprc. =)
Ещё один маленький нюанс. Мы все помним, что есть три стандартных потока: stdin stdout и stderr. По умолчанию из крона отсылаются два потока: стандартный поток вывода и стандартный поток вывода ошибок. Для того чтобы мы получали только вывод ошибок на почту необходимо поменять строку в crontabe на следующую:
*/1 * * * * echo "123" > /dev/null
Так мы отправили весь стандартный вывод в «бездну».
И наоборот — чтобы получать только вывод скрипта и никаких ошибок:
*/1 * * * * echo "123" 2>/dev/null
Напомню, что 2 — это поток вывода ошибок.
Ну и напоследок, отправляем всё в небытие (не по теме, но может кому-то пригодится):
*/1 * * * * echo "123"> /dev/null 2>&1
Тут мы отправили стандартный вывод в /dev/null и тудаже вывод ошибок.
Вернёмся к почте. При такой отправке результатов к нам на почту приходят письма примерно с такой темой:
Cron
Что не есть информативно. Куда лучше было бы получать письма, в теме которых было что-то красивое и удобное. Однако для этого одним только MAILTO из crontab'а не обойтись.
Здесь нам понадобится команда mail. Если у вас её нет, тогда поставим heirloom-mailx:
$ sudo apt-get install --no-install-recommends heirloom-mailx
Теперь нужно указать в конфиге mail, что мы будем использовать msmtp.
$ nano ~/.mailrc
set sendmail="/usr/bin/msmtp"
Проверяем отправку почты
$ mail -s "Здесь будет тема письма." user@ya.ru
Далее пишем текст письма и нажимаем Ctr-D (^D ;).
Ну и собственно кронтаб:
*/1 * * * * echo "123" | mail -s "Проверка крона" user@ya.ru
Или вот так, если логи/текст у нас уже сформированы и хранятся в файле super_logs.txt
*/1 * * * * mail -s "Проверка крона" user@ya.ru < super_logs.txt
Вместо вывода
Каждый из способов чем-то лучше другого. Для себя же я отсановился на варианте отправки результатов выполнения скрипта через утилиту mail, а ошибки принимаю через директиву MAILTO.
Логирование писем, отосланных через функцию mail()
Если у вас свой сервер (или хостинг-сервер), на котором расположено множество различных проектов, то, возможно, вы сталкивались со следующей проблемой: из-за уязвимости в скрипте на один из проектов попал вредоносный код, занимающийся рассылкой спама. Найти виновника порой бывает весьма проблематично. Так что оптимальным выходом будет просто логировать действия функции mail()
Все крайне просто
Создайте файл /usr/local/bin/phpsendmail и поместите в него следующий код:
/**
This script is a sendmail wrapper for php to log calls of the php mail() function.
Author: Till Brehm, www.ispconfig.org
*/
$sendmail_bin = '/usr/sbin/sendmail';
$logfile = '/var/log/mail.form';
//* Get the email content
$logline = '';
while ($line = fgets(STDIN)) {
if(stristr($line,'to:') || stristr($line,'from:')) $logline .= trim($line).' ';
$mail .= $line;
}
//* compose the sendmail command
$command = 'echo "'.$mail.'" | '.$sendmail_bin.' ';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
$command .= $_SERVER['argv'][$i].' ';
}
//* rotate log if it gets too big
if(is_file($logfile) && filesize($logfile) > 10000000) {
if(is_file($logfile.'.old')) unlink($logfile.'.old');
exec('cp -pf '.$logfile.' '.$logfile.'.old');
exec('cat /dev/null > '.$logfile);
}
//* Write the log
system('echo "'.date("Y-m-d H:i:s").' '.$_ENV['PWD'].' '.$logline.'" >> '.$logfile);
//* Execute the command
return shell_exec($cmd);
Это логгер всех сообщений с ротированием лог-файла.
Не забудьте указать верный путь к sendmail в переменной $sendmail_bin
Затем сделайте скрипт исполняемым
chmod +x /usr/local/bin/phpsendmail
Создайте лог-файл, смените владельца на пользователя, от которого запускается веб-сервер и дайте ему права на запись
touch /var/log/mail.formchown www-data:www-data /var/log/mail.form
chmod 0700 /var/log/mail.form
Приведите ваш конфигурационный файл php.ini к следующему виду (измените параметр sendmail_path)
[mail function]; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/local/bin/phpsendmail
И перезапустите веб-сервер
/etc/init.d/apache2 restartПроверить логгер можно с помощью нехитрого скрипта:
mail('yourname@yourdomain.com','This is a test message subject','This is a test message body');echo 'Mail sent.';
Запустите этот сценарий через web и проверьте лог:cat /var/log/mail.form
Отправка e-mail писем с вложениями из консоли
$ mail -s "Тема письма" pupkin@mail.ru
Привет!
Я пишу тебе из консоли!
Ctrl+D
Комбинация клавиш Ctrl+D (^D) с новой строки позволяет завершить ввод письма. После этого у меня появляется приглашение ввести получателя копии - просто жму "Enter", и письмо отправляется.
Если тело письма находится в файле, то можно просто воспользоваться перенаправлением входного потока:
$ mail -s "Письмо из файла" pupkin@mail.ru
Аналогично поступаем, если требуется отослать вывод какой-либо команды. Например, следующая команда отошлет мне на мыло содержание текущего каталога:
$ ls | mail -s "Вывод команды" pupkin@mail.ru
Кроме того, утилита позволяет не только читать письма, но и получать их, отвечать и делать прочие полезные манипуляции. Но вот чего она, похоже, не позволяет - так это добавить вложение к письму. Однако, это не беда. Есть немало способов отправить файл из консоли по электронной почте. Я рассмотрю три из них, которые не потребовали от меня разбираться в чем-то или что-то скачивать/устанавливать.
1. Если нужно отправить двоичный файл письмом, можно его просто закодировать с помощью uuencode. Команда будет выглядет следующим образом:
$ uuencode image.jpg image.jpg | mail -s "Метод 1" sombeody@somewhere.net
И хотя файл действительно закодируется и отправится, это не является вложением в полном смысле электронной почты. некоторые почтовые клиенты адэкватно отреагируют на файл в письме, другие же покажут его как простой текст, и раскодировать его придется вручную.
2. С помощью консольной утилиты mpack. Эта утилита пакует файл в сообщение и отсылает полученное сообщение туда, куда изволите.
$ mpack -s "Метод 2" image.jpg sombeody@somewhere.net
3. С помощью полноценного консольного почтового клиента mutt. Можно запустить его, сформировать письмо и отправить куда надо. А можно запустить mutt в режиме эмуляции диалога mailx (параметр -x), при этом передав через параметры все необходимое, чтобы не получать лишних вопросов от этой программы. Второй вариант выглядит так:
$ echo "Смотри вложение" | mutt -x -s "Метод 3" -a image.jpg sombeody@somewhere.net