Документация по ОС FreeBSD Среда, 08.05.2024, 19:44
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Mail

Создаем почтовую систему среднего и малого офиса на основе FreeBSD Postfix+dr.web+popa3d+pflogsumm [2005] Часть 1
Недавно один из знакомых администраторов попросил помочь ему в создании почтовой системы для фирмы в которой он работает. Подумав о сакраментальном слове RTFM и вспомнив что недавних переселенцев из под Windows надо поощрять я все же решил поискать для него хорошую документацию подробно описывающую то что ему предстоит выполнить. Побродив некоторое время в сети с удивление обнаружил отсутствие того за чем пришел. Не то чтобы документации не было совсем . Скорее ее было даже слишком много. Очень часто мне на глаза попадались продвинутые статьи описывающие настройку магистральных систем способных работать в качестве почтовых серверов крупных интернет провайдеров. Встречались тексты объясняющие способы взаимодействия почтовой системы с SQL, RADIUS, LDAP серверами. Для нашего случая все эти ухищрения были чрезмерны. К сожалению подробной интрукции по настройке почтовой системы для малого и среднего офиса так и не было найдено. Свою систему мы будем строить на основе FreeBSD 4.5. В тоже время практически все описаное ниже после мелких исправлений будет работать во многих других Unix подобных системах. Главное что бы для целевой системы удалось найти версии программ postfix, popa3d, drweb, pflogsumm. Кратко обсудим зачем нужен каждый из этих компонентов. Postfix будет обеспечивать принятие входящих и отправку исходящих сообщений по протоколу smtp. Обычно программы такого типа называют MTA - Mail Transfer Agent. Popa3d позволит пользователям читать полученную почту. С помошью drweb мы будем проверять на вирусы все проходящие через нас письма. Для того чтобы знать насколько хорошо функционирует построеная нами система, нужно собирать статистику ее работы. К тому же при случае начальству можно показать что не зря ещь свой хлеб с маслом. Выполнять это полезное действо мы будем с помошью pflogsumm. Стоит обратить внимание что машина на которой все это устанавливается имеет два сетевых интерфейса 192.168.10.252 и 80.80.120.163. Первый направлен во внутреннюю подсеть, а второй в Интернет. К сожалению авторизации на основе пароля и имени пользователя для протокола smtp у нас не будет. Отправка писем будет разрешена всем пользователям нашей внутренней сети 192.168.10.0. С другой стороны для малыйх и средних сетей в большинстве случаев этого не потребуется. Соответствено через второй интерфейс мы будем общаться с внешним миром. Так же стоит помнить что для авторизации по pop3 мы будем использовать имена и пароли пользователей хранящиеся в файле /etc/master.passwd.
В качестве кандидатов на место smtp демона рассматривались exim, postfix, qmail, sendmail. Давайте кратко рассмотрим достоинстав и недостатки каждого из них. Стоит оговориться что все нижеизложеное является всего лищь моим личным мнением. Как говорится вольному воля поэтому читатель может на свой страх и риск использовать в качестве MTA (Mail Transfer Agent) все что ему заблагорассудится.
Sendmail является самым старым MTA из нашего списка. Несмотря на впечатляющий и мощный функционал его пришлось отбраковать сразу же. В первую очередь произошло это из-за того что программа представляет из себя один монолитный блок. По этой же причине за ней тянется огромный шлейф уязвимостей и проблем с быстродействием. Вторым немаловажным недостатком является зубодробительная процедура конфигурирования. Перспективы программы для создании простейщей конфигурации которой необходимо некоторое время повозиться с компилятором m4 по моему мнению выглядят весьма грустно . Хотя старый монстр все еще не сдается, по причине многочисленности своих приверженцев. Заключительным гвоздем в гроб Sendmail послужило то, что использование его для офиса среднего о размера похоже на погоню за мухой с молотом в руках.

В тоже время самый безопасный из претендентов qmail мне не понравился слишком жесткой иерархией запуска служебных программ. Для выполнения каждого класса своих задач он порождает дочерние процессы специальных программ. После выполнения задачи процесс дочерней программы уничтожается. С одной стороны это обеспечивает безопасность и запас прочности программы, но с другой создает некоторые накладные расходы на постоянное создание дочерних процессов и межпроцессорное взаимодействие. К тому же лично мне развитие проекта qmail кажется слишком медленным.

Приступив к осмотру Exim с огорчением замечаю, что процес установки на мой взгляд все же довольно нетривиален, и не особенно подходит новичкам мира Unix. Для включения тех или иных возможностей приходится редактировать Makеfile. Да и сам процес последующей настройки показался мне слегка странным. Если не обращать внимания на описанные только что недостатки , то мошный функциональный потенциал заложенный в эту программу Вас очень обрадует.

Postfix являющийся ближайшим конкурентом qmail и делает упор на быстродействие и безопасность. Принципы деления выполняемой задачи очень похожи на те что применяются в qmail, но дизайн системы совершенно другой. Основой идеологии postfix является наличие независимых резидентных модулей. Ни один из модулей не является дочерним процессом другого. В тоже время за счет постоянного присутствия модулей в памяти каждый из них может независимо пользоваться услугами других. Проект postfix на данный момент является самым динамично развивающимся из всех перечисленных
Покончив с теорией приступим к осуществлению наших планов. 

Нужно создать группы postfix и postdrop. А затем в группу postfix добавить пользователя по имени postfix. Почтовая система будет работать с правами пользователя postfix, а группа postdrop будет владеть очередью сообщений. Наличие двух груп и одного пользователя увеличивает запас прочности и безопасности демона smtp. В зависимости от Вашей операционной системы действия по созданию пользователя можно будет выполнить с помощью команды adduser или useradd. Некоторые пуристы мира юникс настаивают что это нужно делать только с помощью команды pw. Впрочем как я уже говорил это их личные проблемы. Юникс хорош именно тем каждый может выбрать средство по вкусу. После успешного создания пользователя и групп принимаемся за установку postfix. Во время установки всего програмного обеспечения будет создан еще один служебный пользователь. Нужно убедиться, что никто не сможет войти в систему пользуясь всеми вышупомянутыми аккаунтами. Для этого в качестве рабочей оболочки в файле /etc/passwd определяем для них /sbin/nologin. Если при создании пользователя сделать это забыли, то добиться нужного эффекта можно с помощью команды vipw.

Покончив с теорией приступим к осуществлению наших планов. Для работы с исходными текстами всего скачанного программного обеспечения я буду использовать директорию /tmp. Читатель может выбрать любую другую. Приступим к установке postfix.

Берем postfix-2.0.0.2.tar.gz с официального сайта проекта http://www.postfix.org/ и как обычно распаковываем и устанавливаем:

# tar zxvf postfix-2.0.0.2.tar.gz
# cd postfix-2.0.0.2
# make tidy
# make
# make install
Теперь нужно дать ответы на несколько вопросов, задаваемых во время инсталляции. В большинстве случаев нужно просто нажать ENTER подтверждая использование настроек предлагаемых по умолчанию.

install_root: [/]
# Корневой каталог файловой системы используемой для установки

tempdir: [/tmp/postfix-2.0.0.2]
# Сюда будут падать временные файлы создаваемые в процессе инсталляции

config_directory: [/etc/postfix]
# Тут будут находиться файлы настроек postfix

daemon_directory: [/usr/libexec/postfix]
# А здесь будет лежать выполняемый файл демона postfix

command_directory: [/usr/sbin]
# Тут будут располагаться выполняемые файлы административных команд postfix

queue_directory: [/var/spool/postfix]
# Директория в которой будет находиться очередь писем обрабатываемых postfix

sendmail_path: [/usr/sbin/sendmail]
# Путь к команде используемой взамен стандартного sendmail

newaliases_path: [/usr/bin/newaliases]
# Путь к исполняемому файлу используемому для перестройки почтовых псевдонимов

mailq_path: [/usr/bin/mailq]
# Путь к команде отображающей состояние почтовой очереди

mail_owner: [postfix]
# Имя пользователя с правами которого работает почта

setgid_group: [postdrop]
# Группа от имени которой будут работать команды обработки почтовой очереди

manpage_directory: [/usr/local/man]
# В этой директории находится база документации на все устанавливаемые программы

sample_directory: [/etc/postfix]
# Директории куда нужно положить примеры конфигурационных файлов postfix.
# Смешивать примеры с реальными файлами конфигурации охоты нет.
# Поэтому вводим имя директории /etc/postfix/sample/

readme_directory: [no]
# Директория куда нужно положить файлы документации
# Выбираем имя директории /etc/postfix/readme/

По завершению установки приступим к настройке. Так же postfix можно поставить из портов или пакетов, но лично мне удобнее из исходников. Конфигурационные файлы postfix находятся в директории /etc/postfix/. Все настройки, которые нам нужно поменять находятся в файле /etc/postfix/main.cf. Большинство опций можно оставить со значениями по умолчанию. Я опищу только те из них которые нужно изменять. Итак, приступим:

myhostname = mail.test.ru
# Имя нашего хоста. Лучше всего устанавливать в соответствии с выводом
# получаемым после выполнения команды hostname.

mydomain = test.ru
#Имя нашего домена. Рекомендуется описать явно. Если переменная не
# определена то postfix будет использовать значение myhostname минус
# первый компонет.

inet_interfaces = 192.168.10.252, 80.80.120.163
# Адреса интерфейсов на которых нужно ждать smtp соединений.
# Для упрощения конфигурации можно использовать слово all для установки
# прослушивания всех интерфейсов. Также можно использовать переменные
# localhost и $myhostname. Тогда будут задействованы интерфейсы
# 127.0.0.1 и адрес соответствующий имени определенному в
# переменной $myhostname.

mydestination = $myhostname, $mydomain
# Список доменов которыми себя считает эта машина. То есть почта
# приходящая для пользователей описанных доменов не отправляется
# куда либо, а разбирается локально.

mynetworks = 192.168.10.0/24, 127.0.0.0/8
# Определяем список доверенных сетей. Клиенты с адресами принадлежащими
# этим сетям смогут рассылать через нас почту. Если этот параметр не определен,
# то доверенной сетью считается IP подсеть к которой принадлежит машина с postfix.

alias_database = dbm:/etc/mail/aliases
# Путь к файлу почтовых псевдонимов.

Сохранив изменения считаем что настройка postfix закончена. Еще одним важным шагом является настройка почтового псевдонима пользователя root. Нам необходимо сделать так что бы все письма приходящие пользователю root перенаправлялись пользователю tigrisha. Открываем файл /etc/mail/aliases и ищем подобную строку:

root:

Затем заменяем на вот такое:

root: tigrisha@test.ru

Сохранив файл c помощью команды newaliases выполняем перестройку системный базы почтовых псевдонимов находящейся в файле /etc/mail/aliases.db. Покончив с настройками проверим нашу конфигурацию.

Сохранив файл c помощью команды newaliases выполняем перестройку системный базы почтовых псевдонимов находящейся в файле /etc/mail/aliases.db. Покончив с настройками проверим нашу конфигурацию.
 
# postfix check
Если ошибок не появилось, значит все у нас хорошо. Самое время запустить демона smtp в лице postfix.
 
# postfix start
А на другой консоли смотрим какие сообщения попадают в файл протокола /var/log/maillog.
 
# tail -f /var/log/maillog
Среди прочих сведений должно промелькнуть что то похожее на эти строчки:

Jan 16 14:35:33 postfix/postfix-script: starting the Postfix mail system
Jan 16 14:35:33 mail.test.ru postfix/master[7190]: daemon started -- version 2.0.0.2

Пришло время проверить как работает отправка почты. С помощью telnet присодиняемся к локальной системе на 25-й порт.
# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.test.ru.
Escape character is '^]'.
220 mail.test.ru ESMTP Postfix
# Затем с помощью команды mail from: указываем серверу от кого будет письмо.

mail from: <tigrisha@test.ru>
250 Ok
# Командой rcpt to: задаем адрес получателя.

rcpt to: <tigrisha@test.ru>
250 Ok
# И наконец с помощью data начинаем ввод текста письма.
# Закончить ввод текста можно нажав enter затем "." и снова enter.

data
354 End data with .
testing mail for tigrisha
.
250 Ok: queued as 822A958

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

На другой консоли смотрим что система пищет в файл /var/log/maillog. Должны увидеть появление следующих строк:

Jan 16 17:45:56 mail.test.ru postfix/smtpd[235]: connect from [127.0.0.1]
Jan 16 17:47:16 mail.test.ru postfix/smtpd[235]: 822A958: client=localhost.test.ru[127.0.0.1]
Jan 16 17:47:55 mail.test.ru postfix/cleanup[246]: 822A958: message-id=< 20030116144716.822A958@mail.test>
Jan 16 17:47:55 mail.test.ru postfix/qmgr[192]: 822A958: from=< tigrisha@test.ru>, size=416, nrcpt=1 (queue active)
Jan 16 17:47:55 mail.test.ru postfix/local[247]: 822A958: to=< tigrisha@test.ru>, relay=local, delay=39, status=sent (mailbox)
Jan 16 17:52:56 mail.test.ru postfix/smtpd[235]: disconnect from localhost.test.ru[127.0.0.1]

Если все так и произошло значит smtp работает как положено. По умолчанию для хранения полученых писем postfix использует формат mailbox. Это означает что у каждого пользователя есть файл в котором хранятся все его письма. Обычно он должен находится в директории /var/mail/. Соответственно для адреса tigrisha@test.ru файл будет называться /var/mail/tigrisha. Посмотрим как себя чувствует этот файл.
 
# ll /var/mail/
total 2
-rw------- 1 postfix postfix 0 Jan 15 17:58 postfix
-rw------- 1 tigrisha tigrisha 1173 Jan 16 17:47 tigrisha

Итак судя по всему письмо благополучно попало в нужный файл.
Теперь необходимо настроить pop3 для того чтобы пользователи могли забирать почту с сервера. В качестве демона pop3 мы будем использовать popa3d. За этой программой закрепилась слава одного из самых быстрых, надежных и безопасных демонов pop3. К сожалению процедура установки этой программы из исходного кода очень неудобна. Перед там как приступить к компиляции приходится вносить в исходный код множество исправлений, что бы включить требуемую функциональность. Лично мне не понятно почему автор не может написать нормальный скрипт configure. Большинству других администраторов такой подход тоже не нравится. Поэтому оберегая собственные нервы воспользуемся системой портов.
 
# cd /usr/ports/mail/popa3d/
# make
# make install
# make clean
После успешной инсталяции проверяем что бы в файле /etc/services были подобные фрагменты.

pop3 110/tcp pop-3 # POP version 3
pop3 110/udp pop-3

В отличии от postfix демон popa3d не находится постоянно в памяти машины. Вместо этого при каждом входящем соединении он будет запускаться супердемоном. В качестве супердемона чаще всего используются либо inetd либо xinetd. В моем случае это был именно inetd. А раз так то нам нужно внести в файл /etc/inetd.conf следующий фрагмент:
 
pop3 stream tcp nowait root /usr/local/libexec/popa3d popa3d

Для того что бы измениения вступили в силу нужно перезапустить демон inetd. Узнаем номер его процесса.
 
# ps -ax | grep inetd | grep -v "grep"
86 ?? Ss 0:01.03 /usr/sbin/inetd -wW
Получается что интересующий нас процесс имеет номер идентификатора 86. Вооружившись этими знаниями перезапускаем inetd.
 
# kill -HUP 86
Некоторые особо непримиримые читатели скажут что так делать не правильно. А обязательно стоит делать одним из двух следующих способов:

kill -HUP `cat /var/run/inetd.pid`
Или

killall -HUP inetd
А можно совсем экзотично:

killall -HUP `ps -ax | grep inetd | grep -v "grep" | tr -s " " | cut -d" " -f2`
Как всегда я отвечу что все эти команды приводят к одинаковому эффекту, а раз результат достигнут, то нет смысла возмущаться. У каждого из нас свой стиль работы. Фанатичные попытки использовать один и тот же прием в разных ситуациях и желание заставить остальных действовать только так как сказал гуру указывает на узость мыслительных процессов. Давайте не будем уподобляться религиозным фанатикам.
 
После перезагрузки наступает самое время протестировать работу демона pop3. Делаем это как обычно с помощью telnet.
 
# telnet localhost 110

Trying 127.0.0.1...
Connected to localhost.test.ru.
Escape character is '^]'.
+OK

# Командой user указываем серверу почту какого пользователя мы желаем читать.
 
user tigrisha
+OK
# Передаем наш сложнейший пароль.

pass Sx12DF234
+OK
# После того как нас авторизовали посмотрим с помощью команды stat
# состояние нашего почтового ящика. Судя по ответу сервера в ящике одно
# письмо размером 597 байт.

stat
+OK 1 597
# Просмотреть содержимое письма можно с помощью команды top 1 20
# Приказываем показать верхние 20 строк первого письма.


top 1 20
+OK

Return-Path: < tigrisha@test.ru>
Received: (from tigrisha@test.ru)
for tigrisha@test.ru; Tue, 11 Feb 2003 18:18:39 +0300 (MSK)
(envelope-from tigrisha@test.ru)
Date: Tue, 11 Feb 2003 18:18:39 +0300 (MSK)
From: Beshkov Andrew < tigrisha@test.ru >
Message-Id: < 200302111518.h1BFIdO44983@mail.test>
To: tigrisha

testing mail for tigrisha

# Налюбовавшись на дело рук своих уходим

quit
+OK
Connection closed by foreign host.

Процесс получение почты прошел гладко словно по маслу. На этом можно было бы завершить наши занятия но все же стоит подумать о безопасности наших пользователей.
Давайте приступим к созданию антивирусной защиты для нашего сервера. Как я уже говорил в качестве антивируса мы будем использовать drweb. Грустный опыт работы с KAV для FreeBSD подтолкнул меня к правильному выбору. Так же стоит обратить внимание на отличное качество русской документации поставляющейся вместе с дисрибутивом drweb. Несмотря на то что эта версия не лечит письма, а отправляет их в карантин, и не умеет проверять архивы внутри писем, возможностей заложенных в пробной версии которую мы будем использоватьдостаточно для надежной защиты от вирусов. Лично мне зараженные письма не нужны. А большинство пользователей самостоятельно архивы открывать не умеет. Даже если они и научатся это делать вирусу все равно не жить потому что на каждой рабочей станции тоже стоит drweb.

Для получения обновлений антивирусных баз нам понадобится программа wget. Кроме всего прочего она поможет нам скачивать все необходимое программное обеспечение. Устанавливаем wget используя механизм портов. Можно конечно и из исходников, но особой надобности в этом нет.
# cd /usr/ports/ftp/wget
# make
# make install
# make clean
Пользователи других операционных систем могут взять исходный код этой утилиты тут http://www.gnu.org/software/wget/wget.html. С помощью только что установленного wget скачиваем последнюю версию drweb.
# /usr/local/bin/wget ftp://ftp.drweb.ru/pub/unix/4.29.5/drweb-4.29.5-freebsd4.tar.gz
Если выполнить это действие, по каким либо причинам не удалось, то для скачивания можно воспользоваться любыми другими инструментами. Но все же стоит разобраться почему произощел такой казус. Иначе в дальнейшем мы не сможем автоматически обновлять антивирусные базы. Если и это не получится то для автообновления вместо wget прийдется использовать программу fetch.

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

Внимательно читаем инструкции в файле /tmp/drweb-4.29.5-freebsd4/install/opt/drweb/README.RUS. А затем запускаем скрипт инсталляции.

# cd drweb-4.29.5-freebsd4
# ./install.sh
К сожалению, установить антивирус с помощью стандартного скрипта да еще и с первого раза мне не удалось. Он все время жаловался, что не может создать директорию /opt/drweb/ поэтому пришлось создать ее вручную.

# mkdir /opt
# mkdir /opt/drweb/
После этого пошли жалобы на невозможность использования уже созданной директории по причине того, что она уже существует. Ну что же придется обработать скрипт инсталляции напильником. Открываем install.sh любимым текстовым редактором ищем такой фрагмент текста.

if [ -d "$INPUT" ] ; then
echo "Directory $INPUT already exists!"

else
mkdir $INPUT

if [ ! -d "$INPUT" ] ; then
echo "Can not create $INPUT!"

else
INSTALL_DIR=$INPUT
fi
fi

Удаляем совсем или переводим этот кусок текста в комментарии. А вместо него вставляем строку:

INSTALL_DIR=$INPUT

Сохраняемся, выходим из редактора и запускаем install.sh снова. Теперь нужно по порядку отвечать на вопросы задаваемые скриптом.

Enter destination directory (/opt/drweb is default):
# Директория инсталляции

Select interface language: 0) english 1) russian
# Язык интерфейса. Мне больше нравится английский поэтому я выбрал "0"

После завершения установки начинаем редактировать /etc/drweb/drweb32.ini и ищем строку:

;User = drweb

Удаляем из нее символ ?;? и идем дальше. Таким образом мы указываем демону drweb что он должен работать с правами одноименного пользователя. Итак, антивирус установлен. Запускаем его с помошью файла /opt/drweb/drwebd. Полюбовавшись на сообщения в /var/log/messages понимаем что антивирус запустился и работает как надо. Но к сожалению, проку нам от этого пока мало. Для того чтобы подключить его к проверке почты нужно настроить интерфейс от postfix к drweb. Давайте разберемся, как взаимодействуют друг с другом вышеуказанные программы проследив весь жизненый цикл письма. На приведенной ниже схеме интересующий нас маршрут прохождения письма помечен синим цветом.

 Image

Письмо может войти в postfix двумя способами. C помошью входящего соединения по smtp через демона smtpd. Если же письмо отправлено с локальной машины, то через программу заменяющую собой sendmail. После этого письмо попадает в модуль cleanup который занимается проверкой и зачисткой заголовков письма. Затем письмо переходит в модуль queue который передает его через pipe фильтру postfix-drweb. Фильтр в свою очередь сохраняет письмо во временном файле и передает путь к нему клиенту антивируса. Усилиями клиента письмо попадает к демону drweb. В свою очередь он с помощью набора антивирусных баз проверяет письмо.

Если вирусов не найдено, то с используя программу заменяющую sendmail письмо передается модулю pickup. Затем вторично пройдя через cleanup и queue в зависимости от того где находится получатель письмо попадает либо в local и доставляется локально, либо в smtp и отсылается на другой сервер. В случае если drweb считает письмо зараженным оно переносится в карантин. С помощью программы sendmail письма с уведомлениями о данном неприятном факте направляются всем кто указан в секции [VirusNotify] файла drweb_postfix.conf. Обычно это админисратор, отправитель и получатель. Разобравшись с теорией приступим к настройке.
 


Источник: http://onix.opennet.ru/content/view/22/26/
Категория: Mail | Добавил: oleg (26.02.2008) | Автор: Бешков Андрей
Просмотров: 1806 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024