Украинская Баннерная Сеть

Рубрика архива: mail

Как не превратить свой почтовый сервер в рассадник спама

В последнее время приходится наблюдать определенное увеличение числа спама, рассылаемого при помощи вредоносного ПО через почтовые сервера провайдеров и организаций. В этом случае сами провайдеры и организации, чьи сервера используются для рассылки, страдают в гораздо большей мере, чем получатели спама. Чем чревата рассылка спама через Ваш почтовый сервер и как с этим бороться? Обо всем по порядку.

Когда раньше зомби машины рассылали письма напрямую, то с ними было относительно легко бороться. Часть из них не имела обратной записи и отфильтровывалась на проверках ip, часть на грейлистинге, часть на других фильтрах. Сейчас вредоносное ПО умнеет и в некоторых случаях зомби машины рассылают сообщения через почтовые сервера, которые указаны в настройках почтовых клиентов (Outlook, The Bat! и т.д.). Поскольку почтовый сервер имеет очередь сообщений, корректные DNS записи и т.д. – это позволяет спам сообщению проходить грейлистинг и многие другие фильтры, что доставляет лишних хлопот получателям таким сообщений. Но несоизмеримо больше хлопот такой спам доставляет тем администраторам, через чьи сервера он рассылается.

Как правило у провайдеров и организаций почтовые сервера настроены таким образом, что сообщение от компьютеров из внутренних подсетей принимаются к отправке без всяких ограничений и любой компьютер из внутренней подсети, если будет заражен вредоносным ПО, сможет осуществить спам рассылку через почтовый сервер. Результатом такой спам рассылки будет рост очереди почтовых сообщений, вплоть до десятков тысяч и более писем. Сервер будет заниматься рассылкой десятков и сотен тысяч писем спама в то время как легитимная корреспонденция будет ожидать своей очереди. Таким образом одна единственная рассылка может парализовать нормальное хождение почты на срок от нескольких часов и более в зависимости от объема рассылки. Как же с этим бороться?

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

Поясню на примере postfix’а. Я не буду объяснять как настроить postfix с поддержкой виртуальных пользователей и авторизации, вместо этого я буду полагать, что Вы уже имеете postfix настроенный таким образом. Так вот, если перед рестрикшном “permit_sasl_authenticated” добавить рестрикшн “reject_authenticated_sender_login_mismatch”, чтобы они выглядели примерно так:

...
reject_authenticated_sender_login_mismatch,
permit_sasl_authenticated,
...

то будет следующая картина: если пользователь авторизуется как [email protected] и попытается передать письмо в котором в качестве обратного адреса указан [email protected], то в ответ получит ошибку:

5.7.1 <[email protected]> Sender address rejected: not owned by user [email protected]

Поскольку все сообщения рассылаемые вредоносным ПО имеют поддельный обратный адрес, то таким образом Вы сможете защитить свой почтовый сервер, не допустив его превращения в рассадник спама.

Фильтруем спам правильно. С примерами для postfix.

Содержание:


Структура SMTP сессии

Перед тем как заняться фильтрацией спама нужно четко представлять себе как происходит взаимодействие почтовых серверов при передаче писем. Когда один почтовый сервер пытается передать другому письмо, то между ними всегда происходит диалог, который можно наглядно продемонстрировать. Для того, чтобы продемонстрировать этот диалог воспользуемся утилитой telnet на нашем сервере и попробуем при ее помощи отправить почтовое сообщение на ящик [email protected] от имени [email protected]:

# telnet examplereceiver.com 25
Connected to examplereceiver.com.
Escape character is ‘^]’.
220 examplereceiver.com ESMTP
helo examplesender.com
250 examplereceiver ready to serve
mail from:[email protected]
250 OK
rcpt to:[email protected]
250 OK
data
354 Go ahead
Hello world!
.
250 OK id=1Lu83v-0002nd-Su

Строки выделенные красным – это команды, которые мы посылаем серверу examplereceiver.com, строки выделеныне зеленым – это ответы сервера examplereceiver.com на наши команды. Давайте подробнее разберем что мы передаем и что получаем в ходе SMTP сессии.

Подробнее »

RoundCube. Установка и настройка.

roundcube Roundcube – это web-интерфейс или, если хотите, почтовый клиент, написанный на PHP. Roundcube сочетает в себе приятность дизайна интерфейса и удобство, которое проявляется даже в мелочах, например письма можно перемещать между папками простым перетаскиванием. Из всех известных мне web-интерфейсов на сегодняшний день Roundcube является наиболее красивым и удобным, а к тому же еще и бесплатным. Для работы Roundcube нам потребуется web-сервер Apache, который мы уже установили, а также сервер баз данных MySQL, тоже установленный ранее. В MySQL базе Roundcube будет сохранять настройки пользователей, адресные книги, автоматически добавляемые подписи к сообщениям и т.д.

Начнем с установки Roundcube:

# cd /usr/ports/mail/roundcube
# make config

Отмечаем следующие опции:

[X] MYSQL       Use MySQL backend

Собираем порт:

# make install clean

Создадим базу данных MySQL:

# mysql
mysql> create database roundcube;
mysql> grant all on roundcube.* to 'roundcube'@'localhost' identified by 'roundcube';
mysql> flush privileges;
mysql> quit

Теперь займемся настройкой web-сервера apache для нашего Roundcube. Для скриптов roundcube мы выделим отдельную площадку. Для этих целей создадим пользователя и домашнюю директорию с деревом каталогов под виртуалхост, установим соответствующие права:

# pw useradd roundcube -g www -s “/sbin/nologin” -c “Roundcube”
# mkdir /home/roundcube
# mkdir /home/roundcube/tmp
# mkdir /home/roundcube/webmail.example.com
# chmod -R 770 /home/roundcube

Создадим конфигурационный файл виртуалхоста:

# touch /usr/local/etc/apache/vhosts/roundcube.conf

И отредактируем его:

<Virtualhost>
ServerName webmail.example.com
ServerAdmin [email protected]
DocumentRoot "/home/roundcube/webmail.example.com"

# Поскольку roundcube написан на PHP и мы
# не предполагаем запуск чего-либо кроме PHP скриптов
# на этом виртуалхосте, то на всякий случай отключаем CGI
# и запрещаем изменение параметров ./htaccess'ом
<Directory "/home/roundcube/webmail.example.com">
Options -ExecCGI
AllowOverride None
</Directory>
# Запрещаем PHP скриптам выходить за пределы
# директории виртуалхоста
php_admin_value open_basedir /home/roundcube
php_admin_value safe_mode_include_dir /home/roundcube
php_admin_value safe_mode_exec_dir /noexec
php_admin_value doc_root /home/roundcube
php_admin_value upload_tmp_dir /home/roundcube/tmp
php_admin_value session.save_path /home/roundcube/tmp

# Логирование
ErrorLog /var/log/httpd/roundcube-error.log
TransferLog /var/log/httpd/roundcube-access.log
</Virtualhost>

Перезапускаем apache, чтобы изменения вступили в силу:

# apachectl restart

После установки скрипты Roundcube появились в директории /usr/local/www/roundcube. Скопируем их в директорию, где будет размещаться наш VirtualHost и зададим владельца:

# cp -R /usr/local/www/roundcube/* /home/roundcube/webmail.example.com/
# chown -R roundcube:www /home/roundcube

Заполняем базу данных:

# mysql roundcube < /home/roundcube/webmail.example.com/SQL/mysql.initial.sql

Переходим к настройке Roundcube. Отредактируем файл /home/roundcube/webmail.example.com/config/db.inc.php:

$rcmail_config = array();
$rcmail_config['db_dsnw'] = 'mysql://roundcube:[email protected]/roundcube';
$rcmail_config['db_dsnr'] = '';
$rcmail_config['db_max_length'] = 512000;  // 500K
$rcmail_config['db_persistent'] = FALSE;
$rcmail_config['db_table_users'] = 'users';
$rcmail_config['db_table_identities'] = 'identities';
$rcmail_config['db_table_contacts'] = 'contacts';
$rcmail_config['db_table_session'] = 'session';
$rcmail_config['db_table_cache'] = 'cache';
$rcmail_config['db_table_messages'] = 'messages';
$rcmail_config['db_sequence_users'] = 'user_ids';
$rcmail_config['db_sequence_identities'] = 'identity_ids';
$rcmail_config['db_sequence_contacts'] = 'contact_ids';
$rcmail_config['db_sequence_cache'] = 'cache_ids';
$rcmail_config['db_sequence_messages'] = 'message_ids';

Теперь отредактируем файл /home/roundcube/webmail.example.com/config/main.inc.php:

 $rcmail_config = array();
$rcmail_config['debug_level'] = 1;
$rcmail_config['enable_caching'] = TRUE;
$rcmail_config['message_cache_lifetime'] = '10d';
$rcmail_config['auto_create_user'] = TRUE;
$rcmail_config['default_host'] = 'localhost';
$rcmail_config['default_port'] = 143;
$rcmail_config['username_domain'] = '';
$rcmail_config['mail_domain'] = '';
$rcmail_config['virtuser_file'] = '';
$rcmail_config['virtuser_query'] = '';
$rcmail_config['smtp_server'] = '';
$rcmail_config['smtp_port'] = 25;
$rcmail_config['smtp_user'] = '';
$rcmail_config['smtp_pass'] = '';
$rcmail_config['smtp_auth_type'] = '';
$rcmail_config['smtp_helo_host'] = '';
$rcmail_config['smtp_log'] = TRUE;
$rcmail_config['list_cols'] = array('subject', 'from', 'date', 'size');
$rcmail_config['skin_path'] = 'mvision';
$rcmail_config['skin_include_php'] = FALSE;
$rcmail_config['temp_dir'] = 'temp/';
$rcmail_config['log_dir'] = 'logs/';
$rcmail_config['session_lifetime'] = 10;
$rcmail_config['ip_check'] = false;
$rcmail_config['double_auth'] = false;
$rcmail_config['des_key'] = 'rcmail-!24ByteDESkey*Str';
$rcmail_config['locale_string'] = 'ru';
$rcmail_config['date_short'] = 'D H:i';
$rcmail_config['date_long'] = 'd.m.Y H:i';
$rcmail_config['date_today'] = 'H:i';
$rcmail_config['useragent'] = 'RoundCube Webmail/0.1';
$rcmail_config['product_name'] = 'RoundCube Webmail';
$rcmail_config['imap_root'] = '';
$rcmail_config['drafts_mbox'] = 'Drafts';
$rcmail_config['junk_mbox'] = 'Junk';
$rcmail_config['sent_mbox'] = 'Sent';
$rcmail_config['trash_mbox'] = 'Trash';
$rcmail_config['default_imap_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
$rcmail_config['create_default_folders'] = TRUE;
$rcmail_config['protect_default_folders'] = TRUE;
$rcmail_config['skip_deleted'] = FALSE;
$rcmail_config['read_when_deleted'] = TRUE;
$rcmail_config['flag_for_deletion'] = FALSE;
$rcmail_config['enable_spellcheck'] = TRUE;
$rcmail_config['spellcheck_uri'] = '';
$rcmail_config['spellcheck_languages'] = NULL;
$rcmail_config['generic_message_footer'] = '';
$rcmail_config['mail_header_delimiter'] = NULL;
$rcmail_config['dont_override'] = array();
$rcmail_config['javascript_config'] = array('read_when_deleted', 'flag_for_deletion');
$rcmail_config['include_host_config'] = FALSE;

/***** these settings can be overwritten by user's preferences *****/
$rcmail_config['pagesize'] = 40;
$rcmail_config['timezone'] = intval(date('O'))/100 - date('I');
$rcmail_config['dst_active'] = (bool)date('I');
$rcmail_config['prefer_html'] = TRUE;
$rcmail_config['htmleditor'] = TRUE;
$rcmail_config['prettydate'] = TRUE;
$rcmail_config['message_sort_col'] = 'date';
$rcmail_config['message_sort_order'] = 'DESC';
$rcmail_config['draft_autosave'] = 300;
$rcmail_config['max_pagesize'] = 200;
$rcmail_config['preview_pane'] = TRUE;

RoundCube установлен и готов к работе.

Postgrey. Установка и настройка грейлиста

Postgrey – это policy демон для postfix, который реализует технологию серых списков (greylist). На сегодняшний день практически весь спам рассылается из так называемых бот-нетов. Ботнет представляет собой набор компьютеров, зараженных вирусами (так называемые компьютеры-”зомби“), которые позволяют хозяину вируса управлять зараженным хостом, в том числе использовать его для рассылки спама. Грейлистинг призван помочь отличить зомби от честного сервера. Алгоритм работы грейлистинга основан на том факте, что зомби в по ряду причин не умеют хранить очередь почтовых сообщений, в связи с чем поведение зомби отличается от поведения честного почтового сервера с очередью сообщений. Что случится если сервер попытается передать почтовое сообщение, но во время передачи сервер получателя вернет ему временную ошибку (код SMTP ошибки: 4хх)? Правильно. Сервер отложит это письмо в очередь и через некоторое время снова попытается отправить сообщение. Зомби же не будет предпринимать попыток повторной отправки, поскольку не умеет обрабатывать очередь сообщений.

Принцип работы грейлиста следующий. Грейлист в момент приема сообщения “запоминает” так называемый триплет – набор из трех характеристик сообщения:
– Адрес отправителя сообщения
- Адрес получателя сообщения
- IP-адрес хоста, который передает сообщение

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

Единственный минус грейлиста в том, что честные сообщения задерживаются на какое-то время (обычно 15-30 минут), но радует хотя бы тот факт, что задерживается только по одному письму (первому) от каждого отправителя. Если от некоего отправителя сообщение успешно прошло грейлист, то все последующие сообщения от этого отправителя будут приниматься с первого раза и без задержек.

Ну а теперь попробуем разобраться с установкой postgrey. Она, к счастью, предельно простая:

# cd /usr/ports/mail/postgrey/
# make install clean

Теперь займемся настройкой postgrey. Нам нужно указать postfix’у каким образом общаться с postgrey. По умолчанию postgrey будет слушать на порту 10023. Открываем /usr/local/etc/postfix/main.cf, внимательно изучаем опцию “smtpd_recipient_restrictions” и в конце всех проверок добавляем наш грейлист (check_policy_service inet:127.0.0.1:10023). В итоге это будет выглядеть примерно так:

smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_sender,
reject_non_fqdn_recipient,
reject_unauth_pipelining,
reject_invalid_hostname,
check_policy_service inet:127.0.0.1:10023

В файле /etc/rc.conf разрешаем запуск postgrey:

postgrey_enable="YES"

Запускаем postgrey, рестартим postfix:

# /usr/local/etc/rc.d/postgrey start
# postfix reload

Всё. Мы имеем полностью настроенный и работающий грейлист.

Стоит отметить, что иногда администратору может потребоваться определить список исключений, чтобы определенные сообщения не грейлистились вообще никогда. Для этого в postgrey есть белые списки. Определяются списки в файлах:
- postgrey_whitelist_clients – список хостов отправителей (не грейлистить сообщения от указанных хостов)
- postgrey_whitelist_recipients – список ящиков локальных получателей (не грейлистить сообщения для указанных получателей)

PostfixAdmin. Установка и настройка

postfixadminPostfixAdmin – это web-интерфейс, который призван облегчить такие рутинные задачи как: добавление и удаление доменов, почтовых ящиков и алиасов, изменение паролей к почтовым ящикам. Кроме этого при помощи postfixadmin доменам можно назначать своих администраторов, которые будут иметь возможность добавлять и удалять почтовые ящики и алиасы на вверенном им домене, изменять пароли.

Нам потребуются установленные apache и MySQL.
Как установить apache: http://wolandblog.com/387-apache-ustanovka-nastroyka
Как установить MySQL: http://wolandblog.com/1341-ustanovka-i-nastrojka-mysql-5-1-utf-8-v-freebsd

Установим PostfixAdmin:

# cd /usr/ports/mail/postfixadmin/
# make config

Отмечаем нужные опции:

[X] MYSQL   MySQL back-end (use mysql PHP extension)

Собираем порт:

# make install clean

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

Для скриптов postfixadmin мы выделим отдельную площадку. Для этих целей создадим пользователя и домашнюю директорию с деревом каталогов под виртуалхост, установим соответствующие права:

# pw useradd postfixadmin -g www -s “/sbin/nologin” -c “PostfixAdmin”
# mkdir /home/postfixadmin
# mkdir /home/postfixadmin/tmp
# mkdir /home/postfixadmin/admin.example.com
# chmod -R 770 /home/postfixadmin

В директории /home/postfixadmin/tmp будут размещаться временные файлы, генерируемые PHP скриптом (сессии, к примеру), а в директории /home/postfixadmin/admin.example.com – скрипты postfixadmin. Перенесем их в эту директорию и зададим нужного владельца на дерево каталогов:

# cp -R /usr/local/www/postfixadmin/* /home/postfixadmin/admin.example.com/
# chown -R postfixadmin:www /home/postfixadmin

Создадим базу данных для posfixadmin:

# mysql
mysql> create database postfix;
mysql> grant all on postfix.* to 'postfix'@'localhost' identified by 'postfix';

Создадим файл /home/postfixadmin/admin.example.com/config.local.php и отредактируем его (для совместимости с последующими версиями не рекомендуется редактировать config.inc.php, вместо этого рекомендуется заносить измененные опции в config.local.php):

$CONF['postfix_admin_url'] = 'http://admin.example.com/';
$CONF['theme_css'] = 'css/default.css';
$CONF['postfix_admin_path'] = dirname(__FILE__);
$CONF['default_language'] = 'ru';
$CONF['database_type'] = 'mysql';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfix';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';
$CONF['admin_email'] = [email protected]';
$CONF['smtp_server'] = 'localhost';
$CONF['smtp_port'] = '25';
$CONF['encrypt'] = 'md5crypt';
$CONF['generate_password'] = 'NO';
$CONF['page_size'] = '10';
$CONF['default_aliases'] = array (
'abuse' => [email protected]'
);
$CONF['domain_path'] = 'NO';
$CONF['domain_in_mailbox'] = 'YES';
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '10';
$CONF['maxquota'] = '10';
$CONF['quota'] = 'NO';
$CONF['quota_multiplier'] = '1024000';
$CONF['transport'] = 'NO';
$CONF['vacation'] = 'NO';
$CONF['vacation_domain'] = '';
$CONF['alias_control'] = 'NO';
$CONF['special_alias_control'] = 'YES';
$CONF['logging'] = 'YES';
$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Return to admin.example.com';
$CONF['footer_link'] = 'http://admin.example.com';
$CONF['welcome_text'] = 'Hi, Welcome to your new account.';

Теперь переходим к настройке виртуалхоста для postfixadmin. В созданной нами директории для конфигурационных файлов виртуалхостов (/usr/local/etc/apache/vhosts) создаем файл postfixadmin.conf:

touch /usr/local/etc/apache/vhosts/postfixadmin.conf

Редактируем его:

<Virtualhost>
ServerName admin.example.com
ServerAdmin [email protected]
DocumentRoot "/home/postfixadmin/admin.example.com"

# Поскольку postfixadmin написан на PHP и мы
# не предполагаем запуск чего-либо кроме PHP скриптов
# на этом виртуалхосте, то на всякий случай отключаем CGI
# и запрещаем изменение параметров ./htaccess'ом

<Directory /home/postfixadmin/admin.example.com>
Options -ExecCGI
AllowOverride None
</Directory>

# Запрещаем PHP скриптам выходить за пределы
# директории виртуалхоста
php_admin_value open_basedir /home/postfixadmin
php_admin_value safe_mode_include_dir /home/postfixadmin
php_admin_value safe_mode_exec_dir /noexec
php_admin_value doc_root /home/postfixadmin
php_admin_value upload_tmp_dir /home/postfixadmin/tmp
php_admin_value session.save_path /home/postfixadmin/tmp

# Логирование
ErrorLog /var/log/httpd/postfixadmin-error.log
TransferLog /var/log/httpd/postfixadmin-access.log
</Virtualhost>

Рестартим apache:

# apachectl restart

Открываем в браузере адрес: http://admin.example.com/setup.php
PostfixАdmin создаст базу данных. Затем на этой же странице вводим инсталляционный пароль (зачем он нужен – ниже), postfixadmin сгенерирует хеш, этот хеш помещаем в config.local.php:

#$CONF['setup_password'] = 'hashed_password';

Возвращаемся на страницу http://admin.example.com/setup.php и с помощью инсталляционного пароля добавляем аккаунт главного админа. В дальнейшем можно будет добавлять главных админов с помощью этого инсталляционного пароля. Так что лучше удалить setup.php от греха подальше. В случае необходимости сходить на сайт postfixadmin’а и взять его из тарбола труда не составит, если, конечно, Вы каждый день не добавляете супер админов :) Удаляем setup.php:

# rm /home/postfixadmin/admin.example.com/setup.php

Всё, PostfixAdmin установлен.


Украинская Баннерная Сеть
Hosting Catalog Rambler's Top100