Настройка почтового сервера: centos 7 postfix+dovecot+mysql

Установка нужных пакетов

1
yum update

Версия postfix с основного репозитория Centos не включает в себя поддержку MariaDB, вот из за этого postfix нужно установить с репозитория CentOs Plus, для этого нужно сделать исключения для пакета postfix в [base] и [updates] для предотвращения от записи и перезаписи пакетов без поддержки MariaDB.
в файле /etc/yum.repos.d/CentOS-Base.repo внесите правки:

1
2
3
4
5
6
7
8
[base]
name=CentOS-$releasever - Base
exclude=postfix

#released updates
[updates]
name=CentOS-$releasever - Updates
exclude=postfix

Установим необходимые пакеты

1
2
yum --enablerepo=centosplus install postfix
yum install dovecot mariadb-server dovecot-mysql

Подготовим базу для наших почтовых ящиков
Запустим и поставим в автозагрузку mariadb service

1
2
systemctl enable mariadb.service
systemctl start mariadb.service

и проведем первоначальную настройку

1
mysql_secure_installation

Зайдем в шелл mysql

1
mysql -u root -p

Создадим базу, пользователя и настроем таблицы

1
2
3
4
5
CREATE DATABASE mymail;
USE mymail;
GRANT SELECT, INSERT, UPDATE, DELETE ON mymail.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailUserPasswd';
GRANT SELECT, INSERT, UPDATE, DELETE ON mymail.* TO 'mailuser'@'localhost.localdomain' IDENTIFIED BY 'mailUserPasswd';
FLUSH PRIVILEGES;

mymail,mailuser,mailUserPasswd — можно сменить на свои

Создадим таблицу для виртуальных доменов

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

Создадим таблицы для форвардинга

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

Таблица для мейл боксов

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

Таблица транспорта

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

Создадим почтовый домен

1
INSERT INTO domains (domain) VALUES ('it-svc.com.ua');

и создадим ящик

1
INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('infoPasswd'));

Можно выйти с mysql шелла

Перейдем к настройке нашего основного транспорта (основных служб и сервисов)
Сперва забиндим mariadb на прослушивание только локального адреса 127.0.0.1
файл /etc/my.cnf
пропишите

1
bind-address=127.0.0.1

и перезапустите сервис

1
systemctl restart  mariadb.service

настраиваем postfix для работы с mysql
создадим отдельную директорию с нашими sql настройками

1
mkdir /etc/postfix/sql

создаем настройку для доменов

1
/etc/postfix/sql/mysql-domains.cf
1
2
3
4
5
user = mailuser
password = mailUserPasswd
dbname = mymail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

Создаем настройку для форвардинга

1
/etc/postfix/sql/mysql-forwardings.cf
1
2
3
4
5
user = mailuser
password = mailUserPasswd
dbname = mymail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

Создаем настройку для ящиков

1
/etc/postfix/sql/mysql-mailboxes.cf
1
2
3
4
5
user = mailuser
password = mailUserPasswd
dbname = mymail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

Создаем настройку сопоставления адресов

1
/etc/postfix/sql/mysql-email2email.cf
1
2
3
4
5
user = mailuser
password = mailUserPasswd
dbname = mymail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

Установим права на конфигурационные файлы

1
2
chmod o= /etc/postfix/sql/*
chgrp postfix /etc/postfix/sql/*

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

1
2
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Далее запускаем по шагово настройки конфигурации postfix Не забываем о смене имени hostname

##каждый postconf -e — новая команда###

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
postconf -e 'myhostname = mail.it-svc.com.ua'
postconf -e 'mydestination = localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'inet_interfaces = all'
postconf -e 'message_size_limit = 30720000'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/sql/mysql-forwardings.cf, mysql:/etc/postfix/sql/mysql-email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql-domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem'
postconf -e 'smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e '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'
postconf -e 'virtual_transport = dovecot'
postconf -e 'dovecot_destination_recipient_limit = 1'

Уведомим postfix о том что обработкой входящих писем будет заниматься dovecot, для этого в конец файла /etc/postfix/master.cf нужно дописать две строки

1
2
dovecot   unix  -       n       n       -       -       pipe
   flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

и немного сменим настройки связанные с авторизацией на сервере для отправки и работой по защищенному протоколу
уберите решетки с этих строк

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       -       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

ставим postfix в автозагрузку и запускаем его

1
2
systemctl enable postfix.service
systemctl start  postfix.service

Настроим DOVECOT
на всякий случай сохраним его стандартный конфиг

1
mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.old

и создадим новый с следующим содержанием

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
protocols = imap pop3
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir

ssl_cert = </etc/pki/dovecot/certs/dovecot.pem
ssl_key = </etc/pki/dovecot/private/dovecot.pem

namespace {
    type = private
    separator = .
    prefix = INBOX.
    inbox = yes
}

service auth {
    unix_listener auth-master {
        mode = 0600
        user = vmail
    }

    unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
    }

user = root
}

service auth-worker {
    user = root
}

protocol lda {
    log_path = /home/vmail/dovecot-deliver.log
    auth_socket_path = /var/run/dovecot/auth-master
    postmaster_address = postmaster@it-svc.com.ua
}

protocol pop3 {
    pop3_uidl_format = %08Xu%08Xv
}

passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf
}

userdb {
    driver = static
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

и создаем файл для работы с mysql

1
/etc/dovecot/dovecot-sql.conf
1
2
3
4
driver = mysql
connect = host=127.0.0.1 dbname=mymail user=mailuser password=mailUserPasswd
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';

установим права владельца

1
2
chgrp dovecot /etc/dovecot/dovecot-sql.conf
chmod o= /etc/dovecot/dovecot-sql.conf

ставим dovecot в автозагрузку и запускаем его

1
2
systemctl enable dovecot.service
systemctl start  dovecot.service

На этом наш почтовый сервер с обязательной авторизацией и работой на защищенных протоколах готов