Stupid House

Установка и настройка почтового сервера на связке Dovecot и Exim без БД в FreeBSD


Рассмотрим установку и настройку связки Dovecot и Exim без использования базы данных для хранения учетных записей пользователей. Аутентификация будет производиться проверкой текстовой пары логин и пароль при этом данные для аутентификации будут храниться в отдельном текстовом файле. Все описанные ниже действия проводились на ОС FreeBSD.

 

 

Установка Dovecot и Exim

Как всегда, в FreeBSD есть два базовых варианта, установить из пакетов, установить из коллекции портов. Установка с помощью менеджера пакетов:

# pkg install dovecot
# pkg install exim

Установка из коллекции портов:

# cd /usr/ports/mail/dovecot
# make install clean
# cd /usr/ports/mail/exim
# make install clean

 

Настройка Dovecot

По умолчанию после установки конфигурационные файлы отсутствуют, но в папке example-config находится полный набор файлов конфигурации для примера, их и будем использовать. Копируем всё содержимое папки /usr/local/etc/dovecot/example-config в /usr/local/etc/dovecot/.

# cp -R /usr/local/etc/dovecot/example-config/ /usr/local/etc/dovecot/

Правим файл конфигурации /usr/local/etc/dovecot/dovecot.conf. Указываем используемые протоколы, imap и lmtp, pop3 по желанию если очень необходим.

protocols = imap lmtp

В файле /usr/local/etc/dovecot/conf.d/10-auth.conf включаем аутентификацию обычным текстом и использование текстового файла для хранения данных пользователей.

disable_plaintext_auth = no
auth_mechanisms = plain
!include auth-passwdfile.conf.ext

 

Настраиваем расположение почтовых ящиков пользователей, их наименование и права доступа. Правим файл /usr/local/etc/dovecot/conf.d/10-mail.conf.

mail_location = maildir:/var/vmail/%d/%n
mail_uid = 144
mail_gid = 144
first_valid_uid = 1

Здесь UID и GID равны 144 что соответствует пользователю и группе dovenull, именно от имени этого пользователя осуществляется доступ к почтовому ящику.

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

# mkdir /var/vmail
# chown dovenull:dovenull /var/vmail/
# chmod 770 /var/vmail/

Настраиваем порты и выдаем доступ к сокетам аутентификации (будет использоваться Exim'ом для авторизации пользователей). Правим файл /usr/local/etc/dovecot/conf.d/10-master.conf.

service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service auth {
  unix_listener auth-userdb {
    mode = 0777
  }
  unix_listener auth-client {
    mode = 0660
    user = mailnull
  }
}

Параметр unix_listener auth-client может отсутствовать в конфиге по умолчанию. Данная настройка была откопана на форуме Exim в процессе разбирательств того, что dovecot не хотел принимать запросы от Exim на аутентификацию пользователей.

Предоставляем доступ к сервисам статистики, добавляем в файл /usr/local/etc/dovecot/conf.d/10-metrics.conf следующие настройки:

service stats {
  unix_listener stats-reader {
    group = mailnull
    mode = 0660
  }

  unix_listener stats-writer {
    group = mailnull
    mode = 0660
  }
}

Указан пользователь mailnull т.к. от его имени запускается Exim. Если возникают проблемы с доступом к статистики, то в документации к dovecot рекомендуют установить mode = 0666.

Настройка SSL производится в файле /usr/local/etc/dovecot/conf.d/10-ssl.conf.

ssl = required
ssl_cert = ‹/usr/local/etc/letsencrypt/live/mybestserver.examle/fullchain.pem
ssl_key = ‹/usr/local/etc/letsencrypt/live/mybestserver.examle/privkey.pem

В полях ssl_cert и ssl_key указываем путь к сертификату и закрытому ключу. Можно использовать сертификаты выпущенные Let’s Encrypt. Здесь можно почитать как выпустить сертификаты и как их обновлять автоматически. Первым символом в указанном пути к файлу сертификата должен быть символ меньше, который указывает, что переменной присваивается не путь к файлу, а его содержимое.

В файле /usr/local/etc/dovecot/conf.d/auth-passwdfile.conf.ext указываем путь к файлу, в котором будет храниться список пользователей с паролями и схему шифрования паролей в разделе passdb, раздел userdb полностью комментируем.

passdb {
  driver = passwd-file
  args = scheme=CRYPT username_format=%u /usr/local/etc/dovecot/users
}

##userdb {
##  driver = passwd-file
##  args = username_format=%u /usr/local/etc/dovecot/users

##  # Default fields that can be overridden by passwd-file
##  #default_fields = quota_rule=*:storage=1G

##  # Override fields from passwd-file
##  #override_fields = home=/home/virtual/%u
##}

 

Настройка Exim

Настройку Exim производим путем внесения изменений в файл /usr/local/etc/exim/configure, необходимые параметры раскомментируем и указываем для них значения.

Устанавливаем Primary hostname - официальное имя почтового сервера, которым он будет представляться. Если данный параметр не указан, то будет подставляться значение возвращаемое функцией uname().

primary_hostname = mail.mybestserver.examle

Указываем список доменов обслуживаемые этим (локальным) хостом, параметр «@» в списке указывает на имя локального хоста, значение этого параметра берется из значения primary_hostname, для доставки локальной почты. Если доставка локальной почты не требуется, то параметр «@» можно удалить. Список обслуживаемых доменов разделяется знаком двоеточия «:».

domainlist local_domains = @ : mybestserver.examle

Если этот почтовый сервер является ретранслятором для какого-либо домена, то этот домен (или домены) необходимо указать в списке relay_to_domains, это позволит любому хосту ретранслировать почту через ваш хост на этот домен. Если ретранслировать почту далее не надо, то данный список остается пустым. Список ретранслируемых доменов разделяется знаком двоеточия «:».

domainlist relay_to_domains =

Задаем список хостов использующие данный сервер как релей на любой узел в интернете. Здесь обычно указывается адрес интерфейса сервера и (или) локальная сеть. Список разделяется знаком двоеточия «:».

hostlist relay_from_hosts = localhost : 127.0.0.1

Указываем пути к сертификатам для TLS подключения, используем те же сертификаты что и для Dovecot.

tls_certificate = /usr/local/etc/letsencrypt/live/mybestserver.examle/fullchain.pem
tls_privkey = /usr/local/etc/letsencrypt/live/mybestserver.examle/privkey.pem

Указываем порты для подключения и порт для шифрованного подключения TLS.

daemon_smtp_ports = 25 : 465 : 587
tls_on_connect_ports = 465

Т.к. в качестве базы данных пользователя будет использоваться текстовый файл, а в качестве логина указываться полный адрес электронной почты, то при отправке почты Exim может автоматически подставлять через @ к этому имени пользователя имя хоста указанное в primary_hostname. Чтобы этого не происходило перед разделами ACL добавляем следующие настройки.

.ifndef MAIN_FORCE_SENDER
local_from_check = false
local_sender_retain = true
untrusted_set_sender = *
.endif

Подразумеваем что все локальные пользователи почты будут храниться в Dovecot, поэтому, в разделе Routers Configuration в localusers отключаем проверку локальных пользователей, а в transport указываем dovecot_virtual_delivery.

localuser:
  driver = accept
##  check_local_user    ## Отключено для Dovecot Virtual Users
# local_part_suffix = +* : -*
# local_part_suffix_optional
##  transport = local_delivery
  transport = dovecot_virtual_delivery
  cannot_route_message = Unknown user

В разделе Transports Configuration настраиваем доставку в почтовые ящики Dovecot (Документация).

dovecot_virtual_delivery:
  driver = pipe
  command = /usr/local/libexec/dovecot/dovecot-lda -d $local_part@$domain -f $sender_address
  # v1.1+: command = /usr/local/libexec/dovecot/dovecot-lda -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
  message_prefix =
  message_suffix =
  delivery_date_add
  envelope_to_add
  return_path_add
  log_output
  user = dovenull
  temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78

Аутентификация будет производиться с помощью Dovecot, в разделе Authentification для этого вносим настройки.

LOGIN:
  driver                     = plaintext
  server_set_id              = $auth1
  server_prompts             = <| Username: | Password:
  server_condition           = Authentication is not yet configured
  server_advertise_condition = ${if def:tls_in_cipher }

dovecot_plain:
  driver = dovecot
  public_name = PLAIN
  server_socket = /var/run/dovecot/auth-client
  server_set_id = $auth1

 

Создание пользователей

Список пользователей и пароли будут храниться в файле /usr/local/etc/dovecot/users в формате пользователь:пароль. Имя пользователя будет соответствовать адресу электронной почты, пароль в зашифрованном виде.

Создаем зашифрованный пароль для пользователя командой doveadm.

# doveadm pw
Enter new password:
Retype new password:
{CRYPT}$2y$05$TKGOLEySAXqMuPIHbwxs6.b3QaPDgHg1DH/7oLh4AFW5FLzOFNw4W

Записываем в файл users данные для почтового ящика.

testuser@mybestserver.examle:{CRYPT}$2y$05$TKGOLEySAXqMuPIHbwxs6.b3QaPDgHg1DH/7oLh4AFW5FLzOFNw4W

 

Запуск сервисов

Добавляем оба сервиса в автозагрузку.

# service dovecot enable
# service exim enable

Запускаем сервисы и проверяем работу электронной почты.

# service dovecot start
# service exim start

 

Логирование

Для получения развернутого отчета при возникновении каких-либо проблем в Dovecot необходимо настроить ведение журналов. Настройка производится в файле /usr/local/etc/dovecot/conf.d/10-logging.conf.

Лог файл для вывода сообщений об ошибках.

log_path = /var/log/dovecot/dovecot-errors.log

Лог файл для вывода информационных сообщений. По умолчанию используется log_path.

info_log_path = /var/log/dovecot/dovecot.log

Лог файл для вывода отладочной информации. По умолчанию используется info_log_path.

debug_log_path = /var/log/dovecot/dovecot-debug.log

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

auth_verbose = yes

Запись в лог информации о несовпадении пароля. Данная настройка может быть полезна для определения попытки подбора пароля методом перебора.

auth_verbose_passwords = yes

Ведение более подробного журнала отладки. Может показывать SQL запросы.

auth_debug = yes

Ведение более подробного журнала отладки при несоответствии паролей. Включение этого параметра включает так же параметр auth_debug.

auth_debug_passwords = yes

Для ведения логов по отдельным протоколам пути к лог файлам указываются на настройках протокола. Пример для протокола lda, файл 15-lda.conf.

protocol lda {
  log_path = /var/log/dovecot/dovecot-lda-errors.log
  info_log_path = /var/log/dovecot/dovecot-lda.log
}

Создаем папку под лог файлы и раздаем на нее права.

# mkdir /var/log/dovecot/
# chown dovecot:dovecot /var/log/dovecot/
# chmod 777 /var/log/dovecot/

 

Логи Exim располагаются в /var/log/exim/, по умолчанию уровень логирования 5 из 6, чем меньше цифра, тем менее подробная информация пишется в лог. Уровень логирования задается параметром log_level от 0 до 6. Подробнее можно почитать в документации.

 

Tags:
Автор: muxa, 06.04.2023
Войдите или зарегистрируйтесь, чтобы иметь возможность оставлять комментарии