Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  FreeBSD Mail Howto
  exim & dovecot
  exim & courier-imap
  squirrelmail
  exim + saslauthd + courier-imap
  postfix -> exim
  sendmail -> exim
  imapsync
  Postfix + LDAP
  maildrop & postfix
  DSPAM
  Exim + LDAP
  ISPmanager
  Backup MX
  exim + exchange
  exim + dovecot + win2003 AD
  RoundCube
  qmail-ldap + AD
  spamooborona
  exim&dovecot + fetchmail + SSL
  Postfix + DBMail
  Mailgraph
  smfsav
  Exim+PgSQL
  Postfix + Dovecot + Clamav + SpamAssasin + LDAP vs MYSQL
  Simplemail Admin
  MTA qmail full install
  OpenLDAP адресная книга
  POSTFIX Статистики
  Backup MX (exim)
  Exim + dovecot + PgSQL + web
  Exim+dovecot2+dspam
  Возможности Dovecot 2
  Dovecot2 configfiles RUS
  Почтовый сервер по шагам ч.1
  Почтовый сервер по шагам ч.2
  Почтовый сервер по шагам ч.3
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> Exim + AD (корпоративная почта)

Exim + AD (корпоративная почта)

Автор: atrium.


Сделаем небольшое введение: данная статья предназначена для тех, кто хоть немного ориентируется в Exim и операционной системе Unix(в нашем варианте FreeBSD).

Exim - MTA (mail transfer agent) для хостов, которые работают на ОС Unix или Unix-like и иимеют постоянное подключение к интернету. Он так же может работать и на хостах, которые имеют периодическое подключение к интернет. Этот MTA является довольно гибким, имеет встроенный Perl, поддерживает в качестве хранилищ данных MySQL, LDAP, PgSQL, NIS, DB, файлы. Для обеспечения безопасности передачи данных имеется поддержка OpenSSL.

Перейдём к делу, сегодня будем настраивать корпоративный почтовый сервер, в качестве хранилища данных будет выступать LDAP (AD на Windows 2003 R2). Наш сервер будет уметь рассылать почту пользователям, которые находятся в AD, также будут групповые рассылки, в качестве mail листов будут выступать группы в AD. Различные ограничения по хостам, адресам, которые будут храниться в отдельных файлах в формате DB. Вся почта будет проверяться антивирусом и спам фильтром. Необходимо сделать уточнение, что посылка почты будет работать только для пользователей, которые не заблокированы в AD.

Все настройки производятся на ОС FreeBSD 7.2


unix# uname -a
FreeBSD unix 7.2-RELEASE FreeBSD 7.2-RELEASE #1: Thu May  7 17:28:50 MSD 2009     
atrium@unix:/usr/obj/usr/src/sys/kernel  i386


Для организации данной конфигурации нам понадобятся следующие пакеты:


Port:   exim-4.69
Path:   /usr/ports/mail/exim
Info:   High performance MTA for Unix systems on the Internet
Maint:  krion@FreeBSD.org
WWW:    http://www.exim.org/


Port:   clamav-0.92.5
Path:   /usr/ports/security/clamav
Info:   Command line virus scanner written entirely in C
Maint:  garga@FreeBSD.org
WWW:    http://www.clamav.net/


Port:   dspam-3.6.8_2
Path:   /usr/ports/mail/dspam
Info:   Bayesian spam filter - stable maintenance version
Maint:  itetcu@FreeBSD.org
WWW:    http://dspam.nuclearelephant.com


Port:   p5-perl-ldap-0.36
Path:   /usr/ports/net/p5-perl-ldap
Info:   A Client interface to LDAP servers
Maint:  perl@FreeBSD.org


Port:   dovecot-1.1.16
Path:   /usr/ports/mail/dovecot
Info:   Secure and compact IMAP and POP3 servers
Maint:  yds@CoolRat.org


Создадим пользователя, от которого будет производиться доставка и соответственно он будет владельцем папки с доменом и почтовыми ящиками.

grep 1006 /etc/passwd
vmail:*:1006:1006:User &:/home/vmail:/sbin/nologin



Далее создадим каталог virtual, назначим ему соответствующие права доступа, сделаем владельцем пользователя vmail и группу mail:

unix# mkdir -m 750 /var/mail/virtual
unix# chown 1006:mail /var/mail/virtual


В этом каталоге будет храниться следующая структура папок:

domain_name -> user_name@domain_name

В катечстве domain_name имя домена, user_name@domain_name - имя почтового ящика пользователя.


Для возможности рассылки почты на группы в AD, которые будут выступать в качестве списков рассылки напишем небольшой скриптик на Perl. В этом скрипте необходимо изменить параметры IP адрес сервера PDC и пользователя от имени которого будет происходить подключение:

#!/usr/bin/perl

use strict;
use warnings;
use Net::LDAP;


my %ldap_connect=(
HOST=>"192.168.0.100",
PORT=>"389",
# Timeout search
TIMEOUT=>"120",
# База поиска
BASE_DN=>"CN=Users,DC=oskol,DC=impexbank,DC=ru",
# Юзер для доступа к LDAP
BIND_DN=>"CN=exim,CN=Users,DC=oskol,DC=impexbank,DC=ru",
# Пароль юзера
BIND_PASS=>"exim",
# Версия LDAP
VERSION=>"3"
);

sub get_mail_lists
{

    my $address=shift;
    my ($user_mail, $dn, $mesg, $entry, $mail_lists);
    my (@array_of_ldap_search, @entries);
    $mail_lists=" ";
    
    # Подключение к хосту
    my $ldap = Net::LDAP->new($ldap_connect{'HOST'}, version=>$ldap_connect{'VERSION'}, \
port=>$ldap_connect{'PORT'}, timeout=>$ldap_connect{'TIMEOUT'}) or die  exit 0;
    
    # Подключение к дереву
    $mesg=$ldap->bind($ldap_connect{'BIND_DN'}, password => $ldap_connect{'BIND_PASS'}) or die exit 0;
      
    # Поиск e-mail дя группы
    $mesg = $ldap->search(
        base => $ldap_connect{'BASE_DN'},
        scope => 'sub',
        filter => "(&(objectClass=top)(objectClass=group)(mail=$address))",
        attrs => ['member']
        );
  # Получение записей dn участников группы
        foreach $entry ($mesg->entries) {
                @array_of_ldap_search = $entry->get_value("member");
        }
  
  # Поиск в соответствии с dn почтового адреса
        foreach $dn (@array_of_ldap_search) {
                $mesg = $ldap->search(
        filter=>"(&(objectClass=top)(objectClass=user)(objectClass=person)\
(distinguishedName=$dn))",
        base=>$ldap_connect{'BASE_DN'},
        scope =>'sub',
        attrs=>['mail']
        );
    
    # Получение найденных записей e-mail'ов
    # И формирование списка
                @entries = $mesg->entries;
                foreach $entry (@entries) {
            $user_mail = $entry->get_value("mail");
            $mail_lists = $mail_lists.",".$user_mail;
                  
                }
        }
        $mail_lists = substr($mail_lists,1);
        $ldap->unbind;

        return $mail_lists;
}

# Для теста раскоментируйте
#print get_mail_lists('adm@oskol.impexbank.ru')


Так как наша система поддерживает безопасное соединение для SMTP, POP3 и IMAP4, то необходимо сгенерировать сертификаты для работы через SSL. Для этого заходим в каталог /usr/src/crypto/openssl/apps и выставляем право исполнения (x) на файл CA.sh или CA.pl, как Вам будет удобнее и генерируем корневой сертификат:


cd /usr/src/crypto/openssl/apps
rm -r ./demoCA/*
./CA.pl -newca


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


total 22
-rw-r--r--  1 root  wheel  3350 23 июн 14:17 cacert.pem
-rw-r--r--  1 root  wheel   651 23 июн 14:17 careq.pem
drwxr-xr-x  2 root  wheel   512 23 июн 14:16 certs
drwxr-xr-x  2 root  wheel   512 23 июн 14:16 crl
-rw-r--r--  1 root  wheel     3 23 июн 14:16 crlnumber
-rw-r--r--  1 root  wheel   114 23 июн 14:17 index.txt
-rw-r--r--  1 root  wheel    21 23 июн 14:17 index.txt.attr
-rw-r--r--  1 root  wheel     0 23 июн 14:16 index.txt.old
drwxr-xr-x  2 root  wheel   512 23 июн 14:17 newcerts
drwxr-xr-x  2 root  wheel   512 23 июн 14:16 private
-rw-r--r--  1 root  wheel    17 23 июн 14:17 serial


После того как с генерировали корневой сертификат, конвертируем его в другой формат и добавим каждому пользователю на Windows машину, его можно установить через групповые политики (конфигурация компьютера -> конфигурация Windows -> параметры безопасности -> политики открытого ключа -> доверенные корневые центры сертификации):


openssl x509 -inform PEM -outform DER -in cacert.pem -out cacert.cer


Т.е Мы, полученный сертификат cacert.cer копируем по FTP на наш PDC (Primary Controller Domain) и через групповые политики устанавливаем всем пользователям домена.

Создадим запрос на сертификат, не забываем правильно указывать имя машины на которой работает Exim, параметр Common Name (eg, YOUR name []):


openssl req -new -newkey rsa:2048  -keyout eximkey.pem -keyform PEM -days 365 -nodes -out certreq.pem


Подпишем корневым сертификатом наш запрос на сертификацию:


openssl x509 -req -inform PEM -outform PEM -in certreq.pem -out eximcert.pem -days 365 \ 
-CAkey ./private/cakey.pem -CAcreateserial -CA cacert.pem
Signature ok
subject=/C=RU/ST=Some-State/O=Raiffeisen/CN=mail2.oskol.impexbank.ru/\
emailAddress=adm@mail.ru
Getting CA Private Key
Enter pass phrase for ./private/cakey.pem:




Создадим каталог /usr/local/etc/exim/ssl в котором будем хранить наши сертификаты для работы сервера:


mkdir -m 550 /usr/local/etc/exim/ssl
chown mailnull:wheel /usr/local/etc/exim/ssl


Далее необходимо выставить права на сертификаты и сделать владельцем пользователя mailnuxll:

chown mailnull:wheel ./*
chmod 440 ./*


Перед тем как приступить к настройке приложений необходимо внести небольшие изменения в файле /etc/mail/mailer.conf и привести его к виду:


sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi


И так, приступим к настройке всех необходимых нам приложений, прежде всего начнём с установки и настройки антивируса, который будет проверять всю почту. В качестве антивируса был выбран Clamav, поэтому ищем его в портах и устанавливаем в зависимости от Ваших предпочтений, т.е опции выбирайте сами (какие форматы файлов он будет проверять). Начнём настройку антивируса, отредактируем файл /usr/local/etc/clamd.conf. Конфигурационный файл предназначен исключительно для использования с MTA. Данная конфигурация позволяет использовать антивирус локально для проверки почты, а так же как сервер антивируса для подключения к нему и сканирования почты по сети при нескольких почтовых серверах:


#-------------------------------
#   Необходимо изменить |
#-------------------------------

# Размер должен соответстовать максимальному размеру
# файла который может быть приаттачен в MTA
StreamMaxLength 10M
MaxScanSize 10M
MaxFileSize 10M

# Период проверки базы антиивруса в s(seconds)
SelfCheck 1800


LogFile /var/log/clamav/clamd.log
LogFileUnlock yes
LogFileMaxSize 5M
LogTime yes
LogClean no
LogSyslog no
LogFacility LOG_MAIL
LogVerbose no
Debug no


PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
VirusEvent /bin/echo "Virus found %v" >> /var/log/clamav/virus.log


MaxThreads 20
ReadTimeout 120
CommandReadTimeout 5
SendBufTimeout 400
IdleTimeout 30
User clamav


LeaveTemporaryFiles no
AlgorithmicDetection yes
DetectBrokenExecutables yes
ScanPE yes
ScanELF yes
ScanOLE2 yes
ScanPDF yes
ScanMail yes
ScanPartialMessages no
ScanHTML yes
ScanArchive yes
ArchiveBlockEncrypted yes
MaxRecursion 10
MaxFiles 1000
AllowSupplementaryGroups yes

# использование в качестве сервера
#
TCPAddr 192.168.0.101
TCPSocket 3310


Далее необходимо настроить программу обновления баз антивирса, для этого отредактируйте файл /usr/local/etc/freshclam.conf, там всё довольно просто, поэтому я думаю Вы справитесь сами.

После редактирования не забываем добавить в /etc/rc.conf две строчки, а также стартануть антивирус и программу обновления баз:


в rc.conf
clamav_clamd_enable="YES"
clamav_freshclam_enable="YES"

cтартуем
/usr/local/etc/rc.d/clamav-clamd start
/usr/local/etc/rc.d/clamav-freshclam start


После того как установили и настроили антивирус необходимо будет настроить POP3 и IMAP4 сервер. В качестве ПО был выбран Dovecot.  Dovecot - это open source IMAP и POP3 сервер для Linux/Unix систем, основным приоритетом в работе данного ПО является безопасность. Поддерживает как mbox, так и maildir форматы почтовых ящиков, позволяет проводить авторизацию в различных базах данных (LDAP, PgSQL, MySQL, passwd ...) и поддерживает различные механизмы авторизации. Более подробную информацию о Dovecot можно прочитать на официальном сайте. Ищем Dovecot в портах и устанавливаем со следующими опциями:


[X] KQUEUE       kqueue(2) support                
[X] SSL          SSL support                      
[X] POP3         POP3 support                     
[X] LDA          LDA support              
[X] LDAP         OpenLDAP support             


После установки приступим к конфигурированию, для этого отредактируем два файла - /usr/local/etc/dovecot.conf и /usr/local/etc/dovecot-ldap.conf:


#---------------------------------------
#  Изменяемые параметры   |
#---------------------------------------
#-----------------------------------------------------------------

# Путь к почтовому ящику
#
mail_location=maildir:/var/mail/virtual/oskol.impexbank.ru/%h/


# UID/GID владельца каталога с почтовыми ящиками
#
first_valid_uid = 1006
last_valid_uid = 1006
first_valid_gid = 1006
last_valid_gid = 1006
mail_uid=1006
mail_gid=1006
mail_privileged_group = mail



# Поддерживаемые протоколы
#
protocols = imap pop3 pop3s imaps

protocol imap  {
    listen=192.168.0.2:143
    ssl_listen=192.168.0.2:993
}
    
protocol pop3  {
    listen=192.168.0.2:110
    ssl_listen=192.168.0.2:995
}


# Путь к сертификатам и пароль на key файл
# Возможно использование сертификатов отдельно для каждого протокола
#
ssl_cert_file=/usr/local/etc/postfix/cert/postfix_public_cert.pem
ssl_key_file=/usr/local/etc/postfix/cert/postfix_private_key.pem
#ssl_ca_file = /usr/local/etc/postfix/cert/cakey.pem
ssl_key_password=


# Разрешить использовать SSL
#
ssl_disable=no

        
# Mail процессы
#
valid_chroot_dirs=/var/mail/virtual


# Запретить использовать использовать авторизацию LOGIN, т.е
# открытый пароль, если не используется SSL/TLS
#
disable_plaintext_auth=yes


# Отрубать процессы IMAP/POP3, если master процесс умер
#
shutdown_clients = yes


# Максимальное количество mail процессов. Когда процессы исчерпаются
# не смогут авторизоваться
#
max_mail_processes = 512
# Максимальный размер процесса в Mb
mail_process_size = 25


#-----------------------------------------------------------------------



# Отладка
#
mail_debug = yes
# Показывать подробную информацию о процессе при команде 'ps'
# ip, login_name ...
verbose_proctitle = yes
auth_debug = yes
auth_debug_passwords = yes
auth_verbose = yes
verbose_ssl = no


# Базовая дирректория
base_dir = /var/run/dovecot/


# Ведение логов
#
log_path=/var/log/dovecot.log
info_log_path=/var/log/dovecot-info.log
syslog_facility=mail
mail_log_prefix="%Us(%u):"
mail_log_max_lines_per_sec=10
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s



# SSL
#
ssl_verify_client_cert = no
ssl_parameters_regenerate = 0


# Управление процессами авторизации
#
login_dir = /var/run/dovecot/login
login_user = dovecot
#Максимальный размер процесса в Mb
login_process_size = 30
#Обрабатывать каждое соединение своим процессом
login_process_per_connection = yes
#Количество процессов ждущих нового соеднинения
#Один процесс занимает около 4 метров, поэтому ориентируйтесь на ОЗУ
login_processes_count = 10
login_max_processes_count = 90
#Максимально количество соединений для каждого login процесса
#используется, если login_process_per_connection=no
login_max_connections = 180
#Приветствие
login_greeting = Hello users
login_chroot = yes


#Пространство default, не трогать!
#
namespace private {
    separator=/
    prefix=
    inbox=yes
}


# Создание общих папок
#
namespace public {
    separator = /
    prefix = Folders/
    location = maildir:/var/mail/virtual/oskol.impexbank.ru/%h/Folders
    hidden = no
    inbox = no
}



# Mailbox
#
mail_full_filesystem_access = no
mmap_disable = yes
fsync_disable = yes
lock_method = fcntl
mail_drop_priv_before_exec = yes
#Уменьшает стоимость использования диска
mail_cache_min_mail_count = 0
#Период проверки изменений в ящике
mailbox_idle_check_interval = 60
mail_save_crlf = no
#Команда LIST по умолчанию возвращает все каталоги начинающиеся с .
#если yes, то возвращаются все дирректории
maildir_stat_dirs = no
#YES если параметр maildir_copy_with_hradlinks=yes
dotlock_use_excl=yes
maildir_copy_with_hardlinks = yes
maildir_copy_preserve_filename = yes


# Настройка протоколов
#
protocol imap {
  login_executable = /usr/local/libexec/dovecot/imap-login
  imap_max_line_length = 65536
  mail_max_userip_connections = 3
  login_greeting_capability = yes
  imap_logout_format = bytes=%i/%o
  mail_executable = /usr/local/libexec/dovecot/imap    
  mail_plugin_dir = /usr/local/lib/dovecot/imap
  imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}
  
protocol pop3 {
  login_executable = /usr/local/libexec/dovecot/pop3-login
  mail_executable = /usr/local/libexec/dovecot/pop3
  pop3_no_flag_updates = no
  pop3_enable_last = no
  pop3_reuse_xuidl = no
  pop3_lock_session = no
  pop3_uidl_format = %08Xu%08Xv
  mail_max_userip_connections = 3
  pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s, in/out=%i/%o
  mail_plugin_dir = /usr/local/lib/dovecot/pop3
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}


# Локальный агент доставки. LDA
#
protocol lda {
  postmaster_address = postmaster@oskol.impexbank.ru
  hostname = mail.oskol.impexbank.ru
  mail_plugin_dir = /usr/local/lib/dovecot/lda
  sendmail_path = /usr/local/sbin/sendmail
  auth_socket_path = /var/run/dovecot/auth-master
  quota_full_tempfail = yes
  deliver_log_format = msgid=%m, from=%f, status=%$
  sendmail_path = /usr/local/sbin/exim
  rejection_subject = Automatically rejected mail
  rejection_reason = Your message to <%t> was automatically rejected:%n%r 
}



# Процессы авторизации
#
auth_executable = /usr/local/libexec/dovecot/dovecot-auth
#Размер процесса в Mb
auth_process_size = 50
#Кэширование процесса авторизации в Kb. 0 - выключить
#Если авторизация через AD, лучше выключить.
auth_cache_size = 0
auth_cache_ttl = 3600
auth_cache_negative_ttl = 0
#Разрешённые символы в имени
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
#Формат имени (в нижнем регистре, имя)
auth_username_format =%Lu
auth_worker_max_count = 30
#Количество запросов, после которых процесс авторизации уничтожается
auth_worker_max_request_count = 1000
#Задержка, при неправильно авторизации
auth_failure_delay = 10



#---------Авторизация для pop, imap и smtp
auth default {

    #Механизмы
    mechanisms = plain login
    
    #Извлечение пароля
    passdb ldap {
  args = /usr/local/etc/dovecot-ldap.conf
    }
    
    #Извлечение пользовательских данных
    userdb ldap {
  args = /usr/local/etc/dovecot-ldap.conf
    }


    
    #Сокет для авторизации в postfix
    socket listen {
  client {
      path=/var/run/dovecot/auth-client
      mode=0666
      user=mailnull
      group=mail
  }
  master {
      path=/var/run/dovecot/auth-master
      mode=0600
      user=mailnull
      group=mail
  }
    }
}


Обязательно проверьте все пути. Данная конфигурация имеет namespace, который создаёт каждому пользователю в его почтовом ящике папку Folders, внутри которой пользователь по средствам MUA (mail user agent) создаст необходимую структуру папок для своих нужд, актуально для IMAP:

Параметр


namespace public {
    separator = /
    prefix = Folders/
    location = maildir:/var/mail/vhost/oskol.impexbank.ru/%h/Folders
    hidden = no
    inbox = no
}



И отключите отладку в /usr/local/etc/dovecot.conf.

Для тех кто установил новую версию Dovecot (1.2):

Settings:

 * Renamed 'ssl_disable=yes' to 'ssl=no'.
 * Renamed 'auth_ntlm_use_winbind' to 'auth_use_winbind', which also determines
   if GSS-SPNEGO is handled by GSSAPI or winbind.
 * Removed 'login_greeting_capability'. The capabilities are now always sent
   (Lemonade requires this and it's not that much extra traffic).
 * Removed 'auth_worker_max_request_count'. It was useful only with PAM, so it
   can now be specified in 'passdb pam { args = max_requests=n } '. The default
   is 100.




Отредактируем файл /usr/local/etc/dovecot-ldap.conf и приведём его к следующему виду:


# IP ADC (контроллер домена)
#
hosts= 192.168.0.100
ldap_version = 3

# Авторизоваться
#
auth_bind= yes

# Login
#
dn= CN=users,CN=Users,DC=oskol,DC=impexbank,DC=ru

# Password
#
dnpass= users

# Дерево в котором будет производиться поиск
#
base= CN=Users,DC=oskol,DC=impexbank,DC=ru

# Поиск в поддеревьях
#
deref=searching
scope=subtree

# Параметры пользователя
# Домашний каталог пользователя равен его e-mail адресу
# Получить домашний каталог можно через %h в dovecot.conf
#
user_attrs=mail=home
user_filter= (&(objectClass=user)(objectClass=person)(sAMAccountName=%u)(badPasswordTime=*))

# Параметры пароля
#
pass_attrs=sAMAccountName=user
pass_filter = (&(objectClass=user)(objectClass=person)(sAMAccountName=%u)(badPasswordTime=*))


После установки сервера IMAP, POP3 необходимо установить и настроить DSPAM, который будет фильтровать спам. DSPAM - открытое программное обеспечение, представляющее собой статический спам фильтр. По заявлению разработчика Jonathan A. Zdziarski DSPAM обладает высокой степенью фильтрации спама. DSPAM можно настроить в двух режимах - демон, вызов бинарного файла из MTA. В нашей конфигурации будем настраивать DSPAM с вызовом его бинарного файла из MTA. Установим DSPAM со следующими опциями:


[X] SYSLOG            Logs via syslog                           
[X] DEBUG             Enable debugging logging                  
[X] VERBOSE_DEBUG     Enable debug in LOGDIR/dspam.debug        
[X] BNR_DEBUG         Enable debug for BNR                      
[X] DAEMON            Daemonize dspam; speaks LMTP or DLMTP     
[X] MYSQL50           Use MySQL 5.0.x as back-end               
[X] MYSQL_COMPRESS    Compress dspam <--> MySQL                 
[X] LDAP              Enable recipient verification via LDAP    
[X] VIRT_USERS        Enable virtual users (needs SQL back-end) 
[X] LONG_USERNAMES    Usernames longer that OS supports         
[X] EXIM_LDA          Use Exim as local delivery agent        


В качестве back-end'a была выбрана MySQL 5-ой версии, поэтому в зависимости от Вашей версии MySQL выберите соответствующую опцию.

В DSPAM будет использоваться единая база для всех пользователей, поэтому создадим файл /var/db/dspam/group и запишем в него следующую информацию:


atrium:shared:*


После этого создадим два алиаса в файле /etc/mail/aliases:


spam:"|/usr/local/bin/dspam --user atrium --class=spam --source=error"
notspam:"|/usr/local/bin/dspam --user atrium --class=innocent --source=error"


На адрес spam@example.ru будет отсылаться спам, а на адрес notspam@example.ru будут отсылаться письма ошибочно помеченные фильтром как спам. После того как добавите информацию в файл /etc/mail/aliases не забудте выполнить команду:


exim_dbmbuild /etc/mail/aliases /etc/mail/aliases.db


Далее необходимо создать базу в MySQL для DSPAM и залить в неё следующие два файла:


/usr/local/share/examples/dspam/mysql/mysql_objects-speed.sql
/usr/local/share/examples/dspam/mysql/virtual_users.sql


После того как вы создадите базу для DSPAM у Вас в ней должны быть следующие таблицы:


mysql> show tables;
+----------------------+
| Tables_in_dspam      |
+----------------------+
| dspam_preferences    |
| dspam_signature_data |
| dspam_stats          |
| dspam_token_data     |
| dspam_virtual_uids   |
+----------------------+
5 rows in set (0.00 sec)


Если у Вас те же самые таблицы (если нет то проверьте загрузили ли Вы два файла указанных выше), то приступим к редактированию файла dspam.conf и приведём его к виду:


Home /var/db/dspam
StorageDriver /usr/local/lib/libmysql_drv.so
TrustedDeliveryAgent "/usr/local/sbin/exim -oMr spam-scanned"
OnFail error
Trust root
Trust mail
Trust mailnull
Trust vmail
Trust atrium
Debug *
TrainingMode teft
TestConditionalTraining on
Feature chained
Feature whitelist
Algorithm graham burton
PValue graham
ImprobabilityDrive on
SupressWebStats on
Preference "signatureLocation=headers"
Preference "showFactors=on"
Preference "spamAction=tag"
Preference "spamSubject=SPAM"
Preference "enableBNR=off"
Preference "enableWhilelist=on"
Preference "statisticalSedation=7"
Preference "whitelistThreshold=8"
AllowOverride trainingMode
AllowOverride spamAction spamSubject
AllowOverride statisticalSedation
AllowOverride enableBNR
AllowOverride enableWhitelist
AllowOverride signatureLocation
AllowOverride showFactors
AllowOverride optIn optOut
AllowOverride whitelistThreshold
MySQLServer     /tmp/mysql.sock
MySQLUser               dspam
MySQLPass               dspam
MySQLDb                 dspam
MySQLCompress           true
MySQLConnectionCache    10
MySQLUIDInSignature    on
HashRecMax              98317
HashAutoExtend          on
HashMaxExtents          0
HashExtentSize          49157
HashMaxSeek             100
HashConnectionCache     10
IgnoreHeader X-Spam-Status
IgnoreHeader X-Spam-Score
IgnoreHeader X-Spam-Scanned
IgnoreHeader X-Virus-Scanner-Result
IgnoreHeader Date
IgnoreHeader Envelope-to
IgnoreHeader Delivery-date
IgnoreHeader Received
IgnoreHeader User-Agent
IgnoreHeader Content-Type
IgnoreHeader Content-Transfer-Encoding
IgnoreHeader To
Notifications   off
LocalMX 127.0.0.1
SystemLog on
Opt out
MaxMessageSize 307200
ProcessorBias on
TrainPristine off
ParseToHeaders on
ChangeModeOnParse on
ChangeUserOnParse on



Приступим к настройке самой главной части, нашему MTA(mail transfer agent). Все опции  находятся в /usr/local/etc/exim/configure, но для удобства я предлагаю разбить стандартный конфигурационный файл на следующие подфайлы, которые через .include будут включаться в главный конфигурационный файл:

acl.conf - ACL списки
transport.conf - транспорты для доставки почты
router.conf - роутеры для маршрутизации почты
macros.conf - макросы, которые будут использоваться
ldap.conf - запросы и параметры для подключения к LDAP(AD)

Приводим главный конфигурационный файл /usr/local/etc/exim/confiure Exim к следующему виду:

#----------------------------------------------
# Name: Exim and AD
# Author: atrium (sysatrium)
# Modify: 16.09.2009
# Copyright (c) atrium (sysatrium), 07.07.2009
# Comment: Спам-фильтр DSPAM.
#----------------------------------------------



#---------------------------------------
# Требующие изменения
#---------------------------------------

# Файл извлекающий e-mail адреса из группового адреса в AD
#
perl_startup=do '/usr/local/etc/exim/MailList_AD.pl'


# Моя подсеть. Можно через (:) указывать узлы отдельно
#
hostlist my_lan = 192.168.0.0/24 : 127.0.0.1


# Полное имя машины на которой работает MTA
# Если опция не задана, то используется специальный вызов uname()
#
primary_hostname = mail.oskol.impexbank.ru


# На каком интерфейсе работает сервер
#
local_interfaces = 192.168.0.101 : 127.0.0.1
daemon_smtp_ports = 25 : 465


# Максимальный размер сообщения
#
message_size_limit=100M


# SMTP баннер
#
smtp_banner="Sendmail version 1.0"


# Управление кэшем обратных вызовов (callout)
#
callout_negative_expire = 1h
callout_positive_expire = 5d
callout_domain_negative_expire = 1h
callout_domain_positive_expire = 7d


# Параметры создают список доменов и список хостов
# Если у Вас есть почтовый шлюз от которого сервер принимает почту
# его необходимо добавить в параметр: 'relay_from_hosts'
#
domainlist local_domains = localhost :  oskol.impexbank.ru
hostlist   relay_from_hosts = localhost : 127.0.0.0/8 


# Внешние домены для которых можно принимать почту, т.е MTA будет релеем для этих доменов
#
domainlist relay_domains =


# Группа администраторов. Могут просматривать очереди сообщений.
# Просмотр очреди доступен, если опция 'queue_list_requires_admin=true'
# Доступны опции -M -q -R -S
#
admin_groups=exim_admin


# Разрешить просмотр очереди юзерам, которые состоят в группе определённой опцией
# admin_groups
#
queue_list_requires_admin=true


# Разрешить управление принудителной доставкой юзерам, которые состоят
# в группе определённой опцией  admin_groups
#
prod_requires_admin = true


# Обработка логов
# Для записи сообщений в syslog в параметре 'log_file_path' необходимо указать syslog
#
log_file_path=/var/log/exim/exim-%s.log
syslog_duplication = false
syslog_timestamp = false
log_selector= \
    +deliver_time \
    +delay_delivery \
    +all_parents \
    +received_recipients \
    +received_sender \
    +smtp_protocol_error \
    +smtp_syntax_error \
    +smtp_connection \
    +connection_reject \
    +sender_verify_fail \
    +size_reject
    

# Ведение логов для отдельного сообщения
# Для уменшения нагрузки стоит отключить
#
message_logs = false


# Вести лог откланённых сообшений
#
write_rejectlog = true


# ACL списки
#
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
acl_smtp_mail = acl_check_mail
acl_smtp_mime = acl_smtp_mime


# Проверка антивирусом
#
av_scanner = clamd:/var/run/clamav/clamd.sock


# Включения
#
.include /usr/local/etc/exim/macros.conf
.include /usr/local/etc/exim/ldap.conf


#--------------------------------
#   TLS   |
#--------------------------------

# Определяет список хостов для которых доступна команда STARTTLS
#
tls_advertise_hosts = *


# Сертификаты
#
tls_certificate = /usr/local/etc/exim/ssl/mail.pem
tls_privatekey = /usr/local/etc/exim/ssl/mailkey.pem


# Порт для TLS
# 
tls_on_connect_ports = 465





#-------------------------------
# Другие общие опции  |
#-------------------------------

# Домен добавляемый к адресу, если в нёт отсутствует доменная часть
#
qualify_domain = oskol.impexbank.ru
#qualify_recipient = oskol.impexbank.ru


# Список хостов, которым разрешено отправлять сообщения без доменной части
# доменная часть добавляется из оций qualify_domain и qualify_recipient
#
sender_unqualified_hosts = 127.0.0.1
recipient_unqualified_hosts = 127.0.0.1


# Разрешать принимать почту в виде name@[192.168.0.1]
# Т.е ручная маршрутизаци почты. Используется спамерами
#
allow_domain_literals = false


# Группа и пользователь от которого работает Exim
#
exim_user = mailnull
exim_group = mail


# Юзер от которого запрещена работа доставки
#
never_users = root


# Отключить поддержку ipv6
#
disable_ipv6 = true


# Количество символов, которые сохраняются в переменной $message_body
#
message_body_visible = 200


# Отсылает 8BITMIME в ответ на EHLO
#
accept_8bitmime = true


# Кодировка заголовков
#
headers_charset=KOI8-R


# Максимально количество получателей, максимально количество команд RCPT TO
#
recipients_max = 200
recipients_max_reject = true


# Количество неправильных SMTP команд, после чего соединение разрывается
#
smtp_max_unknown_commands = 3


# Более детальные ответы на ошибки
#
smtp_return_error_details = true


# RFC1413
#
rfc1413_hosts = *
rfc1413_query_timeout = 5s




#--------------------------------------------------------
# Управление сообщениями с пометкой frozen  |
#--------------------------------------------------------

# Через какой период повторять отправку сообщений с пометкой frozen
#
auto_thaw = 0s


# Отправлять уведомление отправителю, если его сообщение заморожено
#
freeze_tell = false


# Сколько хранить замороженные отлупы сообщений
timeout_frozen_after = 2d


# Определяет время через которое будет повторная отправка рикошета, если его не возможно доставить
# После попытки отправки рикошета и если она неудачна он удаляется
#
ignore_bounce_errors_after = 5h


# Время хранения сообщения в очереди чьи spool записи повреждены, если оно не может быть доставлено
# После чего удаляется и инцидент логируется
#
keep_malformed = 2d




#-------------------------------------------
# Пути к каталогам и файлам          |
#-------------------------------------------

spool_directory = /var/spool/exim
split_spool_directory = false
pid_file_path = /var/run/exim.pid




#----------------------------------------------------------------
#       Демон отправки уведомлений в случае ошибок доставки     |
#----------------------------------------------------------------

#bounce_message_file = /usr/local/etc/exim/bounce.cf
bounce_return_body = true
bounce_return_message = true
bounce_return_size_limit = 100K




#-------------------------------------
#      Управление соединениями       |
#-------------------------------------

# Максимально число соединений с 1 компьютера
#
smtp_accept_max_per_host=5

# Максимальное количество одновременных соединений по smtp
#
smtp_accept_max = 50

# Резервирует соединения для указанных хостов
#
smtp_accept_reserve = 5
smtp_reserve_hosts = 10.178.1.79




#-----------------------------
#     ACL        |
#-----------------------------

.include /usr/local/etc/exim/acl.conf




#--------------------------------
# Обработка роутеров  |
#--------------------------------
# Порядок обработки роутеров имеет значение

begin routers

.include /usr/local/etc/exim/router.conf




#--------------------------------
#          ТРАНСПОРТ    |
#--------------------------------

begin transports

.include /usr/local/etc/exim/transport.conf



#----------------------------------------
# Конфигурация повторов   |
#----------------------------------------

begin retry


# Address or Domain    Error       Retries
# -----------------    -----       -------

*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h



#---------------------------------
#         Авторизация            |
#---------------------------------

begin authenticators

dovecot_login:
  driver = dovecot
  public_name = LOGIN
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1
  
dovecot_plain:
  driver = dovecot
  public_name = PLAIN
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1


Так как у нас в конфигурации установлен следующий параметр:

# Группа администраторов. Могут просматривать очереди сообщений.
# Просмотр очреди доступен, если опция 'queue_list_requires_admin=true'
# Доступны опции -M -q -R -S
#
admin_groups=exim_admin


то соответственно необходимо создать соответствующую группу exim_admin в которой будут состоять пользователи имеющие возможность выполнять административные действия связанные с опциями -M -q -R -S. Конфигурационный файл содержит достаточное количество комментариев, поэтому несложно будет разобраться.

Далее создадим файл macros.conf следующего содержания, который будет располагаться в том же каталоге, что и главный конфигурационный файл:

#---------------------------------------------
# Author: atrium (sysatrium)
# Modify: 15.10.2009
# Copyright (c) atrium (sysatrium), 17.09.2009
# Description: Macros for exim.conf
#---------------------------------------------


# Путь к внешним скриптам
#
PATH_SCRIPT=/usr/local/etc/exim


# Путь к почтовым ящикам. Владельцем должен быть пользователь
# такой же, который установлен в транспорте для доставки сообщений
#
PATH_MAILBOX=/var/mail/virtual/oskol.impexbank.ru


# Включение проверки расширений файлов вложений. Если включить данную
# опцию, то будут запрещаться определённые расширения файлов для отправки
# Для включения и выключения  проверки использовать: yes/no
#
CHECK_EXTENSION_FILE=yes


# Максимальный размер сообщения для локальной сети
# Для включения и выключения проверки использовать: yes/no
#
CHECK_MESSAGE_SIZE_LAN = yes #Включить проверку на ограничение размера
MSL_LAN = 20M

# Максимальный размер сообщения для интернета
# Для включения и выключения проверки использовать: yes/no
#
CHECK_MESSAGE_SIZE_INTRANET = yes #Включить проверку на ограничение размера
MSL_INTERNET = 10M


# Ограничение количества отправленных сообщений для клиента
#
RATE_LIMIT_COUNT = 100
RATE_LIMIT_TIME = 1m
RATE_LIMIT = yes #Разрешает использовать лимиты на отправку


#---------Используются в зависимости от бэкэнда (mysql, ad, pgsql, ldap)
#---------Можно отключить, если не используются или игнорировать
#
# Содержит e-mail адреса и домены, которым запрещено отправлять почту
# После внесения изменений в файл deny_sender не забываем выполнять команду
# exim_dbmbuild deny_sender deny_sender.db
#
DENY_SENDER=/etc/exim/deny_sender.db


# Содержит e-mail адреса и домены, которым запрещено получать почту
# После внесения изменений в файл deny_recipient не забываем выполнять команду
# exim_dbmbuild deny_recipient deny_recipient.db
#
DENY_RECIPIENT=/etc/exim/deny_recipient.db


# Содержит IP адреса машин или подсети, которым запрещён доступ к отправке почты
# Посик в файле линейный, поэтому после внесения данных они сразу станут доступны
#
DENY_HOST=/etc/exim/deny_host



Создаём ещё один файл - ldap.conf в том же каталоге, что и главный конфигурационный файл. Этот файл будет содержать параметры подключения к LDAP (AD) и соответствующие запросы для извлечения информации.

#--------------------------------------------
# Author: atrium (sysatrium)
# Name: work witch the ldap server
# Modify: 16.09.2009
# Copyright (c) atrium (sysatrium), 16.09.2009
# Description: Connection for LDAP server
#        - AD (Active Directory)
#        - OL(OpenLDAP)   
#---------------------------------------------


# Сервер LDAP
#
hide ldap_default_servers = 192.168.0.100

# Версия LDAP
#
hide ldap_version = 3

# Пользователь для доступа в LDAP
# Права только на чтение
#
LDAP_BIND_USER="CN=users,CN=Users,DC=oskol,DC=impexbank,DC=ru"

# Пароль для пользователя LDAP_BIND_USER
#
LDAP_BIND_PASS="users"

# Количество возвращаемых записей
#
LDAP_SIZE=100

# База в которой будет происходить поиск
#
LDAP_BASE_SEARCH=CN=Users,DC=oskol,DC=impexbank,DC=ru

# Выбрать все E-Mail
# Запрос в AD
#
AD_LDAP_MAIL_RCPT= \
    user=LDAP_BIND_USER \
    pass=LDAP_BIND_PASS \
    ldap:///LDAP_BASE_SEARCH?mail?sub?(&(objectCLass=top)(objectClass=person) \
(objectClass=organizationalPerson)(objectClass=user) \
(mail=${quote_ldap:${local_part}@${domain}}) (badPasswordTime=*))

# Получение группового адреса
# Запрос в AD
#
AD_LDAP_MAIL_GROUP= \
    user=LDAP_BIND_USER \
    pass=LDAP_BIND_PASS \
    ldap:///LDAP_BASE_SEARCH?mail?sub?(&(objectClass=top)(objectClass=group) \
(mail=${quote_ldap:${local_part}@${domain}}))
    

# Получение группововго адреса. Если отправитель группа рассылки то запрещать отправку через ACL
# Запрос в AD
#
AD_LDAP_MAIL_AUTH_GROUP= \
    user=LDAP_BIND_USER \
    pass=LDAP_BIND_PASS \
    ldap:///LDAP_BASE_SEARCH?mail?sub?(&(objectClass=top)(objectClass=group) \
(mail=${quote_ldap:${sender_address}}))



# Получение пользователей, которым разрешено отправлять письма через сервер
# Запрос в AD
#
AD_LDAP_MAIL_AUTH_SENDER= \
    user=LDAP_BIND_USER \
    pass=LDAP_BIND_PASS \
    ldap:///LDAP_BASE_SEARCH?mail?sub?(&(objectClass=top)(objectClass=person) \
(objectClass=organizationalPerson)(objectClass=user) \ 
(mail=${quote_ldap:${sender_address}}) (badPasswordTime=*))


Единственное, что необходимо изменить в этом файле это указать IP сервера PDC и пользователя которым будем подключаться к серверу.

Следующие два очень важных файла: транспорты, роутеры.

transport.conf

#---------------------------------------------
# Author: atrium (sysatrium)
# Modify: 06.10.2009
# Copyright (c) atrium (sysatrium), 06.10.2009
# Description: Transport for the Exim
#---------------------------------------------


# Виртуальные пользователи. Необходимо создать пользователя
# 'vmail' от имени которого будет производиться процесс доставки.
# Необходимо выставить необходимую квоту на ящик
#
virtual_user:
    driver = appendfile
    delivery_date_add = true
    envelope_to_add = true
    return_path_add = true
    directory = PATH_MAILBOX/${local_part}@${domain}
    user=vmail
    group=mail
    check_owner = true
    create_directory = true
    directory_mode = 0750
    mode = 0600
    maildir_format = true
    mailbox_size = 100M
    maildir_use_size_file = true
    maildir_retries = 5
    maildir_tag = ,S=${message_size}
    allow_symlink = false


# Доставка по smtp
#
remote_smtp:
  driver = smtp
  command_timeout = 3m
  connect_timeout = 5m
  connection_max_messages = 500
  data_timeout =5m


# Локальные пользователи
#
local_user:
  driver = appendfile
  file = /var/mail/$local_part
  delivery_date_add
  envelope_to_add
  return_path_add
  group = mail
  user = $local_part
  mode = 0660
  mbx_format = true
  no_mode_fail_narrower
  notify_comsat = true


# Передача сообщений в канал
#
address_pipe:
  driver = pipe
  return_output


# Добавление почты в файл
#
address_file:
 driver = appendfile
 delivery_date_add
 envelope_to_add
 return_path_add


# Транспорт автоответов
#
address_reply:
  driver = autoreply



# DSPAM
#----------------------------------------------------------------------
# Сканирование на спам, если DSPAM вызывается как бинарник.
# Важное значение имеет количество подключений к MySQL и режим обучения.
#
spam_scan:
    driver = pipe
    command = /usr/local/bin/dspam --deliver=innocent --user "$local_part@$domain" -- %u
    user = mailnull
    group = mail
    return_path_add = false
    log_output = true
    return_fail_output = true


# Внесение письма в категорию спам
#
spam:
    driver = pipe
    command = /usr/local/bin/dspam --user "$local_part@$domain" --class=spam --source=error
    return_path_add = false
    return_fail_output = false
    log_output = true
    home_directory = /var/db/dspam
    current_directory = /var/db/dspam
    user = mailnull
    group = mail


# Удаление письма из категории спам
#
notspam:
    driver = pipe
    command = /usr/local/bin/dspam --user "notspam@$domain" --class=innocent --source=error \
--deliver=innocent %u
    return_path_add = false
    return_fail_output = false
    log_output = true
    home_directory = /var/db/dspam
    current_directory = /var/db/dspam
    user = mailnull
    group = mail


# Добавление писем с пометкой спам в папку SPAM
#
spam_filter:
    driver = appendfile
    user = 1006
    group = mail
    create_directory = true
    directory = PATH_MAILBOX/$local_part@$domain/.SPAM
    maildir_format = true
    delivery_date_add = false
    envelope_to_add = false
    return_path_add = false
    check_owner = true
    directory_mode = 0700
    maildir_retries = 3
    mode = 0600
#--------------
#-----End DSPAM


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

router.conf

#---------------------------------------------
# Author: atrium (sysatrium)
# Modify: 29.09.2009
# Copyright (c) atrium (sysatrium), 29.09.2009
# Description: Router for Exim
#---------------------------------------------


# Сканирование на спам - DSPAM. Работает, если DSPAM вызывается
# как бинарный файл.
#
spam_scan:
    driver=accept
    verify = false
    address_test = false
    condition = "${if and {{!eq {$received_protocol}{spam-scanned}} \
{!eq {$received_protocol}{local}} }{1}{0}}"
    transport = spam_scan
    require_files = /usr/local/bin/dspam
    local_parts = !spam : !notspam


# Внешние адреса. Если имеется шлюз, то этот транспорт
# необходимо убрать, так как все внешние адреса будут обрабатываться
# шлюзом
#
dnslookup:
    driver = dnslookup
    domains = ! +local_domains
    transport = remote_smtp
    ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : +my_lan
    no_more


# Пометка письма как спам. Исползуется в случае, если установлен DSPAM
#
spam:
    driver = accept
    local_part_prefix = spam
    transport = spam
    address_test = false


# Отмена пометки письма как спам. Используется в случае, если установлен DSPAM
#
notspam:
    driver = accept
    local_part_prefix = notspam
    transport = notspam
    address_test = false

# Обработка локальных алиасов. Отправлять могут только пользователи домена.
#
local_aliases:
    driver=redirect
    condition = ${if match_domain{$sender_address_domain}{+local_domains}}
    data=${lookup{$local_part}lsearch{/etc/mail/aliases}}
    file_transport=address_file
    pipe_transport=address_pipe
    address_test = false


# Обработка виртуальных алиасов. Адреса в базе указываются через (,)
# Отправка разрешена только внутренним пользователям, т.к они авторизованы
# Если нужна рассылка на определённые группы, то лучше создайте отдельный роутер для них
#
virtual_aliases:
  driver = redirect
  condition = ${if match_domain{$sender_address_domain}{+local_domains}}
  data = ${perl{get_mail_lists}{${lookup ldap{AD_LDAP_MAIL_GROUP}}}}
  forbid_file = true


# Обработка локальных пользователей
#
local_user:
    driver = accept
    check_local_user = true
    transport = local_user
    address_test = false


# Отправка писем с пометкой SPAM в папку SPAM. Можно использовать для различных
# сканеров на спам.
#
spam_filter:
    driver = accept
    condition = ${if match{$h_X-DSPAM-Result:}{Spam}}
    transport = spam_filter
    no_more



# Обработка виртуальных пользователей
#
virtual_user:
    driver = accept
    condition = ${lookup ldap{AD_LDAP_MAIL_RCPT}{true}{false}}
    transport = virtual_user
    cannot_route_message = Relay access denied      


Порядок следования роутеров очень важен, поэтому при добавлении нового будте внимательны.

Создадим файл ACL, который будет обеспечивать защиту от спама средствами MTA (Exim). Конфигурационный файл содержит достаточное количество комментариев для того что бы разобраться.

#---------------------------------------------------
# Author: atrium (sysatrium)
# Name: ACL for Exim
# Comment: Необходимо изменить некоторые 
#    ACL при изменении back-end'a (sql, ldap)
# Modify: 23.10.2009
# Copyright (c) atrium (sysatrium) 08.07.2009
#---------------------------------------------------
#------version_1.0----------------------------------
#
# В ACL необходимо добавить проверку в rbl листах (dnslists)
#-----------------------------------------------------------
# deny dnlists = rbl.example.ru
#      sender_domains = !+local_domains


#-----------------------------
#           ACL              |
#-----------------------------

begin acl

# Ограничения применяемые после использования команды 'MAIL FROM'
#
acl_check_mail:
    
    # Делает небольшую задержку для отправителя не из
    # своей сети и не из списка релеев
    #
    warn set acl_m0 = 20s
    
    warn hosts = +my_lan : +relay_from_hosts
         set acl_m0 = 0s
         
    warn delay = $acl_m0

    accept




# Ограничения применяемые после ипользования команды 'RCPT TO'
#
acl_check_rcpt:
    
    # Используется для вычисления количества получателей при отправке письма для postmaster или abuse
    #
    warn set acl_m1 = 1
   sender_domains = !+local_domains
   local_parts = postmaster : abuse


    # Задаёт переменные для организации разделения размера сообщения для локальной сети
    # и интернета
    #
    warn set acl_c0 = unlocal

    warn domains=+local_domains
   set acl_c0= local


    # Ограничение количества посылаемых сообщений одним клиентом за период времени
    # Данное ограничение действует только для внешних клиентов.
    # Параметры RATE_LIMIT_COUNT и RATE_LIMIT_TIME задаются в файле macros.conf
    # Для включения лимитов используется параметр RATE_LIMIT: yes/no
    #
    defer ratelimit = RATE_LIMIT_COUNT / RATE_LIMIT_TIME / per_mail
    hosts = !+my_lan : !+relay_from_hosts
    condition = ${if eq{RATE_LIMIT}{yes}}
          message = "Ratelimit to send message  $sender_rate_limit/$sender_rate_period \
              for hosts $sender_host_address from $sender_address"


    # Авторизация и TLS обязательно должна использоваться для пользователей домена
    #
    deny message = "Not authenticated users ${sender_address} (hosts: $sender_host_address)"
         !authenticated = *
         hosts = !+relay_from_hosts
         senders = ${lookup ldap{AD_LDAP_MAIL_AUTH_SENDER}}
    
    deny message = "Need use TLS (hosts: $sender_host_address}"
         !encrypted = *
         hosts = !+relay_from_hosts
         senders = ${lookup ldap{AD_LDAP_MAIL_AUTH_SENDER}}


    # При отправке от postmaster@*, abuse@* количество получателей не должно быть больше 1
    # При условии, что postmaster и abuse с другого домена. Для локального postmaster
    # количество получателей не ограниченно, так как при отправке от его имени 
    # требуется авторизация. Подсчёт начинается с 0.
    #
    deny message = "Message from $sender_address are never sent to more than \
one recipient (host: $sender_host_address)"
   sender_domains = !+local_domains
   senders = postmaster@* : abuse@*
   condition = ${if >{$recipients_count}{0}}


    # Запрет приёма сообщения с <> отправителем, если количество получателей больше 1
    # Спамеры довольно часто используют <> адрес отправителя, а по RFC MTA 
    # должен принимать письма с пустым <>. Подсчёт начинается с 0.
    #
    deny message = "Message from <$sender_address> are never sent to more that \
one recipient (host: $sender_host_address)"
   senders = :
   condition = ${if >{$recipients_count}{0}}
    
    
    # Ограничение на приём сообщений для postmaster и abuse.
    # Если получателей больше 1, то сообщение блокируется.
    #
    deny message = "Message from <$sender_address> to <postmaster or abuse> are never \
contain to more that on recipient (host: $sender_host_address)"
   sender_domains = !+local_domains
   condition = ${if >{${eval: ($acl_m1+$recipients_count)-1}}{0}}
    

    # Обработка приветствия HELO/EHLO. Избавляет MTA от ненужных запросов к DNS
    #
    deny message = "HELO/EHLO command must be in accordance with (See RFC2821)"
   hosts = !+relay_from_hosts : !+my_lan : *
         condition = ${if eq{$sender_helo_name}{}{true}{false}}

    deny message = "HELO/EHLO IP $interface_address access denied"
         hosts = !+relay_from_hosts : !+my_lan : *
         condition = ${if match{$sender_helo_name}{\N^\[?\N$interface_address\N\]?$\N}{true}{false}}

    deny message = "HELO/EHLO hostname $primary_hostname access denied (See RFC2821)"
         hosts = !+relay_from_hosts : !+my_lan : *
         condition = ${if eq{$sender_helo_name}{$primary_hostname}{true}{false}}

    deny message = "HELO/EHLO domain $sender_helo_name access denied"
         hosts = !+relay_from_hosts : !+my_lan : *
         condition = ${if match_domain{$sender_helo_name}{+local_domains}{true}{false}}

    deny message = "HELO/EHLO format ip address access denied (See RFC2821)"
   hosts = !+relay_from_hosts : !+my_lan : *
   condition = ${if isip{$sender_helo_name}}

    deny message = "HELO/EHLO format access denied (See RFC2821)"
   hosts = !+relay_from_hosts : !+my_lan : *
   condition = ${if match{$sender_helo_name}{\N\.\N}{no}{yes}}

    deny message = "HELO/EHLO format access denied (See RFC2821)"
   hosts = !+relay_from_hosts: !+my_lan : *
   condition = ${if match{$sender_helo_name}{\N\.$\N}{yes}{no}}

    deny message = "HELO/EHLO format access denied (See RFC2821)"
   hosts = !+relay_from_hosts : !+my_lan : *
   condition = ${if match{$sender_helo_name}{\N\.\.\N}{true}{false}}


    # Запрет использования IP адреса в local_part отправителя
    #
    deny message = "Not use IP in name senders"
         condition = ${if match{$sender_address}{\N\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \
\@\N$sender_address_domain\N\N}{true}{false}}


    # Запрет отправления от самого себя и самому себе
    #
    deny message = "${sender_address}=${local_part}@${domain} (host: $sender_host_address)"
   hosts = !127.0.0.1
         condition = ${if eq{${sender_address}}{$local_part@$domain}{true}{false}}


    # Запрещать определённые символы в локльной части адреса (т.е  имя)
    #
    deny message       = Restricted characters in address
         domains       = +local_domains
         local_parts   = ^[.] : ^.*[@%!/|]

    deny message       = Restricted characters in address
         domains       = !+local_domains
         local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./


    # Чёрные списки, блокируют отправителей, получателей, домены, IP, сети
    # Раскомментировать
    #
    deny message = "Hosts ${sender_host_address} access denied"         # IP отправителя
         hosts = ${lookup{$sender_host_address}iplsearch{DENY_HOST}}

    deny message = "Sender ${sender_address} access denied"             # Адрес отправителя
         hosts = *
         senders = ${lookup{$sender_address}dbm{DENY_SENDER}}

    deny message = "Domain ${sender_address_domain} access denied"      # Домен отправителя
         hosts = *
         sender_domains = ${lookup{$sender_address_domain}dbm{DENY_SENDER}}

    deny message = "Access denied recipients ${local_part}@${domain}"   # Адрес получателя
         hosts = *
         recipients =${lookup{$local_part@$domain}dbm{DENY_RECIPIENT}}

    deny message = "Access denied recipient domain ${domain}"           # Домен получателя
         hosts =  *
         domains = ${lookup{$domain}dbm{DENY_RECIPIENT}}


    # Проверка HELO/EHLO
    #
    deny message = "HELO/EHLO are with RFC2821"
         hosts = !+my_lan : !+relay_from_hosts
         !verify = helo


    # Проверка получателя
    #
    require verify = recipient


    # Проверка отправителя с помощью обратного вызова
    # Раскоментировать
    #
#    deny message = "Not sender $sender_address (host: $sender_host_address)"
#  sender_domains = !+local_domains
#  !verify = sender/callout=40s


    # Блокировка получателей, которых нет в базе пользователей.
    # Если письмо предназначено для получателя домена
    #
    deny !recipients= ${lookup ldap{AD_LDAP_MAIL_RCPT}} : ${lookup ldap{AD_LDAP_MAIL_GROUP}} : \
spam@oskol.impexbank.ru : notspam@oskol.impexbank.ru
   hosts = !127.0.0.1
         domains = +local_domains
         message= "Not found recipient $local_part@$domain (host: $sender_host_address)"
    
    
    # Блокировка хостов, которые пытаются отправить почту от адреса группы рассылки нашего домена
    #
    deny message = "Access denied sender address <$sender_address> (host: $sender_host_address)"
   senders = ${lookup ldap{AD_LDAP_MAIL_AUTH_GROUP}}


    # Запрет посылки письма на группы рассылки из вне. Рассылка разрешена только
    # пользователям домена.
    #
    deny message = "Mailing an the address <$local_part@$domain> access denied"
   sender_domains = !+local_domains
   recipients = ${lookup ldap{AD_LDAP_MAIL_GROUP}}


    # Защита от открытого релея
    #
    accept hosts         = +relay_from_hosts
           control       = submission

    accept authenticated = *
           control       = submission

    require message = relay not permitted
            domains = +local_domains

    accept




# Ограничения на команду 'DATA'
#
acl_check_data:

# Ограничение размера сообщения для локальной сети. Размер сообщения задаётся
# макросом 'MSL_LAN' в файле macros.conf. Для того чтобы работал данный запрет
# необходимо в файле macros.conf значение 
# CHECK_MESSAGE_SIZE_LAN выставить в 'yes'
#
    deny message = "Size message limit for lan MSL_LAN"
   condition = ${if and { \
      { \
      eq{CHECK_MESSAGE_SIZE_LAN}{yes} \
      } \
      { \
      eq{$acl_c0}{local} \
      } \
      { \
      >{$message_size}{MSL_LAN} \
      } \
        }} 


# Ограничения размера сообщения для интернета. Размер сообщения задаётся 
# макросом 'MSL_INTERNET' в файле macros.conf. 
# Для того чтобы работал данный запрет 
# в файле macros.conf значение 
#CHECK_MESSAGE_SIZE_INTRANET выставить в 'yes'
    #
    deny message = "Size message limit for internet MSL_INTERNET"
   condition = ${if and { \
      { \
      eq{CHECK_MESSAGE_SIZE_INTRANET}{yes} \
      } \
      { \
      eq{$acl_c0}{unlocal} \
      } \
      { \
      >{$message_size}{MSL_INTERNET} \
      } \
        }}


    # Проверка сиснтаксиcа заголовков в отправляемом сообщении
    #
    deny message = "Incorrect syntax header in message"
   sender_domains = !+local_domains
   !verify = header_syntax


    # Запрет сообщений содержищих вирус. Если возникнут проблемы с антивирусом,
    # то доставка будет произведена.
    #
    deny demime     = *
         malware    = */defer_ok
         hosts      = !+relay_from_hosts : *
         message    = This message contains a virus ($malware_name).


    # Включение в сообщения заголовка о том, что письмо проверено антивирусом
    # и спам фильтром
    #
    warn add_header = X-Virus-Scaned: ClamAV


  accept



acl_smtp_mime:
    
# Запрет отправки определённого типа файлов. 
# Все расширения можно хранить в базе
# и извлекать соответствующим запросом. Первое ACL извлекает расширение файла,
# которое сравнивается с набором расширений извлечённых из базы данных,
# файла или перечисленных в условии. Второе ACL используется, 
# если вдруг пользователь
# переименовал файл и добавил к существующему 
# расширению новое например: 'test.exe.doc'
# это ACL будет извлекать второе расширение. 
# Для включения данной ACL используется 
# опция CHECK_EXTENSION_FILE, если 'yes' - проверять, 
# если 'no' - то не проверять.
#
    warn hosts = !+relay_from_hosts : * 
   condition = ${if eq{CHECK_EXTENSION_FILE}{yes}}
   set acl_m0 = ${extract{-1}{.}{${lc:$mime_filename}}}

    warn hosts = !+relay_from_hosts : *
   condition = ${if eq{CHECK_EXTENSION_FILE}{yes}}
   set acl_m1 = ${extract{-2}{.}{${lc:$mime_filename}}}
   
    
    # Запрет отправки файлов с определёнными расширениями файлов
    #    
    deny message = "Access denied extension - [$acl_m0] file (phase: 1)"
   condition = ${if eq{$acl_m0}{exe}}

    deny message = "Access denied extension - [$acl_m0] file (phase: 2)"
   condition = ${if eq{$acl_m1}{exe}}


    accept



размещено: 2009-06-19,
последнее обновление: 2010-11-17,
автор: atrium

оценить статью:

Alexander, 2010-04-27 в 11:22:30

А почему эта статья только по поиску отображается и не присутствует в
www.lissyara.su—>статьи—>FreeBSD—>почтовые системы—>

atrium, 2010-05-01 в 23:57:19

она ещё не публиковалась

Дмитрий, 2010-09-03 в 13:09:45

atrium, спасибо, статья супер!

adre, 2011-05-12 в 20:23:37

Давай публикуй уже =)

arez1978, 2012-03-15 в 8:10:04

Приветствую! Настраиваю по статье и у меня произошла оказия, при отправке письма одним из пользователей на адрес другого пользователя домена получаю следующее сообщение в логах (exim -bd -d+all > /var/log/exim-debug.log 2>&1):
[code]
09:05:16 19442 Start search
09:05:16 19442 search ended by ldap_result yielding 115
09:05:16 19442 ldap_parse_result: -14
09:05:16 19442 ldap_parse_result yielded 0: Success
09:05:16 19442 LDAP search: no results
09:05:16 19442 lookup failed
09:05:16 19442 expanding: ${lookup ldap{user=CN=exim,CN=Users,DC=domen,DC=ru pass=Mail256 ldap:///DC=domen,DC=ru?mail?sub?(&(objectClass=top)(objectClass=g
09:05:16 19442    result:
09:05:16 19442 Starting Perl interpreter
09:05:16 19442 failed to expand: ${perl{get_mail_lists}{${lookup ldap{user=CN=exim,CN=Users,DC=domen,DC=ru pass=PassMail256 ldap:///DC=domen,DC=ru?mail?sub?(&(
09:05:16 19442    error message: Undefined subroutine &main::get_mail_lists called.
09:05:16 19442
09:05:16 19442 virtual_aliases router: defer for semenovd@domen.ru
09:05:16 19442   message: failed to expand "${perl{get_mail_lists}{${lookup ldap{user=CN=exim,CN=Users,DC=domen,DC=ru pass=PassMail256 ldap:///DC=domen,DC=ru?m
09:05:16 19442
09:05:16 19442 ---------— end verify ------------
[/code]

Часть кода обрезалась справа. Буду рад любому коментарию

arez1978, 2012-03-20 в 7:50:27

перемудрил с перловым скриптом, он неверно формировал список.

drewhka, 2012-04-06 в 12:31:11

Небольшой баг в perl-скрипте.
Вместо
$mail_lists = substr($mail_lists,1)
надо написать
$mail_lists = substr($mail_lists,2)

Иначе в возвращаемом списке рассылки будет запятая в начале =)

Alexandr, 2012-05-23 в 10:51:48

Не написано откуда взяты эти сертификаты
ssl_cert_file=/usr/local/etc/postfix/cert/postfix_public_cert.pem
ssl_key_file=/usr/local/etc/postfix/cert/postfix_private_key.pem


tls_certificate = /usr/local/etc/exim/ssl/mail.pem
tls_privatekey = /usr/local/etc/exim/ssl/mailkey.pem

sysatrium, 2012-05-23 в 11:13:22

В начале статьи указано как генерить

Alexandr, 2012-05-24 в 8:42:21

ssl_cert_file=/usr/local/etc/postfix/cert/postfix_public_cert.pem
ssl_key_file=/usr/local/etc/postfix/cert/postfix_private_key.pem
и
tls_certificate = /usr/local/etc/exim/ssl/mail.pem
tls_privatekey = /usr/local/etc/exim/ssl/mailkey.pem

это одни и те же файлы?

И вообще на форуме бы обсудить...

kolesya, 2012-08-14 в 19:18:39

Монстрище :)
Я так понял хочеш развязать localuser@domain.local и externalemail@external.domain  ... респект )  

может поможет (аська сто семь 19 ноль девять)
==================================================
dovecot_gssapi:
   driver = dovecot
   public_name = GSSAPI
   server_socket = /var/run/dovecot/auth-client
==================================================

MMC, 2013-04-11 в 9:00:34

Привет автору, статья мне очень помогла. Огромное спасибо!
Небольшое дополнение:
я запарился вопросом избавления от скрипта, и нашел вот такой роутер и запрос для групп:
[url=http://mcleod095.blogspot.ru/2011/12/exim-ad-groups-and-users.html]
применил у себя - работает на ура.

archan84, 2014-02-20 в 7:05:13

статья очень помогла,спасибо,но тут есть недочет!!!можно авторизованному пользователю писать от имени любового почтового ящика из AD другого пользователя!


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 8 чел.
За последние 30 мин было: 38 человек
За сегодня было
756 показов,
78 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.4614 секунд
Из них PHP: 62%; SQL: 38%; Число SQL-запросов: 86 шт.
Исходный размер: 219239; Сжатая: 40851