Рубрика:
Администрирование /
Электронная почта
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Виктор Венявский
Используем Gmail в качестве внешнего фильтра для корпоративной почты
Уже многие оценили качество фильтрации спама и вирусов такого сервиса, как Gmail. Он позволяет размещать почтовую службу для целого домена на своих серверах, после чего почта становится доступна как через Web, так и по протоколу POP3. Такая комбинация возможностей и дает нам способ использовать Gmail как внешний фильтр для почты.
Структура и этапы настройки почты
В статье не описывается настройка почтовой системы на серверах, предполагаем, что почта на корпоративном сервере уже настроена и работает.
Из статьи вы узнаете, как разместить почтовые ящики на Gmail и как получать с них почту по протоколу POP3 для дальнейшего раскладывания в ящики на корпоративном почтовом сервере. Итак, шаги настройки будут включать:
- Создание учетной записи на Gmail.
- Проверка владельца домена на Gmail.
- Создание пользователей на Gmail.
- Установка и настройка fetchmail.
- Изменение MX-записей.
- Тестирование.
- Дополнительные возможности.
Создание учетной записи на Gmail
Gmail предоставляет два уровня сервиса – коммерческий и бесплатный. В таблице 1 показаны наиболее значимые различия между ними.
Я оставлю выбор версии на ваше усмотрение. Исходя из личного опыта могу сказать, что бесплатная версия очень стабильная, и если нет необходимости коммерческой поддержки почты (например, почтовая служба предоставлена компании-владельцу домена на коммерческой основе), то, как правило, бесплатной версии более чем достаточно. В этой статье я расскажу об использовании бесплатной версии.
Таблица 1. Различия в уровнях сервиса
|
Платная версия
|
Бесплатная версия
|
Стоимость
|
$50 US в год на каждого пользователя
|
–
|
Гарантия 99.9% стабильности
|
Да
|
Нет
|
Дисковое пространство
|
10 Гб на пользователя
|
2 Гб на пользователя
|
Программный интерфейс (API)
|
Да
|
Нет
|
Круглосуточная поддержка
|
Да
|
Нет
|
Название пакета
|
Premier Edition
|
Standard Edition, Education Edition
|
Итак, начинаем создавать учетную запись на Gmail. Для этого идем по адресу http://www.google.com/a, нажимаем на кнопку «Get Started», затем выбираем один из уровней пакета «Standard Edition», «Premier Edition» или «Education Edition». Далее проходим стандартную процедуру регистрации. После завершения регистрации вы попадете на стартовую страницу (см. рис. 1).
Рисунок 1. Стартовая страница
Проверка владельца домена на Gmail
Служба Gmail требует прохождения этапа проверки владельца домена. Для этого необходимо перейти по ссылке «Verify domain ownership» на стартовой странице. Процедура проверки может происходить по одному из двух сценариев:
- Создание CNAME в DNS.
- Загрузку специального файла на сайт домена.
Автор выбрал загрузку файла на сайт домена. Для этого необходимо создать файл http://ваш-домен/googlehostedservice.html и положить в этот файл содержимое, которое вы получите на странице проверки владельца домена (cм. рис. 2).
Рисунок 2. Проверка владельца домена
Создание пользователей на Gmail
На этом этапе нам необходимо создать на Gmail все существующие почтовые ящики. Панель администратора на Gmail предоставляет возможность загрузки списка пользователей. Для перехода на страницу загрузки списка пользователей идем по ссылкам «Users accounts», затем «Upload many users at once». В результате попадаем на страницу, которая предлагает загрузку списка пользователей в формате csv (comma-separated values, данные, разделенные запятыми).
Создаем простой текстовый файл, где каждая строка представляет информацию о каждом пользователе в формате: «Имя почтового ящика, имя, фамилия, пароль». Например:
info, Алексей, Федоров, password1
dns, Константин, Сергеев, password2
После создания файла загружаем его на страницу создания пользователей, и на этом этапе процесс создания почтовых ящиков на Gmail завершен.
Примечание: опцию «Require a password change when new or updated users sign in» (требовать от пользователя сменить пароль при следующем входе в систему) необходимо оставить выключенной.
Установка и настройка fetchmail
Fetchmail – программа, позволяющая получать почту по протоколам POP3, IMAP или SMTP для дальнейшей отправки по протоколу SMTP (локальная доставка тоже поддерживается). Мы будем получать почту с помощью протокола POP3 со всех почтовых ящиков на Gmail и отправлять ее на локальный SMTP-сервер.
Установка fetchmail
Я использую в работе дистрибутив CentOS версии 4.4 (один из дистрибутивов GNU/Linux). Для других платформ процедура не должна сильно отличаться. Скачиваем архив программы с домашней страницы проекта, расположенной на http://fetchmail.berlios.de.
Раскрываем и устанавливаем:
tar -xzvf fetchmail-xx.tgz
cd fetchmail-xx
./configure
make
make install
Конфигурация fetchmail
Работа fetchmail контролируется файлом, в котором описаны адреса POP-серверов, имена пользователей, а также куда отправлять почту после получения ее по протоколу POP3. Синтаксис для нашего случая приведен ниже:
poll pop3-servername proto protocol:
user "pop username" password "password" options ssl to local_username here nokeep
где:
- pop3-servername – адрес POP3-сервера. Для службы Gmail имя сервера – pop.gmail.com.
- protocol – протокол, используемый для получения почты по POP3. Для Gmail протокол – POP3.
- password – незашифрованный пароль для доступа к POP3-ящику.
- local_username – имя почтового ящика на локальном почтовом ящике.
И таких записей должно быть столько, сколько у нас пользователей.
Для наших двух пользователей файл настройки может выглядеть следующим образом:
set syslog
poll pop.gmail.com proto pop3:
user "info@domain.tld" password "password1" options ssl to info here
poll pop.gmail.com proto pop3:
user "dns@domain.tld" password "password2" options ssl to dns here
Первая строка указывает fetchmail на вывод отладочных сообщений в syslog.
Создаем файл fetcmailrc и выкладываем его на наш почтовый сервер в безопасное место. Помните, что этот файл содержит незашифрованные пароли пользователей, поэтому владелец файла должен быть root и права доступа должны быть 600. Автор расположил этот файл в /etc/fetchmail/fetchmailrc.
Запуск fetchmail
Одним из достоинств fetchmail является его способность работать в режиме демона. Для запуска fetchmail в этом режиме при перезагрузке сервера создаем скрипт запуска в /etc/init.d/fetchmail:
#!/bin/sh
# chkconfig: 2345 55 25
# description: fetchmail daemon
case "$1" in
start)
echo -n "Starting: fetchmail"
/usr/bin/fetchmail -f /etc/fetchmailrc -D domain_name -d interval -v
echo "."
;;
stop)
echo -n "Stopping service: fetchmail"
killall fetchmail
echo "."
;;
restart)
$0 stop
sleep 2
$0 start
;;
*)
echo "Usage: /etc/init.d/fetchmail {start|stop|restart}" >&2
exit 1
;;
esac
exit 0
где:
- domain_name – имя нашего домена;
- interval – время ожидания после каждого получения почты с Gmail.
Далее необходимо запустить демон и включить его в процесс загрузки при старте сервера:
/etc/init.d/fetchmail start
chkconfig fetchmail on
Процедура включения демона в процесс загрузки указано для RedHat-подобных систем.
Предварительное тестирование
Если все процедуры прошли удачно (включая процедуру проверки владельца домена и загрузки пользователей), то в сообщениях syslog (обычно это файл maillog) мы должны увидеть события:
6.2.5 querying pop.gmail.com (protocol POP3)
POP3< +OK Gpop ready for requests from xx.xx.xx.xx 2pf796759nfv
POP3> USER info@domain.tld
POP3< +OK send PASS
POP3> PASS *
POP3< +OK Welcome.
POP3> DELE 1
POP3< +OK marked for deletion
POP3> QUIT
|
Часть сообщений удалена ввиду их ненужности.
Переключение MX-записей
Это наиболее важный момент, поэтому для переключения MX-записей нужно выбрать время использования с минимальным уровнем активности. Рекомендуется выставить минимальное время TTL (time to live) в DNS и выждать 2-3 дня. Я выставил 5 минут на время процедуры изменения MX-записей, чтобы в случае проблем можно переключить обратно.
Заходим на Gmail как администратор и идем на страницу получения списка MX-записей. Для этого необходимо перейти по ссылкам «Service settings -> Email -> Instructions on how to activate email -> Change MX records». В результате попадаем на страницу, где приведен список MX-записей, которые нужно внести в настройки DNS, обслуживающих вашу зону (см. рис. 3).
Рисунок 3. Список MX-настроек
Вам необходимо удалить все MX-записи из настроек DNS-cервера, который обслуживает вашу зону, и добавить MX-записи, как указано на этой странице. Для DNS-сервера BIND это может выглядеть следующим образом:
IN MX 1 ASPMX.L.GOOGLE.COM.
IN MX 5 ALT1.ASPMX.L.GOOGLE.COM.
IN MX 5 ALT2.ASPMX.L.GOOGLE.COM.
IN MX 10 ASPMX2.GOOGLEMAIL.COM.
IN MX 10 ASPMX3.GOOGLEMAIL.COM.
IN MX 10 ASPMX4.GOOGLEMAIL.COM.
IN MX 10 ASPMX5.GOOGLEMAIL.COM.
Опциально можно оставить адрес корпоративного сервера в списке MX с минимальным приоритетом на тот случай, если все почтовые серверы Gmail недоступны. Хотя в этом случае есть вероятность получения спама или вирусов. Об этом подробнее объяснено в последнем разделе.
Полное тестирование и завершение настроек
На данном этапе нужно протестировать все почтовые адреса для исключения ошибок. Для этого можно воспользоваться двумя простыми скриптами, один – для отправки, второй – для проверки факта получения тестового сообщения на локальном POP3-сервере после отработки fetchmail. Входными параметрами для обоих скриптов является список пользователей в формате CSV, который мы создали ранее для загрузки на Gmail.
Внимание! Скрипт, который отправляет почту, необходимо запускать на компьютере, отличном от почтового сервера, иначе почта будет доставлена напрямую локально, без участия Gmail.
Итак, первый скрипт для отправки тестового сообщения, скрипт send.pl:
#!/usr/bin/perl
use strict;
my $local_domain = 'domain.tld';
my @emails;
open(F, "users.csv") || die "can not open users.csv";
my @emails=<F>;
chomp(@emails);
close(F);
foreach my $i(@emails)
{
my ($email,$fname,$lname,$password) = split(/\,/,$i);
open(M, "| mail -s gmail-test $email\@$local_domain");
print M "gmail-test\n";
close(M);
}
Вместо домена «domain.tld» в 3-й строке необходимо поставить имя вашего домена.
Второй скрипт подключается к локальному POP3-серверу, получает сообщения для каждого почтового ящика и ищет сигнатуру «gmail-test» в содержимом сообщений.
Скрипт receive.pl:
01. #!/usr/bin/perl
02. use Net::POP3;
03. use strict;
04. my $pop3_host = 'pop3.domain.tld';
05. my $local_domain = 'domain.tld';
06. my @emails;
07. open(F, "users-list.csv") || die "can not open users-list.csv";
08. my @emails=<F>;
09. chomp(@emails);
10. close(F);
11. foreach my $i(@emails)
12. {
13. my ($email,$fname,$lname,$password) = split(/\,/,$i);
14. my $pop_username=$email;
15. $pop_username .= '@' . $local_domain;
16. print "testing $email with $password\n";
17. my $pop = Net::POP3->new($pop3_host, Timeout => 60);
18. if ($pop->login($pop_username, $password) > 0)
19. {
20. my $msgnums = $pop->list;
21. foreach my $msgnum (keys %$msgnums)
22. {
23. my $msg = $pop->get($msgnum);
24. if(grep /test/, @$msg){
25. print "email $email is fine\n";
26. }
27. else{
28. print "email $email is bad\n";
29. }
30. }
31. }
32. else{
33. print "failed to login to pop3 using $pop_username with password $password\n";
34. }
35. $pop->quit;
36. }
Несколько замечаний:
- В строке 4 необходимо прописать адрес вашего POP3-сервера в переменной $pop3_host.
- В строке 5 в переменной $local_domain нужно прописать имя вашего домена.
- Если для авторизации на вашем почтовом сервере используются длинные имена в формате «username@domain.tld», то строку 15 нужно раскомментировать.
Сам процесс тестирования очень прост и включает в себя четыре шага:
- Отправляем тестовые сообщения на Gmail с помощью send.pl.
- Ждем несколько минут, пока сообщения не будут доставлены на Gmail.
- Запускаем демон fetchmail и ждем, пока он не отработает (процесс можно увидеть в системных сообщениях).
- Запускаем скрипт receive.pl и наблюдаем процесс сканирования сообщений уже на локальном POP3-сервере.
В зависимости от результата этот скрипт распечатает «email email@domain.tld is fine» или «email email@domain.tld is bad». Если в момент проверки какого-либо почтового ящика получаем сообщение об ошибке, необходимо проверить настройки этого почтового ящика на всех компонентах системы.
Gmail на Web
Если на вашем сервере отсутствует такая служба, как webmail, то можно опять воспользоваться возможностями Gmail, которая позволяет пользователям заходить на почтовую службу под вашим доменным именем, например http://webmail.domain.tld. В этом разделе я расскажу, как активировать эту возможность. Для этого нам надо предпринять следующие шаги:
- Настройка адреса webmail на службе Gmail.
- Написание скрипта для проверки действительности паролей.
- Настройка SPF.
- Тестирование SPF (опционально).
Настройка адреса webmail на службе Gmail
Для начала необходимо сообщить Gmail, что у нас есть собственный адрес для webmail. Для этого входим на Gmail по адресу https://www.google.com/a/cpanel/domain.tld/EmailSettings как администратор домена, далее идем по ссылкам «Service Settings», «Email». Находим пункт «Web address» и нажимаем на ссылку «Change URL».
Далее выбираем «Custom http» и вводим адрес, на котором мы хотим видеть нашу веб-почту. На следующей странице, после нажатия на кнопку «Continue», вы обнаружите инструкции по настройке вашего DNS для создания адреса веб-почты. Эти инструкции сводятся к добавлению записи CNAME, указывающей на ghs.google.com, как приведено для программы BIND (Berkeley Internet Name Domain):
webmail IN CNAME dhs.google.com
Первый шаг для доступа к почте через Web выполнен.
Написание скрипта для проверки валидности паролей
Некоторые пользователи после получения доступа к почте Gmail через webmail захотят поменять пароль учетной записи на cерверах Gmail. Тогда демон fetchmail, который забирает почту с Gmail и раскладывает по почтовым ящикам, не сможет забрать почту для этого пользователя. Есть два варианта для решения этой проблемы:
- Использование Google API, который позволяет управлять учетными записями автоматически.
- Периодическое тестирование всех POP3-учетных записей на Gmail с помощью специально разработанного скрипта. Этот скрипт, если не может подключиться к какому-нибудь POP3-ящику, будет отсылать предупреждение системному администратору.
Я пошел по второму пути и создал этот скрипт, который работает по следующему алгоритму:
- Загружает список пользователей из нашего файла users-list.csv. Подключается к Gmail по протоколу POP3 и пытается аутентифироваться, используя имя пользоваля и пароль.
- Если аутентификация прошла успешно, то осуществляется переход к проверке следующего адреса. Если произошла ошибка, то через один час (как в данной конфигурации) делается еще одна попытка подключиться. Если после 3 попыток удачного соединения так и не произошло, то скрипт посылает сообщение системному администратору. Несколько попыток необходимы во избежание ложных срабатываний в случае неполадок на Gmail.
Кроме этого, на случай глобального отсутствия соединения с Gmail (например, не работает подключение к Интернету), этот скрипт проверяет доступность сервера Gmail с помощью диагностического средства ping.
Скрипт проверки учетных записей POP3:
#!/usr/bin/perl
use Net::Ping;
use IO::Socket::SSL;
use Mail::POP3Client;
use strict;
my $gmail_host='pop.gmail.com';
my $gmail_port=995;
my $attempts=3;
my $sleep_between_attempts=60*60;
my $domain='domain.tld';
my $admin_email = 'admin@domain.tld';
my $p = Net::Ping->new('icmp');
if(!$p->ping($gmail_host))
{
print "Failed to ping $gmail_host\n";
print "Exiting\n";
exit;
}
my @emails;
open(F, "users-list.csv") || die "can not open users-list.csv";
my @emails=<F>;
chomp(@emails);
close(F);
foreach my $i(@emails)
{
my ($email,$fname,$lname,$password) = split(/\,/,$i);
my $succesful=1;
foreach(my $j=0;$j<$attempts;$j++)
{
if(test_pop3account("$email\@$domain",$password))
{
$succesful=1; #successful, lets test next
last;
}
else # failed for now, lets do it again a bit later
{
print "failed to connect to gmail for $email\@$domain.\n";
print "Sleeping for $sleep_between_attempts seconds\n";
sleep($sleep_between_attempts);
}
}
# sending alert to admin if the test has failed
# completelly
if(!$succesful)
{
print "Completelly failed for $email\@$domain\n";
open (MAIL, '|/usr/sbin/sendmail -t ') || die "Can't open sendmail service";
print MAIL "To: $admin_email\n";
print MAIL "From: $admin_email\n";
print MAIL "Alert! gmail pop3 is bad for $email\@$domain\n";
print MAIL "\n\nAlert! gmail pop3 is bad for $email\@$domain\n\n";
print MAIL "Please verify\n\n";
close MAIL;
}
else{
print "Testing for $email\@$domain was successful\n";
}
}
sub test_pop3account
{
my ($email, $password) = @_;
my $socket = IO::Socket::SSL->new( PeerAddr => $gmail_host,
PeerPort => $gmail_port,
Proto => 'tcp') || die "No socket!";
my $pop = Mail::POP3Client->new();
$pop->User($email);
$pop->Pass($password);
$pop->Socket($socket);
return $pop->Connect();
}
В начале скрипта прописаны переменные, которые необходимо установить в соответствии с параметрами вашего домена. Описание переменных приведено в таблице 2.
Таблица 2. Описание переменных скрипта проверки учетных записей POP3
Переменная
|
Назначение
|
$attempts
|
Количество попыток подключиться к серверу Gmail
|
$sleep_between_attempts
|
Время выжидания между попытками неудачного подключения, в секундах
|
$domain
|
Адрес нашего домена
|
$admin_email
|
E-mail-адрес, куда должны отсылаться сообщения о полной невозможности подключения к почте
|
Теперь можно настроить запуск этого скрипта через CRON с необходимым интервалом. Интервал может сильно разниться, например, если у вашей компании нестабильное или непостоянное подключение к Интернету, то для предотвращения ложных срабатываний скрипт можно запускать с интервалом 2-3 дня.
Настройка SPF
SPF (Sender Policy Framework) известно как средство, которое служит для борьбы с таким явлением, как спам. Подробности о работе этого инструмента можно прочитать на http://www.openspf.org. Суть этой технологии сводится к размещению в DNS-зоны специальной записи TXT, которая описывает серверы, с которых позволена отправка почты от имени вашего домена. Все остальные источники почты от имени вашего домена рассматриваются как отправители спама на серверах-получателях, где есть поддержка проверки SPF.
Итак, у нас может быть две ситуации с SPF:
- Отсутствует в записях DNS для вашего домена. Тогда вы можете решить, нужно ли это вам, хотя настройка SPF рекомендуется, потому что в этом случае спам-фильтры на серверах-получателях будут рассматривать письма с вашего домена как посланные из доверенного источника. Если вы решили, что SPF не нужен, тогда оставшуюся часть раздела можно пропустить.
- Если у вас уже настроена SPF-запись для вашего домена, то, кроме описания вашего почтового сервера, необходимо внести серверы Gmail в записи, описывающей ваше SPF-правило.
Для создания или обновления SPF необходимо прописать следующую TXT-запись, которая описывает все серверы, отправляющие почту от вашего домена:
«v=spf1 a:10.10.10.15 include:aspmx.googlemail.com ~all»
Инструкция по созданию записей для SPF в DNS взята с адреса http://www.google.com/support/a/bin/answer.py?hl=en&answer=33786.
В таблице 3 смотрите описание каждого элемента.
Таблица 3. Описание элементов записи для SPF
Элемент
|
Описание
|
v=spf1
|
Версия SPF
|
a:10.10.10.15
|
Указывает, что сервер с IP-адресом 10.10.10.15 тоже может отправлять почту с нашего домена. Здесь надо указать ваш собственный почтовый сервер, с которого отправляется почта во внешний мир
|
include:aspmx.googlemail.com
|
Включить записи SPF службы Gmail в процедуру проверки. Таким образом, если пользователь почты вашего домена отсылает сообщение с webmail службы Gmail, то сервер-получатель сообщения обнаружит, что серверы Gmail также разрешены для отправки почты от имени вашего домена
|
~all
|
Если предыдущие элементы не совпали с характеристиками сервера-отправителя, то тогда для этого отправителя применяется шаблон «all». Модификатор «~» перед шаблоном «all» означает SoftFail, и эта оценка может учитываться спам-фильтрами для оценки вероятности, что сообщение – спам
|
Тестирование SPF-настроек
Для тестирования нужно отправить сообщение самому себе с сервера, который разрешен для отправки почты от имени нашего домена. Почтовая служба Gmail при прохождении через нее писем вносит в заголовок результаты работы SPF, поэтому нужно, чтобы наше сообщение прошло через указанную службу. После получения тестового сообщения нужно проверить заголовки. Если все нормально настроено, то должен присутствовать такой элемент:
Received-SPF: pass (google.com: domain of info@domain.tld
designates 10.10.10.15 as permitted sender)
|
Дополнительные возможности
В этом разделе будут упомянуты две вещи, на которые я настоятельно рекомендую обратить внимание. Моя практика показала, что многие спамеры создают базы данных с IP‑адресами MX-записей, и эти базы хранятся в течение длительного времени, что приводит к получению спама напрямую. Для решения этой проблемы можно немного поменять наше решение и выполнить два взаимосвязанных шага:
- Удалить MX-запись, которая указывает на наш почтовый сервер (описание MX-записей было приведено в разделе «Переключение MX-записей».
- Запретить входящие соединения на портах 25 и 465.
Разумеется, эта дополнительная защита от спама может быть осуществлена, если все домены на вашем почтовом сервере обслуживаются Gmail.
Также рекомендуется создать пользователя abuse@domain.com на Gmail. Этот адрес используется, как правило, для получения жалоб, если ваш домен вовлечен в нелегальные действия, такие как спам или размещение нелегального содержимого на корпоративном сайте. Если вы вовремя не отреагируете на жалобы, то Gmail может прекратить обслуживать ваш домен (с возможным перемещением в черный список). Пользователь abuse@domain.com зарезервирован на Gmail, поэтому создать эту запись как обычного пользователя не получится.
Для перенаправления почты с адреса abuse@ в административной панели Gmail нужно перейти по ссылкам «Users accounts -> Create mailing list» и на этой странице создать mailing list abuse@domain.com и в качестве подписчика добавить адрес пользователя, который обрабатывает жалобы.
Заключение
Эта статья дает основные понятия и шаги по использованию Gmail как внешний почтовый фильтр. За рамками статьи остались такие вопросы как:
- Поддержка множественных доменов в fetchmail.
- Создание скрипта для автоматической проверки правильности настроек.
Последователям этого метода следует ознакомиться с правилами Gmail перед началом использования данного сервиса.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|