From: mr.tacitus <http://mr-tacitus.blogspot.com>
Date: Mon, 26 Dec 2007 14:31:37 +0000 (UTC)
Subject: Интеграция почтового сервера Exim c MS Active Directory
ОС: FreeBSD 6.2
Почтовый сервер: exim 4.63
СУБД: mysql-server-5.0.27
POP3 и IMAP сервер, с хранением почты в СУБД: dbmail-2.2.2_1
Антиспам-фильтр: dspam-3.6.8_1
Антивирусное ПО: clamav-0.90_3
ПО авторизации: cyrus-sasl-saslauthd-2.1.22, cyrus-sasl-ldapdb-2.1.22
Библиотека ПО для работы с графикой: gd-2.0.33_4,1
Веб-сервер: apache-2.0.59, mod_perl2-2.0.3_1,3
CPAN-модули для работы с графикой: bsdpan-GD-2.35, bsdpan-GD-Graph3d-0.63, bsdpan-GDGraph-1.4308
Все программное обеспечение было установленно из портов ОС FreeBSD
6.2, за исключением нескольких CPAN-модулей.
Установка вышеперечисленного ПО производилась в следующем порядке:
1. почтовый сервер;
2. ПО авторизации;
3. СУБД;
4. POP3 и IMAP сервер;
5. антивирус;
6. антиспам-фильтр;
7. веб-сервер.
1. Установка почтового сервера.
Перед установкой почтового сервера в папке /usr/ports/mail/exim создал
файл sys.mk со следующим содержимым:
Ну а далее просто make install clean или portinstall mail/exim.
Потом начинаем править конфигурационный файл /usr/local/etc/exim/configure:
<...skip...>
######################################################################
# MAIN CONFIGURATION SETTINGS #
######################################################################
# 192.168.0.1 - это адрес вашего контроллера домена, где LDAP-сервер
# доступен по 3268 порту.
ldap_default_servers = <; 192.168.0.1:3268
# В Active Directory нужно создать пользователя "Exim" с паролем "password".
# Стоит обратить внимание на то, что свойство "Выводимое имя"
# пользователя должно быть именно "Exim", иначе почтовый сервер не сможет
# авторизоваться в LDAP-сервере контроллера домена.
LDAP_AD_BINDDN = "CN=Exim,CN=Users,DC=domain,DC=com"
LDAP_AD_PASS = password
LDAP_AD_BASE_DN = "CN=Users,DC=domain,DC=com"
# Макрос для организации запросов к LDAP-серверу.
LDAP_AD_MAIL_RCPT =
user=LDAP_AD_BINDDN
pass=LDAP_AD_PASS
ldap:///DC=domain,DC=com?mail?sub?(&(|(objectClass=top)(objectClass=user)
(objectClass=organizationalPerson)(objectClass=person))
(mail=${quote_ldap:${local_part}@${domain}}))
# Скрываем версию ПО
smtp_banner = "$primary_hostname, ESMTP EXIM"
# Некоторые почтовые клиенты в HELO радостно пишут имя windows-машин
# со знаком "_" и тут же отпинываются почтовым сервером. Разрешаем использование
# этого знака.
helo_allow_chars = _
# Пишем логи по дням - удобно для последующего "разбора полетов".
log_file_path = /var/log/exim/exim-%s-%D.log
log_selector = +all
SYSLOG_LONG_LINES = yes
# ourdomain.ru - это доменная зона, куда будут приходить ваши письма.
primary_hostname = mail.ourdomain.ru
domainlist local_domains = ourdomain.ru
hostlist relay_from_hosts = 127.0.0.1
qualify_domain = ourdomain.ru
# Пытаемся распознать имя только тех хостов которые не в локальной сети.
host_lookup = !192.168.0.0/24
# Объявление блока для проверки имени хоста
acl_smtp_connect = acl_check_host
# Объявление блока для проверки HELO отправителя
acl_smtp_helo = acl_check_helo
# Делаем этот параметр равный нулю, чтобы сервер не пытался опросить ident хоста.
rfc1413_query_timeout = 0s
<...skip...>
######################################################################
# ACL CONFIGURATION #
# Specifies access control lists for incoming SMTP mail #
######################################################################
# Отпинываем пользователей, указавших в HELO числа
drop message = Invalid HELO/EHLO data
condition = ${if match {$sender_helo_name}{N^-?[0-9]+$N}{yes}{no}}
# Отпинываем пользователей, указавших в HELO ip-address
drop message = HELO/EHLO should not be the ip-address
condition = ${if match
{$sender_helo_name}{N^(d+.){3}d+$N}{yes}{no}}
# Отпинываем пользователей, указавших в HELO адреса, подпадающих
# под список /usr/local/etc/exim/list/spam-hosts
drop message = Spam blocking
condition = ${lookup {$sender_helo_name}wildlsearch{/usr/local/etc/exim/list/spam-hosts}{yes}{no}}
accept
### Проверка имени хоста отправителя
acl_check_host:
# Правило разрешающее указанные в списке хосты
accept hosts = wildlsearch;/usr/local/etc/exim/list/white-hosts
# Отпинываем пользователей с хостами, подпадающими
# под список /usr/local/etc/exim/list/spam-hosts
drop message = Spam blocking
hosts = !192.168.0.0/24 : !127.0.0.1 :
wildlsearch;/usr/local/etc/exim/list/spam-hosts
# Отпинываем пользователей с хостами, подпадающими
# под список ip-адресов /usr/local/etc/exim/list/net.blocked
drop message = This ip-address in our blacklist
hosts = net32-lsearch;/usr/local/etc/exim/list/net.blocked
drop message = This ip-address in our blacklist
hosts = net24-lsearch;/usr/local/etc/exim/list/net.blocked
drop message = This ip-address in our blacklist
hosts = net16-lsearch;/usr/local/etc/exim/list/net.blocked
# И после него добавляем правило, запрещающее без авторизации отправлять
# письма от имени наших пользователей
deny !authenticated = *
condition = ${if eq{$sender_address_domain}{ourdomain.ru}{yes}{no}}
message = Sorry, authorization required
<...skip...>
# В блоке проверки содержимого письма (acl_check_data) добавляем правило,
# блокирующее письма с потенциально опасным содержимым
deny message = Contains ".$found_extension" file (blacklisted).
demime = exe:com:vbs:bat:pif:scr:js:cab:wsh:msi:hta:
vb:vbe:jse:cpl:reg:msp:msi:mst
<...skip...>
######################################################################
# ROUTERS CONFIGURATION #
# Specifies how addresses are handled #
######################################################################
# THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #
# An address is passed to each router in turn until it is accepted. #
######################################################################
begin routers
<...skip...>
# Теперь добавляем роутеры для проверки пользователей в Active Directory
# Этот роутер должен стоять после "dnslookup".
adsi_check:
driver = redirect
domains = +local_domains
allow_fail
allow_defer
# forbid_file
# forbid_pipe
# Проверяем наличие запрошенного ящика в Active Directory
data = ${lookup ldap {LDAP_AD_MAIL_RCPT}
{${local_part}@${domain}} {:fail: User unknown}}
redirect_router = local_adsi_user
local_adsi_user:
driver = accept
# local_part_suffix = +* : -*
# local_part_suffix_optional
transport = local_adsi_delivery
cannot_route_message = Unknown user
<...skip...>
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
begin transports
<...skip...>
# Тут порядок размещения транспортов уже не играет роли
### Local delivery
local_adsi_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
group = mail
user = mailnull
mode = 0660
no_mode_fail_narrower
Примеры файлов со списками, которые были упомянуты в конфигурационном
файле:
В этом файле следующий формат данных. Маски сетей пишутся по одному на
строку в формате AAA.BBB.CCC.DDD/XX,
где XX - должен быть кратным восьми и больше восьми. Примеры:
AAA.BBB.0.0/16, AAA.BBB.CCC.0/24 или AAA.BBB.CCC.DDD/32
Настраиваем профили пользователей в домене - пишем их электронные
адреса в соответствующем поле. Тут надо заметить что в моем случае
надо чтобы имя пользователя электронного адреса совпадало с его именем
входа - т.е. если в домене он demiurg то адрес должен быть как
demiurg@ourdomain.ru. Иначе в будущем могут быть глюки.
Потом проверяем конфигурацию почтового сервера командой exim -bh
80.73.64.248 (под root). Почтовый сервер начнет имитировать
SMTP-диалог с указанным хостом и одновременно выводить отладочную
информацию о ходе обработки команд и данных.
Например такой диалог:
*< Ответ сервера
*> Наши команды
# exim -bh 80.73.64.248
**** SMTP testing session as if from host 80.73.62.248
**** but without any ident (RFC 1413) callback.
**** This is not for real!
>>> host in hosts_connection_nolog? no (option unset)
LOG: SMTP connection from [80.73.62.248]
>>> host in host_lookup? yes (end of list)
... skip ...
>>> accept: condition test succeeded
*< 220 mail.dbki.ru, ESMTP EXIM
*> HELO sakha.ru
>>> sakha.ru in helo_lookup_domains? no (end of list)
>>> using ACL "acl_check_helo"
>>> processing "accept"
>>> check hosts = 192.168.0.0/24 : 127.0.0.1
... skip ...
*< 250 mail.dbki.ru Hello sakha.ru [80.73.62.248]
# Вводим фиктивный адрес отправителя
*> MAIL FROM: demiurg@sakha.ru
*< 250 OK
# Вводим РЕАЛЬНЫЙ адрес получателя
*> RCPT TO: demiurg@ourdomain.ru
>>> using ACL "acl_check_rcpt"
... skip ...
>>> processing "accept"
>>> accept: condition test succeeded
# Если все правильно настроили то должно выйти "250 Accepted",
# если иное - то начинаем проверять конфиг.
*< 250 Accepted
# Выходим
*> QUIT
2. Установка ПО авторизации.
Настраиваем SMTP-авторизацию
для этого ставим cyrus-sasl-saslauthd-2.1.22
Подробности установки СУБД MySQL 5.0 расписывать не буду, так как она
стандартна.
4. Установка POP3 и IMAP сервера.
Следующим шагом ставим DBMail 2.2.2
# cd /usr/ports/mail/dbmail
# make config
отмечаем:
[X] MYSQL Build with MySQL support (хранение почты в mySQL)
[X] SIEVE Build w. support for Sieve mail sorting language (на всякий случай :)
[X] LDAP Build with support for LDAP authentication (ищем пользователей в Active Directory)
и далее
# make install clean
Создаем БД в MySQL:
$ mysql -u root -p
mysql> create database dbmail;
mysql> GRANT SELECT,INSERT,DELETE,UPDATE ON `dbmail`.* to
'dbmail'@'localhost' IDENTIFIED BY 'password';
mysql> use dbmail;
mysql> source /usr/local/share/dbmail/mysql/create_tables.mysql
mysql> flush privileges;
Меняем настройки в конфигурационном файле /usr/local/etc/dbmail.conf:
driver = mysql
authdriver = ldap
sqlsocket = /var/run/mysql.sock
user = dbmail
pass = password
db = dbmail
[LDAP]
# Секция описана полностью, на всякий случай.
PORT = 3268
VERSION = 3
HOSTNAME = 192.168.0.1
BASE_DN = cn=Users,dc=domain,dc=com
BIND_DN = cn=Exim,cn=Users,dc=domain,dc=com
Запускаем антивирус (clamd и freshclam), рестартуем почтовый сервер и
наслаждаемся жизнью :)
6. Установка антиспам-фильтра.
Ставим антиспам-фильтр:
# cd /usr/ports/mail/dspam
# make config
и отмечаем: SYSLOG, DEBUG, DAEMON, MYSQL50, HASH, VIRT_USERS, LONG_USERNAMES, EXIM_LDA, CGI
и далее:
# make all install clean
Создаем базу данных для dspam:
$mysql -u root -p
mysql> create database dspam;
mysql> use dspam;
mysql> grant all on dspam.* to dspam@'localhost' identified by 'password';
mysql> source
/usr/local/share/examples/dspam/mysql/mysql_objects-speed.sql
mysql> source /usr/local/share/examples/dspam/mysql/virtual_users.sql
mysql> flush privileges;
# Тут создается специальная папка, доступная пользователю по IMAP,
# куда складывается помеченный спам для
# последующего осмотра и разбора.
local_delivery_spam_transport:
driver = pipe
command = /usr/local/sbin/dbmail-smtp -d $local_part@$domain -m 'Spam'
message_prefix =
message_suffix =
delivery_date_add
envelope_to_add
return_path_add
Рестартуем exim и снова радуемся жизни :) Если порадоваться не
получилось - читаем от начала и все проверяем.
7. Установка веб-сервера apache2 и веб-интерфейса dspam.
Запускаем
# cd /usr/ports/www/apache20
# make WITH_SUEXEC_MODULES=yes all install clean
# cd /usr/ports/www/mod_perl2; make install clean
Этот порт нужен для авторизации в веб-интерфейсе
# cd /usr/ports/www/mod_auth_imap2; make install clean
Cтавим порт /usr/ports/graphics/gd и недостающие CPAN-модули (чтобы
веб-интерфейс dspam мог рисовать графики)
# cpan -i GD::Graph3D
# cpan -i GD::Graph
Не знаю почему, но при установке dspam веб-интерфейс не
инсталлировался. Хотя видимо так случилось от того, что веб-сервер еще
не был установлен. :) Поэтому её пришлось вручную вытаскивать из
тарбалла и копировать в папку /usr/local/www/data/dspam. В итоге у
меня в папке оказались следующие файлы и папки:
<Directory "/usr/local/www/data/dspam">
Auth_IMAP_Enabled on
AuthName "Authorization"
AuthType basic
Require valid-user
# Параметры для авторизации пользователей по IMAP
Auth_IMAP_Authoritative on
Auth_IMAP_Server 127.0.0.1
Auth_IMAP_Port 143
Auth_IMAP_Log on
Options FollowSymLinks ExecCGI
AllowOverride All
Order allow,deny
Allow from all
DirectoryIndex admin.cgi
AddHandler cgi-script .cgi
<IfModule mod_perl.c>
PerlSendHeader On
AddHandler perl-script .cgi
PerlHandler Apache::Registry
</IfModule>
</Directory>
Запускаем apache2 и радуемся жизни :)
Всё.
1290 Прочтений • [Интеграция почтового сервера Exim c MS Active Directory (mail exim samba domain windows ldap freebsd dbmail)] [08.05.2012] [Комментариев: 0]