Страница 1 из 1

exchange+postfix+ clamav

Добавлено: 17 сен 2008, 13:08
flash
Описание: есть сеть 10.10.10.0/24 c домен контроллером на базе windows 2003 server c ip 10.10.10.1, и с доменным именем example.local, в домене есть exchange server 2007 с ip 10.10.10.10 почтовый домен example.ru, так же присутствует dmz x.x.x.x/24, в которой есть релей для нашего exchange сервера с ip x.x.x.15 работающий под управлением freebsd 7.0 stable.
Задача: надо обеспечить проверку наличия пользователя в домене перед тем как передавать почту нашему exchange серверу, и настроить антивирусную проверку всей поступающей корреспонденции.
Решение: Итак рассматривалось несколько вариантов, но остановились на проверке наличия учетной записи в домене через ldap а антивирусную проверку осуществлять с помощью clamav
Приступаем: на установке и обновлении freebsd останавливаться не буду, есть куча доков по этому вопросу. В качестве сервиса мта ставим постфикс из портов /usr/ports/mail/postfix/, при конфигурировании отмечаем openldap для этого

Далее как обычно make; make install
После удачной установки в /etc/rc.conf отключаем sendmail и включаем postfix

sendmail_enable="NO" отключаем sendmail как сервис
sendmail_submit_enable="NO" говорим что мы не принимаем почту через sendmail
sendmail_outbound_enable="NO" говорим что мы не отправляем почту через sendmail
sendmail_msp_queue_enable="NO" отключаем очередь сообщенийsendmail
postfix_enable="YES" включаем автозагрузку постфикс

Переходим к настройки постфикса
cd /usr/local/etc/postfix
vi main.cf


queue_directory = /var/spool/postfix место хранения очереди постфикс
command_directory = /usr/local/sbin путь к команде postfix
daemon_directory = /usr/local/libexec/postfix путь к исполняемым файлам постфикса
mail_owner = postfix и так все ясно
myhostname = relay.example.ru имя хоста обязательно должно резолвиться в ip
mydomain = example.ru объявляем домашний домен
myorigin = $mydomain объявляем что настройки действительны для домена
inet_interfaces = $myhostname указываем на каком интерфейсе запускать постфикс по умолчанию стоит all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain зона обслуживания
local_recipient_maps = ldap:/usr/local/etc/postfix/ldap.cf – к этому файлу мы потом вернемся (провека наличия получателя в домене)
unknown_local_recipient_reject_code = 550 всех неизвестных нах
mynetworks_style = host объявляю стиль сетей поскольку это релей бесприпятственная отправка только с нескольких хостов поэтому хост
mynetworks = 127.0.0.1/32, x.x.x.15/32, 10.10.10.10/32 объявляю сети из которых можно отправлять почту
relay_domains = $mydestination принимаем почту для отправки
smtpd_helo_required = yes требуем представиться
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, небольшая антиспамовская проверка
reject_unauth_destination,
reject_rbl_client bl.spamcop.net,
reject_rbl_client list.dsbl.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client relays.ordb.org,
permit

transport_maps = hash:/usr/local/etc/postfix/transport отписываем транспорты к этому файлу еще вернемся
alias_maps = hash:/usr/local/etc/postfix/aliases указываем алиасы не забыть о команде makemap hash aliases.db < aliases
smtpd_banner = $myhostname ESMTP $mail_name строка выводимая при коннекте к релею

далее все по умолчанию
теперь переходим к транспорту т.е. к файлу /usr/local/etc/postfix/transport
Здесь нам все лишь надо добавить пару строк

example.ru smtp:[10.10.10.10]
.example.ru smtp:[10.10.10.10]

Сохраняем закрываем и выполняем команду
postmap transport

Теперь переходим к самому интересному.
Создаем пользователя в АД (если не знаете что это такое, дальше можете не читать) в OU users пользователя ldap с паролем 123456 (под этим пользователем мы будем проверять наличие почты в нашем домене).

cd /usr/local/etc/postfix
touch ldap.cf
vi ldap.cf


search_base = ou=Users,dc=example,dc=local где будем искать учетки пользователей
server_host = 10.10.10.1 ip домен контроллера
server_port = 3268 порт я выбрал порт глобального каталога но можно и стандартный 389
query_filter = (&(proxyAddresses=smtp:%s)) фильтр поиска
result_filter = %s фильтр результата
result_attribute = cn проверть кому принадлежит e-mail
scope = sub где искать (sub=все поддерево)
bind = yes авторизованный доступ к домену
bind_dn = cn=ldap,ou=Users,dc=example,dc=local имя для авторизации
bind_pw = 123456 пароль для авторизации
cache = yes кэшировать ответы
dereference = 0
domain = example.ru
debuglevel = 1

сохраняем, выходим и перезапускаем постфикс командой /usr/local/etc/rc.d/postfix restart
По лдапу все если не заработало анализируйте логии поставте дебуглевел 1000 и смотрите mail.log
Теперь переходим к clamav

cd /usr/ports/security/clamav
make; make install все по умолчанию
cd /usr/ports/security/clamsmtp/
make; make install все по умолчанию
/usr/local/bin/freshclam -v обновляем clamav

Переходим в каталог /usr/local/etc/postfix
vi mail.cf
Здесь дописываем в конец файла

#Antivirus ClamAV
content_filter = scan:[127.0.0.1]:10025
сeceive_override_options = no_address_mappings


сохраняем выходим

vi master.cf
в начало дописываем

# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.1/32


Сохраняем и выходим
Переходим в каталог /usr/local/etc/
vi clamd.conf

LogFile /var/log/clamav/clamd.log путь к лог файлу
LogFileMaxSize 2M размер лог файла
LogTime yes записывать время
LogClean yes очищать лог при перезапуске
LogSyslog yes использовать syslog для логирования
LogFacility LOG_MAIL логировать почту
LogVerbose yes подробный лог
TemporaryDirectory /tmp директория временных файлов
DatabaseDirectory /var/db/clamav директория базы данных
LocalSocket /var/run/clamav/clamd.sock файл сокета важно
FixStaleSocket yes
TCPSocket 3310 tcp сокет на порту 3310
TCPAddr 127.0.0.1 адрес сокета
MaxConnectionQueueLength 300 максимальныя длинна очереди
StreamMaxLength 200M максимальная длинна потока
StreamMinPort 30000 слушать потоки на портах с 30000 до 32000
StreamMaxPort 32000
ReadTimeout 300 таймаут чтения
MaxDirectoryRecursion 200 просматривать поддиректорий
FollowDirectorySymlinks yes переходить по символьным линкам
FollowFileSymlinks yes проверять файлы на которые указывают сим линки
SelfCheck 600 период самодиагностики 10 минут
User clamav пользователь
AllowSupplementaryGroups yes группа = пользователь
Debug yes включить дебаг
LeaveTemporaryFiles yes
DetectPUA yes
DetectBrokenExecutables yes

ScanPDF yes сканировать пдф
ScanMail yes сканировать почту

Сохраняем и выходим

vi clamsmtpd.conf
OutAddress: 10026 Слушаем Внешний адрес
TimeOut: 180 Таймаут
Listen: 127.0.0.1:10025 Открываем порт 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock Коннектимся к сокету clamav
TempDirectory: /tmp Временная папка
Quarantine: on Включаем карантин
User: clamav Пользователь
VirusAction:/usr/local/etc/script При обнаружении вируса выполнить скрипт

Создаем скрипт
pwd
/usr/local/etc
touch script
vi script


там пишем следующие

#!/bin/sh
MAILTO=ldap@example.ru
# formail should be in PATH
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
LINE="-----------------------------------------------------------------"
(echo "Virus found: $VIRUS"
echo "Sender(s): $SENDER"
echo "Recipient(s): $RECIPIENTS"
echo
if [ "x$EMAIL" != "x" ] && [ -f $EMAIL ]
then
echo "Empty e-mail: $EMAIL"
echo
echo Header:
echo $LINE
formail -X "" < $EMAIL
echo $LINE
fi
) | cat -v | mail -s "The virus has been found in the body of this mail: $VIRUS, incoming message from: $SENDER, to $RECIPIENTS is blockd" $MAILTO,$RECIPIENTS
file="/var/log/clamav/clamsmtpd.virus.log"
dir="/var/clamsmtpd/"
exec 1>>$file
exec 2>>$file
echo "-------------------------------------------------------"
echo server $SERVER
echo client $CLIENT
echo Sender $SENDER
echo Recipients $RECIPIENTS
echo Virus $VIRUS
echo "-------------------------------------------------------"
# Move the virus file to another directory
# This only works if Quarantine is enabled
if [ -n "$EMAIL" ]; then
mv "$EMAIL" "$dir"
fi


суть скрипта при обнаружении вируса в почтовом сообщении, оно перекладывается в папку /var/clamsmtpd/, а получателю и админу идет уведомление о заблокированном сообщении с указанием его имени
И наконец правим файл /usr/local/etc/freshclam.conf
[
b]vi /usr/local/etc/freshclam.conf
DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose yes
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
Debug yes[/b]

Сохраняем выходим

/usr/local/bin/freshclam –v
В /etc/rc.conf прописываем
clamav_freshclam_enable="YES"
clamav_clamd_enable="YES"
clamsmtpd_enable="YES"


Сохраняем выходим

/usr/local/etc/rc.d/clamav-freshclam start
/usr/local/etc/rc.d/clamav-clamd start
/usr/local/etc/rc.d/clamsmtpd start
/usr/local/etc/rc.d/postfix restart


Вот собственно и все