Почтовый сервер Postfix, на базе RedHat Enterprise Linux 4, с поддержкой IMAP, SMTP аутенификацией, фильтрацией спама, Web-интерфейсом и проверкой почты на вирусы.
Авторы: Николай Самосват (Nikolay Samosvat), Сергей Зинец (Sergey Zinec)
Оглавление:
1.Устанавливаем Postfix
2.Устанавливаем Dovecot.
3.Настройка Postfix для поддержки аутенификации SMTP.
4.Устанавливаем Web-интерфейс для работы с почтой
5.Проверка почты на вирусы, с помощью ClamAV и Amavis
6.Средства борьбы со спамом (spamassassin, postgrey)
Устанавливаем Postfix
Postfix — агент передачи почты (MTA — mail transfer agent)yum install postfix
Настроим алиасы, чтобы вся почта для пользователя root пересылалась нашему пользователю lamo
для этого в /etc/aliaces в самый конец добавим строку
root lamo
В конфиге /etc/postfix/mail.cf вносим необходимые изменения:
Часть 1.
# INTERNET HOST AND DOMAIN NAMES
#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
# other configuration parameters.
#
#myhostname = virtual.domain.tld
myhostname = post.stcompany.ru
# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
mydomain = stcompany.ru
Часть2.
# Alternatively, you can specify the mynetworks list by hand, in
# which case Postfix ignores the mynetworks_style setting.
#
# Specify an explicit list of network/netmask patterns, where the
# mask specifies the number of bits in the network part of a host
# address.
#
# You can also specify the absolute pathname of a pattern file instead
# of listing the patterns here. Specify type:table for table-based lookups
# (the value on the table right-hand side is not used).
#
mynetworks = 192.168.10.0/28, 127.0.0.0/8
#mynetworks = $config_directory/mynetworks
#mynetworks = hash:/etc/postfix/network_table
Теперь нужно перезапустить сервис:
service postfix restart
Все, остальное можно оставить по умолчанию.
Для проверки отправим себе письмо:
[root@post sysconfig]# telnet 192.168.10.120 25
Trying 192.168.10.120...
Connected to post.stcompany.ru (192.168.10.120).
Escape character is '^]'.
220 post.stcompany.ru ESMTP Postfix
HELO post.stcompany.ru
250 post.stcompany.ru
mail from:fromer@from.info
*(здесь все равно что писать, если в mail.cf не включена проверка отправителя)
250 Ok
rcpt to:root@post.stcompany.ru
250 Ok
data
354 End data with
.
!!preved krasavcheg!!
.
250 Ok: queued as BC1332BC5A
quit
221 Bye
Connection closed by foreign host.
[root@post sysconfig]#
Все нормально, письмо отправилось, теперь посмотрим, пришло ли оно.
Т.к. postfix хранит все почту в /var/mail/имя_пользователя, а в нашем случае письмо писалось для root, но в соответствии с настроенными алиасами было перенаправлено пользователю lamo, там и смотрим:
[root@post sysconfig]# cat /var/mail/lamo
From fromer@from.info Thu Aug 24 11:46:55 2006
Return-Path:
X-Original-To: root@post.stcompany.ru
Delivered-To: lamo@post.stcompany.ru
Received: from localhost (localhost.localdomain [127.0.0.1])
by post.stcompany.ru (Postfix) with ESMTP id 9A28E2BC5C
for ; Thu, 24 Aug 2006 11:46:55 +0400 (MSD)
X-Virus-Scanned: amavisd-new at example.com
Received: from post.stcompany.ru ([127.0.0.1])
by localhost (post.stcompany.ru [127.0.0.1]) (amavisd-new, port 10024)
with LMTP id Ou3ZVMMH3-15 for ;
Thu, 24 Aug 2006 11:46:55 +0400 (MSD)
Received: from post.stcompany.ru (post.stcompany.ru [192.168.10.120])
by post.stcompany.ru (Postfix) with SMTP id BC1332BC5A
for ; Thu, 24 Aug 2006 11:46:21 +0400 (MSD)
Message-Id: <20060824074621.BC1332BC5A@post.stcompany.ru>
Date: Thu, 24 Aug 2006 11:46:21 +0400 (MSD)
From: fromer@from.info
To: undisclosed-recipients: ;
Status: O
X-UID: 2
Content-Length: 78
X-Keywords:
!!preved krasavcheg!!
Видим, что письмо доставлено и все в порядке..
Теперь сделаем, чтобы postfix запускался при старте системы:
# /sbin/chkconfig --level 35 postfix on
Устанавливаем Dovecot.
Dovecot – IMAP-сервер, рассчитанный на максимальную безопасность и надежность, способный обслуживать клиентов по протоколам imap, imaps, pop3, pop3s.
Так как этих пакетов нет в стандартной поставке RHEL4 я подключил дополнительные репозитории к yum, создав файл /etc/yum.repos.d/ext-rep.repo со следующим содержанием:
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://apt.sw.be/redhat/el$releasever/en/$basearch/dag
#gpgcheck=0
enabled=1
[dries]
name=Extra Fedora rpms dries - $releasever - $basearch
baseurl=http://ftp.belnet.be/packages/dries.ulyssis.org/redhat/el4/en/i386/dries/RPMS
enabled=1
[karan]
name=CentOS.Karan.Org-EL$releasever - Stable
#gpgkey=http://centos.karan.org/RPM-GPG-KEY-karan.org.txt
#gpgcheck=1
enabled=1
baseurl=http://centos.karan.org/el$releasever/misc/stable/$basearch/RPMS/
baseurl=ftp://rpm.karan.org/pub/kbsingh/el$releasever/misc/stable/$basearch/RPMS/
Приступим к установке:
yum install dovecot
для того чтобы он заработал, достаточно в /etc/dovecot.conf найти секцию
# Protocols we want to be serving:
# imap imaps pop3 pop3s
и здесь раскомментировать и поправить строку protocols таким образом.
protocols = imap imaps pop3
*imap здесь присутствует чтобы можно было в дальнейшем подключить SquirrelMail.
Перезапускаем postfix и dovecot.
И сделаем, чтобы dovecot запускался при старте системы:
# /sbin/chkconfig --level 35 dovecot on
Все, теперь пользователи могут получать почту с нашего сервера.
Настройка Postfix для поддержки аутенификации SMTP.
Постфикс может быть сконфигурирован на релей почты от пользователей, находящихся в "чужих" сетях, у которых валидны логин и пароль.
Добавим следующие строки в файл /etc/postfix/main.cf
# Эта строка информирует постфикс о том, что необходимо
# использовать SMTP AUTH когда пользователь находится
# не в 'mynetwork' и пытается отправить почту на "чужие" домены
smtpd_sasl_auth_enable = yes
# Эта опция выключает выключает "anonymous style" для SMTP AUTH.
# Без этой опции любой может использовать postfix как "open relay"
smtpd_sasl_security_options = noanonymous
# Эта опция устанавливает ограничения для клиентов,
# пытающихся релееить почту через ваш почтовый сервер
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
Поправим файл /etc/sysconfig/saslauthd
# эта опция указывает на то, что демону saslauthd необходимо
# использовать механизм PAM (подключаемые модули аутентификации)
# для проверки каждого имени и пароля
MECH=pam
Теперь удостоверимся что демон saslauthd запускается при старте системы, выполнив от рута команду:
# /sbin/chkconfig --level 35 saslauthd on
Теперь запускаем saslauthd и postfix:
# service saslauthd restart
# service postfix restart
Постфикс стартовал и теперь он разрешает релееить почту аутентифицированным клиентам.
Проверим это.
Большинство коммуникаций с почтовым сервером происходит обычным текстом, однако информация аутентификации передается кодированной в Base64. Соответственно нам необходимо генерировать данную информацию для проверки работоспособности. Для этого необходимо в консоли набрать следующее:
# perl -MMIME::Base64 -e 'print encode_base64("test\0test\0test");'
Где test\0test\0test является \логин\0логин\0пароль, (перед последними двумя параметрами надо ставить ноль) т.е. в моем примере был создан пользователь test с паролем test.
После выполнения этой перловой команды мы получим в ответ вот такую строку:
dGVzdAB0ZXN0AHRlc3Q=
Это и есть наша аутентификационная информация, кодированная в Base64.
Теперь выполним проверку:
# telnet mail.example.com 25
Trying 127.0.0.1...
Connected to mail.example.com (123.123.123.123).
Escape character is '^]'.
220 mail.example.com ESMTP Postfix
EHLO anotherhost.com
250-mail.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-XVERP
250 8BITMIME
AUTH PLAIN dGVzdAB0ZXN0AHRlc3Q=
235 Authentication successful
QUIT
221 Bye
Строка: "250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5" говорит о том, что postfix пускает аутентифицированных пользователей.
Устанавливаем Web-интерфейс для работы с почтой
SquirrelMail – вэб интерфейс для работы с электронной почтой.
yum install squirrelmail
*Если на сервере еще не стоит httpd и php, то yum сам вытянет из репазитариев все необходимое, достаточно только открыть 80 порт на фаерволе для вэб сервера (-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT)
Посмотрим куда он установился:
[root@post etc]# whereis squirrelmail
squirrelmail: /etc/squirrelmail /usr/share/squirrelmail
/etc/squirrelmail – содержит файлы конфигурации.
/usr/share/squirrelmail – это основная директория программы
запустим файл конфигурации программы /usr/share/squirrelmail/config/conf.pl
Заполняем свои данные и незабываем указать в качестве imap севера dovecot.
Сохраняем изменения и выходим. Теперь можно попробовать постучаться на вэб интерфейс.
http://192.168.10.120/webmail/
Теперь сделаем, чтобы httpd запускался при старте системы:
# /sbin/chkconfig --level 35 httpd on
Теперь пользователи могут прямо из интернета работать со своими почтовыми ящиками.
Проверка почты на вирусы, с помощью ClamAV и Amavis
yum install amavisd-new
yum install clamd
yum install clamav
yum install clamav-db
Теперь исправим конфигурационный файл Postfix.
/etc/postfix/master.cf
smtp-amavis unix - - n - 2 lmtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
А также,
/etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
Затем в файле /etc/amavisd.conf необходимо откомментировать строку:
@bypass_spam_checks_maps = (1); # uncomment to DISABLE anti-spam code
в разделе @av_scanners = ( необходимо оставить только секцию с описанием ClamAV, остальные секции комментируем:
### http://www.clamav.net/
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
# NOTE: the easiest is to run clamd under the same user as amavisd; match the
# socket name (LocalSocket) in clamav.conf to the socket name in this entry
# When running chrooted one may prefer: ["CONTSCAN {}\n","$MYHOME/clamd"],
в разделе @av_scanners_backup = ( все делаем аналогично предыущему разделу:
### http://www.clamav.net/ - backs up clamd or Mail::ClamAV
['ClamAV-clamscan', 'clamscan',
"--stdout --disable-summary -r --tempdir=$TEMPBASE {}",
[0], qr/:.*\sFOUND$/, qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
В файле /etc/clamd.conf комментируем параметр TCPSocket и правим параметр LocalSocket в соответствии со значением, указанным в разделе '@av_scanners = ( ' файла /etc/amavisd.conf. В итоге должно получиться вот так:
LocalSocket /var/run/clamav/clamd
#TCPSocket 3310
Теперь надо сделать чтобы clamd смог читать сокет /var/run/clamav/clamd, созданный amavis'ом. Для этого в файле /etc/group добавим пользователя clamd в группу к amavis, в моем случае это выглядит вот так:
amavis:x:101:clamav
И запускаем их:
# service clamd restart
# service amavisd restart
Теперь от рута обновляем базы антивируса:
# freshclam
Удостоверимся что демоны clamd и amavisd запускается при старте системы, выполнив от рута команды:
# /sbin/chkconfig --level 35 clamd on
# /sbin/chkconfig --level 35 amavisd on
Готово. Смотрим логи и хедеры писем на предмет проверки работы антивируса, теперь в новые письма добавится строка X-Virus-Scanned: amavisd-new at example.com
*И не забываем проверить прописалась ли ссылка на freshclam в директорию /etc/cron.daily (необходимо для ежедневного обновления баз антивируса).
Средства борьбы со спамом (spamassassin, postgrey)
SpamAssassin - это расширяемый почтовый фильтр, используемый для идентификации спама. Полученные почтовые сообщения могут быть выборочно помечены как спам для фильтрации в будущем аналогичных сообщенний.
Postgrey – сервер политики Postfix, который осуществляет greylisting. Когда запрос о поставке почты получен, Postfix проверяет связку CLIENT_IP / ОТПРАВИТЕЛЬ / ПОЛУЧАТЕЛЬ. Если это - первый раз, когда эта связка замечена, или если она замечена меньше чем 10 минут назад, то почта отклоняется с временной ошибкой. Правильный сервер через время повторит письмо.
Spamassassin
Т.к. в нашей системе уже установлен Amavis, spamassassin, входит в список его зависимостей и уже был установлен yum-ом. Для того чтобы он заработал, достаточно закомментировать в файле /etc/amavisd.conf строку:
# @bypass_spam_checks_maps = (1); # uncomment to DISABLE anti-spam code
И запустить саму службу: service spamassassin restart
Postgrey
yum install postgrey
В файле /etc/init.d/postgrey исправим секцию OPTIONS
OPTIONS="--inet=127.0.0.1:10023 --delay=1000 --retry-window=22h --greylist-text='Greylisted for 1000 seconds, see http://b-formula.ru/greylisted/index.html'"
*--greylist-text='Greylisted for 1000 seconds, see http://b-formula.ru/greylisted/index.html' дает возможность выводить свою html страницу с ошибкой, вместо стандартной.
Теперь нужно перезапустить сервисы:
service greylist restart
service postfix restart
И сделаем, чтобы обе сервиса запускались при старте системы:
# /sbin/chkconfig --level 35 spamassassin on
# /sbin/chkconfig --level 35 postgrey on
Пример функций /etc/postfix/mail.cf
# Размер почтового ящика устанавливаем 100Мб
mailbox_size_limit = 104857600
# Размер письма 15M
message_size_limit = 25360000
# Эта строка информирует Postfix о том, что необходимо использовать SMTP AUTH когда
# пользователь находится не в 'mynetwork' и пытается отправить почту на "чужие" домены
smtpd_sasl_auth_enable = yes
# Эта опция выключает "anonymous style" для SMTP AUTH.
# Без этой опции любой может использовать postfix как "open relay"
smtpd_sasl_security_options = noanonymous
# Требовать от клиента в начале smtp-сессии слать команду HELO/EHLO.
# До сих пор многие программы для спам рассылок не включают в себя набор этих команд.
smtpd_require_helo = yes
# Запрещаем использовать команду vrfy для определения пользователя на сервере.
disable_vrfy_command = yes
# Использовать бузу данных открытых релеев relays.ordb.org
maps_rbl_domains = relays.ordb.org
# The broken_sasl_auth_clients parameter controls interoperability with SMTP clients
# that do not recognize that Postfix supports RFC 2554 (AUTH command). Examples of
# such clients are Microsoft Outlook Express version 4 and Microsoft Exchange version 5.0.
#При использовании нестандартных клиентов, имеющих свои методы аутентификации
broken_sasl_auth_clients = yes
# Не отключать поиск доменного имени у IP адреса.
disable_dns_lookups = no
# Проверка клиента при ХЕЛО:
# клиентов в "своей" сети не проверяем
# прошедших аутентификацию не проверяем
# остальных проверяем на неправильное доменное имя
# остальных проверяем на неполное доменное имя
# остальных проверяем на наличие A и MX записей
smtpd_helo_restrictions =
#vip senders check_sender_access hash:$config_directory/vipsenders
permit_mynetworks
permit_sasl_authenticated
reject_invalid_hostname
reject_non_fqdn_hostname
reject_unknown_hostname
# ??? Эта опция устанавливает ограничения для клиентов, пытающихся релееить почту через ваш почтовый сервер
# пропускаем клиентов, описанных в файле "access_vip_sender"
# пропускаем клиентов "своей" сети
# пропускаем прошедших аутентификацию
# пропускаем если получатель в нашем (домене)??
# отклоняем клиентов с неверными имененм хоста
# отклоняем клиентов с неизвестным доменом отправителя
# отклоняем клиентов с неизвестным доменом получателя
# отклоняем клиентов если получатель не в нашем (домене)??
# отклоняем клиентов если он есть в списке relays.ordb.org
# грейлистинг
# отклоняем клиентов если он есть в списке sbl.spamhaus.org
# отклоняем клиентов если он есть в списке sbl.spamhaus.org
smtpd_recipient_restrictions =
#Включение постгрэя// обязательно перед permit_auth_destination
check_policy_service inet:127.0.0.1:10023
permit_auth_destination
permit_mynetworks
permit_sasl_authenticated
reject_invalid_hostname
reject_unknown_sender_domain
reject_unknown_recipient_domain
reject_unauth_destination
reject_rbl_client relays.ordb.org
reject_rbl_client sbl.spamhaus.org
#Проверка от ClamAV
content_filter = smtp-amavis:[127.0.0.1]:10024Ярлыки: Linux, Postfix