Выполнение (новый проверенный вариант от 18.01.2014):
Это предварительная рабочая версия. В самое ближайшее время оформлю и допишу пояснения.
- После установки UbuntuServer 12.04.3 LTSвыполним обновление пакетов
sudo apt-get update
sudo apt-get upgrade
- Устанавливаем 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» (без конфигурации)
- Подключаемся к 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
- Проверим, что 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
- Создаем группу virtualи пользователя virtual, входящего в эту группу.
sudo groupadd -g 5000 virtual
sudo useradd -g virtual -u 5000 virtual
- Создадим каталог, где будут размещаться почтовые ящики:
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
- Создаем конфигурационный файл для доступа к почтовым доменам в базе данных 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
- Создаем конфигурационный файл для определения автоматической пересылки писем с ящика на ящик
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
- Создаем конфигурационный файл для доступа к почтовым аккаунтам в базе данных 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
- Создаем конфигурационный файл для виртуального отображения почты
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
- Владельцем данных конфигурационных файлов должен быть root, группой владельца — postfix
sudo chown root /etc/postfix/mysql-virtual_*.cf
sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf
- Редактируем конфигурационный файл главного модуля 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
- Настраиваем демон 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»
- Настраиваем 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
- Настраиваем 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’
- Владельцем данных файлов должен быть root
sudochown root /etc/pam.d/smtp /etc/postfix/sasl/smtpd.conf
- Редактируем конфигурационный файл 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
- Добавляем пользователя postfix в группу sasl
sudo adduser postfix sasl
- Конфигурируем 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 } }
- Настраиваем параметры соединения с базой данных 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’);
- Проверяем конфигурацию Dovecot
dovecot -a
- Создадим в базе данных MySQLпочтовый домен и два пользователя
mysql -u root -p
USE mail;
INSERT INTO domains (domain) VALUES (‘myubuntu.org’);
INSERT INTO users (user, email, password) VALUES (‘user1’, ‘[email protected]’, ENCRYPT(‘user1_password’));
INSERT INTO users (user, email, password) VALUES (‘user2’, ‘[email protected]’, ENCRYPT(‘user2_password’));
quit
- Создадим сертификат и ключ для 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
- Владельцем ключа должен быть root
sudo chown root /etc/dovecot/myubuntu.key
- Перезапускаем 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