Контроль переписки в Postfix («большой брат» следит за тобой)
Задача - требуется контролировать переписку определенных сотрудников (официальная версия - создать backup почтовой переписки с возможностью последующего просмотра). Другими словами необходимо, чтобы при отправке письма пользователем (например, user@mydomain.ru), доставлял его почту как обычно адресату, а также дублировал это письмо в определенный ящик (например, big_brother@mydomain.ru).
На первый взгляд задача довольно не простая, но как оказалось - всё довольно легко реализуется. Имеем - операционная система FreeBSD и почтовый сервер на базе Postfix. Вот какие возможности для решения этой задачи предоставляет нам Postfix:
- always_bcc = address
- sender_bcc_maps = type:table и recipient_bcc_maps = type:table
Доставляет копии ВСЕХ сообщений (входящих и исходящих) на указанный адрес (поддерживается с Postfix v.2.1). Например, указав в /usr/local/etc/postfix/mail.cf строку always_bcc = backup@mydomain.ru можно сделать полный бэкап всей почты на адрес backup@mydomain.ru, вот только не повезет тому, кто это всё разгребать будет.
Таблицы соответствия отправителя/получателя с адресами доставки копий сообщений (функция доступна в Postfix 2.1 и выше.) То что нам и нужно.
Рассмотрим 2 варианта реализации - на основе файлов (индексированных карт hash) и базы данных MySQL.
Способ с использованием индексированных hash карт
Мы можем контролиривать, что хотим получить в результате - копировать на определенный ящик только отправляемые пользователем сообщения или только входящие, а может и то и другое.
Для примера рассмотрим вариант копирования исходящих сообщений:
1. Создаем файл в каталоге /usr/local/etc/postfix/, содержащий записи о том с какого почтового адреса копировать почту и на какой отправлять копии - назовем его sender_bcc. Добавляем в него строчку в формате:
user@mydomain.ru backup@mydomain.ru user2@mydomain.ru backup@mydomain.ru
2. Добавляем в main.cf строчку
sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
3. Обязательно создаем индексированный файл:
postmap /usr/local/etc/postfix/sender_bcc
4. Перезагружаем постфикс и любуемся копированием исходящей почты.
Аналогичные шаги нужно проделать для получения возможности копирования входящей почты. Вместо sender_bcc_maps следует использовать recipient_bcc_maps.
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
Внимание! После внесения изменений не забываем перестроить хэш:
postmap /usr/local/etc/postfix/recipient_bcc postmap /usr/local/etc/postfix/sender_bcc
Способ с использованием MySQL
Подразумевается, что вы уже используете MySQL совместно с Postfix для хранения учетных записей, транспорта и т.д.
1. Создаем табличку bcc в вашей базе данных
CREATE TABLE bcc ( id int(10) unsigned NOT NULL auto_increment, sender varchar(128) NOT NULL default '', recipient varchar(128) NOT NULL default '', copy varchar(128) NOT NULL default '', PRIMARY KEY (id) ) TYPE=MyISAM;
2. в /usr/local/etc/postfix/ создаем файлы sender_bcc.cf и recipient_bcc.cf:
sender_bcc.cf
user = postfix_user password = postfix_password dbname = mail_database query = SELECT copy FROM bcc WHERE sender = '%s' hosts = 127.0.0.1
recipient_bcc.cf
user = postfix_user password = postfix_password dbname = mail_database query = SELECT copy FROM bcc WHERE recipient = '%s' hosts = 127.0.0.1
3. В main.cf добавляем строчки
sender_bcc_maps = mysql:/usr/local/etc/postfix/sender_bcc.cf recipient_bcc_maps = mysql:/usr/local/etc/postfix/recipient_bcc.cf
4. Перезапускам Postfix для применения изменений. Изменения данных в таблице MySQL bcc применяются без перезапуска Postfix.
Избавляемся от дублирования сообщений bcc_maps
Чтобы не происходило дублирования почты при использовании bcc_maps в master.cf следует добавить строчку:
-o receive_override_options=no_address_mappings
В моём случае это выглядит так:
smtp inet n - n - - smtpd #AntiSPAM + DrWeb -o receive_override_options=no_address_mappings -o content_filter=kas3scan:127.0.0.1:9026
Напоследок - неплохая статья по настройке Postfix , хотя сам несколько иначе строил, но руки пока не доходят написать свою статью полностью. Хотя есть некоторые наработки, описания которых не встречал в сети.
Комментариев: 15
Большой брат всегда следит за тобой :)
Ммм.. Спасибо автору.. То что доктор прописал =)
Спасибо автор, нужная вещь как раз искал реализацию!
Только есть еще вопрос "Избавляемся от дублирования сообщений bcc_maps" это нужно прописывать для всех вариантов или только тем кто юзает MySQL
попробовал настроить пересылку исходящих писем посредством hash. Возник вопрос:
пересылка возможна на ящик из другого домена? или только на ящик в родном домене ? Заранее спасибо.
Значит, то что доктор прописал(2 способ), создаём табличку, и всё хорошо, тогда стоит немного подумать, 1. чтобы всё в кучу не валить, нам необходимо для каждого пользователя создать ящик backup, прописать его в 2 таблицы, в этом случае у нас все входящие-исходящие для данного письма будут валится в одну папку на сервере, свалочка получится, по хорошему для каждого пользователя надо будет создать дополнительно 2 почтовых ящика, user_backup_from и user_backup_to.. Нехорошо получается, геморно это, может кто расскажет, как будут ходить письма внутри домена? одно и то же письмо будет сохранено 2 раза? как то опять нехорошо... Может валить всё в кучу, отправлять логи postfix в mysql, потом на это всё хозяйство натянуть веб морду с возможностью выгрузки файлов в отдельный каталог по отдельному пользователю, зато ни таблиц, ни лишнего мусора и всегда удобно подглядеть, восстановить
А есть ли возможность делать исключения?
Т.е. чтобы делались бекапы всей исходящей почты домена, кроме 2 ящиков.
Подскажите а как может произойти дублирование, которое вы лечите редактированием master.cf?
спасибо огромной за отключение дублирования
-o receive_override_options=no_address_mappings
очень помогло.
Мега респект!!!!!
Потратил целый день на буржуйских форумах на решение проблемы с дублированием. Нигде ни слова про опцию, только вопросы как убрать дублирование и ни одного ответа!
Спасибо огромное!
Пасибо
еще немного докрутил свой сервер до того чего хочется
жаль только не получается через MySQL организовать пересылку скажем входящих от одного пользователя нскольким а не одному
Всем привет.
Скажите есть ли возможность и как это реализовать. Допустим чтоб если письмо от pupkin@mail.ru пришло на andrey@mydomen.ru, то только тогда копия письма приходит большому брату.
Я так понял что вы хотите сделать копирование писем определенного отправителя на ящик одного из ваших пользователей. Можно конечно попробовать добавить этого отправителя в sender_bcc: pupkin@mail.ru backup@mydomain.ru
Не знаю правда будет такое работать или нет, сейчас нет возможности проверить... но даже чисто теоретически это правило всё равно распространяется на всех пользователей вне зависимости кому отправлено сообщение, а не на кого-то конкретно. Возможно в новой версии postfix это как-то реализовано, нужно читать документацию.
Спасибо за статью!
Последние версии PostfixAdmin поддерживают добавление адресов, на которые будет копироваться почта, однако письма приходят в двух экземплярах. После добавления:
все работает, как положено!
Привет.
А как в случай mysql сделать несколько получателей ?