Главная | Контакты



Главная > Программы > Postfix

Создание почтового сервера на FreeBSD. Часть 1

Вступление

Данный документ описывает установку и настройку почтовой системы на основе Postfix, Cyrus-SASL, MySQL, Courier-IMAP, postfixadmin, clamav, spamassassin, amavisd-new. При этом нет разницы, сколько почтовых доменов заведено в системе, как называются пользователи, мы будем использовать виртуальных пользователей, которые с системными никак не пересекаются.

Перед началом настройки данной связки рекомендую обновить дерево портов.

В нашем распоряжении имеется следующая система:

# uname -a
FreeBSD www.it-volga.org 8.1-STABLE FreeBSD 8.1-STABLE
C двумя сетевыми интерфейсами:
rl0 [y.y.y.y] – внутренний ip
rl1 [x.x.x.x] – внешний ip, выданный провайдером
Примечание !!!

Если вы настраиваете новую систему и собираетесь ее использовать в промышленных целях, настоятельно рекомендую до начала сборки пакетов обновить систему (мир) и применить все патчи безопасности.

Perl

Итак, начнем по порядку. Скорее всего, perl уже стоит у вас в системе, т.к. на него завязано слишком много пакетов. В линуксе он вообще сразу ставится с системой. Если perl не установлен, то ставим его

# cd /usr/ports/lang/perl5.8/
# make install clean
# rehash

Примечание !!!

Некоторые командные процессоры для ускорения поиска выполнимых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения PATH.

Если вы используете один из таких командных процессоров, то перед использованием только что добавленных программ вам может понадобиться вызвать команду rehash после установки порта. Эта команда будет работать с такими оболочками, как, например, tcsh.

При работе с такими командными процессорами, как sh или shells/bash, воспользуйтесь командой hash -r. Дополнительную информацию можно найти в документации к вашему командному процессору

Openssl

Устанавливаем openssl. Он нам понадобится для генерации сертификатов/ключей, а также для поддержки SSL/TLS.

# cd /usr/ports/security/openssl/
# make install clean
# rehash

Mysql

Устанавливаем и настраиваем MySQL. На unix системах, наверное, одна из самых распространенных СУБД. MySQL необходим для работы postfixadmin. В базе данных мы будем хранить информацию о пользователях и почтовых ящиках.

# cd /usr/ports/databases/mysql51-server/
# setenv BUILD_OPTIMIZED yes
# setenv WITH_OPENSSL yes (если mysql будет работать на той же машине и обслуживать тока этот хост, можно отключить поддержку ssl)
# setenv WITH_CHARSET utf8
# make install clean
# rehash

Устанавливаем набор вспомогательных скриптов, которые помогают настроить MySQL.

# cd /usr/ports/databases/mysql51-scripts/
# make install clean
# rehash

Производим первоначальную настройку MySQL сервера. Настраиваем запуск MySQL вместе с системой

# echo ‘mysql_enable=»YES»‘ >> /etc/rc.conf

Создаем конфигурационный файл, исправляем по своему желанию

# cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf

Единственное, что я подправил, так это указал лог файл и в целях безопасности указал, чтобы mysql слушал только localhost. Если вы не собираетесь «выставлять» mysql наружу, то лучше привязать его или к внутреннему интерфейсу или к localhost.

#
# /etc/my.cnf
#
[mysqld]
general_log=/var/log/mysql.log
bind-address=127.0.0.1

Создаем соответствующий файл и выставляем необходимые права

# touch /var/log/mysql.log
# chown mysql:mysql /var/log/mysql.log

Примечание : Если логи не пипутся в /var/log, то проверьте папку баз /var/db/mysql. Скорее всего там будет файлик {имя хоста}.log

Запускаем MySQL

# /usr/local/etc/rc.d/mysql-server start
Starting mysql.

# cat /var/log/mysql.log
/usr/local/libexec/mysqld, Version: 5.1.52 started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument

А теперь воспользуемся скриптом для настройки безопасности MySQL сервера

# /usr/local/bin/mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we’ll need the current password for the root user. If you’ve just installed MySQL, and you haven’t set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none):

OK, successfully used password, moving on…

Setting the root password ensures that nobody can log into the MySQL

root user without the proper authorisation.

Set root password? [Y/n]Y

New password:

Re-enter new password:

Password updated successfully!

Reloading privilege tables..

… Success!

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment.

Remove anonymous users? [Y/n]Y

… Success!

Normally, root should only be allowed to connect from ‘localhost’. This ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]Y

… Success!

By default, MySQL comes with a database named ‘test’ that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment.

Remove test database and access to it? [Y/n]Y

- Dropping test database…

… Success!

- Removing privileges on test database…

… Success!

Reloading the privilege tables will ensure that all changes made so far will take effect immediately.

Reload privilege tables now? [Y/n] Y

… Success!

Cleaning up…

All done! If you’ve completed all of the above steps, your MySQL installation should now be secure.

Thanks for using MySQL!

Что делает скрипт mysql_secure_installation

Как видно из названия самого скрипта он предназначен для повышения безопасности MySQL сервера. С помощью этого скрипта мы выполнили следующие действия:
задали пароль для супер пользователя root (с системным root он не имеет ничего общего, это абсолютно два разных пользователя), так как по умолчанию для него не установлен пароль;
удалили анонимного пользователя, который создается только для тестовых целей;
запретили пользователю root входить удаленно. Теперь он сможет заходить только с localhost;
удалили тестовую БД test и доступ к ней;

Все, с MySQL мы разобрались, идем дальше.
Cyrus-Sasl

Собираем и настраиваем Cyrus-SASL. Данную библиотеку мы будем использовать для SMTP аутентификации, т.е. проверки логина и пароля по некоторому алгоритму, например PLAIN, LOGIN, CRAM-MD5.

# cd /usr/ports/security/cyrus-sasl2/

# make config

# make install clean

Courier-authlib

Собираем и настраиваем courier-authlib. Данную библиотеку courier-imap использует для аутентификации пользователей.

# cd /usr/ports/security/courier-authlib/

# make config

# make install clean

Делаем автоматический запуск authdaemond при старте системы

# echo ‘courier_authdaemond_enable=»YES»‘ >> /etc/rc.conf

Настраиваем courier-authlib. Для этого редактируем два конфигурационных файла: /usr/local/etc/authlib/authdaemonrc и /usr/local/etc/authlib/authmysqlrc

# cat /usr/local/etc/authlib/authdaemonrc | grep -v ^# | grep -v ^$

authmodulelist=»authmysql»

authmodulelistorig=»authmysql»

daemons=5

authdaemonvar=/var/run/authdaemond

subsystem=mail

DEBUG_LOGIN=2 (уровень ошибок 0-2)

DEFAULTOPTIONS=»wbnodsn=1″

LOGGEROPTS=»"

# cat /usr/local/etc/authlib/authmysqlrc | grep -v ^# | grep -v ^$

MYSQL_USERNAME postfix

MYSQL_PASSWORD postfix

MYSQL_SOCKET /tmp/mysql.sock

MYSQL_OPT 0

MYSQL_DATABASE postfix

MYSQL_CHARACTER_SET utf8

MYSQL_USER_TABLE mailbox

MYSQL_CLEAR_PWFIELD password

MYSQL_UID_FIELD ’1981′

MYSQL_GID_FIELD ’1981′

MYSQL_LOGIN_FIELD username

MYSQL_HOME_FIELD ‘/var/spool/mail’

MYSQL_NAME_FIELD name

MYSQL_MAILDIR_FIELD maildir

MYSQL_QUOTA_FIELD quota

MYSQL_WHERE_CLAUSE active=’1′

MYSQL_UID_FIELD и MYSQL_GID_FIELD

Обратите внимание на значения этих полей, здесь необходимо указывать uid и gid пользователя и группы virtual соответственно.

Настройка authmysqlrc

Если MySQL запускается на той же машине, что и courier-authlib вы можете использовать сокет, вместо указания порта и имени сервера. При этом не нужно инициализировать MYSQL_SERVER/MYSQL_PORT.

Запускаем authdaemond

# /usr/local/etc/rc.d/courier-authdaemond start

Starting courier_authdaemond.

Если вы все правильно настроили, то в log-файле должно быть следующее

# cat /var/log/maillog | grep authdaemond

Feb 9 23:01:56 freebsd authdaemond: modules=»authmysql», daemons=5

Feb 9 23:01:56 freebsd authdaemond: Installing libauthmysql

Feb 9 23:01:56 freebsd authdaemond: Installation complete: authmysql

Courier-imap

Устанавливаем и настраиваем courier-imap. Несмотря на название, courier-imap также поддерживает и pop3, хотя основной акцент делается на работу с imap.

# cd /usr/ports/mail/courier-imap/

# make config

# make install clean

В зависимости от того, что вы хотите использовать pop3 или imap, редактируем соответствующие файлы. Редактируем следующий файл /usr/local/etc/courier-imap/pop3d

# cat /usr/local/etc/courier-imap/pop3d | grep -v ^# | grep -v ^$

PIDFILE=/var/run/pop3d.pid

MAXDAEMONS=40

MAXPERIP=4

POP3AUTH=»PLAIN LOGIN CRAM-MD5″

POP3AUTH_ORIG=»PLAIN LOGIN CRAM-MD5″

POP3AUTH_TLS=»PLAIN LOGIN CRAM-MD5″

POP3AUTH_TLS_ORIG=»PLAIN LOGIN CRAM-MD5″

POP3_PROXY=0

PORT=110

ADDRESS=192.168.0.15

TCPDOPTS=»-nodnslookup -noidentlookup»

LOGGEROPTS=»-name=courier-imap»

POP3DSTART=YES

MAILDIRPATH=Maildir

Примечание Для того чтобы пользователи могли просматривать почту из мира, то в поле ADDRESS необходимо указать 0. В этом случае courier-imap будет слушать на всех активных интерфейсах.

Если вы хотите, чтобы пользователи могли просматривать почту только через веб интерфейс (imp), то в поле ADDRESS необходимо указать 127.0.0.1.

Если у вас в системе много интерфейсов, а вам нужно привязать pop/imap сервер только к некоторым, то это можно сделать так:

ADDRESS=0

PORT=192.168.0.15.110,127.0.0.1.110

pop vs imap

В документации к imp, настоятельно рекомендуют использовать imap протокол. И только в случае отсутствия imap использовать pop. Поэтому возможно вам следует настроить imap сервер вместо pop.

Например, The Bat плохо работает с imap, а вот Outlook express, наоборот, хорошо. Так что выбор остается за вами.

Настраиваем автоматический запуск pop сервера при старте системы

# echo ‘courier_imap_pop3d_enable=»YES»‘ >> /etc/rc.conf

Запускаем pop сервер

# /usr/local/etc/rc.d/courier-imap-pop3d.sh start

Starting courier_imap_pop3d.

Проверяем, запустился ли pop3 сервер

# sockstat | grep :110

root couriertcp 6592 3 tcp4 192.168.0.15:110 *:*

Postfix

Ну а теперь собираем сердце нашей системы – Postfix

# cd /usr/ports/mail/postfix

# make config

# make install clean

# rehash

В конце установки на вопрос

Would you like to activate Postfix in /etc/mail/mailer.conf [n]?

Отвечаем yes.

Отключаем запуск sendmail при старте системы, иначе postfix и sendmail будут конфликтовать между собой. Для этого добавляем следующие строчки в rc.conf

# cat /etc/rc.conf | grep sendmail

sendmail_enable=»NO»

sendmail_submit_enable=»NO»

sendmail_outbound_enable=»NO»

sendmail_msp_queue_enable=»NO»

Отключаем специфические для sendmail опции

# touch /etc/periodic.conf

# cat /etc/periodic.conf

daily_clean_hoststat_enable=»NO»

daily_status_mail_rejects_enable=»NO»

daily_status_include_submit_mailq=»NO»

daily_submit_queuerun=»NO»

Редактируем конфигурационный файл postfix, а именно main.cf

#

# LOCAL PATHNAME INFORMATION

#

# Указываем месторасположения директории очереди postfix. Также данная директория является корнем, когда postfix запускается в chroot окружении.

queue_directory = /var/spool/postfix

# Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)

command_directory = /usr/local/sbin

# Задаем корень конфигурационных файлов, для более «быстрой навигации». Например, теперь можно использовать $base/header_checks вместо /usr/local/etc/postfix/header_checks. Мелочь, а приятно.

base = /usr/local/etc/postfix

# Задает месторасположение всех программ демонов postfix. Это программы, перечисленные в файле master.cf. Владельцем этой директории должен быть root

daemon_directory = /usr/local/libexec/postfix

# QUEUE AND PROCESS OWNERSHIP

# Задает владельца очереди postfix, а также большинства демонов postfix. В целях безопасности, необходимо использовать выделенную учетную запись. Т.е. от данного пользователя не должны запускаться какие-либо процессы в системе, а также он не должен являться владельцем каких-либо файлов.

mail_owner = postfix

# Права по умолчанию, использующиеся local delivery agent. Не указывайте здесь привилегированного пользователя или владельца postfix.

default_privs = nobody

# INTERNET HOST AND DOMAIN NAMES

# Задает имя хоста в формате FQDN. По умолчанию, используется значение, возвращаемой функцией gethostname().

myhostname = mx.it-volga.org

# Задает имя нашего домена. По умолчанию используется значение $myhostname минус первый компонент.

mydomain = it-volga.org

# SENDING MAIL

# Данный параметр указывает имя домена, которое используется при отправлении почты с этой машины. По умолчанию, используется имя локальной машины -$myhostname. Для согласованности между адресами отправителя и получателя, myorigin также указывает доменное имя, которое добавляется к адресу получателя для которого не указана доменная часть.

# myorigin = $myhostname (отправлять письма от: «it-volga@mx.it-volga.org»)

# myorigin = $mydomain (отправлять письма от: «it-volga@it-volga.org»)

myorigin = $mydomain

# RECEIVING MAIL

# Указывает адреса сетевых интерфейсов, на которых будет принимать почту наша почтовая система. По умолчанию используются все активные интерфейсы на машине. При изменении этого праметра необходимо перезапустить postfix

inet_interfaces = all

# Данный параметр указывает список доменов, для которых почта будет доставляться локально, а не пересылаться на другой хост. Не указывайте здесь виртуальные домены, для этого есть специальный параметр virtual_mailbox_domains

mydestination = $myhostname, localhost.$mydomain, localhost

# REJECTING MAIL FOR UNKNOWN LOCAL USERS

# Таблица просмотра со всеми именами и адресами локальных получателей.

local_recipient_maps = unix:passwd.byname $alias_maps

# TRUST AND RELAY CONTROL

# Данный параметр задает список «доверенных» клиентов, которые обладают некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено # пересылать почту через postfix. Если вы не доверяете никому, то оставьте

# только 127.0.0.0/8

mynetworks = 127.0.0.0/8

# ALIAS DATABASE

# Данный параметр указывает список алиасов, используемый local delivery agent. После внесения изменений в данный файл необходимо выполнить команду newaliases или postalias /etc/mail/aliases

alias_maps = hash:/etc/aliases

alias_database = hash:/etc/aliases

# SHOW SOFTWARE VERSION OR NOT

# Желательно сообщать как можно меньше информации о нашем почтовом сервере. Согласно требованиям SMTP протокола вы должны указать $myhostname вначале текста

smtpd_banner = $myhostname ESMTP

# DEBUGGING CONTROL

#Задает уровень информативности, когда имя или адрес SMTP клиента или сервера соответствует шаблону, заданному в параметре debug_peer_list. Следует использовать только во время отладки.

# debug_peer_list = 127.0.0.1, it-volga.org.

debug_peer_level = 2

# RESTRICTIONS

# client, helo, sender, recipient, data, end-of-data

# Дополнительные ограничения доступа smtp сервера в контексте smtp запроса клиента

smtpd_client_restrictions = permit_mynetworks,

permit_sasl_authenticated,

check_client_access hash:$base/client_access,

reject_unknown_client_hostname

# Дополнительные ограничения, применяемые сервером Postfix в контексте SMTP команды HELO

smtpd_helo_restrictions = check_helo_access hash:$base/helo_access,

permit_mynetworks,

permit_sasl_authenticated,

reject_invalid_helo_hostname,

reject_non_fqdn_helo_hostname,

reject_unknown_helo_hostname

# Дополнительные ограничения, применяемые сервером Postfix в контексте команды MAIL FROM

smtpd_sender_restrictions = permit_mynetworks,

check_sender_access hash:$base/sender_access,

reject_authenticated_sender_login_mismatch,

reject_unknown_sender_domain,

reject_unlisted_sender,

reject_unverified_sender

# Дополнительные ограничения, применяемые сервером Postfix в контексте команды RCPT TO

smtpd_recipient_restrictions = permit_mynetworks,

permit_sasl_authenticated,

reject_unauth_destination,

check_recipient_access hash:$base/recipient_access,

reject_unlisted_recipient,

reject_unknown_recipient_domain,

reject_non_fqdn_recipient,

reject_unverified_recipient

# Отклонять команду ETRN

smtpd_etrn_restrictions = reject

# Заставляем отклонять почту с неизвестным адресом отправителя.

# Позволяет бороться с червями и некоторыми вирусами.

smtpd_reject_unlisted_sender = yes

# Отключает SMTP команду VRFY. В результате чего, невозможно определить существование определенного ящика. Данная техника (применение команды VRFY) используется спамерами для сбора имен почтовых ящиков.

disable_vrfy_command = yes

# Требуем чтобы адреса, передаваемые в SMTP командах MAIL FROM и RCPT TO заключались в <>, а также не содержали стилей или фраз RFC 822.

strict_rfc821_envelopes = yes

# Скрываем отображение имени таблицы получателей в ответе «User unknown»

# yes: User unknown in virtual mailbox table

# no: User unknown

show_user_unknown_table_name = no

# Данный адрес будет использоваться при проверки существования адреса отправителя.

address_verify_sender = <>

# Числовой код ответа SMTP сервера Postfix в случае, когда адрес получателя отвергнут ограничением reject_unverified_sender.

unverified_sender_reject_code = 550

# Требуем, чтобы удаленный SMTP клиент представлял себя в начале SMTP сессии с помощью команды HELO или EHLO.

smtpd_helo_required = yes

# Всегда отправлять EHLO вначале SMTP сессии

smtp_always_send_ehlo = yes

# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент. При превышение данного числа Postfix разорвет соединение.

smtpd_hard_error_limit = 8

# Включаем поддержку sasl аутентификации

smtpd_sasl_auth_enable = yes

# Имя приложения, используемого для инициализации SASL сервера. Данный параметр задает имя конфигурационного файла. Имя smtpd будет соответсвовать конфигурационному файлу SASL – smtpd.conf.

smtpd_sasl_application_name = smtpd

# Включает функциональную совместимость с SMTP клиентами, которые используют устаревшую версию команды AUTH (RFC 2554), например, outlook express 4 и MicroSoft Exchange version 5.0.

broken_sasl_auth_clients = yes

# Отвергаем методы, позволяющие анонимную аутентификацию

smtpd_sasl_security_options = noanonymous

# Optional lookup table with the SASL login names

# that own sender (MAIL FROM) addresses

smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf

# Указываем, где postfix должен брать информацию о алиасах

virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf

# Указываем, где postfix должен брать информацию о доменах

virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf

# Указываем, где postfix должен брать информацию о почтовых ящиках

virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf

virtual_mailbox_base = /var/spool/mail

# Настраиваем поддержку квот

virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf

virtual_maildir_extended=yes

virtual_mailbox_limit_override=yes

virtual_create_maildirsize = yes

virtual_overquota_bounce = yes

virtual_maildir_limit_message=»Sorry, the user’s maildir has overdrawn

his diskspace quota, please try again later»

# Ограничиваем максимальный размер письма до 5 Мб

message_size_limit = 5242880

# 1981 – uid и gid пользователя и группы virtual соответственно

virtual_gid_maps = static:1981

virtual_uid_maps = static:1981

virtual_minimum_uid = 1000

Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:

# cat /usr/local/lib/sasl2/smtpd.conf

pwcheck_method: auxprop

mech_list: PLAIN LOGIN CRAM-MD5

auxprop_plugin: sql

sql_usessl: yes

sql_engine: mysql

sql_hostnames: localhost

sql_user: postfix

sql_passwd: postfix

sql_database: postfix

sql_select: select password from mailbox where username = ‘%u@%r’

log_level: 3

Инициализируем базу данных псевдонимов

# /usr/local/bin/newaliases

Создаем необходимые файлы

# cd /usr/local/etc/postfix

# touch helo_access sender_access

# touch recipient_access client_access

# postmap helo_access

# postmap sender_access

# postmap recipient_access

# postmap client_access

# mkdir /usr/local/etc/postfix/mysqlLookupMaps

# cat /usr/local/etc/postfix/mysqlLookupMaps/alias.conf

user = postfix

password = postfix

hosts = localhost

dbname = postfix

table = alias

select_field = goto

where_field = address

# cat /usr/local/etc/postfix/mysqlLookupMaps/domain.conf

user = postfix

password = postfix

hosts = localhost

dbname = postfix

table = domain

select_field = domain

where_field = domain

additional_conditions = and active = ’1′ and backupmx = ’0′

# cat /usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf

user = postfix

password = postfix

hosts = localhost

dbname = postfix

table = mailbox

select_field = maildir

where_field = username

additional_conditions = and active = ’1′

# cat /usr/local/etc/postfix/mysqlLookupMaps/quota.conf

user = postfix

password = postfix

hosts = localhost

dbname = postfix

table = mailbox

select_field = quota

where_field = username

additional_conditions = and active = ’1′

# cat /usr/local/etc/postfix/mysqlLookupMaps/sender.conf

user = postfix

password = postfix

hosts = localhost

dbname = postfix

table = mailbox

select_field = username

where_field = username

additional_conditions = and active = ’1′

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

# chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/

# chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf

# chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/

# pw group add virtual -g 1981

# pw user add virtual -g virtual -s /sbin/nologin -u 1981

# mkdir /var/spool/mail

# chown virtual:virtual /var/spool/mail/

# chmod 740 /var/spool/mail/

Настраиваем запуск postfix вместе с системой.

# echo ‘postfix_enable=»YES»‘ >> /etc/rc.conf

# /usr/local/etc/rc.d/postfix start

postfix/postfix-script: starting the Postfix mail system

Если все правильно настроено, то в log-файле должно быть следующее

# cat /var/log/maillog | grep postfix

Feb 9 23:46:40 freebsd postfix/postfix-script[12718]: starting the Postfix mail system

Feb 9 23:46:40 freebsd postfix/master[12719]: daemon started — version 2.4.6, configuration

/usr/local/etc/postfix

Следующая часть 2

Материал взят с сайта: http://www.it-volga.org/sozdanie-pochtovogo-servera-na-freebsd-chast-1/

Главная > Программы > Postfix