Антон Сенько
Почтовый шлюз для MS Exchange 2007
на базе FreeBSD 7.0 + Postfix 2.4
Недавно фирма, в которой я работаю, перешла на корпоративную почту на базе MS Exchange 2007. Тут же возник вопрос: как защитить почтовый сервер от внешних атак и спама. Об этом и пойдет речь в статье.
Почему так?
Не секрет, что MS Exchange – мощное средство для построения корпоративной почты уровня предприятия, и все больше фирм переходят на это решение от компании Microsoft. Но вместе с этим множественные проблемы с безопасностью продуктов Microsoft могут порядком осложнить жизнь системному администратору, поэтому обычно почтовый сервер прячется за какой-либо пограничный сервер, который работает в качестве SMTP-шлюза – то есть, пересылает письма изнутри периметра безопасности в Глобальную сеть и наоборот.
В MS Exchange 2007 появилась новая роль сервера – Edge Transport Server, призванная выполнять функции пограничного сервера, но для ее использования необходим выделенный сервер, работающий под управлением Windows 2003 Server SP1 либо выше. Поэтому для небольших фирм использование Edge может оказаться неприемлемым, так как это связано с еще большими финансовыми вливаниями: сервер, лицензия для серверной Windows, антивирус. Кроме прочего, все это не плохо бы спрятать за ISA. Отличной альтернативой может стать любая Linux/UNIX-система с установленным MTA Postfix.
Постановка задачи
Итак, что хотим:
- каждый пользователь в фирме должен иметь корпоративную почту;
- переписку с внешним миром могут вести только пользователи с внешним почтовым адресом;
- MS Exchange-сервер спрятан в локальной сети за почтовым шлюзом;
- письма принимаются только для существующих адресов, проверка адресов производится на почтовом шлюзе;
- единое хранилище пользовательских аккаунтов – Active Directory;
- антивирусная проверка и фильтрация спама происходит так же на почтовом шлюзе.
Что имеем:
- server.company.ru – FQDN-сервер, на котором установлен Postfix;
- company.ru – имя внешнего почтового домена;
- mx.company.local – имя сервера Exchange, работающего под управлением Win2k3, IP-адрес – 192.168.1.1;
- company.local – имя локального домена Active Directory;
- gw – имя хоста FreeBSD-сервера, внутренний IP-адрес – 192.168.1.10.
Настройка Postfix
Последней стабильной версией MTA Postfix на момент написания статьи являлась postfix-2.4.7, ее и будем использовать для реализации, а в качестве платформы шлюза отлично подойдет любая *BSD-система, в данном случае FreeBSD 7.0.
Устанавливать Postfix лучше из портов:
gw# cd /usr/ports/mail/postfix24
gw# make config
Поскольку мы хотим проверять существование пользователя в Active Directory, собираем Postfix с поддержкой OpenLDAP, для этого нужно отметить соответствующую опцию в открывшемся диалоге (см. рис. 1):
gw# make install clean
gw# rehash
Рисунок 1. Опции сборки Postfix
После установки в директории /usr/local/etc/postfix появятся конфигурационные файлы, находим main.cf и правим параметры:
# /usr/local/etc/postfix/main.cf
myhostname = server.company.ru
mydomain = company.ru
myorigin = $mydomain
mydestination = $myhostname
mynetworks_style = host
mynetworks = 192.168.1.1/32, 127.0.0.0/8
Теперь нужно настроить антивирусную проверку и фильтрацию нежелательной почты. Описание этих мероприятий выходит за рамки статьи. Как это сделать, можно прочитать на сайтах [1, 2]. Кроме всего прочего очень рекомендуется включить грейлистинг. Я использую для этих целей пакет gld-1.7, который присутствует в портах, в связке с MySQL [3].
Для того чтобы Postfix мог пересылать почту внутрь сети, нужно добавить в main.cf следующие параметры:
# /usr/local/etc/postfix/main.cf
# Описываем виртуальный домен
virtual_mailbox_domains = company.ru
# Информацию о почтовых ящиках искать в LDAP (в нашем случае - AD)
virtual_mailbox_maps = ldap:/usr/local/etc/postfix/ldap.cf
# Описываем куда пересылать приходящую почту
transport_maps = hash:/usr/local/etc/postfix/virtual_transport
После этого создаем файл ldap.cf и описываем, где искать данные о почтовых ящиках:
# /usr/local/etc/postfix/ldap.cf
server_host = ldap://company.local
server_port = 389
timeout = 60
search_base = DC=company,DC=local
query_filter = (&(proxyAddresses=smtp:%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(objectClass=user) \
(objectClass=group)(objectClass=contact)(objectClass=publicFolder)))
result_format = %s
result_attribute = cn
special_result_attribute =
scope = sub
bind = yes
bind_dn = ldaplookup@company.local
bind_pw = secret_password
dereference = 0
domain = company.ru
version=3
debuglevel = 0
Здесь, в параметре server_host, указан не сервер, у которого запрашиваются данные о существовании пользователя, а имя домена Active Directory, при этом необходимо позаботиться о том, чтобы на FreeBSD корректно разрешались имена из DNS-зоны company.local. Это сделано для того, чтобы Postfix при получении новой корреспонденции не был привязан к конкретному серверу и связка оставалась работоспособной, пока доступен хотя бы один контроллер домена.
Особое внимание нужно обратить на параметр query_filter. По сути, это запрос, который осуществляет выборку из базы LDAP. Используя такой фильтр, запрос будет возвращать почтовые адреса для не заблокированных
(!(userAccountControl:1.2.840.113556.1.4.803:=2) [4]) объектов, принадлежащих классам user, group, contact и publicFolder. Синтаксис ldap.cf зависит от версии Postfix, так что будьте внимательны: без правки, со старыми версиями MTA подобная схема работать не будет!
Параметры bind_dn и bind_pw содержат имя и пароль учетной записи в AD (ее нужно предварительно создать), от имени которой будет происходить поиск.
После этого следует создать файл /usr.local/etc/postfix/virtual_transport и указать в нем, куда пересылать приходящую в домен company.ru почту:
# /usr/local/etc/postfix/virtual_transport
company.ru smtp:[192.168.1.1]
Адрес сервера взят в квадратные скобки для того, чтобы система не пыталась разрешать его имя. После этих манипуляций необходимо создать индексированный файл командой:
gw# postmap /usr/local/etc/postfix/virtual_transport
Для автоматического запуска Postfix, в /etc/rc.conf добавляем:
# /etc/rc.conf
postfix_enable="YES"
Последним штрихом запрещаем пересылку писем в Интернет от локальных почтовых адресов, например, таким образом:
# /usr/local/etc/postfix/sender_access
/.*company\.local/i REJECT Sending to internet is forbidden
И подключаем sender_access в main.cf:
# /usr/local/etc/postfix/main.cf
smtpd_sender_restrictions = check_sender_access regexp:/usr/local/etc/postfix/sender_access
Теперь почта с локальных адресов не будет перенаправляться в Интернет, и пользователь получит соответствующее сообщение об ошибке, внутренняя же корреспонденция, о которой Postfix даже «не подозревает», будет доставляться без проблем.
Несанкционированно отправить письмо от другого имени пользователь также не сможет, если это не разрешено ему явно в настройках учетной записи в «Консоли управления Exchange».
Осталось только запустить Postfix:
gw# postfix start
и убедиться, что в логах нет ошибок:
gw# cat /var/log/maillog
Переходим к MS Exchange.
Настройка MS Exchange
Как установить и сделать начальное конфигурирование сервера MS Exchange, можно прочитать в [5, 6], мы же остановимся подробней на том, как «научить» его работать по задуманной схеме.
На Exchange-сервере понадобится создать SMTP-соединитель для отправки почты в Интернет через почтовый шлюз и разрешить получать почту от Postfix без авторизации, а также указать обслуживаемый домен.
Открываем консоль управления MS Exchange и переходим: «Конфигурация организации -> Транспортный сервер-концентратор» и выбираем в панели задач (Action Panel, не путать с системной панелью задач) «Создать обслуживаемый домен».
В открывшемся диалоге нужно ввести имя почтового домена company.ru, и выбирать «Домен внутренней ретрансляции», затем нажать кнопку «Создать».
Рисунок 2. Добавление глобального домена
Соединитель отправки и разрешение на получение почты от Postfix без авторизации проще создать из командной строки, для этого нужно открыть командную консоль Exchange и ввести:
[PS] C:\> New-SendConnector -Name 'Outbound' -Usage 'Internet' -AddressSpaces 'smtp:*;1' \
-DNSRoutingEnabled $false -SmartHosts '[192.168.1.10]' -SmartHostAuthMechanism 'None' -SourceTransportServers 'MX'
здесь: Outbound – имя коннектора, MX – NetBios имя Exchange-сервера.
[PS] C:\> Set-ReceiveConnector "Default MX" -permissiongroups: "ExchangeUsers, ExchangeServers, ExchangeLegacyServers, AnonymousUsers"
Эти настройки можно также сделать в графической консоли управления: «Конфигурация организации -> Транспортный сервер-концентратор -> Соединители отправки и Настройка серверов -> Транспортный сервер-концентратор -> Получающие соединители».
Следует отметить, что если Exchange разворачивался в локальном домене, то политикой по умолчанию каждому почтовому ящику будет присваиваться адрес вида login@company.local, где login – имя пользователя для входа в домен AD. Пользователь с таким адресом не сможет получить почту от других серверов в Интернете, так как company.local – это локальный домен, известный только DNS-серверу компании. Поэтому пользователю, которому необходима возможность обмена электронной почтой с внешними серверами, нужно добавить адрес вида anyname@company.ru и сделать его адресом по умолчанию.
Для этого в консоли управления Exchange нужно перейти: «Настройка получателей -> Почтовые ящики», и открыть свойства почтового ящика на вкладке «Адреса электронной почты».
В открывшемся диалоге нужно добавить желаемый адрес, убрать галку «Автоматически обновлять адреса электронной почты на основе политики адресов электронной почты», встать курсором на созданный адрес и нажать кнопку «Сделать обратным адресом» (см. рис. 3).
Рисунок 3. Добавление пользователю внешнего адреса
Адрес по умолчанию в этом диалоге выделяется жирным шрифтом. В случае если нужно обеспечить каждого пользователя внешней почтой, проще будет создать новую политику адресов электронной почты, либо отредактировать политику по умолчанию.
Кроме этого, следует четко понимать, что при такой связке на почтовом шлюзе нет локальных почтовых ящиков, поэтому адреса «по умолчанию», такие как postmaster@company.ru, root@company.ru, нужно дополнительно прописать в почтовом ящике системного администратора описанным выше способом, но не делать их «обратным адресом». Если этого не сделать, то отчеты, которые шлет и сама FreeBSD, и отчеты о неудачной доставке от MAILER-DAEMON будут теряться.
Заключение
Хочется отметить, что подобная схема показала себя с наилучшей стороны. Postfix, настроенный в соответствии с рекомендациями [1, 3], пропускает максимум 5-7 нежелательных писем в месяц, при нагрузке около 100 пользователей. В начале внедрения, в течение двух недель, были выявлены и прописаны в исключениях несколько «честных» серверов, письма с которых расценивались как спам.
Все управление учетными записями сводится к манипулированию ими в Консоли управления Exchange, никаких дополнительных настроек на postfix для пользователей делать не нужно. Кроме того, подобный подход позволяет снять нагрузку с сервера Exchange в плане фильтрации нежелательной корреспонденции и исключить издержки на приобретение антиспам-фильтров и антивирусов, умеющих работать с хранилищем Exchange.
Также, будучи скрытым в локальной сети, сервер Exchange надежно защищен от сетевых атак извне, что делает почтовую систему более устойчивой, а сон системного администратора – глубже и спокойней.
P.S.: Хочется поблагодарить Агапова Владимира за его статью [8], именно в ней была почерпнута основная идея такой связки.
- http://demon.yekt.com/postfix_antyspam.html.
- http://demon.yekt.com/clamav_antivirus_postfix.html.
- http://www.reid.ru/freebsd/?p=269.
- http://blogs.msdn.com/muaddib/archive/2008/10/08/query-individual-properties-of-the-useraccountcontrol-active-directory-user-property.aspx.
- Лопутнев С., Ильин Д. Microsoft Exchange Server 2007. Первые шаги по развёртыванию и настройке. //Системный администратор, №2, 2008 г. – С. 40-47.
- http://www.msexchange.ru.
- http://antonborisov.ru/2008/06/02/postfix-kak-frontend-dlya-exchange-2007.
- Агапов В. Устанавливаем связку Postfix + Exchange. //Системный администратор, №7, 2005 г. – С. 42-44.