среда, 27 июля 2011 г.

Контроль переписки в Postfix или Big Brother watching you

Иногда, необходимо контролировать переписку определенных сотрудников или же всех сотрудников. Т.е. чтобы при отправке письма пользователем, его почта доставлялась как обычно адресату, а также дублировалось письмо в определенный ящик.

Для доставки копии ВСЕХ сообщений (входящих и исходящих) на указанный адрес (поддерживается с Postfix v.2.1) добавляем в /etc/postfix/main.cf добавляем вот такой вот параметр:

always_bcc = address

где address - мыло ящика, куда необходимо дублировать ВСЕ месаджи от ВСЕХ

Для контроля определенных сотрудников необходимо использовать таблицы соответствия отправителя/получателя с адресами доставки копий сообщений sender_bcc_maps = type:table и recipient_bcc_maps = type:table

Рассмотрим 2 варианта реализации - на основе файлов (индексированных карт hash) и базы данных MySQL.

Способ с использованием индексированных hash карт

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

Для копирования исходящих сообщений:

Создаем файл /etc/postfix/sender_bcc. Внутрь помещаем правило о том с чьего мала и куда слать копию:
user@mydomain.ru backup@mydomain.ru
user2@mydomain.ru backup@mydomain.ru

Добавляем в main.cf мапу на этот файл:
sender_bcc_maps = hash:/etc/postfix/sender_bcc

Индексируем:
#>postmap /etc/postfix/sender_bcc

Перезагружаем постфикс и любуемся копированием исходящей почты :).

По аналогии в /etc/postfix/recipient_bcc создаем правило для копирования входящей почты:
user@mydomain.ru backup@mydomain.ru
user2@mydomain.ru backup@mydomain.ru

И опять же добавляем в main.cf мапу на этот файл:
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc

Индексируем:
#>postmap /etc/postfix/recipient_bcc

ВАЖНО!!! Если в последствии в файлы /etc/postfix/recipient_bcc и /etc/postfix/sender_bcc вносятся изменения - необходимо перестраивать их хэш (периндексировать):

#>postmap /etc/postfix/recipient_bcc
#>postmap /etc/postfix/sender_bcc


Способ с использованием MySQL

Подразумевается, что уже используется MySQL совместно с Postfix для хранения учетных записей, транспорта и т.д.

Создаем таблицу bcc-ей в базе данных:

#>mysql -p mail

mysql>CREATE TABLE IF NOT EXISTS 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)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8;

В /etc/postfix/ создаем файлы sender_bcc.cf:

user = mail_admin
password = mailadminpass
dbname = mail
query = SELECT copy FROM bcc WHERE sender = '%s'
hosts = 127.0.0.1

и recipient_bcc.cf:

user = mail_admin
password = mailadminpass
dbname = mail
query = SELECT copy FROM bcc WHERE recipient = '%s'
hosts = 127.0.0.1

В /etc/postfix/main.cf добавляем:

sender_bcc_maps = mysql:/usr/local/etc/postfix/sender_bcc.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/recipient_bcc.cf

Перезапускам Postfix для применения изменений. Изменения данных в таблице MySQL bcc применяются без перезапуска Postfix.

Избавляемся от дублирования сообщений bcc_maps

Чтобы не происходило дублирования почты при использовании bcc_maps в /etc/postfix/master.cf следует добавить строчку перед conten_filter. Т.е. должно быть где-то так:

smtp      inet  n       -       n       -       -       smtpd
-o content_filter=
-o receive_override_options=no_address_mappings

Замечание! Если на серваке крутится несколько виртуальных доменов, и надо "копировать" переписку только с одного домена, то в качестве sender или recipient необходимо указывать маску. Например, @mydomen1.com

Жопиздан:)

Комментариев нет:

Отправить комментарий