Корпоративный почтовый сервер
Postfix, Dovecot, MySQL, Postgrey, ClamAV и ClamSMTP
Disclaimer
Данная статья является подведением некоторых итогов над моими экспериментами с Postfix. Вы можете использовать ее как базовый документ, для создания на базе Postfix своих почтовых серверов работающих под управлением RedHat подобных дистрибутивов Linux. Эта статья не является официальным документом. Я надеюсь, что вы имеете опыт работы в Linux.
Введение
Данная почтовая система построена на операционной системе Linux, а если быть точнее на дистрибутиве Linux CentOS. Как упоминалось ранее, данная статья может быть использована для построения почтовых систем на дистрибутивах Linux подобных на Red Hat. Я использовал Postfix, как MTA для своей системы, IMAP/POP3 сервером служит dovecot. Из-за ограниченности аппаратного обеспечения, как антиспам решение я использовал postgrey. ClalmAV выступает в роли антивирусного фильтра для нашей почтовой системы. База пользователей храниться в MySQL. Структуру базы данных мы будем использовать от проекта postfixadmin, а соответственно сам проект как веб интерфейс к панели управления почтовой системы. Все программы устанавливались в большинстве случаев из rpm пакетов. В написании данной статьи я использовал статью автора Johnny Chada. Выражаю ему благодарность за его работы.
Подключим необходимые репозитарии
rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -ihv http://centos.alt.ru/repository/centos/5/i386/centalt-release-5-3.noarch.rpm
rpm -ivh http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
MySQL
Как я отметил ранее, MySQL нужен для хранения в ней базы данных пользователей, а если быть точнее: названия учетной записи, пароля в шифрованном виде, пути, на основе которого MTA будет складывать почту и многое другое. Нам понадобится:
1. Установить СУБД;
2. Обезопасить нашу СУБД и подкорректировать работу СУБД под наши нужды;
3. Создать базу данных;
4. Создать пользователя, который будет с ней работать и назначить ему права.
Воспользовавшись программой yum, я установил MySQL сервер. Ну а если это вас не устраивает, то вы вольны установить MySQL сервер любым удобным вам методом.
yum -y install mysql-server mysql-devel
Установка программы может занять некоторое время. При канале 2 Mbps это заняло у меня минут 5-7. Теперь нам необходимо отконфигурировать демон СУБД и установить пароль для суперпользователя. Для этого необходимо запустить скрипт /usr/bin/mysql_secure_installation. Он представляет собой визард. Все что нужно - это читать вопросы и отвечать на них. Далее необходимо принудить MySQL слушать только localhost и включить регистрацию событий MySQL. На этапе установки это необходимая функция для того, чтобы видеть какие запросы отправляет система в СУБД. Позже её можно будет отключить. Для этого надо открыть файл /etc/my.cnf и добавить в него следующие строки:
service mysqld start
/usr/bin/mysql_secure_installation
[mysqld]
log=/var/log/mysqld.log
bind-address=127.0.0.1
...
Теперь необходимо создать базу данных, а так же создать пользователя и задать ему пароль и нужные для работы с базой данных права. (Это пример, поэтому вы можете изменять название базы данных, имя пользователя и пароль)
chkconfig --level 35 mysqld on
mysql -u root -p
Enter password:
mysql> CREATE DATABASE mail;
mysql> GRANT ALL PRIVILEGES ON mail.* TO 'postfix'@'localhost' IDENTIFIED BY 'password';
Postfix
Postfix это довольно быстрый в работе и простой в настройке Mail Transport Agent.
Установим MTA и нужные зависимости:
yum install postfix dovecot-sasl dovecot-mysql mysql pam mod_ssl openssl crypto-utils -y
Пакет установлен, его конфигурационные файлы находятся в /etc/postfix. У postfix есть два конфигурационных файла, которые мы и будем редактировать (это main.cf и master.cf). Так же во время конфигурации нам нужно будет создать несколько конфигурационных файлов. И так, начнем с main.cf:
cp /etc/postfix/main.cf /etc/postfix/main.cf.original
gedit /etc/postfix/main.cf
soft_bounce = no
queue_directory = /var/spool/postfix
daemon_directory = /usr/libexec/postfix
mail_owner = postfix
default_privs = nobody
myhostname = mail.mailserver.tld
mydomain = mailserver.tld
myorigin = $mydomain
mydestination = $myhostname,localhost.$myhostname,localhost
local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps, $transport_maps
unknown_local_recipient_reject_code = 550
mynetworks = 127.0.0.0/8
relay_domains = $transport_maps
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases.db
mail_spool_directory = /var/mail
smtpd_banner = $myhostname ESMTP
debug_peer_level = 2
debug_peer_list = 127.0.0.1
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
config_directory = /etc/postfix
Одним удобным способом посмотреть, что происходит во время SMTP-сессии, является директива debug_peer_list из файла main.cf. Глобально включать отладку всех SMTP-соединений было бы очень накладно, поэтому в нее стоит добавлять только список хостов, взаимодействие с которыми мы хотим отслеживать тщательнее, чем обычно. К примеру, для наблюдения за передачей писем между нами и yandex.ru, mail.ru, pochta.ru и 10.10.10.23 строка могла бы выглядеть вот так:
debug_peer_level = 2
debug_peer_list = yandex.ru, mail.ru pochta.ru 10.10.10.23/32 10.10.10.0/24
Как видите, хосты можно перечислять двумя путями – через запятую и через пробел. Впрочем, как вы уже убедились, никто не мешает в качестве хоста указывать IP-адреса или целые подсети вроде 10.10.10.0/32.
Это базовые настройки Postfix, которые достаточны для старта сервера. Но это ещё не все. Не закрывая конфигурационный файл, дописываем конфигурацию для работы с виртуальными пользователями.
virtual_mailbox_domains = mysql:$config_directory/sql/vdomains.cf
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = mysql:$config_directory/sql/vmailbox.cf
virtual_alias_maps = mysql:$config_directory/sql/valias.cf
virtual_minimum_uid = 1150
virtual_uid_maps = static:1150
virtual_gid_maps = static:12
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
Значения всех этих параметров вы можете найти на сайте postfix. Но здесь есть некоторые параметры, которые я хотел бы пояснить. Параметры virtual_minimum_uid иvirtual_uid_maps указывают на ID пользователя, которого я специально создал для обработки почты. virtual_gid_maps указывает ID на группу mail. В моем случае это число равное 12. Уточните ID вашей группы mail. И так давайте создадим пользователя, который будет обрабатывать пользователя.
useradd -r -u 1150 -g mail -d /var/vmail -s /sbin/nologin -c Virtual vmail
mkdir -p -v /var/vmail
chmod 770 /var/vmail
chown vmail:mail /var/vmail
Мы не хотим, чтобы наш почтовый сервер был открытым релеем, поэтому допишем следующие строки в main.cf
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
permit
Этот параметр мы будем редактировать, но на данном этапе нам хватает. Теперь нам необходимо создать конфигурационные файлы в соответствии с данными, которые я указал в main.cf, чтобы postfix мог обращаться к нашей базе данных.
mkdir /etc/postfix/sql
gedit /etc/postfix/sql/vdomains.cf
user = postfix
password = password
hosts = localhost
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1'
gedit /etc/postfix/sql/vmailbox.cf
user = postmaster
password = password
hosts = localhost
dbname = mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s'AND active = '1'
gedit /etc/postfix/sql/valias.cf
user = postfix
password = password
hosts = localhost
dbname = mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
Примечание: параметры user и password это пользователь и его пароль, который вы задали для работы postfix c базой данный в разделе MySQL. Как видно из конфигурационного файла локально внутри сервера обработкой почты будет занимать dovecot. Поэтому сначала нам необходимо установить dovecot.
yum -y install dovecot dovecot-mysql
(Конфигурация dovecot будет рассмотрена ниже) Для того, чтобы dovecot служил локальным транспортом нам необходимо добавить в master.cf следующие строки.
gedit /etc/postfix/master.cf
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d $(recipient)
Перед тем как перейти к настройке dovecot, давайте завершим конфигурацию postfix. Сначала давайте допишем ограничения самого postfix, а далее подключим кpostfix-у postgrey и clamav. Открываем файл main.cf для редактирования, находимпараметр smtpd_recipient_restrictions и дописываем следующие строки:
gedit /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unverified_recipient,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client dull.ru
Пояснения о каждом параметре можно прочитать на http://www.postfix.org Перед тем как приступить к установке clamav и postgrey рекомендую произвести поиск в своем репозитарии на наличии этих пакетов. Примечание: в стандартном репозитарии CentOS я не нашел пакета postgrey, а clamav есть демон clamd. В репозитарии Fedora не было postgrey, а у clamav отсутствовал демон clamd. Проблему эту можно решить, в Интернете я
набрел на репозитарий для Enterprise Linux полностью открытый и поддерживаемый сообществом. Вот ссылка на этот репозитарий http://apt.sw.be/redhat/el5/en/i386/rpm … f.i386.rpm, вы можете скачать и установить данный репозитарий и установить нужные вам пакеты без проблем.
После установки нам нужно дописать всего 1 строчку после, которого postfix подружиться с postgrey. Открываем main.cf и делаем соответствующие изменения:
gedit /etc/postfix/main.cf
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:/var/spool/postfix/postgrey/socket,
reject_non_fqdn_recipient,
reject_unverified_recipient,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dialups.mail-abuse.org,
reject_rbl_client dull.ru
Примечание: check_policy_service должен быть обязательно прописан после параметра reject_unauth_destination. Так же check_policy_service как видно работает через UNIX сокет, есть так же возможность работы через TCP порт. Вам нужно будет проверить скрипт автозапуска для выяснения того как стартует демон. На этом привязка postgrey к postfix-у закончилась. Приступим к установке и настройке clamav.
yum -y install clamav clamav-devel clamav-update
У clamav есть конфигурационный файл, который нужно привести к нижеследующему виду:
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 0
LogTime yes
LogSyslog yes
LogFacility LOG_MAIL
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /var/tmp
DatabaseDirectory /var/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
TCPSocket 3310
TCPAddr 127.0.0.1
MaxConnectionQueueLength 30
MaxThreads 50
ReadTimeout 300
User clamav
AllowSupplementaryGroups yes
ScanPE yes
ScanELF yes
DetectBrokenExecutables yes
ScanOLE2 yes
ScanPDF yes
ScanMail yes
ScanHTML yes
ScanArchive yes
ArchiveBlockEncrypted no
И конфигурационный файл freshclam, который отвечает за обновление вирусной базы антивируса:
gedit /etc/freshclam.conf
DatabaseDirectory /var/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogSyslog yes
LogFacility LOG_MAIL
DatabaseOwner clamav
DatabaseMirror db.az.clamav.net
DatabaseMirror db.local.clamav.net
NotifyClamd /etc/clamd.conf
Привязать clamav можно разными путями. Я предпочел привязку с помощью ClamSMTP. На сайте проекта я нашел ссылку на Source RPMS
данной программы которая облегчила бы установку и интеграцию. Соответственно я зашел и скачал нужный мне пакет, собрал его и установил
на свою систему. После этого нужно сконфигурировать демон ClamSMTP и привязать его к postfix.
OutAddress: 10026
TimeOut: 180
KeepAlives: 0
XClient: on
Listen: 127.0.0.1:10025
ClamAddress: /var/run/clamav/clamd.sock
Header: X-Virus-Scanned: ClamAV using ClamSMTP
TempDirectory: /tmp
Action: drop
Quarantine: on
User: clamav
Для того, чтобы привязать clamav с помощью ClamSMTP нам нужно дописать в main.cf и master.cf следующие строки:
gedit /etc/postfix/main.cf
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
gedit /etc/postfix/master.cf
scan unix - - n - 16 smtp -o smtp_send_xforward_command=yes
Таким образом, мы перенаправляем почту для проверки в clamav. Но нам также нужно, чтобы письма возвращались обратно в postfix. Для этого в
master.cf файле мы добавляем нижеследующие строки:
gedit /etc/postfix/master.cf
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.0/8
Вот и все, в принципе, SMTP часть почтового сервера готова, за исключением схемы которую мы будем использовать в нашей базе данных (как
отмечалось ранее ее мы возьмем из postfixadmin-а. он будет рассматриваться ниже в разделе Apache). Но что это за почтовый сервер, у которого нет IMAP/POP3 части. Ранее мы установили dovecot, который и будет отвечать за эту часть нашего почтового сервера.
Dovecot
Конфигурационный файл dovecot по формату немного отличается от конфигурационных файлов, с которыми мы работали до этого. Мы будем редактировать 2 конфигурационных файла (dovecot.conf и dovecot-sql.conf), которые лежат в директории /etc. Вы можете скачать src.rpm пакет и указать другое месторасположение данных файлов. Итак, откроем конфигурационный файл dovecot.conf для редактирования и приведем его к следующему виду:
base_dir = /var/run/dovecot/
protocols = imap pop3
protocol imap {
listen = *:143
}
protocol pop3 {
listen = *:110
}
log_timestamp = "%Y-%m-%d %H:%M:%S"
syslog_facility = mail
mail_location = maildir:/var/vmail/%d/%u
mail_debug = yes
first_valid_uid = 1150
last_valid_uid = 1150
maildir_copy_with_hardlinks = yes
protocol imap {
login_executable = /usr/libexec/dovecot/imap-login
mail_executable = /usr/libexec/dovecot/imap
imap_max_line_length = 65536
}
protocol pop3 {
login_executable = /usr/libexec/dovecot/pop3-login
mail_executable = /usr/libexec/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
postmaster_address = postmaster@mailserver.tld
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
}
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot-sql.conf
}
user = nobody
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = mail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postdrop
}
}
}
dict {
}
plugin {
}
Как видно из данного конфигурационного файла нам нужен другой конфигурационный файл под названием dovecot-sql.conf. По умолчанию данный конфигурационный файл лежит в следующей директории /usr/share/doc/dovecot-X.Y.Z/examples/dovecot-sql-example.conf. Можно
скопировать его в директорию /etc или создать в директории /etc файл dovecot-sql.conf. Нужно привести данный конфигурационный файл к нижеследующему виду:
gedit /etc/dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=mail user=postfix password=password
default_pass_scheme = MD5
user_query = SELECT '/var/vmail/%d/%n' AS home, 'maildir:/var/vmail/%d/%n' as mail, 1150 AS uid, 12 AS gid, concat('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username AS user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1150 AS userdb_uid, 12 AS userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
Примечание: dovecot чувствителен к регистрам символов в своих конфигурационных файлах
Apache
Плоха та система, которой невозможно управлять. Для того, чтобы установить postfixadmin нам необходим Apache с поддержкой php. Необходимо
установить следующее программное обеспечение:
yum -y install httpd php php-imap php-mbstring php-common php-pdo php-mysql php-cli
Для установки postfixadmin нужно скачать архив с сайта программы и выполнить следующие команды
cd /var/www/html
wget http://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.3.3/postfixadmin-2.3.3.tar.gz/download
tar -xvzf postfixadmin-2.3.3.tar.gz
mv postfixadmin-2.3.3/ postfixadmin
cd postfixadmin
gedit config.inc.php
После распаковки архива необходимо перейти в директорию postfixadmin и отредактировать файл config.inc.php. В принципе данный конфигурационный файл ничего сложного из себя не представляет. (Подводным камнем является параметр $CONF[emailcheck_resolve_domain]).
А также $CONF['configured'] = true. Здесь имеется ввиду что если используется несуществующий домен, то этот параметр необходимо выключить иначе postfixadmin не даст добавить этот несуществующий домен в систему. В обозревателе открываете путь к данной панели управления.
Еще надо поменять значение $CONF['database_password'] = 'postfixadmin' на $CONF['database_password'] = 'password' который мы указали в начале.
Вы должны поменять значение:
$CONF[emailcheck_resolve_domain] = true
$CONF['configured'] = true
$CONF['database_password'] = 'password'
После этого PostfixAdmin запустится….
chkconfig --level 35 mysqld on
chkconfig --level 35 dovecot on
chkconfig --level 35 postfix on
chkconfig --level 35 httpd on
chkconfig --level 35 postgrey on
Отключаем и убираем Sendmail:
alternatives --config mta
service sendmail stop
yum remove sendmail –y
touch /etc/aliases.db
Чтобы убедится в успешности установки, вы можете посмотреть почтовый лог файл /etc/var/maillog:
Aug 11 02:01:30 localhost dovecot: Dovecot v1.2.17 starting up (core dumps disabled)
Aug 11 02:01:30 localhost dovecot: auth-worker(default): mysql: Connected to localhost (mail)
Aug 11 02:01:31 localhost postgrey[2358]: Process Backgrounded
Aug 11 02:01:31 localhost postgrey[2358]: 2011/08/11-02:01:31 postgrey (type Net::Server::Multiplex) starting! pid(2358)
Aug 11 02:01:31 localhost postgrey[2358]: Using default listen value of 128
Aug 11 02:01:31 localhost postgrey[2358]: Binding to UNIX socket file /var/spool/postfix/postgrey/socket using SOCK_STREAM
Aug 11 02:01:31 localhost postgrey[2358]: Setting gid to "104 104"
Aug 11 02:01:31 localhost postgrey[2358]: Setting uid to "103"
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2432
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2433
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2434
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2435
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2436
Aug 11 02:01:31 localhost dovecot: auth(default): new auth connection: pid=2437
Aug 11 02:01:31 localhost postfix/postfix-script[2445]: starting the Postfix mail system
Aug 11 02:01:31 localhost postfix/master[2446]: daemon started -- version 2.8.4, configuration /etc/postfix
Как видим, нету слов error и warrning
Послесловие
Данная конфигурация работает в одной организации, которая попросила заменить их коммерческий продукт на данную систему.