Почтовый сервер на базе Postfix, Dovecot и Ubuntu 12.04 LTS

Выполнение (новый проверенный вариант от 18.01.2014):
Это предварительная рабочая версия. В самое ближайшее время оформлю и допишу пояснения.

  1. После установки UbuntuServer 12.04.3 LTSвыполним обновление пакетов

sudo apt-get update

sudo apt-get upgrade

  1. Устанавливаем Postfix, Dovecot, MySQLи другие необходимые пакеты

sudo apt-get install postfix dovecot-common dovecot-imapd mysql-server mysql-client postfix-mysql dovecot-mysql sasl2-bin

В процессе установки MySQL задаем пароль root в MySQL: sqlrootpass

В процессе установки Postfixвыбираем тип конфигурации «noconfiguration» (без конфигурации)

  1. Подключаемся к MySQL

mysql -uroot–p

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

CREATE DATABASE mail;

USE mail;

Внимание! Далее будет использоваться пользователь mail_admin и его пароль mail_admin_password для доступа к базе данных почтовых аккаунтов в MySQL. Вместо mail_admin и mail_admin_password Вы можете задать свои значения.

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;

FLUSH PRIVILEGES;

создаем таблицу доменов

CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );

Создаем таблицу …

CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

Создаем таблицу для пользователей

CREATE TABLE users ( user varchar(80) NOT NULL, email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );

CREATE TABLE transport ( domain varchar(128) NOT NULL default », transport varchar(128) NOT NULL default », UNIQUE KEY domain (domain) );

quit

  1. Проверим, что MySQL связана с localhost (127.0.0.1). Для найдем в файле /etc/mysql/my.cnf строку bind-address            = 127.0.0.1

grep ‘bind-address’ /etc/mysql/my.cnf

в результате выполнения команды на экран должно быть выведено

bind-address            = 127.0.0.1

  1. Создаем группу virtualи пользователя virtual, входящего в эту группу.

sudo groupadd -g 5000 virtual

sudo useradd -g virtual -u 5000 virtual

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

sudo mkdir /var/spool/mail/myubuntu.org

сменим имя и группу владельца созданной директории на virtual:virtual

sudo chown virtual:virtual  /var/spool/mail/myubuntu.org

дадим владельцу и его группе полные права на каталог, а другим все запретим

sudo chmod 770 /var/spool/mail/myubuntu.org

Начинаем конфигурировать Postfix

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

sudo nano /etc/postfix/mysql-virtual_domains.cf

user = mail_admin

password = mail_admin_password

dbname = mail

query = SELECT domain AS virtual FROM domains WHERE domain = ‘%s’

hosts = 127.0.0.1

  1. Создаем конфигурационный файл для определения автоматической пересылки писем с ящика на ящик

sudo nano /etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin

password = mail_admin_password

dbname = mail

query = SELECT destination FROM forwardings WHERE source = ‘%s’

hosts = 127.0.0.1

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

sudo nano /etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin

password = mail_admin_password

dbname = mail

query = SELECT CONCAT( SUBSTRING_INDEX(email, ‘@’, -1), ‘/’ , SUBSTRING_INDEX(email, ‘@’, 1), ‘/’ ) FROM users WHERE email = ‘%s’

hosts = 127.0.0.1

  1. Создаем конфигурационный файл для виртуального отображения почты

sudo nano /etc/postfix/mysql-virtual_email2email.cf

user = mail_admin

password = mail_admin_password

dbname = mail

query = SELECT email FROM users WHERE email = ‘%s’

hosts = 127.0.0.1

  1. Владельцем данных конфигурационных файлов должен быть root, группой владельца — postfix

sudo chown root /etc/postfix/mysql-virtual_*.cf

sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf

  1. Редактируем конфигурационный файл главного модуля main

sudo nano /etc/postfix/main.cf

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

#Так наш сервер будет представляться при отправке и получении почты

smtpd_banner = $myhostname ESMTP (Ubuntu)

#Отключаем использование comsat

biff = no

#Запрещаем автоматически дополнять неполное доменное имя в адресе письма

append_dot_mydomain = no

#Указываем имя нашего хоста

myhostname = ubuntu.myubuntu.org

# Указываем файл с псевдонимами почтовых ящиков

alias_maps = hash:/etc/postfix/aliases

#Указываем, для каких доменов будем принимать почту

mydestination = localhost

# Не будем ограничивать размер почтовых ящиков

mailbox_size_limit = 0

recipient_delimiter = +

#Указываем прослушивание на всех сетевых интерфейсах

inet_interfaces = all

#Указываем обязательность использование клиентами команды helo

smtpd_helo_required = yes

#Описываем доступ доменам, почтовым ящикам и т.д.

virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf

virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf

virtual_mailbox_base = /var/spool/mail

virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf

virtual_minimum_uid = 100

virtual_uid_maps = static:5000

virtual_gid_maps = static:5000

home_mailbox = Maildir/

local_recipient_maps = $virtual_mailbox_maps

#Описываем авторизацию по SMTP для клиентов не из доверенной зоны

smtpd_sasl_type = dovecot

smtpd_sasl_auth_enable = yes

smtpd_sasl_path = private/auth

smtpd_sasl_security_options = noanonymous

#broken_sasl_auth_clients = yes

#Указываемкаталогочередидля Postfix

queue_directory = /var/spool/postfix

smtpd_recipient_restrictions =  permit_mynetworks,  permit_sasl_authenticated, reject_unauth_destination

proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps  $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps

smtp_use_tls = yes

smtpd_use_tls = yes

smtp_tls_note_starttls_offer = yes

smtpd_tls_key_file = /etc/dovecot/myubuntu.key

smtpd_tls_cert_file = /etc/dovecot/myubuntu.cert

smtpd_tls_loglevel = 1

smtpd_tls_received_header = yes

smtpd_tls_session_cache_timeout = 1s

tls_random_source = dev:/dev/urandom
13.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель будет представляться именем нашего сервера
sudo nano /etc/postfix/helo.list
myubuntu.org 550 Don’t use my hostname
прохешируем
sudo postmap /etc/postfix/helo.list
14.       Задаем сообщение, которое будет выводить Postfix в случае, если отправитель извне будет говорить, что он из нашей сети
sudo nano /etc/postfix/ext_sender
myubuntu.org 450 Do not use my domain in your envelope sender
прохешируем
sudo postmap /etc/postfix/ext_sender

  1. Настраиваем демон saslauthdдля взаимодействия с Postfix

sudo mkdir -p /var/spool/postfix/var/run/saslauthd

sudo nano /etc/default/saslauthd

необходимо проверить, чтобы были закомментированы все строки, и написать следующее:

START=yes

DESC=»SASL Authentication Daemon»

NAME=»saslauthd»

MECHANISMS=»pam»

MECH_OPTIONS=»»

THREADS=5

OPTIONS=»-c -m /var/spool/postfix/var/run/saslauthd -r»

  1. Настраиваем pam-аутентификацию

sudo nano /etc/pam.d/smtp

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

auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1

account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=user passwdcolumn=password crypt=1

  1. Настраиваем Postfixдля взаимодействия с saslauthd

sudo nano /etc/postfix/sasl/smtpd.conf

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

pwcheck_method: saslauthd

mech_list: plain login

allow_plaintext: true

auxprop_plugin: mysql

sql_hostnames: 127.0.0.1

sql_user: mail_admin

sql_passwd: mail_admin_password

sql_database: mail

sql_select: SELECT password FROM users WHERE user = ‘%u’

  1. Владельцем данных файлов должен быть root

sudochown root /etc/pam.d/smtp /etc/postfix/sasl/smtpd.conf

  1. Редактируем конфигурационный файл Postfix

sudo nano /etc/postfix/master.cf

Добавляем следующие строки

dovecot unix — n n — — pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}

submission inet n — — — — smtpd

-o smtpd_tls_security_level=encrypt

-o smtpd_sasl_auth_enable=yes

-o smtpd_sasl_type=dovecot

-o smtpd_sasl_path=private/auth

-o smtpd_sasl_security_options=noanonymous

-o smtpd_sasl_local_domain=$myhostname

-o smtpd_client_restrictions=permit_sasl_authenticated,reject

-o smtpd_sender_login_maps=hash:/etc/postfix/virtual

-o smtpd_sender_restrictions=reject_sender_login_mismatch

-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject

smtps inet n — n — — smtpd

-o syslog_name=postfix/smtps

-o smtpd_tls_wrappermode=yes

-o smtpd_sasl_auth_enable=yes

  1. Добавляем пользователя postfix в группу sasl

sudo adduser postfix sasl

  1. Конфигурируем Dovecot

sudo nano /etc/dovecot/dovecot.conf

Нужно убедится в том, что все строки закомментированы и добавить следующее

!include_try /usr/share/dovecot/protocols.d/*.protocol
#Разрешаемавторизациюв plaintext

disable_plaintext_auth = no

# Журнал будем писать в файл /var/log/dovecot.err

log_path = /var/log/dovecot.err

# Формат даты и времени для регистрируемых событий

log_timestamp = «%Y-%m-%d %H:%M:%S »

#Включаем SSL

ssl = yes

ssl_cert =< /etc/dovecot/myubuntu.cert ssl_key =< /etc/dovecot/myubuntu.key #Строка приветствия при ответе сервера login_greeting = Dovecot ready. #Описываем тип (maildir) и местонахождения почтовых ящиков (/var/spool/mail/%d/%n) %d - имя сервера, %n - имя пользователя mail_location = maildir:/var/spool/mail/%d/%n #Задаем идентификатор пользователя и группы, с которыми будет работать dovecot mail_uid = 5000 mail_gid = 5000 mail_privileged_group = mail valid_chroot_dirs = /var/spool/mail/ #Настраиваем вывод отладочных сообщений auth_verbose = yes auth_debug = yes auth_debug_passwords = yes #Типыдопустимыхвариантоваутентификации auth_mechanisms = plain login digest-md5 #Задаемпараметры аутентификации passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf } service auth { unix_listener auth-userdb { mode = 0660 user = virtual group = virtual } unix_listener /var/spool/postfix/private/auth { mode = 0660 # Assuming the default Postfix user and group user = postfix group = postfix } } service imap-login { inet_listener imap { port = 0 } inet_listener imaps { port = 993 ssl = yes } }

  1. Настраиваем параметры соединения с базой данных MySQL

sudo nano /etc/dovecot/dovecot-sql.conf

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

driver = mysql

connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password

default_pass_scheme = CRYPT

password_query = SELECT email AS user , password FROM users WHERE (user = ‘%u’) or (email = ‘%u’);

  1. Проверяем конфигурацию Dovecot

dovecot -a

  1. Создадим в базе данных MySQLпочтовый домен и два пользователя

mysql -u root -p

USE mail;

INSERT INTO domains (domain) VALUES (‘myubuntu.org’);

INSERT INTO users (user, email, password) VALUES (‘user1’, ‘user1@myubuntu.org’, ENCRYPT(‘user1_password’));

INSERT INTO users (user, email, password) VALUES (‘user2’, ‘user2@myubuntu.org’, ENCRYPT(‘user2_password’));

quit

  1. Создадим сертификат и ключ для SSL

cd /etc/dovecot

sudo openssl req -new -outform PEM -out myubuntu.cert -newkey rsa:2048 -nodes -keyout myubuntu.key -keyform PEM -days 365 -x509

В итоге в каталоге /etc/dovecot будет создан сертификат myubuntu.cert и ключ
myubuntu.key

  1. Владельцем ключа должен быть root

sudo chown root /etc/dovecot/myubuntu.key

  1. Перезапускаем saslauthd, dovecot и postfix

sudo service saslauthd restart

sudo service dovecot restart

sudo service postfix restart

в Thunderbird настройки:

imap порт 993 имя пользователя user1 SSL/TLS обычный пароль

smtp порт 465 имя пользователя user1 SSL/TLS обычный пароль


В процессе возникали следующие ошибки:

1. При выполнении команды telnet localhost smtp в /var/log/mail.log появляется следующее:

Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: connect from localhost[127.0.0.1]

Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: warning: SASL: Connect to private/auth failed: No such file or directory (или Connection refused)

Aug 22 14:14:58 ubuntu postfix/smtpd[3095]: fatal: no SASL authentication mechanisms

Aug 22 14:14:59 ubuntu postfix/master[3089]: warning: process /usr/lib/postfix/smtpd pid 3095 exit status 1

Это говорит о том, что dovecot не создает сокет /var/spool/postfix/private/auth , используя который postfix должен осуществлять авторизацию, и не слушает его.

Решение: в файле конфигурации dovecot /etc/dovecot/dovecot.conf писать не так

socket listen {

client {

path = /var/spool/postfix/private/auth

mode = 0666

user = postfix

group = postfix

}

}

, атак:

service auth {

unix_listener /var/spool/postfix/private/auth {

mode = 0660

user = postfix

group = postfix

}

}

2. При попытке отправки сообщения через Thunderbird в /var/log/mail.log появляется следующее:

ubuntu postfix/trivial-rewrite[3223]: warning: do not list domain myubuntu.org in BOTH mydestination and virtual_mailbox_domains

postfix ругаетсянато, чтовфайле /etc/postfix/main.cf доменноеимя myubuntu.org прописаносразувдвухпараметрах: mydestination и virtual_mailbox_domains

Решение: вфайлеконфигурации postfix /etc/postfix/main.cf впараметре mydestination убратьдомен myubuntu.org (уВасондругой).

3. После отправки сообщения через  Thunderbird к адресату оно не доходит, а в /var/log/dovecot.err пишется следующее:

lda: Error: userdb lookup: connect(/var/run/dovecot/auth-userdb) failed: Permission denied (euid=5000(virtual) egid=5000(virtual) missing +r perm: /var/run/dovecot/auth-userdb, dir owned by 0:0 mode=0755)

Сокет /var/run/dovecot/auth-userdb имеетвладельца root игруппу root, права srw-rw—-, поэтомупользователь virtual неимеетдоступаксокету.

Решение: длятого, чтобывладельцем /var/run/dovecot/auth-userdb был virtual, вконфигурационномфайле /etc/dovecot/dovecot.conf добавимследующее:

service auth {

unix_listener auth-userdb {

mode = 0660

user = virtual

group = virtual

}

}

Немного теории.

В файле /etc/postfix/main.cf  указан параетр  virtual_transport = dovecot . Сам параметр virtual_transport используется для указания того, что будет использоваться в качестве транспорта доставки почты по умолчанию. Значение dovecot указывает на строки в файле /etc/postfix/master.cf, а именно:

dovecot unix — n n — — pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient}

,где

dovecot — имя сервиса

unix — тип службы: данная служба прослушивает сокет UNIX и доступна только для локальных клиентов

 — пустое значение параметра private: будет ли для службы ограничен доступ к почтовой системе. Т.к. по умолчанию значение параметра YES, доступ будет ограничен.

n — значение параметра unpriv (unprivileged): указывает, работает служба с правами суперпользователя или с правами владельца postfix. Значение по умолчанию YES.

n — значение параметра chroot: указывает, будет ли служба ограничена каталогом queue_directory, который прописывается в /etc/postfix/main.cf . Значение по умолчанию YES.

 — пустое значение параметра wakeup: автоматическое пробуждение службы после заданного количества секунд. Пробуждение осуществляется путем подключения к службе и отправки wake up запроса. Значение по умолчанию 0, т.е. автоматическое пробуждение отключено.

 — пустое значение параметра maxproc: максимальное количество процессов, которые могут обращаться к службе одновременно. Значение по умолчанию 100.

pipe flags=DRhu user=virtual:virtual argv=/usr/lib/dovecot/deliver -d ${recipient} — значение параметра command + args : команда, которая будет выполнена. Имя команды указывается относительно каталога демона postfix, который можно задать с помощью параметра daemon_directory. Флаги:

D — запускать службу под контролем команды, указанной в параметре debugger_command в файле main.cf .

остальное смотреть в мануалах к службам.

Источник http://tnadm.blogspot.com/2012/08/blog-post_16.html

Запись опубликована в рубрике *Ubuntu. Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91