Поиск

Газета FOSS News

12 марта 2010

О газете
Архив
Авторам
Рекламодателям

 

Кабинет читателя

Вход в систему
Введите имя пользователя и пароль для входа в систему:



Наши друзья


Ротация кнопок.

Наша кнопка:


Портал RootUA

4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

Exim с интеграцией в AD

Добрый  день, уважаемые читатели, сегодня  мы рассмотрим настройку Exim с интеграцией в Active Directory (в дальнеёшем AD). Сделаем небольшое введение: данная статья предназначена для тех, кто хоть немного ориентируется в 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;
  • Групповые рассылки на основе групп в 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 (Priamry Controller Domain);
  • Имя пользователя, от которого будет производиться поиск в LDAP;

Код скрипта: 

#!/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('example@example.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 должна появиться следующая структура: 

-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 

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

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

Создадим  запрос на сертификат, не забываем правильно  указывать имя машины, на которой работает 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 

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

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 две строчки, а также стартонуть антивирус и программу обновления баз: 

clamav_clamd_enable="YES"

clamav_freshclam_enable="YES" 

/usr/local/etc/rc.d/clamav-clamd start

/usr/local/etc/rc.d/clamav-freshclam start 

После того, как установили и настроили  антивирус, необходимо будет настроить POP3 и IMAP4 сервер. В качестве ПО был  выбран Dovecot.  Dovecot - это open source IMAP4 и 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

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

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

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

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

# Путь к почтовому  ящику

#

mail_location=maildir:/var/mail/virtual/example.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.101:143

    ssl_listen=192.168.0.101:993

}

   

protocol pop3  {

    listen=192.168.0.101:110

    ssl_listen=192.168.0.101:995

# Путь к сертификатам  и пароль на key файл

# Возможно использование сертификатов отдельно для каждого протокола

#

ssl_cert_file=/usr/local/etc/exim/ssl/eximcert.pem

ssl_key_file=/usr/local/etc/ exim /ssl/eximkey.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/example.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/example.ru/%h/Folders

    hidden = no

    inbox = no

И отключите отладку, когда сервер начнёт работать в боевом режиме. 

Для тех, кто установил новую версию 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 

Важная опция  в dspam.conf:

  • MySQLConnectionCache    10

Если у Вас большое количество входящей почты, то советую увеличить количество подключений. Этот параметр не установлен в нужное значение, так как сервер является тестовым. 

Приступим к настройке самой главной  части, нашему MTA. Все опции  находятся в /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 к следующему виду: 

# Файл, извлекающий  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/eximcert.pem

tls_privatekey = /usr/local/etc/exim/ssl/eximkey.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 следующего содержания, который будет располагаться в том же каталоге, что и главный конфигурационный файл. Для создания файлов с расширением db используйте команду exim_dbmbuild

# Путь к внешним скриптам

#

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=/usr/local/etc/exim/deny_sender.db 

# Содержит e-mail адреса  и домены, которым запрещено получать  почту

# После внесения  изменений в файл deny_recipient не забываем  выполнять команду

# exim_dbmbuild deny_recipient deny_recipient.db

#

DENY_RECIPIENT=/usr/local /etc/exim/deny_recipient.db 

# Содержит IP адреса  машин или подсети, которым  запрещён доступ к отправке  почты

# Поиск в файле  линейный, поэтому после внесения  данных они сразу станут доступны

#

DENY_HOST=/usr/local /etc/exim/deny_host 

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

# Сервер 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 

# Виртуальные  пользователи. Необходимо создать  пользователя

# '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 

# Сканирование  на спам - 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). Конфигурационный файл содержит достаточное количество комментариев для того, чтобы разобраться. 

# В 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


Автор: Ивченко Максим (atrium)

По материалам:

Комментарии

Добавить комментарий

* - необходимое для заполнения поле

*




Изображение CAPTCHA для предотвращения спама
Если слово непонятно, нажмите здесь..
*
*
Hety, 30-01-10 11:12:
Не читабельно, ввиду отсутствия разделения на абзацы.
 
© 2004-2009 Журнал "Root UA" - свидетельство СМИ: КВ №14786-3757Р
Газета "FOSS News" - свидетельство СМИ: ОД №1355-236-Р
При использовании материалов портала ссылка на Root.UA обязательна, для интернет-изданий – гиперссылка, не закрытая для индексации поисковыми системами.

sitenews