Поддержка Консалтинг Обучение Jamf Pro Блог

Mac OS X 10.6 Server Greylisting

Кирилл Воронин 17.10.2010

Пригодится, если вы используете или планируете использовать ваш Mac OS X Server как почтовый сервер (решил написать развернутый ответ на вопросы, пришедшие к нам в хелпдеск систему).

/* State of Spam & Phishing, Symantec */

Считаем, что мы уже поломали копья, – когда и кому имеет смысл держать свой почтовый сервер, а кому воспользоваться услугами хостера; сколько пользователей являются оправданием своему серверу (50, 100, 500?); какие проблемы безопасности могут возникать при использовании хостинга.
Считаем, что поспорили и на тему, – на какой платформе следует организовать свой почтовый сервер(серверы)?
Что такое служба Mail в Mac OS X Server? Это Postfix, Dovecot , SpamAssassin, ClamAV, amavisd-new, SquirrelMail, Sieve, Mailman (наверняка, что-то упустил). Да, все это можно сделать на Linux или *BSD.
Но если у вас уже десяток xserve (Open Directory, файловые серверы, сервер под редакционную систему, фотобанк и т.п.), то зачем вам еще одна платформа? Разумнее все организовать на Mac OS X Server.
А если вся ваша серверная стойка размером 3.6 см*19.7 см*19.7см и называется Mac Mini Server?

Проблема
Итак, используя Server Admin, вы настроили почту в 5 кликов.

Отправили письмо от локального пользователя локальному пользователю. “test.” Успех!
Ответили на это письмо. “Re:test”. Успех!
Отправили письмо на какой-то внешний адрес. “qwertyqwertyqwerty”. Оно пришло!
Ответили на это письмо. “Re:qwertyqwertyqwerty”. Ждете. Ждете. Оно не доходит и вы начинаете суетиться и перенастраивать почту. (А может я неправильно указал hostname? А что такое Virtual Hosting на вкладке Advanced? А может я должен был использовать SMTP релей провайдера? А может перезагрузить сервер?)

Можно было бы включить более подробное журналирование.

Хотя, соответствующая этой проблеме запись в логах “Recipient address rejected: Service is unavailable” не добавила спокойствия. Но показала бы куда рыть (или гуглить).

Переходим к теории.
Причиной паники была нетерпеливость. Mac OS X 10.6 Server использует грейлистинг (greylisting).
Apple верна себе в плане глубины документации, и в 134-страничном Mail Service Admin v10.6.pdf грейлистинг, который сервер использует по умолчанию даже не упоминается.

Что такое грейлистинг?

Основная идея грейлистинга в том, что нормальные почтовые серверы будут следовать RFС, а спамерское ПО нет.
Нормальный сервер, если ему не удастся доставить почту, попытается сделать это снова (и не раз), а спаммерское ПО продолжит отправлять письмо на следующий миллион адресов. Поэтому наш почтовый сервер при первой попытке отправить ему письмо ответит отказом и примет его только при повторной пересылке.

Чем это хорошо? Действительно, отсеивается много спама. В медийной компании на 1500 сотрудников использование грейлистинга уменьшило количество спама, который приходется обработать SpamAssassin на 95% (то есть 19/20 почты – спам, отсекаемый грейлистингом).
Это относительно незатратный способ для вашего сервера, так как письмо не нужно принимать целиком, оно обрабатывается на уровне заголовков, а не на уровне содержания (как это происходит, когда оно попадает в лапы SpamAssassin и ClamAV).
Минимальная конфигурация на стороне нашего сервера.

Почитать подробнее про грейлистинг можно здесь, а здесь – найти набор решений для разных почтовых серверов.

Могут ли быть с этим проблемы?
Да целая куча (у всего есть несколько сторон)!
Спаммерское ПО совершенствуется (в принципе, достаточно еще раз прогнать ту же рассылку через несколько минут).
Многие почтовые системы (особенно огромные, популярные web-mail системы) могут повторно отправить это же письмо уже с другого IP.
Регистрация на веб-сайтах, онлайн-платежи. Во-первых, как правило, ждешь письма от сайта молниеносно. Во-вторых, кривое ПО сайта может отправить письмо только один раз (ну что ж – не надо так делать, надо отправлять письмо через smtp relay, как минимум настроить почтовый сервер на этом веб-сервере).

Что конкретно делает ПО на нашем сервере?
При попытке принять письмо наш сервер отмечает IP адрес сервера отправителя, почтовый адрес отправителя и почтовый адрес получателя в виде связки. Если он не находит эту связку в своей базе, он записывает ее:

65.55.88.22/ballmer@microsoft.com/steve@apple.com: 1287284242

Что означает, 17 октября 2010 г. в 6:57:22 с IP адреса 65.55.88.22 была произведена попытка отправить письмо с адреса ballmer@microsoft.com на адрес steve@apple.com.
После этого, наш сервер ответит кодом ошибки и будет ждать момента, когда почтовый сервер 65.55.88.22 снова попытается отправить это письмо.

Кстати, что это за ПО?

Скрипт /usr/libexec/postfix/greylist.pl из поставки Postfix, никак не модернизированный программистами Apple.
База /private/var/lib/postfix/greylist.db.

Запись в /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination check_policy_service unix:private/policy permit

Запись в /etc/postfix/master.cf
policy unix – n n – – spawn
user=nobody:mail argv=/usr/bin/perl /usr/libexec/postfix/greylist.pl

Чтобы увидеть в деталях, что происходит, добавьте опцию -v (greylist.pl -v), принимайте почту и смотрите /var/log/mail.log
Проделаем это и еще раз проанализируем письмо от Стива к Стиву:

Oct 17 06:56:25 relay7 postfix/smtpd[37596]: connect from mail.global.frontbridge.com[65.55.88.22]
Oct 17 06:57:15 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: ccert_fingerprint=
Oct 17 06:57:16 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: sasl_method=
Oct 17 06:57:16 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: sasl_sender=
Oct 17 06:57:16 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: size=0
Oct 17 06:57:16 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: helo_name=microsoft.com
Oct 17 06:57:17 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: reverse_client_name=mail.global.frontbridge.com
Oct 17 06:57:17 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: queue_id=
Oct 17 06:57:17 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: encryption_cipher=
Oct 17 06:57:17 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: encryption_protocol=
Oct 17 06:57:18 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: etrn_domain=
Oct 17 06:57:18 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: ccert_subject=
Oct 17 06:57:18 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: request=smtpd_access_policy
Oct 17 06:57:18 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: protocol_state=RCPT
Oct 17 06:57:19 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: stress=
Oct 17 06:57:19 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: recipient=steve@apple.com
Oct 17 06:57:19 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: sasl_username=
Oct 17 06:57:19 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: instance=92dc.4cba6601.bb3e2.0
Oct 17 06:57:20 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: protocol_name=SMTP
Oct 17 06:57:20 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: encryption_keysize=0
Oct 17 06:57:20 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: recipient_count=0
Oct 17 06:57:20 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: ccert_issuer=
Oct 17 06:57:21 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: sender=ballmer@microsoft.com
Oct 17 06:57:21 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: client_name=mail.global.frontbridge.com
Oct 17 06:57:21 relay7 /usr/libexec/postfix/greylist.pl[37632]: Attribute: client_address=65.55.88.22
Oct 17 06:57:21 relay7 /usr/libexec/postfix/greylist.pl[37632]: open /var/lib/postfix/greylist.db
Oct 17 06:57:22 relay7 /usr/libexec/postfix/greylist.pl[37632]: lookup 65.55.88.22:
Oct 17 06:57:22 relay7 /usr/libexec/postfix/greylist.pl[37632]: lookup 65.55.88.22/ballmer@microsoft.com/steve@apple.com:
Oct 17 06:57:22 relay7 /usr/libexec/postfix/greylist.pl[37632]: store 65.55.88.22/ballmer@microsoft.com/steve@apple.com: 1287284242
Oct 17 06:57:22 relay7 /usr/libexec/postfix/greylist.pl[37632]: request age 0
Oct 17 06:57:23 relay7 /usr/libexec/postfix/greylist.pl[37632]: Action: defer_if_permit Service is unavailable
Oct 17 06:57:23 relay7 postfix/smtpd[37596]: NOQUEUE: reject: RCPT from mail.global.frontbridge.com[65.55.88.22]: 450 4.7.1 : Recipient address rejected: Service is unavailable; from= to= proto=SMTP helo=

Пока мы ничего не знаем, про 65.55.88.22, ballmer@microsoft.com и steve@apple.com, запомним эту комбинацию.
Проходит пара минут и сервер снова делает попытку:

Oct 17 06:59:49 relay7 postfix/smtpd[37659]: connect from mail.global.frontbridge.com[65.55.88.22]
Oct 17 07:00:13 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: ccert_fingerprint=
Oct 17 07:00:13 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: sasl_method=
Oct 17 07:00:14 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: sasl_sender=
Oct 17 07:00:14 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: size=0
Oct 17 07:00:14 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: helo_name=microsoft.com
Oct 17 07:00:14 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: reverse_client_name=mail.global.frontbridge.com
Oct 17 07:00:15 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: queue_id=
Oct 17 07:00:15 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: encryption_cipher=
Oct 17 07:00:15 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: encryption_protocol=
Oct 17 07:00:15 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: etrn_domain=
Oct 17 07:00:16 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: ccert_subject=
Oct 17 07:00:16 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: stress=
Oct 17 07:00:16 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: protocol_state=RCPT
Oct 17 07:00:16 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: request=smtpd_access_policy
Oct 17 07:00:17 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: sasl_username=
Oct 17 07:00:17 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: recipient=steve@apple.com
Oct 17 07:00:17 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: instance=931b.4cba66b3.dd456.0
Oct 17 07:00:17 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: protocol_name=SMTP
Oct 17 07:00:18 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: encryption_keysize=0
Oct 17 07:00:18 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: recipient_count=0
Oct 17 07:00:18 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: ccert_issuer=
Oct 17 07:00:18 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: sender=ballmer@microsoft.com
Oct 17 07:00:19 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: client_name=mail.global.frontbridge.com
Oct 17 07:00:19 relay7 /usr/libexec/postfix/greylist.pl[37664]: Attribute: client_address=65.55.88.22
Oct 17 07:00:19 relay7 /usr/libexec/postfix/greylist.pl[37664]: lookup 65.55.88.22:
Oct 17 07:00:19 relay7 /usr/libexec/postfix/greylist.pl[37664]: lookup 65.55.88.22/ballmer@microsoft.com/steve@apple.com: 1287284242
Oct 17 07:00:20 relay7 /usr/libexec/postfix/greylist.pl[37664]: request age 178
Oct 17 07:00:20 relay7 /usr/libexec/postfix/greylist.pl[37664]: store 65.55.88.22: 1
Oct 17 07:00:20 relay7 /usr/libexec/postfix/greylist.pl[37664]: Action: dunno
Oct 17 07:00:20 relay7 postfix/smtpd[37659]: D65459B67B4: client=mail.global.frontbridge.com[65.55.88.22]
Oct 17 07:00:28 relay7 postfix/cleanup[37825]: D65459B67B4: message-id=<20101017030020.D65459B67B4@relay7.apple.com>
Oct 17 07:00:28 relay7 postfix/qmgr[37585]: D65459B67B4: from=, size=346, nrcpt=1 (queue active)
Oct 17 07:00:31 relay7 postfix/smtpd[37659]: disconnect from mail.global.frontbridge.com[65.55.88.22]
Oct 17 07:00:32 relay7 postfix/smtpd[37830]: connect from localhost[127.0.0.1]
Oct 17 07:00:32 relay7 postfix/smtpd[37830]: A087F9B67C0: client=localhost[127.0.0.1]
Oct 17 07:00:32 relay7 postfix/cleanup[37825]: A087F9B67C0: message-id=<20101017030020.D65459B67B4@relay7.apple.com>
Oct 17 07:00:32 relay7 postfix/qmgr[37585]: A087F9B67C0: from=
, size=997, nrcpt=1 (queue active)
Oct 17 07:00:32 relay7 postfix/smtp[37826]: D65459B67B4: to=, relay=127.0.0.1[127.0.0.1]:10024, delay=29, delays=25/0.2/0.01/3.5, dsn=2.0.0, status=sent (250 2.0.0 Ok, id=31433-01, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as A087F9B67C0)
Oct 17 07:00:32 relay7 postfix/qmgr[37585]: D65459B67B4: removed
Oct 17 07:00:33 relay7 postfix/pipe[37834]: A087F9B67C0: to=
, relay=dovecot, delay=0.81, delays=0.01/0.12/0/0.68, dsn=2.0.0, status=sent (delivered via dovecot service)

Ага, снова 65.55.88.22, снова ballmer@microsoft.com и снова для steve@apple.com, время между попытками – 178 секунд. 178 > 60 секунд (Параметр $greylist_delay=60; из greylist.pl). Значит передаем письмо дальше (оно передается amavisd-new, тот проверяет его, используя SpamAssassin и ClamAV и отправляет обратно, postfix передает его dovecot, все эти детали сегодня нас уже не интересуют).

Как полностью отключить greylisting?
Это то к чему многие сразу и прибегают.
GUI средств для этого нет.

Вернее, вы можете снять галочку Enable junk mail filtering, но это отключит и SpamAssassin и ряд проверок postfix.

Отредактируйте /etc/postfix/main.cf
В разделе smtpd_recipient_restrictions удалите check_policy_service unix:private/policy и перезапустите почтовый сервер.

Можно ли создать whitelist, куда внести “свои” домены и серверы у которых проблемы с отправкой?

Можно использовать другой механизм postfix и поставить его в очереди перед грейлистингом.
Добавим в /etc/postfix/main.cf
в раздел smtpd_recipient_restrictions
check_sender_access hash:/etc/postfix/sender_access

Все строка теперь выглядит так:
smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks reject_unauth_destination check_sender_access hash:/etc/postfix/sender_access check_policy_service unix:private/policy permit

Создадим файл sender_access, внесем туда нужные домены (shortcut.ru OK), наберем команду
postmap /etc/postfix/sender_access.

Есть ли более продвинутые способы контроля грейлистинга?
Да, например, вместо системных средств можно использовать postgrey (есть и в MacPorts).

Что насчет SPF, DKIM, Sender ID?
Друзья, я раб Excel, а не системный администратор!
Все что я могу, – попросить написать об этом своих коллег, которые занимаются настоящим делом у наших клиентов.
Вспомнилось, как один знакомый хакер, прикидывающийся системным администратором, говаривал пользователям “Не доходит? Ну а вы что хотели, батенька? Протокол SMTP не гарантирует доставки почты!”

Ссылки по теме
postfix.org/SMTPD_POLICY_README
Postfix. Подробное руководство
Руководство системного администратора Эви Немет
(Не знаю, писала ли об этом бабушка в этом издании, но так или иначе, юные администраторы должны засыпать с этой книгой).