Настройка почтового сервера Postfix+Dovecot
Cloud Server, Debian | Комментировать запись
В данной показано, как разделить почтовые ящики и учетные записи системы, используя LMTP-сервер Dovecot в качестве механизма доставки и систему управления базами данных PostgreSQL для хранения записей пользователей.
После выполнения руководства почта больше не будет передаваться на стандартные почтовые ящики Linux!
Примечание: для выполнения руководства использовались Debian 7, Postfix 2.9, Dovecot 2.1 и PostgreSQL 9.1.
Установка PostgreSQL
Установите PostgreSQL:
# aptitude install postgresql postfix-pgsql
В Dovecot 2.1 поставляется с включенным pgsql по умолчанию. Если же Dovecot имеет модульную организацию, запустите:
# aptitude install dovecot-lmtpd dovecot-pgsql
чтобы установит необходимые модули.
Настройка базы данных PostgreSQL
Примечание: Если система PostgreSQL уже установлена и запущена на вашем сервере, отредактируйте нижеприведенный код согласно вашим данным.
Теперь нужно настроить авторизацию, чтобы Dovecot имел доступ к базе данных. Внесите в /etc/postgresql/9.1/main/pg_ident.conf следующий код:
mailmap dovecot mailreader
mailmap postfix mailreader
mailmap root mailreader
Затем внесите в /etc/postgresql/9.1/main/pg_hba.conf следующее:
Примечание: нижеприведенный код следует внести сразу после блока комментариев Put your actual configuration here! В противном случае сначала может прочитаться один из стандартных разделов файла и подключение к базе данных не удастся.
local mail all peer map=mailmap
Затем перезапустите PostgreSQL:
service postgresql reload
Создайте БД:
# sudo -u postgres psql
postgres=# CREATE USER mailreader;
postgres=# REVOKE CREATE ON SCHEMA public FROM PUBLIC;
postgres=# REVOKE USAGE ON SCHEMA public FROM PUBLIC;
postgres=# GRANT CREATE ON SCHEMA public TO postgres;
postgres=# GRANT USAGE ON SCHEMA public TO postgres;
postgres=# CREATE DATABASE mail WITH OWNER mailreader;
postgres=# \q
# sudo psql -U mailreader -d mail
postgres=# \c mail
mail=# CREATE TABLE aliases (
alias text NOT NULL,
email text NOT NULL
);
mail=# CREATE TABLE users (
email text NOT NULL,
password text NOT NULL,
maildir text NOT NULL,
created timestamp with time zone DEFAULT now()
);
mail=# ALTER TABLE aliases OWNER TO mailreader;
mail=# ALTER TABLE users OWNER TO mailreader;
mail=# \q
Затем добавьте виртуальные почтовые ящики:
# doveadm pw -s sha512 -r 100
Enter new password: ...
Retype new password: ...
{SHA512}.............................................................==
# psql -U mailreader -d mail
mail=# INSERT INTO users (
email,
password,
maildir
) VALUES (
'foo@yourdomain.tld',
'{SHA512}.............................................................==',
'foo/'
);
Интерфейс управления (опционально)
Командную строку можно заменить интерфейс администрирования. Сначала создайте пользователя, который имеет право на изменение базы данных. Вернитесь в /etc/postgresql/9.1/main/pg_hba.conf и добавьте следующую строку под ранее внесенным кодом:
host pgadmin mail 127.0.0.1/32 md5
Это откроет локальные соединения сокета на порт 5432 (стандартный порт PostgreSQL).
Добавьте пользователя БД:
# sudo -u postgres psql
postgres=# CREATE USER pgadmin WITH PASSWORD 'new password';
postgres=# \q
Передайте пользователю право на изменение почтовой БД.
# sudo psql -U mailreader -d mail
mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON users TO pgadmin;
mail=> GRANT SELECT, UPDATE, INSERT, DELETE ON aliases TO pgadmin;
mail=> \q
Теперь можно использовать интерфейс управления (например, pgAdmin, который может использовать SSH-туннелирование для подключения к БД, или phpPgAdmin).
Настройка Dovecot
Теперь нужно подключить Dovecot к БД и настроить LMTP-сервер. Создайте нового пользователя (Dovecot не будет обрабатывать почту без отдельной учетной записи) и отдельный каталог для maildir (можно использовать /var/mail, но он, как правило, использует формат mbox)
Примечание: maildir – это формат хранения почты, который способен обеспечить целостность почтового ящика при чтении, изменении и добавлении электронных писем.
# adduser --system --no-create-home --uid 500 --group --disabled-password --disabled-login --gecos 'dovecot virtual mail user' vmail
# mkdir /home/mailboxes
# chown vmail:vmail /home/mailboxes
# chmod 700 /home/mailboxes
Сохраните следующую конфигурацию как /etc/dovecot/dovecot-sql.conf:
driver = pgsql
connect = host=/var/run/postgresql/ dbname=mail user=mailreader
default_pass_scheme = SHA512
password_query = SELECT email as user, password FROM users WHERE email = '%u'
user_query = SELECT email as user, 'maildir:/home/mailboxes/maildir/'||maildir as mail, '/home/mailboxes/home/'||maildir as home, 500 as uid, 500 as gid FROM users WHERE email = '%u'
Убедитесь, что этот файл принадлежит пользователю root с правами 600.
Теперь откройте /etc/dovecot/dovecot.conf и отредактируйте настройки passdb и userdb следующим образом:
userdb {
driver = prefetch
}
passdb {
args = /etc/dovecot/dovecot-sql.conf
driver = sql
}
Измените строку protocols так:
protocols = imap lmtp
Добавьте сокет сервиса lmtp и некоторые настройки lmtp-протоколов:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
}
protocol lmtp {
postmaster_address=postmaster@yourdomain.com
hostname=mail.yourdomain.com
}
Теперь строка mail_location лишняя, ее можно удалить.
Настройка Postfix
Теперь нужно настроить Postfix для передачи сообщений серверу Dovecot. Откройте /etc/postfix/main.cf и добавьте в конец файла строку:
mailbox_transport = lmtp:unix:private/dovecot-lmtp
Далее нужно создать конфигурационный файл БД для Postfix. Создайте файл /etc/postfix/pgsql-aliases.cf и внесите в него:
user=mailreader
dbname=mail
table=aliases
select_field=alias
where_field=email
hosts=unix:/var/run/postgresql
Затем создайте файл /etc/postfix/pgsql-boxes.cf и внесите:
user=mailreader
dbname=mail
table=users
select_field=email
where_field=email
hosts=unix:/var/run/postgresql/
В main.cf измените строку alias_maps :
alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/pgsql-aliases.cf
и строку local_recipient_maps:
local_recipient_maps = proxy:pgsql:/etc/postfix/pgsql-boxes.cf $alias_maps
В целом файл main.cf должен иметь такой вид:
myhostname = mail.mydomain.com
myorigin = mydomain.com
mydestination = mydomain.com, mail.mydomain.com, localhost, localhost.localdomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
alias_maps = hash:/etc/aliases proxy:pgsql:/etc/postfix/pgsql-aliases.cf
local_recipient_maps = proxy:pgsql:/etc/postfix/pgsql-boxes.cf $alias_maps
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtpd_tls_cert_file=/etc/ssl/certs/mailcert.pem
smtpd_tls_key_file=/etc/ssl/private/mail.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_security_level=may
smtpd_tls_protocols = !SSLv2, !SSLv3
Завершающие действия
Перезапустите программы:
# postfix reload
# service dovecot restart
Готово! При помощи терминала протестируйте настройку:
~# mail postmaster@yourdomain.com
Subject: this is a test.
EOT
Вскоре сообщение должно появиться в почтовом ящике postmaster@yourdomain.com (это может занять несколько минут).
Tags: Debian 7, Dovecot, LMTP, Postfix, PostgreSQL, PostgreSQL 9.1