Настройка почтовой системы (Exim+Dovecot+Roundcube)

Материал из IN-TON
Перейти к: навигация, поиск

Содержание

Предисловие

Цель данной статьи - оставить для себя память что и как я делал. Статья не претендует на авторство и большей частью представляет собой копипасту с изменениями и небольшими дополнениями. Все оригиналы использованных статей указаны в подвале.

Основные термины

  • SMTP (Simple Mail Transfer Protocol) — простой протокол передачи почты.
  • POP3 (Post Office Protocol Version 3) — протокол почтового отделения, версия 3.
  • IMAP (Internet Message Access Protocol) — протокол доступа к почте в Интернете.
  • MTA (Mail Transfer Agent) — агент пересылки почты.
  • MDA (Mail Delivery Agent) — агент доставки почты.
  • LDA (Local Delivery Agent) — локальный агент доставки почты;
  • MUA (Mail user agent) — почтовый агент пользователя (почтовый клиент);
  • Sieve — язык описания правил фильтрации для почтовых сообщений.

Введение

В современном мире электронная почта является далеко не последним средством коммуникации, только представьте себе, сколько людей сегодня имеет собственный почтовый адрес, а сколько электронных сообщений пересылается в мире только за один час. Данная технология используется практически повсюду, начиная от персонального использования, заканчивая использованием на корпоративном и государственном уровнях.

В данной статье описан процесс настройки почтовой системы на базе операционной системы Ubuntu Linux и программного обеспечения Exim, Dovecot, Roundcube. Здесь я не буду рассказывать про основы работы электронной почты, поскольку предполагается, что читатель уже знаком с основными терминами и понятиями, а также знает какие службы отвечают за работу той или иной части электронной почты (имеется ввиду MTA, MDA, MUA). Очень полезным и даже необходимым будет прочтение документов, описывающих протоколы SMTP, POP3, IMAP (это тот базис, который любой уважающий себя админ почтовых систем должен знать). Перевод данных документов будет не сложно найти на просторах Интернета.

В будущей конфигурации почтового сервера предполагается, что Exim занимается только передачей электронных сообщений, а Dovecot работает непосредственно с почтовыми ящиками пользователей. Взаимодействие Exim и Dovecot организовано через программу LDA, входящую в состав пакета Dovecot. Защита от спама будет реализована средствами Exim, о методике защиты будет подробно рассказано в соответствующем разделе. К Dovecot будет подключен плагин Sieve, который позволит пользователям создавать собственные фильтры. Доступ к почтовым ящикам и управление ими, а также управление пользовательскими фильтрами будет организовано с помощью веб интерфейса Roundcube. Задача хранения всей служебной информации будет возложена на систему управления базами данных PostgreSQL.

Структура таблиц в базе данных

На данном этапе, необходимо определиться, в каком виде у вас будут храниться данные почтовой системы (информация о пользователях, доменах и т.п.). Гибкость используемых программных средств позволяет реализовать абсолютно любую структуру базы данных, например, для управления почтовой системой, возможно использовать postfixadmin и взять за основу, поставляемую с данным пакетом структуру базы данных. В моем случае для доступа к почте будет использоваться веб интерфейс Roundcube, который позволяет пользователю рулить всеми необходимыми настройками своего аккаунта (изменение своих учетных данных, пароля и т.п.), поэтому я сделал удобную для меня структуру базы данных, а для внесения и изменения данных мне достаточно функционала phpPgAdmin.

На приведенном ниже рисунке представлена схема базы данных. Из приведенной схемы видно, что поля "domain_id" из таблиц aliases_tb и users_tb связаны с полем "id" из таблицы domains_tb. Данная связь обеспечивает привязку учетных записей (users_tb) и синонимов (aliases_tb) к конкретному домену (domains_tb). Связь полей в таблицах обеспечена на уровне запросов языка SQL. Схема связей таблиц Sheme.png

SQL код:

  1. CREATE TABLE "aliases_tb" (
  2. "id" BIGSERIAL PRIMARY KEY,
  3. "aliasname" CHARACTER VARYING(32) NOT NULL,
  4. "domain_id" INTEGER NOT NULL,
  5. "mailaddr" CHARACTER VARYING(256) NOT NULL,
  6. "active" BOOLEAN DEFAULT TRUE NOT NULL,
  7. CONSTRAINT "aliases_tb_domain_id_check" CHECK (("domain_id" > 0))
  8. );
  9.  
  10. CREATE TABLE "domains_tb" (
  11. "id" BIGSERIAL PRIMARY KEY,
  12. "domainname" CHARACTER VARYING(128) NOT NULL,
  13. "active" BOOLEAN DEFAULT TRUE NOT NULL
  14. );
  15.  
  16. CREATE TABLE "users_tb" (
  17. "id" BIGSERIAL PRIMARY KEY,
  18. "username" CHARACTER VARYING(32) NOT NULL,
  19. "passwd" CHARACTER VARYING(32) DEFAULT MD5((POWER((5)::DOUBLE PRECISION, (RANDOM() * (12345)::DOUBLE PRECISION)))::TEXT) NOT NULL,
  20. "domain_id" BIGINT NOT NULL,
  21. "uid" INTEGER DEFAULT 26 NOT NULL,
  22. "gid" INTEGER DEFAULT 6 NOT NULL,
  23. "homedir" CHARACTER VARYING(512) DEFAULT '/var/mail'::CHARACTER VARYING NOT NULL,
  24. "quota" INTEGER DEFAULT 10240,
  25. "active" BOOLEAN DEFAULT TRUE NOT NULL,
  26. CONSTRAINT "users_tb_domain_id_check" CHECK (("domain_id" > 0)),
  27. CONSTRAINT "users_tb_gid_check" CHECK (("gid" > 0)),
  28. CONSTRAINT "users_tb_quota_check" CHECK (("quota" > 0)),
  29. CONSTRAINT "users_tb_uid_check" CHECK (("uid" > 0)),
  30. CONSTRAINT "users_tb_username_check" CHECK ((CHAR_LENGTH(("username")::TEXT) > 0))
  31. );
  32.  
  33. CREATE TABLE "whitelist_tb" (
  34. "ip" INET,
  35. "addrhash" CHARACTER VARYING(32),
  36. "ctime" INTEGER DEFAULT DATE_PART('epoch'::TEXT, NOW())
  37. );
  38.  
  39. CREATE TABLE "greylist_tb" (
  40. "ip" INET,
  41. "addrhash" CHARACTER VARYING(32),
  42. "ctime" INTEGER DEFAULT DATE_PART('epoch'::TEXT, NOW())
  43. );
  44.  
  45. CREATE TABLE "blacklist_tb" (
  46. "ip" INET,
  47. "ctime" BIGINT DEFAULT DATE_PART('epoch'::TEXT, NOW())
  48. );
  49.  
  50. CREATE TABLE "badhosts_tb" (
  51. "id" BIGSERIAL PRIMARY KEY,
  52. "ip" CIDR,
  53. "description" CHARACTER VARYING(512)
  54. );

В таблице domains_tb содержится список обслуживаемых доменов почтовым сервером. Таблица aliases_tb содержит синонимы для доменов, users_tb содержит учетные данные пользователей, а таблицы blacklist_tb, greylist_tb и whitelist_tb используются для реализации технологии серых списков, о которой будет рассказано в разделе про настройку Exim. Таблицу badhosts_tb пришлось ввести, поскольку от некоторых более или менее корректно настроенных хостов бывает, приходит спам, и как раз такие хосты уютно располагаются в данной таблице (вычисляются в процессе работы почтовой системы и вручную добавляются/удаляются). Для понимания приведу пример вставляемых в таблицы данных:

  1. INSERT INTO "domains_tb" VALUES (DEFAULT, 'example.net', 'true');

Таким образом добавляется домен, который будет обслуживать почтовый сервер. Далее необходимо посмотреть какой идентификатор (поле "id" таблицы "domains_tb") был присвоен новой записи. Он будет использоваться при добавлении синонимов и учетных записей пользователей. В данном случае пусть он будет равным единице.

  1. INSERT INTO "aliases_tb" VALUES (DEFAULT, 'postmaster', 1, 'admin@old_domain.net', 'true');
  2. INSERT INTO "users_tb" VALUES (DEFAULT, 'admin', MD5('1234'), 1, 26, 26, '/var/mail', 10240, 'true');

Первый запрос добавляет синоним вида postmaster@example.net —> admin@old_domain.net, а второй новую учетную запись с почтовым адресом admin@example.net, паролем 1234, директорией для хранения почты — /var/mail и квотой размером в 10Мб. Поля uid и gid (в данном случае они равны 26) указывают под каким пользователем осуществлять доставку в директорию для хранения почты.

Агент доставки почты Dovecot

Dovecot - это свободный IMAP и POP3 сервер для Unix/Linux систем, при разработке которого безопасности уделяется много внимания. Также хорошими достоинствами данного сервера являются: быстрота, простота установки и малое потребление памяти. Основные особенности:

  • поддержка форматов почтовых ящиков mbox и Maildir;
  • высокое быстродействие благодаря индексации содержимого почтовых ящиков;
  • полное соответствие стандартам IMAP;
  • возможность работы с почтовыми язиками и их индексами с нескольких компьютеров, что позволяет хранить данные на кластерных файловых системах и NFS;
  • возможность расширения функционала с помощью плагинов;
  • поддержка Sieve;
  • поддержка различных хранилищ аутентификационной информации и режимов аутентификации;
  • Postfix и Exim могут проводить аутентификацию пользователей через Dovecot;
  • простота миграции с большинства других IMAP и POP3 серверов.

В данной конфигурации почтовой системы работа с почтовыми ящиками пользователй переложена полностью на Dovecot, что позволяет использовать фильтры на языке Sieve и вести Dovecot,у собственный индексный файл в каждом ящике для ускорения работы с ним.

Установка

  1. # aptitude install dovecot-core dovecot-imapd dovecot-managesieved dovecot-pgsql dovecot-pop3d dovecot-sieve

Настройка

Конфигурационные файлы Dovecot хранятся в папке /etc/dovecot (если в директории пусто, то примеры конфигурационных файлов лежат здесь — /usr/share/doc/dovecot-core/dovecot/example-config). Во второй версии главный конфигурационный файл был разбит на несколько файлов, каждый из которых отвечает за определенный функционал. Большинство опций из первой версии присутствуют и во второй, поэтому не окажется лишним полный перевод конфигурационного файла Dovecot первой версии — ссылка. Структура директории с конфигурационными файлами Dovecot имеет следующий вид:

  • dovecot.conf — конфигурационный файл Dovecot;
  • dovecot-sql.conf.ext — настройки для sql базы данных пользователей;
  • conf.d/10-auth.conf — параметры процесса авторизации;
  • conf.d/10-director.conf — параметры Dovecot Director;
  • conf.d/10-logging.conf — ведение логов;
  • conf.d/10-mail.conf — расположение почтовых ящиков и параметры пространства имен;
  • conf.d/10-master.conf — сетевые параметры и ограничения для процессов;
  • conf.d/10-ssl.conf — параметры SSL;
  • conf.d/15-lda.conf — параметры LDA;
  • conf.d/20-imap.conf — настройки процесса IMAP;
  • conf.d/20-lmtp.conf — настройки процесса LMTP;
  • conf.d/20-managesieve.conf — настройки процесса ManageSieve;
  • conf.d/20-pop3.conf — настройки процесса POP3;
  • conf.d/90-acl.conf — списки доступа к почтовым ящикам;
  • conf.d/90-plugin.conf — параметры для плагинов;
  • conf.d/90-quota.conf — настройки квот;
  • conf.d/90-sieve.conf — параметры интерпритатора Sieve;
  • conf.d/auth-*.conf.ext — параметры различных баз данных пользователей;

Итак, переходим к правке конфигурационных файлов:

Файл dovecot.conf:

  1. ## Конфигурационный файл Dovecot
  2.  
  3. # Инструкцию по быстрому старту смотреть здесь:
  4. # http://wiki2.dovecot.org/QuickConfiguration
  5.  
  6. # Команда "dovecot -n" выводит список измененных параметров. Используйте
  7. # эту возможность, вместо копирования содержимого файла, при обращении
  8. # в списках рассылки.
  9.  
  10. # Все, что расположено после символа "#" считается комментарием. Пробелы
  11. # и символы табуляции игнорируются. Значение параметра, в котором
  12. # есть пробелы поместите в кавычки, чтобы он интерпритировался должным
  13. # образом, например key = "# char and trailing whitespace "
  14.  
  15. # Значения по умолчанию представленные в данном файле не обязательно
  16. # раскомментировать. Не обязательны секции (например, namespaces {})
  17. # или настройки плагинов, здесь они приведены для примера. Пути так же
  18. # заданы в качестве примера.
  19.  
  20. # С какими протоколами работать?
  21. #protocols = imap pop3 lmtp
  22. protocols = imap pop3
  23.  
  24. # Список, разделенный запятыми, IP адресов или имен хостов, с которых
  25. # будут обрабатываться подключения. "*" - принимать подключения со всех
  26. # интерфейсов по протоколу IPv4. "[::]" - принимать подключения со всех
  27. # интерфейсов по протоколу IPv6. Укажите "*, [::]", чтобы принимать
  28. # подключения по любому протоколу.
  29. # Если вы хотите изменить стандартный порт для сервиса, то правте
  30. # файл conf.d/master.conf.
  31. listen = *
  32.  
  33. # Директория, в которой работает Dovecot.
  34. base_dir = /var/run/dovecot/
  35.  
  36. # Приветственное сообщение.
  37. login_greeting = POP3/IMAP server ready.
  38.  
  39. # Список сетей, разделенный пробелами, которым разрешен доступ.
  40. # Клиентам с этих адресов разрешено переписывать IP адресы
  41. # и порты (для проверок авторизации и аутентификации).
  42. # Параметр disable_plaintext_auth игнорируется для этих сетей.
  43. # Например, здесь можно указать адреса ваших IMAP-прокси серверов.
  44. #login_trusted_networks =
  45.  
  46. # Список сокетов проверки прав доступа входа, разделенный пробелами (например, tcpwrap)
  47. #login_access_sockets =
  48.  
  49. # Использовать более информативный заголовок процесса (отображается
  50. # в команде ps). На данный момент отображаются только имя пользователя
  51. # и IP адрес. Полезно, если вы хотите видеть кого на самом деле обслуживает
  52. # IMAP процесс.
  53. verbose_proctitle = no
  54.  
  55. # Прибивать все подключения, когда завершается главный процесс Dovecot.
  56. # При "no" подключенные клиенты продолжат работу, даже если главный
  57. # процесс будет завершен (может быть полезно при обновлении, например когда
  58. # была выпущена новая версия с исправленными косяками в безопасности).
  59. # Однако, когда главный процесс будет завершен, то процессы обрабатывающие
  60. # запросы от клиентов не смогут писать в лог файлы.
  61. shutdown_clients = yes
  62.  
  63. # Если не ноль, то посылать выполнять команды через соединение к серверу doveadm
  64. # (то есть выполнять их на сервере doveadm), вместо выполнения этих команд
  65. # самим процессом.
  66. #doveadm_worker_count = 0
  67. # Unix сокет или хост, на котором работает сервер doveadm.
  68. #doveadm_socket_path = doveadm-server
  69.  
  70. # Список переменных окружения, разделенный пробелами, которые задаются
  71. # перед запуском Dovecot и передаются всем дочерним процессам. Также вы можете
  72. # задавать здесь переменные окружения, используя пару ключ=значение.
  73. #import_environment = TZ
  74.  
  75. ##
  76. ## Настройки dictionary server
  77. ##
  78.  
  79. # Словарь может использоваться некоторыми плагинами, для сохранения
  80. # значений типа ключ=значение. К таким плагинам можно отнести: quota,
  81. # expire и acl. Словарь может использоваться через сервер или напрямую.
  82. # Следующий блок dict ассоциирует имена словарей и URI, когда используется
  83. # сервер. URI имеет следующий формат "proxy::<name>".
  84.  
  85. dict {
  86. #quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
  87. #expire = sqlite:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
  88. }
  89.  
  90. # Остальные параметры задаются в файлах в папке conf.d, которые
  91. # подключаются ниже. Имена конфигурационных файлов заданы так,
  92. # чтобы конф. файлы подключались в определенном порядке.
  93. !include conf.d/*.conf
  94.  
  95. # Попробовать включить файл. Если файл не будет найдет, то это просто
  96. # будет проигнорировано.
  97. !include_try local.conf

Файл dovecot-sql.conf.ext:

  1. # Этот файл открывается с правами пользователя root, поэтому
  2. # он должен принадлежать пользователю root и иметь права
  3. # доступа 0600.
  4. #
  5. # http://wiki2.dovecot.org/AuthDatabase/SQL
  6. #
  7. # Для модуля sql passdb вам нужна база данных с таблицей, содержащая
  8. # как минимум поля "имя пользователя" и "пароль". Если вы хотите
  9. # использовать синтакс user@domain, то вам понадобится отдельное
  10. # поле для имени домена.
  11. #
  12. # Если все ваши пользователи имеют одинаковые uid/gid и одинаковую
  13. # общую часть вначале пути (наример, /var/mail, /usr/home), то вы можете
  14. # использовать модуль static userdb для генерации остального пути к
  15. # домашней директории из имени пользователя и домена. В этом случае
  16. # вам не понадобятся поля home, uid, gid в таблице в базе данных.
  17. #
  18. # Если у вас есть необходимость использовать модуль sql userdb, то
  19. # вам придется создать поля home, uid, и gid. Вот пример таблицы:
  20. #
  21. # CREATE TABLE users (
  22. # username VARCHAR(128) NOT NULL,
  23. # domain VARCHAR(128) NOT NULL,
  24. # password VARCHAR(64) NOT NULL,
  25. # home VARCHAR(255) NOT NULL,
  26. # uid INTEGER NOT NULL,
  27. # gid INTEGER NOT NULL,
  28. # active CHAR(1) DEFAULT 'Y' NOT NULL
  29. # );
  30.  
  31. # Используемая база данных: mysql, pgsql, sqlite
  32. driver = pgsql
  33.  
  34. # Подключение к базе данных. Специфичные настройки для драйвера.
  35. #
  36. # HA / round-robin load-balancing is supported by giving multiple host
  37. # settings, like: host=sql1.host.org host=sql2.host.org
  38. #
  39. # pgsql:
  40. # Смотрите в документацию PostgreSQL по функции PQconnectdb
  41. # допустимые параметры. Используйте maxconns=n (по умолчанию 5)
  42. # для ограничения количества подключений Dovecot к базе данных.
  43. #
  44. # mysql:
  45. # Имена основных параметров аналогичны PostgreSQL:
  46. # host, port, user, password, dbname
  47. #
  48. # Также доступны следующие параметры:
  49. # client_flags - смотрите документацию по MySQL
  50. # ssl_ca, ssl_ca_path - задайте одну или две опции, чтобы включить SSL
  51. # ssl_cert, ssl_key - для отправки сертификата клиента на сервер
  52. # ssl_cipher - минимальная безопасность шифра (по умолчанию: HIGH)
  53. # option_file - читать параметры из файла (указанного здесь) для клиента
  54. # MySQL, вместо файла по умолчанию - my.cnf.
  55. # option_group - читать параметры из определенной группы (по умолчанию: client)
  56. #
  57. # Вы можете указать в параметре host путь к Unix сокету: host=/var/run/mysql.sock
  58. # Учтите, что на данный момент нельзя использовать пробелы в параметрах.
  59. #
  60. # sqlite:
  61. # Путь к файлу базы данных.
  62. #
  63. # Примеры:
  64. # connect = host=192.168.1.1 dbname=users
  65. # connect = host=sql.example.com dbname=virtual user=virtual password=blarg
  66. # connect = /etc/dovecot/authdb.sqlite
  67. #
  68. connect = host=192.168.7.253 dbname=vmail user=vmail password=1234
  69.  
  70. # Формат хранения паролей по умолчанию.
  71. #
  72. # Список поддерживаемых схем смотрите здесь:
  73. # http://wiki2.dovecot.org/Authentication/PasswordSchemes
  74. #
  75. default_pass_scheme = MD5
  76.  
  77. # Запрос passdb, который возвращает пароль. Он может вернуть следующие поля:
  78. # password - пароль пользователя. Это поле всегда должно присутствовать.
  79. # user - возвращается в формате user@domain.
  80. # username и domain - другой путь представления поля "user".
  81. #
  82. # Поле "user" должно быть регистронезависимым, чтобы избежать
  83. # создания двух директорий (почтовых ящиков), если вдруг пользователь
  84. # предоставит учетные данные по разному: "name" и "nAme". Если имя пользователя
  85. # и имя домена хрантся в разных колонках, то вы можете вернуть колонки
  86. # "username" и "domain" вместо одной "user".
  87. #
  88. # Также запрос может вернуть другие поля, которые имеют свое назначение,
  89. # смотрите список таких полей здесь:
  90. # http://wiki2.dovecot.org/PasswordDatabase/ExtraFields
  91. #
  92. # Подстановки, используемые чаще всего: (смотрите полный список подстановок
  93. # здесь - http://wiki2.dovecot.org/Variables):
  94. #  %u = entire user@domain
  95. #  %n = user part of user@domain
  96. #  %d = domain part of user@domain
  97. #
  98. # Учтите, что подстановки могут использоваться только в SQL запросе. Если
  99. # запрос возвращает любую из этих подстановок, то ничего не изменяется.
  100. # Иначе было бы невозможно задавать имя пользователя, в котором
  101. # присутствовал бы символ '%'.
  102. #
  103. # Пример:
  104. # password_query = SELECT userid AS user, pw AS password \
  105. # FROM users WHERE userid = '%u' AND active = 'Y'
  106. #
  107. password_query = \
  108. SELECT "users_tb"."username" AS "username", \
  109. "domains_tb"."domainname" AS "domain", \
  110. "users_tb"."passwd" AS "password" \
  111. FROM "users_tb" \
  112. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  113. WHERE "users_tb"."username" = '%n' AND \
  114. "domains_tb"."domainname" = '%d' AND \
  115. "users_tb"."active" = 'true' AND \
  116. "domains_tb"."active" = 'true'
  117.  
  118.  
  119. # Запрос, который возвращает информацию о пользователе. Он может вернуть:
  120. # uid - System UID (overrides mail_uid setting)
  121. # gid - System GID (overrides mail_gid setting)
  122. # home - Home directory
  123. # mail - Mail location (overrides mail_location setting)
  124. #
  125. # Ни одно из этих полей не является обязательным. Если вы используете
  126. # везде одинаковые UID и GID, и различными у вас остаются только
  127. # home или mail, то вам лучше использовать userdb static.
  128. # Полный список возможных полей смотрите здесь:
  129. # http://wiki2.dovecot.org/UserDatabase/ExtraFields
  130. #
  131. # Примеры:
  132. # user_query = SELECT home, uid, gid FROM users WHERE userid = '%u'
  133. # user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u'
  134. # user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u'
  135. #
  136. user_query = \
  137. SELECT "users_tb"."uid" AS "uid", "users_tb"."gid" AS "gid", \
  138. ("users_tb"."homedir" || '/%d/%n') AS "home", \
  139. ('*:storage=' || "users_tb"."quota" || 'k') AS "quota_rule" \
  140. FROM "users_tb" \
  141. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  142. WHERE "users_tb"."username" = '%n' AND \
  143. "domains_tb"."domainname" = '%d' AND \
  144. "users_tb"."active" = 'true' AND \
  145. "domains_tb"."active" = 'true'
  146.  
  147. # Если вы не хотите использовать два запроса (passdb + userdb), то вы можете
  148. # использовать userdb prefetch вместо userdb sql. В этом случае вы должны
  149. # сделать так, чтобы запрос в password_query возвращал поля userdb
  150. # с префиксом "userdb_". Например:
  151. #password_query = \
  152. # SELECT userid AS user, password, \
  153. # home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
  154. # FROM users WHERE userid = '%u'
  155.  
  156. # Запрос для получения списка всех пользователей.
  157. #iterate_query = SELECT username AS user FROM users

Файл conf.d/10-auth.conf:

  1. ##
  2. ## Процесс авторизации
  3. ##
  4.  
  5. # Отключить метод аутентификации LOGIN и другие методы с открытым текстом,
  6. # если клиент подключен не через защищенное соединение SSL/TLS. Только
  7. # учтите, что для локальных подключений это ограничение не применяется.
  8. disable_plaintext_auth = no
  9.  
  10. # Размер кэша в килобайтах. 0 значит, что кэш выключен. Учтите, что bsdauth,
  11. # PAM и vpopmail требуют, чтобы параметр cache_key был задан, чтобы
  12. # использовать кэширование.
  13. auth_cache_size = 0
  14.  
  15. # Время жизни кэша в секундах. После истечения времени кэшированные
  16. # данные не используются, но если БД отвалилась, то остается использовать
  17. # только их. Dovecot также пытается автоматически узнать об изменении
  18. # пароля у пользователя: если предыдущая аутентификация была успешной,
  19. # но текущая потерпела неудачу, то кэш не будет использован. Сейчас это
  20. # работает только для аутентификации с открытым текстом.
  21. #auth_cache_ttl = 1 hour
  22.  
  23. # Время жизни для неудачных попыток (пользователь не найден,
  24. # неверный пароль). 0 значит выключить кэширование.
  25. #auth_cache_negative_ttl = 1 hour
  26.  
  27. # Space separated list of realms for SASL authentication mechanisms that need
  28. # them. You can leave it empty if you don't want to support multiple realms.
  29. # Many clients simply use the first one listed here, so keep the default realm
  30. # first.
  31. #auth_realms =
  32.  
  33. # realm/domain по умолчанию, если тот явно не задан. Это используется
  34. # и для SASL realms, и для добавления @domain к имени пользователя
  35. # при авторизации открытым текстом.
  36. #auth_default_realm =
  37.  
  38. # Список разрешенных символов в имене пользователя. Если полученное
  39. # имя пользователя имеет символы не из списка, то пользователь
  40. # автоматом получает отлуп. Это простая проверка позволяет слать
  41. # лесом ботов, ну и чтобы не получить проблем с экранированием данных
  42. # при запросах к SQL/LDAP. Если вы хотите разрешить любые символы, то
  43. # оставьте это поле пустым.
  44. auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
  45.  
  46. # Преобразование имени пользователя перед поиском в БД. Значение
  47. # содержит серию замен (исходный -> нужный). Например, "#@/@"
  48. # значит, что символы '#' и '/' будут преобразованы в '@'.
  49. #auth_username_translation =
  50.  
  51. # Формат имени пользователя перед просмотром в БД. Вы можете
  52. # использовать здесь стандартные значения, например, %Lu
  53. # преобразует символы в нижний регистр, %n - отбросить домен, если
  54. # он задан, или "%n-AT-%d" - заменить символ '@' на '-AT-'. Это
  55. # преобразование выполняется после auth_username_translation.
  56. auth_username_format = %Lu
  57.  
  58. # If you want to allow master users to log in by specifying the master
  59. # username within the normal username string (ie. not using SASL mechanism's
  60. # support for it), you can specify the separator character here. The format
  61. # is then <username><separator><master username>. UW-IMAP uses "*" as the
  62. # separator, so that could be a good choice.
  63. #auth_master_user_separator =
  64.  
  65. # Имя анонимного пользователя, используемое с механизмом
  66. # ANONYMOUS SASL.
  67. #auth_anonymous_username = anonymous
  68.  
  69. # Максимальное количество работающих процессов аутентификации.
  70. # Эти процессы создаются и уничтожаются автоматически.
  71. auth_worker_max_count = 30
  72.  
  73. # Имя хоста используемое в GSSAPI. По умолчанию берется из системы.
  74. # Значение "$ALL" разрешает использовать любые записи keytab.
  75. # Host name to use in GSSAPI principal names. The default is to use the
  76. # name returned by gethostname(). Use "$ALL" to allow all keytab entries.
  77. #auth_gssapi_hostname =
  78.  
  79. # Kerberos keytab для работы с GSSAPI. Если не указан, то
  80. # используется системное значение (обычно /etc/krb5.keytab).
  81. #auth_krb5_keytab =
  82.  
  83. # Авторизация NTLM и GSS-SPNEGO через демона winbind и ntlm_auth
  84. # из пакета Samba. <doc/wiki/Authentication/Mechanisms/Winbind.txt>
  85. auth_use_winbind = no
  86.  
  87. # Путь до тулзы ntlm_auth из пакета Samba.
  88. #auth_winbind_helper_path = /usr/bin/ntlm_auth
  89.  
  90. # Количество секунд выжидаемое перед повторной попыткой аутентификации.
  91. auth_failure_delay = 2 secs
  92.  
  93. # Отказать в аутентификации, если у клиента неверный SSL сертификат.
  94. auth_ssl_require_client_cert = no
  95.  
  96. # Взять имя пользователя из SSL сертификата (который предоставил клиент).
  97. # Будет использована функция X509_NAME_get_text_by_NID(), которая
  98. # возвращает значение поля CommonName.
  99. auth_ssl_username_from_cert = no
  100.  
  101. # Список, разделенный пробелами, разрешенных методов аутентификации:
  102. # plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
  103. # gss-spnego
  104. # Учитывайте значение параметра disable_plaintext_auth.
  105. auth_mechanisms = plain login
  106.  
  107. ##
  108. ## Параметры базы данных пользователей
  109. ##
  110.  
  111. #
  112. # БД паролей, используемая для проверки пользователей (и ничего более).
  113. # Вы можете настроить несколько БД паролей (passdbs) и
  114. # пользователей (userdbs). Это полезно, если вы хотите сделать доступ
  115. # системным пользователям и виртуальным одновременно, чтобы
  116. # не пришлось дублировать системных в базе виртуальных.
  117. # <doc/wiki/PasswordDatabase.txt>
  118. #
  119. # БД пользователей определяет, где хранится почта и какому
  120. # пользователю/группе она принадлежит. При конфигурации
  121. # single-UID используйте "static".
  122. #
  123. # <doc/wiki/UserDatabase.txt>
  124.  
  125. #!include auth-deny.conf.ext
  126. #!include auth-master.conf.ext
  127.  
  128. #!include auth-system.conf.ext
  129. !include auth-sql.conf.ext
  130. #!include auth-ldap.conf.ext
  131. #!include auth-passwdfile.conf.ext
  132. #!include auth-checkpassword.conf.ext
  133. #!include auth-vpopmail.conf.ext
  134. #!include auth-static.conf.ext

Файл conf.d/10-logging.conf:

  1. ##
  2. ## Расположение лог файлов.
  3. ##
  4.  
  5. # Файл, в который записываются сообщения об ошибках.
  6. # Укажите "syslog", чтобы слать все в syslog.
  7. # Укажите /dev/stderr, чтобы слать все в stderr.
  8. log_path = /var/log/dovecot/mainlog
  9.  
  10. # Лог файл, в который выводятся информационные сообщения.
  11. # Если не задано, то используется параметр log_path.
  12. #info_log_path =
  13.  
  14. # Лог файл, в который выводятся отладочные сообщения.
  15. # Если не задано, то используется параметр log_path.
  16. #debug_log_path =
  17.  
  18. # Раздел syslog для логов.
  19. #syslog_facility = mail
  20.  
  21. ##
  22. ## Ведение логов и отладка.
  23. ##
  24.  
  25. # Писать в лог о неудачных попытках входа и их причину.
  26. auth_verbose = yes
  27.  
  28. # В случае, если пароль неверен, выводить в лог пароль.
  29. # Возможные значения: no, plain и sha1. Значение sha1 может быть полезно
  30. # для выявления перебора паролей
  31. auth_verbose_passwords = no
  32.  
  33. # Выводить более информативные сообщения в лог. Так же пишутся
  34. # запросы SQL.
  35. #auth_debug = no
  36.  
  37. # В случае несовпадения паролей писать в лог пароли и используемую
  38. # схему авторизации. Полезно для отладки. Перед включением
  39. # включите auth_debug.
  40. #auth_debug_passwords = no
  41.  
  42. # Включить вывод отладочных сообщений. Это может вам определить,
  43. # почему Dovecot не может найти ваши письма.
  44. #mail_debug = no
  45.  
  46. # Выводить инфу про SSL в сообщениях об ошибках.
  47. #verbose_ssl = no
  48.  
  49. # Плагин mail_log предоставляет более гибкое управление ведением логов.
  50. plugin {
  51. # Какие события писать в лог. Еще можно указать: flag_change append
  52. #mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
  53. # Возможные поля: uid, box, msgid, from, subject, size, vsize, flags
  54. # size and vsize are available only for expunge and copy events.
  55. #mail_log_fields = uid box msgid size
  56. }
  57.  
  58. ##
  59. ## Формат лог сообщений.
  60. ##
  61.  
  62. # Префикс для сообщений, формат смотреть в мане по strftime(3).
  63. #log_timestamp = "%b %d %H:%M:%S "
  64.  
  65. # Список, разделенный пробелами того, что вы хотите писать.
  66. # Элементы, которые имеют не пустое значение будут объединяться
  67. # вместе в выходной строке с помощью запятой.
  68. #login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
  69.  
  70. # Формат лога подключений. %$ заменяется на login_log_format_elements,
  71. # %s заменяется на данные.
  72. #login_log_format = %$: %s
  73.  
  74. # Префикс для выводимых сообщений в лог файл. Смотрите
  75. # <doc/wiki/Variables.txt>, чтобы знать - какие значения здесь
  76. # возможны.
  77. #mail_log_prefix = "%s(%u): "
  78.  
  79. # Формат лог сообщений доставщика писем. Вы можете использовать следующие значения:
  80. #  %$ - статус доставки (e.g. "saved to INBOX")
  81. #  %m - Message-ID
  82. #  %s - тема
  83. #  %f - от кого
  84. #  %p - физический размер
  85. #  %w - виртуальный размер
  86. #deliver_log_format = msgid=%m: %$

Файл conf.d/10-mail.conf:

  1. ##
  2. ## Пути к ящикам и пространства имен
  3. ##
  4.  
  5. # Расположение почтовых ящиков. По умолчанию эта переменная не задана,
  6. # поэтому Dovecot пытается найти почтовые ящики автоматически.
  7. # Это не будет работать, если пользователь не имеет почтового ящика,
  8. # поэтому лучше задать этот параметр.
  9. #
  10. # Если вы используете mbox, то одного пути к файлам почтового ящика
  11. # (например, /var/mail/%u) не будет достаточно. Так же вы должны
  12. # предоставить Dovecot,у, где будут храниться другие почтовые ящики.
  13. # Это называется "root mail directory (корневая директория почты)" и она должна
  14. # быть задана первой в параметре mail_location.
  15. #
  16. # Так же вы можете использовать следующие переменные:
  17. #
  18. #  %u - имя пользователя
  19. #  %n - имя польльзователя, только без домена
  20. #  %d - имя домена (пусто, если домен не указан)
  21. #  %h - домашняя директория
  22. #
  23. # Полный список смотрите здесь - <doc/wiki/Variables.txt>. Примеры:
  24. #
  25. # mail_location = maildir:~/Maildir
  26. # mail_location = mbox:~/mail:INBOX=/var/mail/%u
  27. # mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
  28. #
  29. # <doc/wiki/MailLocation.txt>
  30. #
  31. mail_location = maildir:~/Maildir
  32.  
  33. # Если вы хотите задать несколько местоположений почтовых ящиков или
  34. # хотите изменить пространства имен, вы можете сделать это определяя
  35. # секции пространств имен.
  36. #
  37. # Вы можете создать приватные, разделяемые и общие пространства имен.
  38. # Приватные пространства имен используются для личных писем пользователй.
  39. # К разделяемым пространствам могут иметь доступ другие пользователи.
  40. # Общие пространства разделяется между почтовыми ящиками, которые
  41. # управляются админами. Если вы создаете разделяемые или общие
  42. # пространства, то вам понадобится ACL плагин (для управляения правами
  43. # доступа), в противном случае пользователи будут иметь доступ ко всем
  44. # разделяемым почтовым ящикам, только если у них есть такая возможность
  45. # на уровне прав доступа файловой системы.
  46. #
  47. # Запомните: Если вы добавляете какие-либо пространства имен, то пространства
  48. # имен по умолчанию должны быть добавлены обязательно, то есть значение
  49. # mail_location ничего не значит, пока в пространстве имен не задан параметр
  50. # location. По умолчанию пространство имен не имеет префикса.
  51. #namespace {
  52. # Тип пространства имен: private, shared или public
  53. #type = private
  54.  
  55. # Используйте здесь обратный слэш в роли разделителя. Вы должны
  56. # использовать такой разделитель для всех пространств имен или
  57. # могут возникнуть проблемы с некоторыми клиентами.
  58. # Зависит от формата пользовательского ящика.
  59. #separator =
  60.  
  61. # Для доступа к пространству имен требуется указать префикс. Он должен
  62. # быть разным для каждого пространства имен. Например, "Public/".
  63. #prefix =
  64.  
  65. # Физическое местоположение почтового ящика. Формат такой же как и
  66. # у параметра mail_location. Если не задан, то значение берется
  67. # из mail_location.
  68. #location =
  69.  
  70. # Может быть только один ящик для приема сообщений и этот параметр
  71. # определяет у какого пространства имен будет этот ящик.
  72. #inbox = no
  73.  
  74. # If namespace is hidden, it's not advertised to clients via NAMESPACE
  75. # extension. You'll most likely also want to set list=no. This is mostly
  76. # useful when converting from another server with different namespaces which
  77. # you want to deprecate but still keep working. For example you can create
  78. # hidden namespaces with prefixes "~/mail/", "~%u/mail/" and "mail/".
  79. #hidden = no
  80.  
  81. # Show the mailboxes under this namespace with LIST command. This makes the
  82. # namespace visible for clients that don't support NAMESPACE extension.
  83. # "children" value lists child mailboxes, but hides the namespace prefix.
  84. #list = yes
  85.  
  86. # Namespace handles its own subscriptions. If set to "no", the parent
  87. # namespace handles them (empty prefix should always have this as "yes")
  88. #subscriptions = yes
  89. #}
  90.  
  91. # Пример конфигурации разделяемого пространства имен
  92. #namespace {
  93. #type = shared
  94. #separator = /
  95.  
  96. # Почтовые ящики отображаются так - "shared/user@domain/"
  97. # %%n, %%d и %%u преобразуются в конечного пользователя.
  98. #prefix = shared/%%u/
  99.  
  100. # Местонахождение писем для других почтовых ящиков. Учтите,
  101. # что %variables и ~/ преобразуются в данные, связанные
  102. # с подключенным пользователем. %%n, %%d, %%u и %%h
  103. # преобразуются в данные, связанные с конечным пользователем.
  104. #location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u
  105.  
  106. # Использовать пространство имен по умолчанию для подписчиков.
  107. #subscriptions = no
  108.  
  109. # Показывать только пространство имен shared/, если выводится
  110. # список разделяемых почтовых ящиков.
  111. #list = children
  112. #}
  113.  
  114. # Системные пользователь и группа, которые используются для доступа
  115. # к почтовым ящикам. Если вы используюте различных пользователей
  116. # и различные группы, то используя колонки uid или gid из БД пользователей,
  117. # можно переопределить эти значения. Вы можете использовать здесь
  118. # имена или числовые идентификаторы. <doc/wiki/UserIds.txt>
  119. mail_uid = mailnull
  120. mail_gid = mailnull
  121.  
  122. # Группа, используемая для привилигированных операций. На данный момент
  123. # это используется только с INBOX, когда не удается его создание или
  124. # не получается блокировка (dotlock). Обычно используется группа "mail" для
  125. # доступа к /var/mail.
  126. mail_privileged_group = mail
  127.  
  128. # Предоставить доступ этим группам к процессу, обрабатывающему письма.
  129. # В основном это используется для разрешения доступа к разделяемым
  130. # пространствам имен. Учтите, что это может быть опасно, если пользователи
  131. # могут создавать символические ссылки (например, если здесь указана
  132. # группа "mail", то ln -s /var/mail ~/mail/var позволит удалять пользователю
  133. # чужие почтовые ящики, или ln -s /secret/shared/box ~/mail/mybox позволит
  134. # читать их).
  135. #mail_access_groups =
  136.  
  137. # Предоставить полный доступ к ФС клиентам. В этом случае не происходит
  138. # каких-либо проверок доступа, только проверки на уровне прав доступа ФС.
  139. # Это работает с Maildir и mbox, разрешая указывать префикс к имени
  140. # ящика, например, /path/ или ~/user/.
  141. mail_full_filesystem_access = no
  142.  
  143. ##
  144. ## Процесс, работающий с письмами
  145. ##
  146.  
  147. # Не использовать системный вызов mmap(). Такое поведение
  148. # может потребоваться, если индексы хранятся на разделяемой
  149. # ФС (например, NFS или кластерная ФС).
  150. mmap_disable = no
  151.  
  152. # Использовать флаг O_EXCL, когда создаются файлы блокировки (dotlock).
  153. # NFS поддерживает O_EXCL, начиная с версии 3, так что на сегодняший
  154. # день данный параметр не создаст каких-либо проблем.
  155. dotlock_use_excl = yes
  156.  
  157. # Когда использовать системные вызовыfsync() или fdatasync():
  158. # optimized (по умолчанию): при необходимости, чтобы не потерять важные данные
  159. # always: полезна, например для NFS, где запись откладывается (задерживается)
  160. # never: вообще не использовать (лучшая производительность, но любой сбой
  161. # может привести к потери данных)
  162. mail_fsync = optimized
  163.  
  164. # Для хранения писем используется NFS. Установите этот параметр в 'yes',
  165. # чтобы Dovecot при необходимости сбрасывал кэши NFS. Если вы
  166. # используете локальную ФС для хранения, то изменение этого параметра
  167. # не требуется.
  168. mail_nfs_storage = no
  169.  
  170. # Индексы тоже хранятся на NFS. Этот параметр требует
  171. # mmap_disable=yes и fsync_disable=no.
  172. #mail_nfs_index = no
  173.  
  174. # Метод блокировки для индексов. Возможные значения fcntl, flock и dotlock.
  175. # В методе блокировки dotlock используются некоторые трюки,
  176. # что может увеличить нагрузку на подсистему ввода/вывода диска.
  177. # Пользователям NFS следует знать: что flock в данном случае не работает,
  178. # не забывайте изменять mmap_disable.
  179. lock_method = fcntl
  180.  
  181. # Директория, в которой LDA/LMTP временно сохраняет входящие сообщения
  182. # размером более 128 Кб.
  183. mail_temp_dir = /var/tmp
  184.  
  185. # Допустимые дапазоны UID для пользователей, по умолчанию от 500 и выше.
  186. # То есть никто не сможет зайти на сервер с идентификатором ниже/выше
  187. # указанного. Учтите, что руту доступ запрещен на уровне кода.
  188. first_valid_uid = 26
  189. #last_valid_uid = 0
  190.  
  191. # Тоже самое, только для групп. Если у пользователя основная группа
  192. # с идентификатором, выходящим из данного диапазона, то в доступе
  193. # такому пользователю будет отказано.
  194. first_valid_gid = 26
  195. #last_valid_gid = 0
  196.  
  197. # Максимальная длина для имени ключевого слова письма.
  198. # Может пригодится при создании новых ключевых слов.
  199. #mail_max_keyword_length = 50
  200.  
  201. # Список директорий, разделенный двоеточиями, в которые можно
  202. # будет chroot,иться процессу (например, если указать здесь /var/mail,
  203. # то возможен будет chroot в поддиректории). Этот параметр не влияет
  204. # на login_chroot, mail_chroot or auth chroot. Если параметр не задан,
  205. # то "/./" в домашних директориях будет игнорироваться.
  206. # Осторожно: Никогда не указывайте здесь директории, к которым
  207. # имеют доступ локальные пользователи. Этим правилом можно
  208. # пренибреч, только если у пользователей нет доступа к шелу.
  209. # <doc/wiki/Chrooting.txt>
  210. #valid_chroot_dirs =
  211.  
  212. # Основная директория для chroot,а процесса. Этот параметр может быть
  213. # изменен для определенных пользователей, указав в пути к
  214. # домашней директории /./ (например, /home/./user chroot в /home).
  215. # Следует знать, что в основном chroot процесса не требуется.
  216. # Dovecot не позволит пользователям получить доступ к файлам
  217. # за пределами домашней директории в любом случае.
  218. # <doc/wiki/Chrooting.txt>
  219. #mail_chroot =
  220.  
  221. # Путь к UNIX сокету сервера аутентификации.
  222. # Сокет используется imap (for shared users) и lda.
  223. auth_socket_path = /var/run/dovecot/auth-userdb
  224.  
  225. # Директория, в которой находятся плагины.
  226. mail_plugin_dir = /usr/local/lib/dovecot
  227.  
  228. # Список плагинов, разделенный пробелами, которые должны
  229. # быть загружены. Плагины специфичные для IMAP, LDA и т.п.
  230. # включаются в других (собственных) файлах конфигурации.
  231. mail_plugins = $mail_plugins quota
  232.  
  233. ##
  234. ## Оптимизация работы с почтовыми ящиками
  235. ##
  236.  
  237. # Минимальное количество писем в почтовом ящике перед обновлением
  238. # файла кеша. Благодаря этому параметру Dovecot будет делать меньше
  239. # операций записи на диск, но количество операций чтения возрастет.
  240. #mail_cache_min_mail_count = 0
  241.  
  242. # Если получена команда IDLE, то почтовый ящик будет периодически
  243. # проверяться на предмет получения новых писем или других изменений.
  244. # Этот параметр определяет минимальное количество секунд перед
  245. # проверкой. Dovecot может использовать dnotify, inotify и kqueue, чтобы
  246. # узнать об изменениях.
  247. #mailbox_idle_check_interval = 30 secs
  248.  
  249. # Сохранять текст письма с CR+LF в конце вместо LF. Это может уменьшить
  250. # нанагрузку на проц при работе с некоторыми письмами, особенно если
  251. # используется системный вызов sendfile(). Но увеличиться нагрузка
  252. # на подсистему ввода/вывода, поэтому прироста в производительности
  253. # может и не быть, а может быть она вообще снизится. Так же следует знать,
  254. # что использование такой возможности может вызвать проблемы с другим
  255. # програмным обеспечением, работающем в ящиках.
  256. #mail_save_crlf = no
  257.  
  258. ##
  259. ## Параметры Maildir
  260. ##
  261.  
  262. # По умолчанию для команды LIST выводится все записи в почтовом ящике,
  263. # начинающиеся с точки. Включение этой опции заставляет Dovecot возвразать
  264. # только список директорий. Для каждого объекта в почтовом ящике
  265. # вызывается системный вызов stat(), что нагружает подсистему ввода/вывода.
  266. #maildir_stat_dirs = no
  267.  
  268. # При копировании письма создавать жесткую ссылку, если это возможно.
  269. # В таком случае производительность возрастет без каких-либо последствий.
  270. maildir_copy_with_hardlinks = yes
  271.  
  272. # Если Dovecot единственной MUA, который имеет доступ к почтовым ящикам,
  273. # то возможно сканировать директорию cur/, только когда изменен mtime
  274. # или когда не удается найти письма.
  275. #maildir_very_dirty_syncs = no
  276.  
  277. ##
  278. ## Параметры mbox
  279. ##
  280.  
  281. # Системный вызов, используемый для блокировок при просмотре mbox.
  282. # Доступно четыре вызова:
  283. # dotlock: создавать файл <mailbox>.lock. Это старый способ, но безопасный
  284. # для NFS. Если вы используете директорию /var/mail, то пользователи
  285. # должны иметь права на запись в нее.
  286. # dotlock_try: тоже самое, что и dotlock, но если блокировка не удастся,
  287. # из-за прав доступа или недостаточного количества места на диске, то
  288. # то просто проигнорировать это.
  289. # fcntl: использовать, если возможно. Работает с NFS, если работает
  290. # демон lockd.
  291. # flock: данный вызов есть не во всех системах. Не работает с NFS.
  292. # lockf: данный вызов есть не во всех системах. Не работает с NFS.
  293. # Вы можете использовать несколько методов, если только из-за этого
  294. # не возникнет проблем с другим софтом (MTA/MUA), то есть другой софт
  295. # должен поддерживать данные методы. Некоторые ОС не позволяют
  296. # использовать разные блокировки одновременно.
  297. #mbox_read_locks = fcntl
  298. #mbox_write_locks = dotlock fcntl
  299.  
  300. # Максимальное кол-во секунд выжидаемое для заблокированного файла
  301. # перед отменой.
  302. #mbox_lock_timeout = 5 mins
  303.  
  304. # Пересоздать блокировку на файл, если почтовый ящик не был изменен
  305. # в течении этого времени (указывать в секундах).
  306. #mbox_dotlock_change_timeout = 2 mins
  307.  
  308. # Когда содержимое mbox изменяется, необходимо полностью перечитать
  309. # его. Если mbox очень большой, то это может занять много времени. Так
  310. # как изменение чаще всего происходит из-за прихода нового письма, то
  311. # было бы гораздо прочитать только новые письма. Если этот параметр
  312. # включен, то Dovecot делает это, но при необходимости перечитывает mbox.
  313. # Параметр следует отключить, если другие MUA могут изменить флаги
  314. # сообщний, о чем Dovecot соответственно не будет знать. Так же следует
  315. # знать, что сброс кэшей выполняется с командами SELECT, EXAMINE,
  316. # EXPUNGE и CHECK.
  317. #mbox_dirty_syncs = yes
  318.  
  319. # Аналогично mbox_dirty_syncs, но не будет осуществляться сброс кэшей,
  320. # даже если выполняются команды SELECT, EXAMINE, EXPUNGE и CHECK.
  321. # Если этот параметр включен, то параметр mbox_dirty_syncs игнорируется.
  322. #mbox_very_dirty_syncs = no
  323.  
  324. # Задерживать запись заголовков mbox, до тех пор пока происходит сброс
  325. # кэшей (команды EXPUNGE и CHECK, после чего файл закрывается).
  326. # Такое поведение может оказаться полезным при использовании протокола
  327. # POP3, когда пользователи пытаются удалить все письма. С другой стороны,
  328. # плохо, что другие MUA не видят изменений в ящике.
  329. #mbox_lazy_writes = yes
  330.  
  331. # Не писать индекс, пока ящик mbox не наберет заданный здесь размер в
  332. # килобайтах. Если индекс уже был создан, то он будет использоваться, но
  333. # не будет обновляться, если размер ящика меньше заданного.
  334. #mbox_min_index_size = 0
  335.  
  336. ##
  337. ## Параметры mdbox
  338. ##
  339.  
  340. # # Максимальный размер файла dbox, перед ротацией.
  341. #mdbox_rotate_size = 2M
  342.  
  343. # Максимальное время жизни dbox файла перед ротацией. Обычно задается
  344. # в днях. Дни считаются с полуночи, поэтому 1d = сегодня, 2d = вчера и т.д.
  345. # Если 0, то такая проверка отключена.
  346. #mdbox_rotate_interval = 1d
  347.  
  348. # При создании новых файлов mdbox резервировать место для них
  349. # размером в mdbox_rotate_size. Этот функционал работает только на Linux
  350. # и на определенных файловых системах (ext4, xfs).
  351. #mdbox_preallocate_space = no
  352.  
  353. ##
  354. ## Параметры для прикрепляемых файлов (вложений).
  355. ##
  356.  
  357. # sdbox и mdbox могут сохранять вложения во внешние файлы.
  358. # На данный момент другие форматы почтовых ящиков не поддерживают
  359. # данный функционал.
  360. # sdbox and mdbox support saving mail attachments to external files, which
  361. # also allows single instance storage for them. Other backends don't support
  362. # this for now.
  363.  
  364. # Предупреждение: Этот функционал до конца не отлажен, поэтому
  365. # используйте его на свой страх и риск.
  366.  
  367. # Директории, в которой будут сохраняться вложения. Если не задано, то
  368. # данный функционал отключен.
  369. #mail_attachment_dir =
  370.  
  371. # Вложения которые меньше указанного здесь размера не будут сохранены
  372. # во внешние файлы. Возможно написать плагин, который будет определять
  373. # по каким-то другим критериям сохранять файл во внешнее хранилище
  374. # или нет.
  375. #mail_attachment_min_size = 128k
  376.  
  377. # Backend фаловой системы, который используется для сохранения вложений:
  378. # posix : No SiS done by Dovecot (but this might help FS's own deduplication)
  379. # sis posix : SiS with immediate byte-by-byte comparison during saving
  380. # sis-queue posix : SiS with delayed comparison and deduplication
  381. #mail_attachment_fs = sis posix
  382.  
  383. # Хэш функция, используемая для генерации имен файлов вложений.
  384. # Вы можете указать здесь обычный текст и следующие переменные: %{md4},
  385. # %{md5}, %{sha1}, %{sha256}, %{sha512}, %{size}. Результат переменных
  386. # может быть ограничен, например так %{sha256:80} - вернет первые 80 бит.
  387. mail_attachment_hash = %{sha1}

Файл conf.d/10-master.conf:

  1. default_process_limit = 100
  2. default_client_limit = 1000
  3.  
  4. # Лимит VSZ (virtual memory size) для процессов по умолчанию. Такая
  5. # плюшка предназначена, чтобы отловить и прибить процессы, которые
  6. # пытаются слопать всю память.
  7. #default_vsz_limit = 256M
  8.  
  9. # Пользователь, под которым работает процесс авторизации пользователй.
  10. # Этот пользователь должен иметь самые минимальные права в системе.
  11. default_login_user = dovenull
  12.  
  13. # Пользователь, под которым работают непривелигерованные процессы.
  14. # Это должен быть другой пользователь (не такой же, как в default_login_user),
  15. # чтобы пользователь default_login_user не мог оказать никакого влияния
  16. # на другие процессы Dovecot,а.
  17. default_internal_user = dovecot
  18.  
  19. service imap-login {
  20. inet_listener imap {
  21. port = 143
  22. }
  23. inet_listener imaps {
  24. port = 993
  25. ssl = yes
  26. }
  27.  
  28. # Количество активных подключений, по превышению которого будет создан
  29. # новый процесс. Обычно используются значения 0 (без ограничений) или 1.
  30. # Подход со значением 1 является более безопасным, но медленным
  31. # по сравнению со значением 0. <doc/wiki/LoginProcess.txt>
  32. service_count = 1
  33.  
  34. # Количество процессов, ждущих подключений.
  35. process_min_avail = 3
  36.  
  37. # Если вы установили service_count=0, то памяти процессу нужно выделить больше.
  38. vsz_limit = 64M
  39. }
  40.  
  41. service pop3-login {
  42. inet_listener pop3 {
  43. port = 110
  44. }
  45. inet_listener pop3s {
  46. port = 995
  47. ssl = yes
  48. }
  49. }
  50.  
  51. service lmtp {
  52. unix_listener lmtp {
  53. #mode = 0666
  54. }
  55.  
  56. # Параметры сетевого сокета
  57. #inet_listener lmtp {
  58. # Avoid making LMTP visible for the entire internet
  59. #address =
  60. #port =
  61. #}
  62. }
  63.  
  64. service imap {
  65. # Большая часть памяти уходит для mmap()ing файлов. Для очень больших вложений
  66. # памяти нужно выделить больше.
  67. vsz_limit = 256M
  68.  
  69. # Максимальное количество процессов обрабатывающих IMAP подключения.
  70. process_limit = 128
  71. }
  72.  
  73. service pop3 {
  74. # Максимальное количество процессов обрабатывающих POP3 подключения.
  75. process_limit = 256
  76. }
  77.  
  78. service auth {
  79. # auth_socket_path указыват расположение Unix сокета. Он может
  80. # использоваться dovecot-lda, doveadm, процессами imap process и т.д.
  81. # По умолчанию только пользователь root имеет к нему доступ, причем
  82. # только права на чтение, но вам может потребоваться изменить права
  83. # доступа к Unix сокету. Пользоваели, которые имеют доступ к сокету
  84. # могут получить список всех пользователей и получить любые данные,
  85. # возвращаемые запросами к базе данных пользователй.
  86. unix_listener auth-userdb {
  87. mode = 0600
  88. user = mailnull
  89. group = wheel
  90. }
  91.  
  92. unix_listener auth-client {
  93. mode = 0600
  94. user = smmsp
  95. group = wheel
  96. }
  97.  
  98. # Postfix smtp-auth
  99. #unix_listener /var/spool/postfix/private/auth {
  100. # mode = 0666
  101. #}
  102.  
  103.  
  104. # Пользователь, под которым работает процесс авторизации.
  105. user = $default_internal_user
  106. }
  107.  
  108. service auth-worker {
  109. # По умолчанию данный процесс (auth worker) запускается под рутом,
  110. # чтобы иметь возможность доступа к файлу /etc/shadow. Если вам это
  111. # не нужно, то можно запускать его под пользователем $default_internal_user.
  112. user = $default_internal_user
  113. }
  114.  
  115. service dict {
  116. # Если используется dict proxy, то процессы, обрабатывающие почту,
  117. # должны иметь доступ к сокету dict proxy.
  118. # Например: mode=0660, group=vmail and global mail_access_groups=vmail
  119. unix_listener dict {
  120. #mode = 0600
  121. #user =
  122. #group =
  123. }
  124. }

Файл conf.d/10-ssl.conf:

  1. ##
  2. ## Параметры SSL
  3. ##
  4.  
  5. # Использовать SSL/TLS: yes, no, required. <doc/wiki/SSL.txt>
  6. ssl = yes
  7.  
  8. # Сертификат и приватный ключ X.509 SSL/TLS. Файлы открываются перед тем,
  9. # как будут сброшены привелегии root, поэтому сохраняйте файл не доступным
  10. # для всех, кроме пользователя root. В дистрибутив включен скрипт (doc/mkcert.sh),
  11. # который облегчит вам создание собственных подписанных сертификатов.
  12. ssl_cert = </usr/local/etc/exim/exim.crt
  13. ssl_key = </usr/local/etc/exim/exim.pem
  14.  
  15. # Если файл-ключ защищен паролем, то укажите этот пароль здесь.
  16. # Так же пароль можно задать с помощью ключа -p. Since this file is often
  17. # world-readable, you may want to place this setting instead to a different
  18. # root owned 0600 file by using ssl_key_password = <path>.
  19. #ssl_key_password =
  20.  
  21. # Файл, содержащий правильные центры сертификации. Задайте, только
  22. # если вы собираетесь использовать ssl_verify_client_cert=yes.
  23. # The file should contain the CA certificate(s) followed by the matching
  24. # CRL(s). (e.g. ssl_ca = </etc/ssl/certs/ca.pem)
  25. #ssl_ca =
  26.  
  27. # Проверять сертификат пользователя. Если вы хотите сделать это
  28. # обязательным, то установите параметр ssl_require_client_cert=yes
  29. # в секции авторизации.
  30. ssl_verify_client_cert = no
  31.  
  32. # Какое поле сертификата использовать в качестве имени пользователя.
  33. # Обычно используют commonName и x500UniqueIdentifier.Вам также
  34. # потребуется задать задать параметр ssl_username_from_cert=yes.
  35. #ssl_cert_username_field = commonName
  36.  
  37. # Как часто регенирировать файл параметров SSL. При генерации
  38. # интенсивно используется CPU. Значение задается в часах,
  39. # если указать 0, то данная фишка будет отключена.
  40. #ssl_parameters_regenerate = 168
  41.  
  42. # Доступные шифры SSL
  43. ssl_cipher_list = ALL:!LOW:!SSLv2:!EXP:!aNULL

Файл conf.d/15-lda.conf:

  1. ##
  2. ## Параметры LDA (также используются для LMTP)
  3. ##
  4.  
  5. # Адрес, используемый для отправки отклоненных писем.
  6. # По умолчанию postmaster@example.com.
  7. postmaster_address = mailer-daemon@info-x.org
  8.  
  9. # Имя хоста, используемое в некоторых частях письма
  10. # (например, в Message-Id). По умолчанию берется из системы.
  11. hostname = mx.info-x.org
  12.  
  13. # Если пользователь превысил квоту, то вернуть ошибку о временном
  14. # сбое вместо отправки отлупа.
  15. quota_full_tempfail = no
  16.  
  17. # Бинарник sendmail,а для отправки отлупов.
  18. #sendmail_path = /usr/sbin/sendmail
  19.  
  20. # Если параметр задан, то отправлять письма через, указанный здесь
  21. # SMTP host[:port], вместо использования утилиты sendmail.
  22. submission_host = localhost:25
  23.  
  24. # Указывать следующую тему в отлупах. Вы можете использовать
  25. # некоторые значения как в параметре rejection_reason ниже.
  26. #rejection_subject = Rejected: %s
  27.  
  28. # Сообщение об отлупах. Вы можете использовать следующие значения:
  29. #  %n = CRLF, %r = reason, %s = original subject, %t = recipient
  30. #rejection_reason = Your message to <%t> was automatically rejected:%n%r
  31.  
  32. # Символ, помещаемый между локальной частью (local-part) и подробным
  33. # email адресом (detail in email address).
  34. #recipient_delimiter = +
  35.  
  36. # Header where the original recipient address (SMTP's RCPT TO: address) is taken
  37. # from if not available elsewhere. With dovecot-lda -a parameter overrides this.
  38. # A commonly used header for this is X-Original-To.
  39. #lda_original_recipient_header =
  40.  
  41. # Если происходит доставка в несуществующую папку (в которой хранится
  42. # почтовый ящик), то создать ее?
  43. lda_mailbox_autocreate = yes
  44.  
  45. # Should automatically created mailboxes be also automatically subscribed?
  46. lda_mailbox_autosubscribe = no
  47.  
  48. protocol lda {
  49. # Список подключаемых плагинов, разделенный запятыми
  50. # (по умолчанию значение глобальной переменной mail_plugins).
  51. mail_plugins = $mail_plugins sieve
  52.  
  53. log_path =
  54. info_log_path =
  55. syslog_facility = mail
  56. }

Файл conf.d/20-imap.conf:

  1. ##
  2. ## Параметры IMAP
  3. ##
  4.  
  5. protocol imap {
  6. # Максимальная длина команды IMAP в байтах. Некоторые клиенты посылают
  7. # слишком длинные команды при работе с очень большими ящиками, поэтому
  8. # вам может понадобиться отказывать таким клиентам с сообщением
  9. # "Too long argument" или "IMAP command line too large" в таком случае.
  10. #imap_max_line_length = 64k
  11.  
  12. # Максимальное кол-во подключений для пользователя с одного IP адреса.
  13. # Учтите, что в имени пользователя учитывается регистр букв.
  14. mail_max_userip_connections = 5
  15.  
  16. # Список подключаемых плагинов, разделенный запятыми
  17. # (по умолчанию значение глобальной переменной mail_plugins).
  18. mail_plugins = $mail_plugins imap_quota
  19.  
  20. # Формат логов:
  21. #  %i - общее кол-во байт полученных от клиента
  22. #  %o - общее кол-во байт отправленных клиенту
  23. imap_logout_format = bytes=%i/%o
  24.  
  25. # Заменить ответ IMAP CAPABILITY на указанный здесь.
  26. # If the value begins with '+', add the given capabilities on top
  27. # of the defaults (e.g. +XFOO XBAR).
  28. #imap_capability =
  29.  
  30. # Сколько секунд ждать ответа от клиента "OK Still here",
  31. # когда тот ничего не делает.
  32. imap_idle_notify_interval = 2 mins
  33.  
  34. # Идентификационные данные, отправляемые клиенту. Используйте *,
  35. # чтобы Dovecot использовал значение по умолчанию. Следующие
  36. # данные имеют значение по умолчанию: name, version, os, os-version,
  37. # support-url, support-email.
  38. #imap_id_send =
  39.  
  40. # Какие идентификационные данные писать в лог. * - значит все.
  41. #imap_id_log =
  42.  
  43. # Хаки для некоторых быжных клиентов:
  44. # delay-newmail:
  45. # Отправлять (EXISTS/RECENT) уведомления о новых сообщениях,
  46. # только когда получены команды NOOP и CHECK. В противном
  47. # случае некоторые клиенты игнорируют эту инфу, например
  48. # OSX Mail (<v2.1). Outlook Express еще корявее, без этого хака
  49. # может показывать пользователю сообщение об ошибке
  50. # "Message no longer in server". Учтите, что OE6 может так же
  51. # криво работать, если синхронизация установлена в "Headers Only".
  52. #
  53. # tb-extra-mailbox-sep:
  54. # В mbox ящик может содержать или письма, или папки, что-то одно
  55. # из них. Thunderbird разделяет их, вынуждая сервер принимать
  56. # суффикс '/' в именах ящиков при работе в списках рассылки.
  57. #
  58. # tb-lsub-flags:
  59. # Show \Noselect flags for LSUB replies with LAYOUT=fs (e.g. mbox).
  60. # This makes Thunderbird realize they aren't selectable and show them
  61. # greyed out, instead of only later giving "not selectable" popup error.
  62. # Элементы списка разделяются пробелами.
  63. #imap_client_workarounds =
  64. }

Файл conf.d/20-managesieve.conf:

  1. ##
  2. ## Параметры ManageSieve
  3. ##
  4.  
  5. # Раскомментируйте, чтобы включить managesieve.
  6. protocols = $protocols sieve
  7.  
  8. service managesieve-login {
  9. inet_listener sieve {
  10. port = 4190
  11. }
  12.  
  13. #inet_listener sieve_deprecated {
  14. # port = 2000
  15. #}
  16.  
  17. # Количество активных подключений, по превышению которого будет создан
  18. # новый процесс. Обычно используются значения 0 (без ограничений) или 1.
  19. # Подход со значением 1 является более безопасным, но медленным
  20. # по сравнению со значением 0. <doc/wiki/LoginProcess.txt>
  21. service_count = 1
  22.  
  23. # Количество процессов, ждущих подключений.
  24. #process_min_avail = 0
  25.  
  26. # Если вы установили service_count=0, то памяти процессу нужно выделить больше.
  27. vsz_limit = 64M
  28. }
  29.  
  30. service managesieve {
  31. # Максимальное количество процессов обрабатывающих подключения.
  32. #process_count = 0
  33. }
  34.  
  35. protocol sieve {
  36. # Максимальная длина команды ManageSieve в байтах. ManageSieve обычно не
  37. # использует длинных команд, поэтому этот параметр изменять не требуется.
  38. #managesieve_max_line_length = 65536
  39.  
  40. # Максимальное кол-во подключений для пользователя с одного IP адреса.
  41. # Учтите, что в имени пользователя учитывается регистр букв.
  42. mail_max_userip_connections = 5
  43.  
  44. # Список подключаемых плагинов, разделенный запятыми
  45. # Не пытайтесь загрузить сюда плагины предназначенные для IMAP.
  46. #mail_plugins =
  47.  
  48. # Формат логов:
  49. #  %i - общее кол-во байт полученных от клиента
  50. #  %o - общее кол-во байт отправленных клиенту
  51. managesieve_logout_format = bytes=%i/%o
  52.  
  53. # Некоторые клиенты ManageSieve разработаны конкретно под CMU's timesieved,
  54. # поэтому могут некоректно работать с реализацией Sieve от Dovecot. В качестве
  55. # обходного пути здесь вы можете указать версию ManageSieve, показываемую
  56. # клиентам.
  57. # Например: 'Cyrus timsieved v2.2.13'
  58. #managesieve_implementation_string = Dovecot Pigeonhole
  59. managesieve_implementation_string = Cyrus timsieved v2.2.13
  60.  
  61. # Explicitly specify the SIEVE and NOTIFY capability reported by the server before
  62. # login. If left unassigned these will be reported dynamically according to what
  63. # the Sieve interpreter supports by default (after login this may differ depending
  64. # on the user).
  65. #managesieve_sieve_capability =
  66. #managesieve_notify_capability =
  67.  
  68. # Максимальное количество попыток компиляций скрипта Sieve, который
  69. # отправляет клиент.
  70. managesieve_max_compile_errors = 5
  71.  
  72. # Редактируйте файл 90-sieve.conf для настройки квот и ограничений времени выполнения
  73. # скриптов Sieve.
  74. }

Файл conf.d/20-pop3.conf:

  1. ##
  2. ## Параметры POP3
  3. ##
  4.  
  5. protocol pop3 {
  6. # Не выставлять флаги (надавний или прочитанно) на письма
  7. # в сессии POP3. Это может поребоваться для уменьшения
  8. # нагрузки на подсистему ввода/вывода диска. При работе
  9. # с хранилищем maildir не будут перемещаться файлы из
  10. # директории new/ в директорию cur/, а с mbox не будет записываться
  11. # Status-header.
  12. #pop3_no_flag_updates = no
  13.  
  14. # Поддержка команды LAST, которая была описана в старых спеках POP3,
  15. # но удалена в новых. Некоторые клиенты все еще ее используеют.
  16. # При включенной опциивыполнение команды RSET приведет к сбросу
  17. # флага \Seen (прочитано) во всех сообщениях.
  18. #pop3_enable_last = no
  19.  
  20. # Если у письма есть заголовок X-UIDL, то использовать его UIDL.
  21. #pop3_reuse_xuidl = no
  22.  
  23. # Блочить ящик на время POP3 сессии.
  24. pop3_lock_session = yes
  25.  
  26. # POP3 requires message sizes to be listed as if they had CR+LF linefeeds.
  27. # Many POP3 servers violate this by returning the sizes with LF linefeeds,
  28. # because it's faster to get. When this setting is enabled, Dovecot still
  29. # tries to do the right thing first, but if that requires opening the
  30. # message, it fallbacks to the easier (but incorrect) size.
  31. #pop3_fast_size_lookups = no
  32.  
  33. # Использовать POP3 UIDL (уникальный идентификатор письма).
  34. # Вы можете использовать следующие значения, вместе с модификаторами
  35. # описанными в <doc/wiki/Variables.txt> (например, %Uf будет значить,
  36. # что имя файла будет в верхнем регистре).
  37. #
  38. #  %v - Mailbox's IMAP UIDVALIDITY
  39. #  %u - Mail's IMAP UID
  40. #  %m - хэш MD5 заголовков ящика в hex (только для mbox)
  41. #  %f - имя файла (только maildir)
  42. #  %g - Mail's GUID
  43. #
  44. # Если вы хотите ,чтобы UIDL был совместим с другими POP3 серверами,
  45. # то используйте следующее:
  46. # UW's ipop3d  : %08Xv%08Xu
  47. # Courier  : %f or %v-%u (both might be used simultaneosly)
  48. # Cyrus (<= 2.1.3)  : %u
  49. # Cyrus (>= 2.1.4)  : %v.%u
  50. # Dovecot v0.99.x  : %v.%u
  51. # tpop3d  : %Mf
  52. #
  53. # Учтите, что Outlook 2003 криво работает с форматом %v.%u, который
  54. # является значением по умолчанию для Dovecot, так что если вы
  55. # настраиваете новый сервер, то хорошим решением будет изменить
  56. # данный параметр. Формат %08Xu%08Xv является самым удачным.
  57. #
  58. #pop3_uidl_format = %08Xu%08Xv
  59.  
  60. # Сохранять UIDLs посланные POP3 клиентам, таким образом
  61. # pop3_uidl_format не будет изменять их. На данный момент работает
  62. # только с Maildir.
  63. #pop3_save_uidl = no
  64.  
  65. # Формат логов POP3:
  66. #  %i - общее кол-во байт полученное от клиента
  67. #  %o - общее кол-во байт отправленное клиенту
  68. #  %t - количество команд TOP
  69. #  %p - кол-во байт, отправленное клиенту при вып. команды TOP
  70. #  %r - число команд RETR
  71. #  %b - кол-во байт, отправленное клиенту при вып. команды RETR
  72. #  %d - кол-во удаленных сообщений
  73. #  %m - кол-во сообщений (перед удалением)
  74. #  %s - размер ящика в байтах (перед удалением)
  75. #  %u - старый/новый хэш UIDL. Может помочь в поиске сообшений (или проблем),
  76. # если UIDLs неожиданно изменился
  77. #pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
  78.  
  79. # Максимальное кол-во подключений для пользователя с одного IP адреса.
  80. # Учтите, что в имени пользователя учитывается регистр букв.
  81. mail_max_userip_connections = 5
  82.  
  83. # Список подключаемых плагинов, разделенный запятыми
  84. # (по умолчанию значение глобальной переменной mail_plugins).
  85. #mail_plugins = $mail_plugins
  86.  
  87. # Хаки для некоторых быжных клиентов:
  88. # outlook-no-nuls:
  89. # Outlook и Outlook Express отупляются, если письмо содержит
  90. # символы NUL. С этим хаком такие символы будут заменены на
  91. # символ 0x80.
  92. # oe-ns-eoh:
  93. # Outlook Express и Netscape Mail тупят, если пропущено окончание
  94. # строки в заголовках. С этим хаком это дело поправимое.
  95. #
  96. # Элементы списка должны быть разделены пробелами.
  97. #pop3_client_workarounds =
  98. }

Файл conf.d/90-quota.conf:

  1. ##
  2. ## Настройка квот.
  3. ##
  4.  
  5. # Не забывайте подключить плагин quota в mail_plugins для включения функционала квот.
  6. # <doc/wiki/Quota.txt>
  7.  
  8. ##
  9. ## Настройка ограничений
  10. ##
  11.  
  12. # Квота задается с помощью параметра "quota_rule", указывается непосредственно
  13. # в нем или в userdb. Возможно задавать размеры для папок в ящике:
  14. # quota_rule = *:storage=1GB
  15. # quota_rule2 = Trash:storage=+100M
  16. # Пользователь имеет квоту в 1Гб, но для корзины выделено доп. 100Мб.
  17.  
  18. plugin {
  19. quota_rule = *:storage=10M
  20. quota_rule2 = Trash:storage=+50M
  21. }
  22.  
  23. ##
  24. ## Предупреждения о достижении пределов квот
  25. ##
  26.  
  27. # Возможно запускать исполняемый файл, когда пользователь исчерпал лимит.
  28. # Квоты могут иметь разные ограничения. Файл будет запущен, только
  29. # для первой сработавшей квоты, поэтому помещайте команды в порядке
  30. # убывания ограничений. Команды запускаются через сервис скриптов
  31. # через Unix сокет (quota-warning ниже).
  32. # Учтите, что символ '%' должен экранироваться - %%, иначе он будет заменен
  33. # на пустое значение.
  34.  
  35. plugin {
  36. #quota_warning = storage=95%% quota-warning 95 %u
  37. #quota_warning2 = storage=80%% quota-warning 80 %u
  38. }
  39.  
  40. # Пример сервиса quota-warning. Права доступа к Unix сокеты должны быть
  41. # выставлены правильно, чтобы процесс (обрабатывающие почту) мог
  42. # открыть его. В примере ниже подразумевается, что процесс (обрабатывающий
  43. # почту) работает с правами пользователя vmail. Если вы укажите mode=0666, то
  44. # все системные пользователи смогут генерировать предупреждения о
  45. # достижении лимитов квот кому угодно.
  46. #service quota-warning {
  47. # executable = script /usr/local/bin/quota-warning.sh
  48. # user = dovecot
  49. # unix_listener quota-warning {
  50. # user = vmail
  51. # }
  52. #}
  53.  
  54. ##
  55. ## Храние данных о квотах
  56. ##
  57.  
  58. # Поддерживается несколько методов хранения квот:
  59. # dirsize: поиск всех файлов в ящике и подсчет общего размера.
  60. # Очень медленно работает с Maildir. Может нагрузить CPU и
  61. # подсистему I/O диска.
  62. # dict: хранить данные в словаре (например, SQL)
  63. # maildir: Maildir++ quota
  64. # fs: использовать системные квоты
  65.  
  66. plugin {
  67. #quota = dirsize:User quota
  68. quota = maildir:User quota
  69. #quota = dict:User quota::proxy::quota
  70. #quota = fs:User quota
  71. }
  72.  
  73. # Возможны и такие конфигурации: каждый пользователь имеею квоту
  74. # в 100Мб и есть одна разделяемая квота в 1Гб для домена.
  75. plugin {
  76. #quota = dict:user::proxy::quota
  77. #quota2 = dict:domain:%d:proxy::quota_domain
  78. #quota_rule = *:storage=102400
  79. #quota2_rule = *:storage=1048576
  80. }

Файл conf.d/90-sieve.conf:

  1. ##
  2. ## Параметры для интерпритатора Sieve
  3. ##
  4.  
  5. # Не забывайте включить плагин Sieve в файлах 15-lda.conf и 20-lmtp.conf,
  6. # используя переменную mail_plugins.
  7.  
  8. plugin {
  9. # Путь к Sieve скрипту пользователя.
  10. sieve = ~/.dovecot.sieve
  11.  
  12. # Путь к глобальному Sieve скрипту, который будет запущен только, если
  13. # у пользователя нет собственного Sieve скрипта. Данный скрипт необходимо
  14. # будет самостоятельно скомпилировать утилитой sievec.
  15. #sieve_global_path = /var/lib/dovecot/sieve/default.sieve
  16.  
  17. # Directory for :personal include scripts for the include extension.
  18. sieve_dir = ~/sieve
  19.  
  20. # Directory for :global include scripts for the include extension.
  21. #sieve_global_dir =
  22.  
  23. # Какие расширения языка Sieve доступны пользователям. По умолчанию
  24. # доступны все поддерживаемые расширения, за исключением запрещенных
  25. # или расширений, находящихся на этапе разработки. Некоторым системным
  26. # администраторам может понадобиться запретить некоторые расширения или
  27. # разрешить расширения, которые по умолчанию не включены. Используя
  28. # '+' и '-' вы можете изменить поддержку тех или иных расширений
  29. # относительно стандартных настроек. Например, `sieve_extensions = +imapflags'
  30. # дополнительно к расширениям по уолчанию, включит запрещенное
  31. # расширение imapflags.
  32. #sieve_extensions = +notify +imapflags
  33.  
  34. # The separator that is expected between the :user and :detail
  35. # address parts introduced by the subaddress extension. This may
  36. # also be a sequence of characters (e.g. '--'). The current
  37. # implementation looks for the separator from the left of the
  38. # localpart and uses the first one encountered. The :user part is
  39. # left of the separator and the :detail part is right. This setting
  40. # is also used by Dovecot's LMTP service.
  41. #recipient_delimiter = +
  42.  
  43. # Максимальный размер скрипта Sieve. Компилятор будет отшибать любой
  44. # скрипт, размер которого больше указанного здесь предела.
  45. sieve_max_script_size = 1M
  46.  
  47. # Максимальное количество команд в одном скрипте.
  48. sieve_max_actions = 32
  49.  
  50. # Максимальное количество переадресаций в одном скрипте.
  51. sieve_max_redirects = 8
  52.  
  53. # Максимальное количество скриптов Sieve, которое может иметь пользователь.
  54. # (Currently only relevant for ManageSieve)
  55. sieve_quota_max_scripts = 30
  56.  
  57. # Максимальный сумарный размер скриптов для одного пользователя.
  58. # (Currently only relevant for ManageSieve)
  59. #sieve_quota_max_storage = 0
  60. }

Файл conf.d/auth-sql.conf.ext:

  1. # Аутентификация для пользователей SQL. Файл подключается в 10-auth.conf.
  2. #
  3. # <doc/wiki/AuthDatabase.SQL.txt>
  4.  
  5. passdb {
  6. driver = sql
  7.  
  8. # Путь до конфигурационного файла SQL, смотрите example-config/dovecot-sql.conf.ext
  9. args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
  10. }
  11.  
  12. # БД пользователей "prefetch" используется для сохранения информации
  13. # полученной из passdb, то есть отпадает необходимость в повторном
  14. # просмотре userdb. Такое возможно сделать при работе с хранилищем
  15. # SQL и LDAP. <doc/wiki/UserDatabase.Prefetch.txt>
  16. #userdb {
  17. # driver = prefetch
  18. #}
  19.  
  20. userdb {
  21. driver = sql
  22. args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
  23. }
  24.  
  25. # Если у вас нет каких-либо специфичных параметров пользователей, то вы
  26. # можете использовать вместо user_query (userdb sql) userdb static. Например:
  27. # <doc/wiki/UserDatabase.Static.txt>
  28. #userdb {
  29. #driver = static
  30. #args = uid=vmail gid=vmail home=/var/vmail/%u
  31. #}

Запуск и проверка конфигурации

Теперь можно запустить сервис:

  1. # service dovecot start
  2. # netstat -anp | grep dovecot
  3. tcp 0 0 0.0.0.0:4190 0.0.0.0:* LISTEN 6813/dovecot
  4. tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 6813/dovecot
  5. tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 6813/dovecot
  6. tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 6813/dovecot
  7. tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 6813/dovecot
  8. tcp6 0 0 :::4190  :::* LISTEN 6813/dovecot
  9. tcp6 0 0 :::993  :::* LISTEN 6813/dovecot
  10. tcp6 0 0 :::995  :::* LISTEN 6813/dovecot
  11. tcp6 0 0 :::110  :::* LISTEN 6813/dovecot
  12. tcp6 0 0 :::143  :::* LISTEN 6813/dovecot

Если сервис не запустился, то смотрите логи и ищите проблему. Теперь проверим работоспособность сервиса (достаточно будет проверить работоспособность сервиса по одному протоколу, например POP3), для этого подключимся telnet,ом к серверу и сымитируем обычную сессию пользователя. Не забываем, что перед проверкой необходимо создать почтовый ящик в базе данных.

  1.  
  2. # telnet server.name 110
  3. +OK POP3/IMAP server ready.
  4. USER user@domain
  5. +OK
  6. PASS userpass
  7. +OK Logged in.
  8. STAT
  9. +OK 228 66786803
  10. QUIT
  11. +OK Logging out.
  12.  

Если имитация сессии пользователя прошла успешно, то настройку Dovecot можно считать завершенной. Если же возникли проблемы, то смотрите логи на предмет ошибок и исправляйте их.

Агент пересылки почты Exim

Exim является одним из лучших MTA, т.к. он чертовски быстр, бесплатен, обладает большим количеством возможностей и поддерживаемых технологий, а также возможностью гибкой и тонкой настройки под любые задачи. Одной из самых классных фич Exim,а являются списки контроля доступа (ACL), с помощью которых можно управлять потоком писем практически не ограничивая себя ни в чем. Exim из коробки поддерживает различные форматы почтовых ящиков. Также стоит отметить возможность поиска конфигурации в обычных файлах и различных базах данных (PostgreSQL, MySQL, LDAP и д.р.). В общем, у него есть куча достоинств, которые можно перечислять практически до бесконечности...

Теперь пару слов про конфигурцию MTA... Как уже было сказано ранее Exim у нас будет заниматься только приемом и передачей почтовых сообщений, поэтому в конфиге можно увидеть, что запускаю я его под пользователем smmsp. smmsp — является стандартным системным пользователем, из описания которого можно увидеть, что он предназначен для процесса, занимающегося пересылкой почты. То есть Exim будет работать от пользователя, не имеющего доступа к почтовым ящикам пользователей, что является несомненным плюсом в безопасности почтовой системы. Если вы сделаете также, то вам необходимо будет переназначить права на служебные папки и файлы Exim,а (/var/log/exim, /var/spool/exim).

В моей конфигурации предполагается использование антивируса ClamAV. Про его установку здесь я писать не буду, но может быть, потом вынесу это дело в отдельную статью. В общем, там нет ничего сложного: залезть в порты, установить, подправить конфигурационный файл под себя, обновить базы и запустить. Если вам антивирус не нужен, то закомментируйте ответственные за сканирование почты строки в конфиге.

Теперь самое интересное — защита от спама. Я нигде не использую внешние средства фильтрации, такие как SpamAssasin или DSPAM, поскольку предпочитаю рубить его еще до приема текста сообщения. Вот тут мощь и гибкость списков контроля доступа Exim,а раскрываются во всей красе. Определение хоста (желающего отправить почту на наш сервер) как спамера происходит на основе спам очков. Это значит, что практически все проверки в ACL не являются запрещающими, а накидывающими некоторое количество спам очков при попадании под какое-нибудь правило. Хосты, набравшие сравнительно большое количество баллов, благополучно размещаются в локальном черном списке (таблица blacklist_tb). Хосты, набравшие такое количество баллов, что их нельзя отнести ни к легитимным хостам, ни к спам хостам заворачиваются в серый список на 29 минут (таблица greylist_tb). По прошествии 29 минут, если хост повторил передачу, то от него принимается письмо и отправитель заносится в белый список, точнее хэш сумма от отправителя и получателя (таблица whitelist_tb). От остальных хостов почта принимается в обычном порядке. Чисткой устаревших записей в таблицах занимается скрипт.

Хочу отметить, что не маловажным при конфигурировании почтового сервера будет использование таких технологий, как SPF и DKIM. Поскольку такие почтовики, как yandex, gmail и другие гиганты очень сильно не доверяют хостам, не имеющих даже той же записи SPF. Например, пока я не настроил на своих серверах DKIM, почтовик гугла помечал все письма с моих серверов как спам и размещал их в соответствующей папке у пользователей.

Установка

  1. # aptitude install exim4 exim4-daemon-heavy

Настройка

Конфигурационный файл Exim распологается здесь — /etc/exim4/exim4.conf.template. Файл очень большой, но при желании его можно разбить на небольшие и отвечающие за определенный функционал файлы, как например, это сделали во второй версии Dovecot (смотрите в документации Exim директиву include). У меня конфигурационный файл имеет следующий вид:

  1. ####################################################################
  2. # Конфигурационный файл Exim #
  3. ####################################################################
  4.  
  5.  
  6. # Это стандартный конфигурационный файл, который можно использовать
  7. # для простых конфигураций. Смотрите документацию, чтобы узнать
  8. # какие опции можно использовать в данном файле. Их гораздо больше,
  9. # чем представлено здесь. Документация находится в doc/spec.txt
  10. # в дистрибутиве Exim в обычном текстовом формате. Другие форматы
  11. # (PostScript, Texinfo, HTML, PDF) доступны на ftp. Документацию
  12. # так же можно найти на официальном сайте.
  13.  
  14.  
  15. # Данный файл разделен на несколько частей, все части, кроме первой,
  16. # начинаются с ключевого слова "begin". Пустые строки и строки,
  17. # начинающиеся с символа # игнорируются.
  18.  
  19.  
  20. ####################################################################
  21. # Важно знать #
  22. ####################################################################
  23. # После изменения конфигурационного файла вы должны послать сигнал #
  24. # HUP демону Exim, чтобы тот перечитал файл. Однако, любой другой #
  25. # запускаемый процесс Exim, например, процесс запущенный MUA #
  26. # для отправки сообщения увидит новый конфигурационный файл. #
  27. # #
  28. # Не обязательно посылать сигнал HUP процессу Exim, когда изменяются#
  29. # дополнительные (вспомогательные) файлы подключенные из конфига. #
  30. # Данные файлы читаются каждый раз, когда это необходимо. #
  31. # #
  32. # Хорошей идеей будет тестирование нового конфигурационного файла #
  33. # на предмет синтаксических ошибок (например, #
  34. # exim -C /config/file.new -bV) #
  35. ####################################################################
  36.  
  37.  
  38. ######################################################################
  39. # Определение макросов #
  40. ######################################################################
  41. EXTRA_PREFIX = /etc/exim4/extra
  42. DKIM_DIRECTORY = /etc/exim4/dkim
  43.  
  44. # Запрос, возвращающий синонимы для почтового адреса, если они есть
  45. CHECK_VIRTUAL_ALIASES = \
  46. ${lookup pgsql{SELECT "aliases_tb"."mailaddr" FROM "aliases_tb" \
  47. INNER JOIN "domains_tb" ON ("aliases_tb"."domain_id" = "domains_tb"."id") \
  48. WHERE "aliases_tb"."aliasname" = '${quote_pgsql:$local_part}' AND \
  49. "domains_tb"."domainname" = '${quote_pgsql:$domain}' AND \
  50. "aliases_tb"."active" = 'true' AND "domains_tb"."active" = 'true'}}
  51.  
  52. # Запрос проверяет существование пользователя в почтовой системе
  53. CHECK_VIRTUAL_USER = \
  54. ${lookup pgsql{SELECT "users_tb"."id" FROM "users_tb" \
  55. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  56. WHERE "users_tb"."username" = '${quote_pgsql:$local_part}' AND \
  57. "domains_tb"."domainname" = '${quote_pgsql:$domain}' AND \
  58. "users_tb"."active" = 'true' AND "domains_tb"."active" = 'true'}{yes}fail}
  59.  
  60. # Запрос возвращает идентификатор группы пользователя в системе
  61. GET_VIRTUAL_GROUP = \
  62. ${lookup pgsql{SELECT "users_tb"."gid" FROM "users_tb" \
  63. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  64. WHERE "username" = '${quote_pgsql:$local_part}' AND \
  65. "domains_tb"."domainname" = '${quote_pgsql:$domain}'}}
  66.  
  67. # Запрос возвращает идентификатор пользователя в системе
  68. GET_VIRTUAL_USER = \
  69. ${lookup pgsql{SELECT "users_tb"."uid" FROM "users_tb" \
  70. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  71. WHERE "username" = '${quote_pgsql:$local_part}' AND \
  72. "domains_tb"."domainname" = '${quote_pgsql:$domain}'}}
  73.  
  74. # Запрос возвращает домашнюю директорию пользователя
  75. GET_VIRTUAL_DIR = \
  76. ${lookup pgsql{\
  77. SELECT "users_tb"."homedir" || '${quote_pgsql:/$domain/$local_part/Maildir}' FROM "users_tb" \
  78. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  79. WHERE "username" = '${quote_pgsql:$local_part}' AND \
  80. "domains_tb"."domainname" = '${quote_pgsql:$domain}'}}
  81.  
  82. # Запрос возвращает данные о предалах квот в килобайтах
  83. GET_VIRTUAL_QUOTA = \
  84. ${lookup pgsql{\
  85. SELECT "users_tb"."quota" || 'K' FROM "users_tb" \
  86. INNER JOIN "domains_tb" ON ("users_tb"."domain_id" = "domains_tb"."id") \
  87. WHERE "username" = '${quote_pgsql:$local_part}' AND \
  88. "domains_tb"."domainname" = '${quote_pgsql:$domain}'}}
  89.  
  90.  
  91. ####################################################################
  92. # Основные параметры
  93. ####################################################################
  94.  
  95. # Данные для поключения к базе данных
  96. hide pgsql_servers = 127.0.0.1/vmail/vmail/1234
  97.  
  98. # Укажите здесь имя своего хоста. Правильно будет указать его в
  99. # формате FQDN. Если данный параметр не задан, то будет использован
  100. # результат вызова функции uname(). В большинстве случаев задавать
  101. # параметр не требуется, так как uname() возвращает верное значение.
  102.  
  103. primary_hostname = mx.in-ton.ru
  104.  
  105.  
  106. # В следующих трех параметрах задается два списка доменов и один
  107. # список хостов. На эти списки можно ссылаться далее в
  108. # конфигурационном файле, используя следующий синтаксис
  109. # +local_domains, +relay_to_domains, и +relay_from_hosts.
  110. # Во всех списках элементы разделены двоеточием:
  111.  
  112. domainlist local_domains = ${lookup pgsql{SELECT "domainname" FROM "domains_tb" WHERE "domainname" = '${quote_pgsql:$domain}' AND "active" = 'true'}}
  113. domainlist relay_to_domains = ${lookup pgsql{SELECT "domainname" FROM "domains_tb" WHERE "domainname" = '${quote_pgsql:$domain}' AND "active" = 'true'}}
  114. hostlist relay_from_hosts = localhost
  115. hostlist blacklist = ${lookup pgsql{SELECT "ip" FROM "blacklist_tb" WHERE "ip" = '${quote_pgsql:$sender_host_address}'}}
  116. hostlist badhosts = ${lookup pgsql{SELECT "ip" FROM "badhosts_tb" WHERE "ip" = '${quote_pgsql:$sender_host_address}'}}
  117.  
  118. # Большинство требований к правилам доступа может быть удовлетворено
  119. # заданием вышеуказанных опций. В боевых конфигурациях вам может
  120. # потребоваться изменить ACL,ки, которые находятся далее в этом файле.
  121.  
  122. # В первом параметре указываются ваши локальные домены, например:
  123. #
  124. # domainlist local_domains = my.first.domain : my.second.domain
  125. #
  126. # Вы можете использовать символ "@", что означает "имя локального хоста",
  127. # как сделано выше в файле. Это имя, которое задается с помощью
  128. # параметра primary_hostname. Если вам не нужны локальные доставки,
  129. # то удалите символ "@". Если вы хотите принимать сообщения с адресом
  130. # назначения в виде "user@[IP]", "user@[192.168.23.44]", то вы можете
  131. # добавить "@[]", как элемент списка локальных доменов. Так же вам
  132. # потребуется раскомментировать параметр "allow_domain_literals" ниже.
  133. # Такое не приветствуется в сегодняшнем интернете.
  134.  
  135. # Во втором параметре указываются домены, которым ваш хост может
  136. # пересылать письма. Если вы не хотите осуществлять пересылку, то
  137. # оставьте значение этого параметра пустым. Однако, если ваш хост
  138. # является резервным или шлюзом для некоторых доменов, то вы
  139. # должны указать их здесь. Например:
  140. #
  141. # domainlist relay_to_domains = *.myco.com : my.friend.org
  142. #
  143. # Это позволяет любому хосту пересылать письма через ваш, указанным
  144. # доменам. Смотрите секцию "Control of relaying" в документации, чтобы
  145. # получить больше информации.
  146.  
  147. # В третьем параметре указываются хосты, которым можно отправлять
  148. # письма в Интернет через ваш хост. Так здесь можно указать список
  149. # локальных сетей, ну и localhost. Например:
  150. #
  151. # hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16
  152. #
  153. # "/16" - это маска переменной длины (CIDR). Учтите, что вы должны
  154. # включить 127.0.0.1, чтобы разрешить процессам на вашей машине
  155. # отправить письма, используя адрес loopback.
  156.  
  157. # Эти три параметра могут содержать различные элементы, включая
  158. # wildcard имена, регулярные выражения, а так же данные из других
  159. # источников. За дополнительной информацией обращайтесь к
  160. # документации. Данные списки используются в ACL,ках для проверки
  161. # входящей почты. Имена ACL,ок заданы здесь:
  162.  
  163. acl_smtp_connect = acl_check_connect
  164. acl_smtp_mail = acl_check_mail
  165. acl_smtp_rcpt = acl_check_rcpt
  166. acl_smtp_predata = acl_check_predata
  167. acl_smtp_data = acl_check_data
  168.  
  169. # Вы не должны изменять эти параметры, если не понимаете
  170. # как работают ACL,ки.
  171.  
  172. # Если Exim скомпилирован с поддержкой content-scanning, то вы можете
  173. # отправлять входящие сообщения на проверку антивирусу. Для этого вам
  174. # потребуется сделать изменения в двух местах. Первое - здесь, где
  175. # вы определяете интерфейс к сканеру. Тут указан ClamAV; смотрите
  176. # документацию, чтобы узнать, как подключить другие антивирусы.
  177. # Второй место в ACL,ке acl_check_data (смотрите ниже).
  178.  
  179. #av_scanner = clamd:/var/run/clamav/clamd.sock
  180.  
  181. # Для проверки на спам, эта опция предоставляет интерфейс к SpamAssassin.
  182. # Так же вам необходимо будет сделать изменения в ACL,ке acl_check_data.
  183.  
  184. # spamd_address = 127.0.0.1 783
  185.  
  186.  
  187. # Если Exim скомпилирован с поддержкой TLS, то возможно вы захотите
  188. # задать следующие параметры, чтобы Exim позволял клиентам
  189. # устанавливать защищенные соединения. В секции аутентификаторов
  190. # ниже, находятся шаблоны конфигураций для аутентификации
  191. # пользователей открытым текстом. Аутентификация открытым текстом
  192. # будет безопасной, если соединение шифруется.
  193.  
  194. # Разрешить любому клиенту использовать TLS.
  195. tls_advertise_hosts = *
  196.  
  197. # Где Exim взять TLS сертификат и приватный ключ. Приватный ключ
  198. # не должен быть защищен паролем. Вы можете объединить сертификат
  199. # и приватный ключ в один файл, тогда вам понадобится только первый
  200. # параметр, в другом случае используйте оба параметра.
  201.  
  202. tls_certificate = /etc/exim4/ssl/server.crt
  203. tls_privatekey = /etc/exim4/ssl/server.key
  204.  
  205. # Для пользователей, которые могут отправить письма откуда угодно,
  206. # вам может понадобиться изменить порты, на которых Exim будет
  207. # принимать подключения. Например, если фаервол в удаленной сети
  208. # блочит 25 порт. Конечно, выделен стандартный порт в таком случае,
  209. # порт 587 (за деталями в RFC 4409). Почтовые клиенты Microsoft
  210. # не могут корректно работать в таком режиме, поэтому (если у вас
  211. # в сети есть такие продукты, то вы можете сделать TLS доступ для
  212. # пользователей).
  213.  
  214. daemon_smtp_ports = 25 : 465 : 587
  215. tls_on_connect_ports = 465
  216.  
  217.  
  218. # Укажите здесь домен, который будет добавляться к адресатам
  219. # в письмах, если там домен не указан. Домен может быть только один,
  220. # символ "@" писать не нужно. Например, "caesar@rome.example"
  221. # полный адрес, в котором указан пользователь и домен (то есть FQDN). Но
  222. # адрес "caesar" не полный (то есть это не FQDN), а просто имя пользователя.
  223. # По умолчанию не полные адреса принимаются только с локальных хостов.
  224. # Смотрите параметр recipient_unqualified_hosts, если вы хотите разрешить
  225. # принимать и добавлять домен в письмах от удаленных хостов. Если
  226. # этот параметр не задан, то используется значение параметра
  227. # primary_hostname.
  228.  
  229. qualify_domain = in-ton.ru
  230.  
  231.  
  232. # Если в письме не задан FQDN получателя (а только логин), то подставить
  233. # в письмо в адрес получателя указанный здесь домен. Если этот параметр
  234. # не задан, то используется значение параметра qualify_domain.
  235.  
  236. qualify_recipient = in-ton.ru
  237.  
  238.  
  239. # Раскомментируйте данный параметр, если вы хотите, чтобы Exim
  240. # принимал письма с адресатами вида "user@[10.11.12.13]". Это
  241. # не нарушает RFC, но в наше время такая плюшка ни к чему. Учтите,
  242. # что этот старый формат может использоваться спамерами. Если вам
  243. # действительно необходимо работать с такими письмами, то
  244. # раскомментируйте параметр и смотрите ниже роутер "domain_literal".
  245.  
  246. # allow_domain_literals
  247.  
  248.  
  249. # Не использовать указанные здесь идентификаторы для доставки почты.
  250. # Можно использовать имена пользователей, список разделяется двоеточием.
  251. # Попытка использования данных идентификаторов для передачи почты
  252. # будет отражена в логе паники, а доставка будет отложена. Есть еще
  253. # более строгий вариант этого параметра - вшивание в код при сборке
  254. # макроса (или переменной, что там не смотрел) FIXED_NEVER_USERS.
  255. # Список пользователей в FIXED_NEVER_USERS уже никак не изменить
  256. # после сборки Exim,а. Значением по умолчанию для FIXED_NEVER_USERS
  257. # является - "root", но чтобы быть абсолютно уверенным (что пользователь
  258. # root никак не задействуется), значение этого параметра по умолчанию
  259. # тоже "root".
  260.  
  261. # Учтите, что настройки по умолчанию не позволят доставлять почту руту,
  262. # как обычному пользователю. Но это не проблема, так как большинство
  263. # конфигураций имеет алиас, который перенаправляет письма для рута
  264. # на нужный адрес.
  265.  
  266. #exim_user = mailnull
  267. #exim_group = mailnull
  268. exim_user = mail
  269. exim_group = mail
  270. never_users = root
  271.  
  272.  
  273. # Следующий параметр заставляет Exim делать обратный запрос к DNS
  274. # для проверки IP адреса, с которого идет передача писем. Если вы
  275. # считаете, что это пустая трата времени или на это уходит слишком
  276. # много времени, то укажите здесь адреса, для которых нужно делать
  277. # такие запросы или закомментируйте/удалите этот параметр вообще.
  278.  
  279. host_lookup = *
  280.  
  281.  
  282. # Следующие параметры заставляют Exim делать обратные запросы (ident)
  283. # для входящих SMTP соединений (RFC 1413). Вы можете указать здесь
  284. # хосты, для которых необходимо делать данные запросы и задать
  285. # таймаут. Если выставить таймаут в 0, то данные запросы делаться
  286. # не будут. Вызовы RFC 1413 не требуют много ресурсов и являются
  287. # хорошим средством для выявления проблем с передаваемой почтой,
  288. # но могут возникнуть проблемы с некоторыми хостами из-за файерволов.
  289. # Так же может быть, что из-за таймаута Exim не будет знать, что
  290. # соединение закрыто, что вызовет задержки в работе. (Начиная с релиза
  291. # 4.61 таймаут уменьшен до 5 секунд.)
  292.  
  293. rfc1413_hosts = *
  294. rfc1413_query_timeout = 5s
  295.  
  296.  
  297. # По умолчанию Exim принимает только почту, в которой адресаты заданы
  298. # верно, то есть в FQDN. Если вы хотите, чтобы Exim работал с почтой
  299. # не имеющей адресатов в FQDN, то укажите здесь хосты с которых
  300. # можно отправлять такие письма. В таком случае, Exim просто добавит
  301. # к адресату значение параметра qualify_domain и/или qualify_recipient.
  302. #
  303. # sender_unqualified_hosts =
  304. # recipient_unqualified_hosts =
  305.  
  306.  
  307. # Если вы хотите, чтобы Exim поддерживал хак с процентом для некоторых
  308. # доменов, то раскомментируйте опцию ниже и укажите список доменов.
  309. # Данный хак позволяет использовать адрес вот такого вида x%y@z (где
  310. # z - один из указанных в этой опции доменов), который будут перенаправлен
  311. # на адрес x@y. Если домен z не из списка, то часть адреса x%y будет
  312. # интерпретирована как есть. В наши дни в использование данного хака
  313. # нет необходимости. Используйте данную фишку, если только она вам
  314. # действительно необходима.
  315. #
  316. # percent_hack_domains =
  317. #
  318. # Если вы включите данный функционал, то не забудьте так же поправить
  319. # правила в секции ACL - уберите проверку символа % в локальной части.
  320.  
  321.  
  322. # Когда Exim не может доставить рикошет к отправителю, то он
  323. # замораживает его. Есть так же другие обстоятельства, при которых
  324. # Exim может заморозить рикошет. Они остаются в очереди пока
  325. # не истечет заданное здесь время.
  326.  
  327. # Данная опция размораживает рикошет по прошествии 2-х дней,
  328. # далее Exim снова пытается его доставить и игнорирует любые
  329. # ошибки о доставке.
  330.  
  331. ignore_bounce_errors_after = 2d
  332.  
  333. # Замороженные сообщения удаляются из очереди, когда истечет
  334. # указанное здесь время.
  335.  
  336. timeout_frozen_after = 7d
  337.  
  338.  
  339. # По умолчанию, ожидающие сообщения в очереди Exim,а хранятся
  340. # в одной директории, называемой "input", которая находится в Exim
  341. # директории spool. (По умолчанию эта директория задается на этапе
  342. # компиляции и имеет такой путь - /var/spool/exim/.) Exim работает
  343. # быстрее, когда очередь сохраняет небольшой размер, но бывают
  344. # обстоятельства, при которых такое не всегда возможно. Если вы
  345. # раскомментируете параметр ниже, то сообщения будут храниться
  346. # в 62 поддиректориях в директории "input", вместо одной общей.
  347. # Поддиректории именуются 0, 1, ... A, B, ... a, b, ... z. Это хорошо
  348. # тем, что:
  349. # 1) если ваша ОС тормозит, когда в директории много файлов, то
  350. # такой подход поможет не допустить этого.
  351. # 2) Exim может обрабатывать очередь в каждой директории отдельно,
  352. # вместо одной общей, что приведет к увеличению производительности
  353. # при больших размерах очереди.
  354.  
  355. split_spool_directory = true
  356.  
  357.  
  358. # Если вы находитесь в такой части мире, где ASCII не достаточен
  359. # для большей части текста, то вы наверняка знакомы с RFC2047.
  360. # По умолчанию, Exim придерживается спецификации, которая
  361. # делает ограничение в 76 символов в строке.
  362. #
  363. # check_rfc2047_length = false
  364. #
  365. # Разрабы Exim,а получали много жалоб от российских админов о
  366. # проблемах в работе с включенной опцией, потому что некоторые
  367. # популярные почтовые клиенты имеют баги.
  368.  
  369. # If you wish to be strictly RFC compliant, or if you know you'll be
  370. # exchanging email with systems that are not 8-bit clean, then you may
  371. # wish to disable advertising 8BITMIME. Uncomment this option to do so.
  372. accept_8bitmime = true
  373.  
  374. # Не использовать протокол IPv6
  375. disable_ipv6 = true
  376. #
  377. freeze_tell = admin@in-ton.ru
  378. #helo_try_verify_hosts = *
  379. # не робит с некоторыми клиентами
  380. #helo_verify_hosts = *
  381. # Ограничение размера почтового сообщения
  382. message_size_limit = 5M
  383. # Разрешить только определенные шифры
  384. tls_require_ciphers = AES : 3DES
  385.  
  386. bounce_return_message = true
  387. bounce_return_body = true
  388. bounce_return_size_limit = 20K
  389.  
  390. smtp_accept_max = 50
  391. smtp_accept_max_per_connection = 100
  392. smtp_accept_max_per_host = 10
  393. smtp_connect_backlog = 50
  394. smtp_enforce_sync = yes
  395. smtp_banner = $smtp_active_hostname ESMTP MTA :)
  396.  
  397. # Что пишем в лог?
  398. log_selector = +all_parents \
  399. +connection_reject \
  400. +incoming_interface \
  401. +lost_incoming_connection \
  402. +received_recipients \
  403. +received_sender \
  404. +smtp_confirmation \
  405. +smtp_protocol_error \
  406. +smtp_syntax_error \
  407. -queue_run
  408.  
  409. #####################################################################
  410. # Параметры ACL
  411. #####################################################################
  412.  
  413. begin acl
  414.  
  415. # Проверки выполняются по порядку до первого попадания в правило,
  416. # где указано принять или отклонить письмо.
  417.  
  418. acl_check_connect:
  419. # Сохраняем в переменную содержимое обратной записи (PTR) для IP подключенного клиента
  420. warn set acl_c_reverse_address = ${escape:${lookup dnsdb{ptr=$sender_host_address}{$value}}}
  421.  
  422. accept
  423.  
  424. acl_check_mail:
  425. warn set acl_c_spamscore = 0
  426.  
  427. # Блочим клиентов из локального черного списка
  428. deny message = Your IP address in local blacklist
  429. hosts = +blacklist
  430.  
  431. deny message = Your IP address in local blacklist. Please contact with postmaster if you consider that your address got there by mistake.
  432. hosts = +badhosts
  433.  
  434. # Различные проверки HELO/EHLO
  435. #---------------------------------------------------------
  436.  
  437. # Накидываем сверху очков за неверный HELO/EHLO
  438. warn !authenticated = *
  439. hosts = !+relay_from_hosts
  440. condition = ${if or{\
  441. {eq{$sender_helo_name}{}}\
  442. {match{$sender_helo_name}{\N^\d+$\N}}\
  443. {match{$sender_helo_name}{\N^\w+$\N}}\
  444. {match{$sender_helo_name}{\N^_+$\N}}\
  445. }\
  446. }
  447. set acl_c_spamscore = ${eval:$acl_c_spamscore + 25}
  448. set acl_c_spamlog = $acl_c_spamlog Bad HELO/EHLO;
  449.  
  450. # Накидываем очки, за использование в HELO любых данных,
  451. # принадлежащих нашему серверу
  452. warn !authenticated = *
  453. hosts = !+relay_from_hosts
  454. set acl_m_islocal = ${lookup pgsql{SELECT "domainname" FROM "domains_tb" \
  455. WHERE "domainname" = '${quote_pgsql:$sender_helo_name}'}{yes}{no}}
  456. condition = ${if or{\
  457. {eq{$sender_helo_name}{$interface_address}}\
  458. {eqi{$sender_helo_name}{$primary_hostname}}\
  459. {eq{$acl_m_islocal}{yes}}\
  460. }\
  461. }
  462. set acl_c_spamscore = ${eval:$acl_c_spamscore + 50}
  463. set acl_c_spamlog = $acl_c_spamlog Your HELO is one of local domain name;
  464.  
  465. # Проверки DNS
  466. #---------------------------------------------------------
  467. # warn message = your reversed address is $acl_c_reverse_address
  468.  
  469. # Добавляем очков за то, что нет указателя в DNS для данного IP
  470. warn !authenticated = *
  471. hosts = !+relay_from_hosts
  472. condition = ${if eq{$acl_c_reverse_address}{}}
  473. set acl_c_spamscore = ${eval:$acl_c_spamscore + 30}
  474. set acl_c_spamlog = $acl_c_spamlog PTR == NULL;
  475.  
  476. # Добавляем еще очков за то, что обратная DNS запись не совпадает с прямой.
  477. warn !authenticated = *
  478. hosts = !+relay_from_hosts
  479. condition = ${if !eqi{$acl_c_reverse_address}{$sender_helo_name}}
  480. set acl_c_spamscore = ${eval:$acl_c_spamscore + 30}
  481. set acl_c_spamlog = $acl_c_spamlog PTR != HELO;
  482.  
  483. # Добавляем очков за то, что IP клиента из диапазона динамических адресов
  484. warn !authenticated = *
  485. hosts = !+relay_from_hosts
  486. condition = ${lookup{$acl_c_reverse_address}wildlsearch{EXTRA_PREFIX/dynamic_pools}{yes}{no}}
  487. set acl_c_spamscore = ${eval:$acl_c_spamscore + 50}
  488. set acl_c_spamlog = $acl_c_spamlog PTR in dynamic pools;
  489.  
  490. # Проверка SPF
  491. #---------------------------------------------------------
  492.  
  493. # Накидываем очки за попытку отправить почту с сервера,
  494. # не указанного в SPF
  495. # warn !authenticated = *
  496. # hosts = !+relay_from_hosts
  497. # spf = fail : softfail
  498. # set acl_c_spamscore = ${eval:$acl_c_spamscore + 50}
  499. # set acl_c_spamlog = $acl_c_spamlog SPF fail;
  500.  
  501. # Накидываем немного очков за отсутствие SPF
  502. # warn !authenticated = *
  503. # hosts = !+relay_from_hosts
  504. # spf = none
  505. # set acl_c_spamscore = ${eval:$acl_c_spamscore + 10}
  506. # set acl_c_spamlog = $acl_c_spamlog SPF none;
  507.  
  508. # Проверка IP в черных списках. За каждое срабатывание правила
  509. # накидываем еще немного очков.
  510. #---------------------------------------------------------
  511. warn !authenticated = *
  512. hosts = !+relay_from_hosts
  513. dnslists = sbl-xbl.spamhaus.org
  514. add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  515. set acl_c_spamscore = ${eval:$acl_c_spamscore+25}
  516. set acl_c_spamlog = $acl_c_spamlog Blacklist sbl-xbl.spamhaus.org;
  517.  
  518. warn !authenticated = *
  519. hosts = !+relay_from_hosts
  520. dnslists = relay.mail-abuse.org
  521. add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  522. set acl_c_spamscore = ${eval:$acl_c_spamscore+25}
  523. set acl_c_spamlog = $acl_c_spamlog Blacklist relay.mail-abuse.org;
  524.  
  525. warn !authenticated = *
  526. hosts = !+relay_from_hosts
  527. dnslists = bl.spamcop.net
  528. add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  529. set acl_c_spamscore = ${eval:$acl_c_spamscore+25}
  530. set acl_c_spamlog = $acl_c_spamlog Blacklist bl.spamcop.net;
  531.  
  532. warn !authenticated = *
  533. hosts = !+relay_from_hosts
  534. dnslists = relays.ordb.org
  535. add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  536. set acl_c_spamscore = ${eval:$acl_c_spamscore+25}
  537. set acl_c_spamlog = $acl_c_spamlog Blacklist relays.ordb.org;
  538.  
  539. warn !authenticated = *
  540. hosts = !+relay_from_hosts
  541. dnslists = dns.rfc-ignorant.org
  542. add_header = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  543. set acl_c_spamscore = ${eval:$acl_c_spamscore+25}
  544. set acl_c_spamlog = $acl_c_spamlog Blacklist dns.rfc-ignorant.org;
  545.  
  546. # Проверяем авторизованного пользователя на предмет подмены адреса отправителя
  547. deny message = Address ($sender_address) does not match with authenticated data ($authenticated_id). Check your email program settings.
  548. authenticated = *
  549. condition = ${if !eq{$sender_address}{$authenticated_id}{yes}{no}}
  550.  
  551. accept
  552.  
  553. # Данная ACL используется для каждой команды RCPT при получении писем.
  554.  
  555. acl_check_rcpt:
  556.  
  557. # Принять, если отправитель - локальный хост (т.е. не через TCP/IP).
  558.  
  559. accept hosts = :
  560. control = dkim_disable_verify
  561.  
  562. ###################################################################
  563. # Следующая секция ACL проверяет локальную часть адреса на предмет
  564. # содержания символов [@%!/|.(точка)] в правильных местах.
  565. #
  566. # Символы кроме точек часто находятся не на своих местах, такое часто
  567. # делают люди, которые надеются обойти ограничения. Поэтому, несмотря
  568. # на то, что они допустимы в локальных частях, эти правила блокируют
  569. # такие попытки.
  570. #
  571. # Пустые компоненты адреса (случай, когда в адресе стоят две точки
  572. # подряд) запрещены в RFC 2822, но Exim позволяет обойти такое
  573. # ограничение, потому что они встретились (х/з как тут перевести:
  574. # ....but Exim allows them because they have been encountered).
  575. # (Предполагается, что адрес имеет вид
  576. # "firstinitial.secondinitial.familyname", но что делать тем кто не имеет
  577. # "secondinitial"). Однако, локальная часть адреса, начинающаяся с
  578. # точки или содержащая /../ может доставить неприятности, если
  579. # используется как часть файла (например, для списка рассылки).
  580. # Такое же замечание справедливо и для локальных частей,
  581. # которые содержат наклонные черты. Символ переадресации
  582. # вывода (<, |, >) может также доставить проблемы, если локальная
  583. # часть легкомысленно включена в командную строку оболочки.
  584. #
  585. # В связи с этим для проверки используется два правила. Первое
  586. # используется для писем направленных для локальных доменов.
  587. # Строка "domains = +local_domains" реализовывает сказанное:
  588. # только локальные домены. Правило блокирует локальные части,
  589. # начинающиеся с точки или содержащие символы @ % ! / или |.
  590. # Если у вас есть локальные учетки имеющие в названии данные
  591. # символы, то вам необходимо модифицировать данное правило.
  592.  
  593. deny message = Restricted characters in address
  594. domains = +local_domains
  595. local_parts = ^[.] : ^.*[@%!/|]
  596.  
  597. # Второе правило применяется для остальных доменов и оно
  598. # не такое строгое как предыдущее.
  599. # Строка "domains = !+local_domains" указывает для каких доменов
  600. # применять правило. Данное правило позволяет локальным
  601. # пользователям отправлять письма во внешний мир, где адресаты
  602. # могут иметь косую или вертикальную черту в локальной части.
  603. # Так же правило блокирует адреса, локальная часть которых
  604. # начинается с точки, косой или вертикальной черты, но допускает
  605. # их использование в любом другом месте локальной части.
  606. # Локальная часть такого вида - /../ запрещена. Использование
  607. # символов @ % и ! запрещено, как и в предыдущем правиле.
  608. # Это сделано, чтобы локальные пользователи (или вирусы на их
  609. # компьютерах) не могли каким-либо образом осуществить
  610. # атаку на удаленный хост.
  611.  
  612. deny message = Restricted characters in address
  613. domains = !+local_domains
  614. local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
  615. ###################################################################
  616.  
  617. # Добавляем очков за то, что адрес отправителя совпадает с адресом получаетеля
  618. warn condition = ${if eq{$sender_address}{$local_part@$domain}{yes}{no}}
  619. set acl_c_spamscore = ${eval:$acl_c_spamscore+20}
  620. set acl_c_spamlog = $acl_c_spamlog Sender == recipient;
  621.  
  622. # Добавляем очков за отправку письма на адрес-ловушку
  623. # P.S. В качестве адресов ловушек используются давно забытые заброшенные
  624. # адреса или специально созданные. То есть это обычный почтовый ящик.
  625. warn local_parts = spam : spamtrap
  626. domains = +local_domains
  627. set acl_c_spamscore = ${eval:$acl_c_spamscore+50}
  628. set acl_c_spamlog = $acl_c_spamlog Spamtrap;
  629.  
  630. # Отправляем на следующую ACL,ку клиентов, набравших достаточное
  631. # количество очков для попадения в локальный черный список.
  632. accept condition = ${if >={$acl_c_spamscore}{100}{yes}{no}}
  633.  
  634. # Принимать письма для пользователя postmaster для любого локального
  635. # домена независимо от источника и без проверки отправителя.
  636.  
  637. #accept local_parts = postmaster
  638. # domains = +local_domains
  639.  
  640. # Не принимать письма, если не удалось проверить отправителя.
  641.  
  642. #require verify = sender
  643.  
  644. deny !authenticated = *
  645. hosts = +relay_from_hosts
  646.  !verify = sender
  647.  
  648. # Добавляем очков за невозможность проверки существования адреса отправителя
  649. warn hosts = !+relay_from_hosts
  650.  !verify = sender/callout=3m,defer_ok
  651. set acl_c_spamscore = ${eval:$acl_c_spamscore+20}
  652. set acl_c_spamlog = $acl_c_spamlog Callout error;
  653.  
  654. # Проверять получателя во входящих письмах. Эта правило будет
  655. # проводить проверку локальной части для локальных доменов, а
  656. # а для удаленных проверку доменной части. Единственным способом
  657. # проверять локальную часть для удаленных доменов использовать
  658. # механизм обратных вызовов (добавить /callout), но сначала
  659. # прочитайте в документации про этот механизм.
  660.  
  661. require verify = recipient
  662.  
  663. # Принимать письма, которые приходят с хостов, для которых этот хост
  664. # является релеем. Подразумевается, что эти хосты скорее всего MUA,
  665. # так что здесь установлен модификатор control=submission, который
  666. # заставляет Exim работать в режиме передачи. Это позволит подправить
  667. # некоторые ошибки в письме, например, нет заголовка Date. Если этот
  668. # хост является релеем для других MTA, то вам может понадобиться
  669. # отключить эту плюшку. Если вы хотите пересылать письма с MTA
  670. # и в "режиме передачи" с MUA, то вы должны разделить это правило
  671. # на два и обрабатывать такие письма отдельно.
  672.  
  673. accept hosts = +relay_from_hosts
  674. control = submission
  675. control = dkim_disable_verify
  676.  
  677. # Принимать сообщение, если оно отправлено клиентом, прошедшим
  678. # аутентификацию.
  679.  
  680. accept authenticated = *
  681. control = submission
  682. control = dkim_disable_verify
  683.  
  684. # Запрещаем пересылать письма через нашу машину неизвестным
  685. # хостам.
  686.  
  687. require message = relay not permitted
  688. domains = +local_domains : +relay_to_domains
  689.  
  690. ###################################################################
  691. # Этот тест закомментирован, потому что подходит не для каждого случая.
  692. # Если вы включите этот тест, то будет производится проверка
  693. # Client SMTP Authorization (csa) хоста отправителя. Эта проверка включает
  694. # в себя просмотр записей SRV в DNS. CSA предложен для внедрения
  695. # в Интернет в мае 2005. Вы можете добавить дополнительные проверки
  696. # к этому тесту для того, чтобы не проверять какие-нибудь хосты методом
  697. # CSA.
  698. #
  699. # require verify = csa
  700. ###################################################################
  701.  
  702. accept
  703.  
  704. acl_check_predata:
  705. # Запрещаем письма, отправленные нескольким адресатам от "пустого" отправителя.
  706. deny message = Sorry, sender address <> disallowed for many rcpt commands
  707. senders = :
  708. condition = ${if >{$rcpt_count}{1}{yes}{no}}
  709.  
  710. # Я пишу в лог дополнительную ифномарцию о сообщениях, которые
  711. # набрали немного спам очков, чтобы добавить еще какие-нибудь проверки,
  712. # если это сообщение все же окажется спамом.
  713. warn condition = ${if <{$acl_c_spamscore}{50}{yes}{no}}
  714. condition = ${if >{$acl_c_spamscore}{0}{yes}{no}}
  715. logwrite = Debug: $acl_c_spamlog
  716.  
  717. # Принимаем сообщение, которые набрали мало спам очков
  718. accept condition = ${if <{$acl_c_spamscore}{50}{yes}{no}}
  719.  
  720. # Помучаем хост небольшой задержкой
  721. warn delay = 20s
  722.  
  723. # Блочим клиентов с большим количеством спам очков и добавляем их
  724. # в локальный черный список.
  725. deny message = Sorry, your spam score very high
  726. condition = ${if >={$acl_c_spamscore}{100}{yes}{no}}
  727. condition = ${lookup pgsql{\
  728. DELETE FROM "blacklist_tb" WHERE "ip" = '$sender_host_address';\
  729. INSERT INTO "blacklist_tb" VALUES ('$sender_host_address', DEFAULT)}{yes}{yes}}
  730.  
  731. # Реализация серого списка. Сюда попадают клиенты, набравшие недостаточное
  732. # количество спам очков для попадания в локальный черный список, но
  733. # превысившие минимальный порог для прохождения письма. Эти хосты нельзя
  734. # отнести ни к легитимным ни к спам хостам, поэтому лучше еще помучить
  735. # их серым списком.
  736. #---------------------------------------------------------
  737. accept condition = ${lookup pgsql{\
  738. SELECT "ip" FROM "whitelist_tb" WHERE "ip" = '$sender_host_address' \
  739. AND "addrhash" = md5('$sender_address')\
  740. }{yes}{no}}
  741.  
  742. defer message = Message deferred. Your address already exists in Greylist. Try again later.
  743. condition = ${lookup pgsql{\
  744. SELECT "ip" FROM "greylist_tb" WHERE "ip" = '$sender_host_address' \
  745. AND "addrhash" = md5('$sender_address$local_part@$domain') \
  746. AND "ctime" + 1740 > date_part('epoch'::text, now())\
  747. }{yes}{no}}
  748. delay = ${eval:$acl_c_spamscore/2}s
  749.  
  750. accept condition = ${lookup pgsql{\
  751. SELECT "ip" FROM "greylist_tb" WHERE "ip" = '$sender_host_address' \
  752. AND "addrhash" = md5('$sender_address$local_part@$domain') \
  753. AND "ctime" + 1740 <= date_part('epoch'::text, now())\
  754. }{yes}{no}}
  755. condition = ${lookup pgsql{\
  756. DELETE FROM "greylist_tb" WHERE "ip" = '$sender_host_address' \
  757. AND "addrhash" = md5('$sender_address$local_part@$domain'); \
  758. INSERT INTO "whitelist_tb" VALUES('$sender_host_address', \
  759. md5('$sender_address'), DEFAULT)\
  760. }{yes}{yes}}
  761.  
  762. defer message = Message deferred. Your address added to Greylist. Try again later.
  763. condition = ${lookup pgsql{\
  764. INSERT INTO "greylist_tb" VALUES('$sender_host_address',\
  765. md5('$sender_address$local_part@$domain'), DEFAULT);\
  766. }{yes}{yes}}
  767. delay = ${eval:$acl_c_spamscore/2}s
  768.  
  769. deny
  770.  
  771. # Этот ACL используется после того, как получено тело письма. В этом ACL
  772. # вы можете проверять тело письма или его заголовки, в частности здесь
  773. # можно отправить тело письма на проверку антивирусом или спам сканером.
  774. # Примеры некоторых тестов приведены ниже и закомментированы.
  775. # Без этих тестов данная ACL принимает все сообщения. Если вы хотите
  776. # использовать данные тесты, то Exim должен быть собран с
  777. # соответствующими опциями (WITH_CONTENT_SCAN=yes in Local/Makefile).
  778.  
  779. #acl_check_data:
  780.  
  781. # Блочить письма с вирусами. Чтобы использовать данный тест
  782. # вы должны задать параметр av_scanner.
  783. # deny malware = *
  784. # message = This message contains a virus ($malware_name).
  785.  
  786. # Добавить заголовки о набранных очках в спам тестах. Чтобы использовать
  787. # данный тест вы должны установить SpamAssassin и задать
  788. # параметр spamd_address.
  789. #
  790. # warn spam = nobody
  791. # add_header = X-Spam_score: $spam_score\n\
  792. # X-Spam_score_int: $spam_score_int\n\
  793. # X-Spam_bar: $spam_bar\n\
  794. # X-Spam_report: $spam_report
  795.  
  796. # Блочить письма с неверным синтаксисом заголовков. При очень большом потоке
  797. # писем лучше отключить эту проверку.
  798. # deny message = Invalid header syntax
  799. #  !verify = header_syntax
  800.  
  801. # Добавляем заголовок в письмо с количеством набранным спам очков
  802. # warn add_header = X-Spamscore: $acl_c_spamscore
  803.  
  804. # Принять сообщение.
  805. # accept
  806.  
  807.  
  808.  
  809. #####################################################################
  810. # Параметры роутеров
  811. #####################################################################
  812. # Здесь важен порядок, в котором заданы роутеры.
  813. # Адрес передается по порядку в роутеры до тех пор,
  814. # пока какой-нибудь не подойдет.
  815. #####################################################################
  816.  
  817. begin routers
  818.  
  819. # Этот роутер направляет почту на удаленные машины через SMTP,
  820. # когда получатель указан в виде IP адреса, например,
  821. # <user@[192.168.35.64]>. В RFC требуется, чтобы почтовик умел
  822. # работать с такими письмами. Однако, в наши дни такие адреса
  823. # практически нигде не используются, разве что только спамерами.
  824. # Поэтому данный роутер по умолчанию закомментирован. Если
  825. # вы его раскомментируете, то вы также должны раскомментировать
  826. # параметр allow_domain_literals, тобы Exim не считал такие адреса
  827. # синтаксически неверными.
  828.  
  829. # domain_literal:
  830. # driver = ipliteral
  831. # domains = ! +local_domains
  832. # transport = remote_smtp
  833.  
  834.  
  835. # Данный роутер отправляет письма, если они не предназначены
  836. # локальным, на удаленные домены. Знак восклицания в записи
  837. # "domains = ! +local_domains" означает отрицание, что можно
  838. # читать как "не".
  839. #
  840. # Любой домен, адрес которого 0.0.0.0 или 127.0.0.0/8 обрабатывается
  841. # так, как будто у него нет DNS записи. Учтите, адрес 0.0.0.0 тоже самое,
  842. # что и 0.0.0.0/32, который означает в большинстве систем, что это
  843. # локальный хост. Если DNS запрос не дал результатов, то адрес
  844. # не направляется в другие роутеры, так как здесь указан параметр
  845. # no_more => вылазит ошибка, что адрес недоступен.
  846.  
  847. dnslookup:
  848. driver = dnslookup
  849. domains = ! +local_domains
  850. transport = remote_smtp
  851. ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  852. no_more
  853.  
  854.  
  855. # Остальные роутеры обрабатывают адреса в локальных доменах,
  856. # которые определены в "domainlist local_domains".
  857.  
  858.  
  859. # Роутер обрабатывает алиасы, ища их в файле с именем
  860. # SYSTEM_ALIASES_FILE. Значение подставляется автоматом
  861. # на этапе сборки. По умолчанию файл располагается здесь:
  862. # /etc/aliases. Если у вас данный файл располагается в другом
  863. # месте, то вам необходимо указать правильный путь до него
  864. # в параметре "data".
  865. #
  866. ##### NB Данный файл должен всегда существовать в системе.
  867. ##### NB Практически в каждой Unix системе он есть, потому что
  868. ##### NB используется Sendmail. В наши дни, в некоторых системах
  869. ##### NB данный файл может отсутствовать. Файл должен
  870. ##### NB содержать как минимум одну запись - для "postmaster".
  871. #
  872. # Если ваш алис разворачивается в трубу (pipe) или файл,тогда вам
  873. # нужно задать пользователя, под которым будет происходить работа
  874. # с трубой или файлом. Если вам необходимо, то вы можете
  875. # раскомментировать (и изменить) опцию "user" ниже, а так же
  876. # добавить опцию "group". Есть другой способ - указать опцию
  877. # "user" в транспортах.
  878.  
  879. system_aliases:
  880. driver = redirect
  881. allow_fail
  882. allow_defer
  883. data = ${lookup{$local_part}lsearch*{/etc/aliases}}
  884. user = mail
  885. group = mail
  886. file_transport = address_file
  887. pipe_transport = address_pipe
  888.  
  889. virtual_aliases:
  890. driver = redirect
  891. allow_fail
  892. allow_defer
  893. data = CHECK_VIRTUAL_ALIASES
  894. user = mail
  895. group = mail
  896.  
  897. # Этот роутер пересылает почту согласно файлу .forward в директории
  898. # пользователя. Если вы хотите фильтровать почту, тогда файл
  899. # .forward должен начинаться со строки "# Exim filter" или "# Sieve filter",
  900. # так же необходимо раскомментировать опцию "allow_filter".
  901.  
  902. # Опция no_verify нужна для того, чтобы пропустить данный роутер,
  903. # когда Exim проверяет адрес. Аналогично, опция no_expn нужна,
  904. # чтобы роутер пропускался, когда Exim обрабатывает команду EXPN.
  905.  
  906. # Если вы хотите, чтобы роутер понимал локальную часть адреса
  907. # с суффиксами (символом "-" или "+") так, как будто их нет, то
  908. # раскомментируйте пару опций local_part_suffix. Например, адрес
  909. # xxxx-foo@your.domain будет воспринят как xxxx@your.domain
  910. # данным роутером. Если вы раскомментируете эти опции, то вам
  911. # нужно будет сделать подобные изменения в роутере localuser
  912. # (так надо, потому что данный роутер не используется при проверке
  913. # существования пользователя).
  914.  
  915. # Опция check_ancestor означает, что если файл .forward генерирует
  916. # адрес, который является предыдущим для этого (то есть обратно
  917. # отправителю), то такое правило будет просто опущено.
  918. # Предотвращает случай, когда есть такие алиасы A -> B, а у B
  919. # B -> A.
  920.  
  921. # Один из трех транспортов используется при пересылке,
  922. # в зависимости от указанных правил в файле .forward.
  923.  
  924. #userforward:
  925. # driver = redirect
  926. # check_local_user
  927. # local_part_suffix = +* : -*
  928. # local_part_suffix_optional
  929. # file = $home/.forward
  930. # allow_filter
  931. # no_verify
  932. # no_expn
  933. # check_ancestor
  934. # file_transport = address_file
  935. # pipe_transport = address_pipe
  936. # reply_transport = address_reply
  937. # condition = ${if exists{$home/.forward} {yes} {no} }
  938.  
  939. # Данный роутер срабатывает, если письмо пришло для зарегистрированного
  940. # пользователя в системе. Если доставка не удалась, то генерируется
  941. # сообщение об ошибке - "Unknown user".
  942.  
  943. virtual_user:
  944. driver = accept
  945. transport = dovecot_delivery
  946. domains = +local_domains
  947. condition = CHECK_VIRTUAL_USER
  948. no_more
  949.  
  950. #####################################################################
  951. # Настройка транспортов
  952. #####################################################################
  953. # Порядок транспортов не имеет значения.
  954. # Только один транспорт отрабатывает при каждой доставке.
  955. #####################################################################
  956.  
  957. # Транспорт используется только после обработки письма роутером.
  958.  
  959. begin transports
  960.  
  961.  
  962. # Этот транспорт используется для доставки писем по SMTP.
  963. # Практически для всех доменов я использую технологию DKIM.
  964. # Подписывать сообщение или нет, определяется в параметре
  965. # dkim_private_key, если он будет пуст, либо 0, либо false, то
  966. # сообщение подписано не будет.
  967. #
  968. # Сгенерировать ключ для домена можно так:
  969. # openssl genrsa -out domain.key 1024
  970. # Вывод конмады (открытый ключ):
  971. # openssl rsa -in info-x.org.key -pubout
  972. # Разместить в DNS записе домена, например:
  973. # _dkim._domainkey.example.net IN TXT "v=DKIM1; k=rsa; t=s; p=your_key"
  974. # Описание ключей можно без проблем найти в RFC.
  975. # Полезным будет добавление еще одной записи в зону:
  976. # _adsp._domainkey.example.net IN TXT "dkim=all"
  977. # Данная запись означает, что все сообщения для данного домена
  978. # должны быть подписаны. То есть принимающая сторона, увидев
  979. # данную запись будет принимать соответствующие решения, если
  980. # например, вдруг письмо, отправленное с этого домена окажется
  981. # не подписанным.
  982.  
  983. remote_smtp:
  984. driver = smtp
  985. dkim_domain = ${lc:${domain:$h_from:}}
  986. dkim_selector = mail
  987. dkim_private_key = ${if exists{DKIM_DIRECTORY/${dkim_domain}.key}{DKIM_DIRECTORY/${dkim_domain}.key}{false}}
  988. dkim_canon = relaxed
  989. dkim_strict = yes
  990.  
  991.  
  992. # Этот транспорт используется для доставки писем в ящики локальных
  993. # пользователей в традиционном для BSD формате - mailbox.
  994. # По умолчанию процесс доставки запускается с правами пользователя
  995. # (uid, gid), поэтому необходимо, чтобы был установлен sticky бит
  996. # на директорию /var/mail. В некоторых системых доставка
  997. # осуществляется по другому - вместо sticky бита используется общая
  998. # группа. Закомментированные опции показывают как такое может быть
  999. # реализовано в Exim.
  1000.  
  1001. #local_delivery:
  1002. # driver = appendfile
  1003. # file = /var/mail/$local_part
  1004. # delivery_date_add
  1005. # envelope_to_add
  1006. # return_path_add
  1007. # group = mail
  1008. # user = $local_part
  1009. # mode = 0660
  1010. # no_mode_fail_narrower
  1011.  
  1012. # Транспорт доставки писем для виртуальных пользователей.
  1013. # При использовании данного транспорта Exim сам будет сохранять письма
  1014. # в почтовый ящик.
  1015. # Раньше у меня он работал так, но щас письма доставляются с использованием
  1016. # Dovecot LDA. Поэтому этот транспорт не используется в данной конфигурации.
  1017. # Удалять не стал, вдруг пригодится где-нибудь.
  1018. #virtual_delivery:
  1019. # driver = appendfile
  1020. # create_directory
  1021. # delivery_date_add
  1022. # envelope_to_add
  1023. # return_path_add
  1024. # message_prefix =
  1025. # message_suffix =
  1026. # maildir_format
  1027. # maildir_tag = ,S=$message_size
  1028. # maildir_use_size_file
  1029. # mode = 0600
  1030. # directory_mode = 0700
  1031. # group = GET_VIRTUAL_GROUP
  1032. # user = GET_VIRTUAL_USER
  1033. # directory = GET_VIRTUAL_DIR
  1034. # quota = GET_VIRTUAL_QUOTA
  1035. # quota_size_regex = ,S=(\d+)
  1036. # quota_is_inclusive = false
  1037.  
  1038. # Транспорт доставки писем для виртуальных пользователей.
  1039. # Сохранение писем в ящик возложено на плечи Dovecot LDA.
  1040. dovecot_delivery:
  1041. driver = pipe
  1042. command = /usr/lib/dovecot/dovecot-lda -e -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
  1043. message_prefix =
  1044. message_suffix =
  1045. delivery_date_add
  1046. envelope_to_add
  1047. return_path_add
  1048. return_fail_output
  1049. log_output
  1050. umask = 077
  1051. group = GET_VIRTUAL_GROUP
  1052. user = GET_VIRTUAL_USER
  1053. temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
  1054.  
  1055. # Этот транспорт используется при доставке писем, адресаты
  1056. # которых были сгенерированы через файл алиасов или .forward.
  1057. # Если pipe что-нибудь выводит на стандартный дескриптор вывода,
  1058. # то этот вывод используется как сообщение об ошибке
  1059. # и направляется отправителю. Если вы хотите, чтобы сообщение
  1060. # отправлялось только в случае ошибки, то используйте опцию
  1061. # return_fail_output вместо return_output. если оно вам нужно, то
  1062. # можете сделать различные транспорты для файла алиасов
  1063. # и файла .forward.
  1064.  
  1065. address_pipe:
  1066. driver = pipe
  1067. return_output
  1068.  
  1069.  
  1070. # Этот транспорт используется для доставки писем в файлы,
  1071. # адреса которых были сгенерированы файлом алиасов или
  1072. # файлом .forward.
  1073.  
  1074. address_file:
  1075. driver = appendfile
  1076. delivery_date_add
  1077. envelope_to_add
  1078. return_path_add
  1079.  
  1080.  
  1081. # Транспорт используется для обработки автоответов.
  1082.  
  1083. address_reply:
  1084. driver = autoreply
  1085.  
  1086.  
  1087.  
  1088. ######################################################################
  1089. # Конфигурация повторных попыток передачи
  1090. ######################################################################
  1091.  
  1092. begin retry
  1093.  
  1094. # Это единственное правило применяется для всех доменов и для всех типах
  1095. # ошибок. Повторные попытки будут происходить каждые 15 минут в течении
  1096. # 2 часов. После чего эти интервалы будут увеличены, начиная с 1 часа и
  1097. # увеличивая каждый раз в 1.5 раза до 16 часов. После повторная передача
  1098. # будет производиться каждые 6 часов, до тех пор, пока не пройдет 4 дня
  1099. # с первой неудачной попытки.
  1100.  
  1101. # Осторожно: Если вы не сконфигурируете повторную передачу (т.е., если
  1102. # этой секции не будет или она будет пустой), то Exim не будет делать
  1103. # повторных попыток передачи вообще. Поэтому, не удаляйте это правило,
  1104. # если в этом нет необходимости.
  1105.  
  1106. # Address or Domain Error Retries
  1107. # ----------------- ----- -------
  1108.  
  1109. * * F,2h,15m; G,16h,1h,1.5; F,4d,6h
  1110.  
  1111.  
  1112.  
  1113. ######################################################################
  1114. # Параметры перезаписи
  1115. ######################################################################
  1116.  
  1117. # There are no rewriting specifications in this default configuration file.
  1118.  
  1119. begin rewrite
  1120.  
  1121.  
  1122.  
  1123. ######################################################################
  1124. # Параметры аутентификации
  1125. ######################################################################
  1126.  
  1127. # Следующие аутентификаторы поддерживают аутентификацию открытым
  1128. # текстом, используя стандартные механизмы PLAIN и LOGIN. Данные
  1129. # механизмы поддерживает большинство почтовых клиентов.
  1130. #
  1131. # Аутентификаторы не настроены до конца, поэтому вам необходимо
  1132. # задать параметр server_condition, чтобы Exim мог проверять
  1133. # переданные учетные данные.
  1134. #
  1135. # По умолчанию в правиле RCPT ACL есть проверка на предмет
  1136. # зареганого пользователя и если он прошел его, то письмо будет принято
  1137. # независимо от того, окуда оно будет отправляться.
  1138.  
  1139. begin authenticators
  1140.  
  1141. # PLAIN метод. Клиент отправляет идентификатор сессии (который тут
  1142. # не используется), логин и пароль. После, доступ к логину и паролю
  1143. # можно получить через переменные $auth2 и $auth3 и проверить
  1144. # их корректность.
  1145.  
  1146. # Аутентификация пользователя проводится средствами Dovecot.
  1147. # Правило server_advertise_condition = ${if def:tls_cipher } запрещает
  1148. # пользователям проходить аутентификаю, если соединение не защищено.
  1149.  
  1150. PLAIN:
  1151. driver = dovecot
  1152. public_name = PLAIN
  1153. server_set_id = $auth1
  1154. server_socket = /var/run/dovecot/auth-client
  1155. server_advertise_condition = ${if def:tls_cipher }
  1156.  
  1157. # LOGIN метод. Здесь нет идентификатора сессии, поэтому логин
  1158. # и пароль доступны через переменные $auth1 и $auth2.
  1159.  
  1160. # Аутентификация пользователя проводится средствами Dovecot.
  1161. # Правило server_advertise_condition = ${if def:tls_cipher } запрещает
  1162. # пользователям проходить аутентификаю, если соединение не защищено.
  1163.  
  1164. LOGIN:
  1165. driver = dovecot
  1166. public_name = LOGIN
  1167. server_set_id = $auth1
  1168. server_socket = /var/run/dovecot/auth-client
  1169. server_advertise_condition = ${if def:tls_cipher }
  1170.  
  1171.  
  1172. ######################################################################
  1173. # Конфигурация local_scan()
  1174. ######################################################################
  1175.  
  1176. # Если вы собрали Exim с поддержкой функции local_scan(), которая
  1177. # содержит таблицы для приватных опций, то здесь вы можете указать их.
  1178. # Не забудьте раскомментировать строку с "begin". По умолчанию
  1179. # закомментирована, потому что вылезет ошибка, если Exim собран
  1180. # без данной плюшки.
  1181.  
  1182. # begin local_scan
  1183.  
  1184.  
  1185. # Конец конфигурационного файла

Содержимое файла /etc/exim4/extra/dynamic_pools:

  1. ^.*([0-9]+).([0-9]+).([0-9]+).([0-9]+).*
  2. ^.*dhcp.*
  3. ^.*host.*
  4. ^.*dsl.*
  5. ^.*dial.*
  6. ^.*broad.*
  7. ^.*band.*
  8. ^.*user.*
  9. ^.*pool.*
  10. ^.*client.*
  11. ^.*cable.*
  12. ^.*pppoe.*
  13. ^.*hsd.*
  14. ^.*dyn.*
  15. ^.*static.*
  16. ^.*ppp.*
  17. ^.*speedy.*
  18. ^.*customer.*

Выше я говорил, что записи из таблиц (необходимых для работы серого списка) подчищаются скриптом, который у меня запускается раз в день. Собственно, вот код этого скрипта (для его работы необходим установленный модуль p5-DBD-Pg):

  1. #!/usr/bin/env perl
  2.  
  3. use DBI;
  4. use strict;
  5. use warnings;
  6.  
  7. my $db_user = 'vmail';
  8. my $db_pass = 'vmail';
  9. my $db_host = '127.0.0.1';
  10. my $db_port = 5432;
  11. my $db_dsn = "DBI:Pg:db=mail_system;host=$db_host;port=$db_port";
  12. my %con_attr = (
  13. 'RaiseError' => 1,
  14. 'PrintError' => 1,
  15. 'AutoCommit' => 1
  16. );
  17.  
  18. my $query = '
  19. DELETE FROM "blacklist_tb" WHERE "ctime" <= date_part($$epoch$$, now()) - 1209600;
  20. DELETE FROM "greylist_tb" WHERE "ctime" <= date_part($$epoch$$, now()) - 604800;
  21. DELETE FROM "whitelist_tb" WHERE "ctime" <= date_part($$epoch$$, now()) - 2678400;
  22. ';
  23.  
  24. my $dbh = DBI->connect($db_dsn, $db_user, $db_pass, \%con_attr) ||
  25. die("Can't connect to databse: $DBI::errstr\n");
  26.  
  27. $dbh->do($query) || die("Can't execute query: ".$dbh->errstr);
  28.  
  29. $dbh->disconnect();
  30.  
  31. exit(0);

Запуск и проверка конфигурации

Теперь можно запустить сервис:

  1. # service exim4 start
  2. # netstat -anp | grep exim
  3. tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 15760/exim4
  4. tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 15760/exim4
  5. tcp 0 0 0.0.0.0:465 0.0.0.0:* LISTEN 15760/exim4

Если сервис не запустился, то смотрите логи (которые распологаются в /var/log/exim4) и ищите проблему. Теперь проверим работоспособность сервиса, для этого подключимся telnet,ом к серверу и сымитируем обычную SMTP сессию. Не забываем, что перед проверкой работы сервиса необходимо создать пару почтовых ящиков в базе данных.

  1. # telnet 127.0.0.1 25
  2. Trying 127.0.0.1...
  3. Connected to localhost.
  4. Escape character is '^]'.
  5. 220 mx.info-x.org ESMTP MTA :)
  6. HELO localhost
  7. 250 mx.info-x.org Hello localhost [127.0.0.1]
  8. MAIL FROM: <test@info-x.org>
  9. 250 OK
  10. RCPT TO: <nekit@info-x.org>
  11. 250 Accepted
  12. DATA
  13. 354 Enter message, ending with "." on a line by itself
  14. From: <test@info-x.org>
  15. To: <nekit@info-x.org>
  16. Subject: Test message
  17. Hello world!!!
  18. .
  19. 250 OK id=1U9KRy-000M9i-7F
  20. QUIT
  21. 221 mx.info-x.org closing connection
  22. Connection closed by foreign host.

Посмотрим теперь на записи в логах:

  1. # cat /var/log/exim4/mainlog | grep 1U9KRy-000M9i-7F
  2. 2013-02-24 01:09:28 1U9KRy-000M9i-7F <= test@info-x.org H=(localhost) [127.0.0.1] I=[127.0.0.1]:25 P=smtp S=387 from <test@info-x.org> for nekit@info-x.org
  3. 2013-02-24 01:09:28 1U9KRy-000M9i-7F => nekit <nekit@info-x.org> R=virtual_user T=dovecot_delivery
  4. 2013-02-24 01:09:28 1U9KRy-000M9i-7F Completed

Из логов видно, что почта ходит нормально, то есть отправляется и принимается. На этом шаге настройку MTA Exim можно считать завершенной. Также можно сказать, что у нас уже есть готовая почтовая система, которой могут пользоваться зарегистрированные пользователи. Напоследок стоит отметить, что не будет лишним проверить почтовый сервер на возможность использования его как открытого релея. Сервисов могущих помочь в этом сейчас довольно много в интернете.

Веб интерфейс Roundcube

Roundcube — это клиент для работы с электронной почтой с веб-интерфейсом, написанный на языке PHP с использованием CSS и XHTML и технологии AJAX. Roundсube предоставляет возможность работы с почтовыми ящиками по протоколам IMAP и SMTP. Для хранения своей служебной информации может использовать любую поддерживаемую базу данных (PostgreSQL, MySQL и т.д.). Позволяет подключать адресную книгу, хранящуюся в LDAP, а также возможно ведение своей адресной книги для каждого пользователя отдельно.

В данной конфигурации Roundcube используется, как основное средство доступа к почтовым ящикам и управления ими для пользователей почтовой системы. Roundcube имеет интерфейс для написания собственных плагинов, расширяющих его функциональность, что может оказаться очень полезным при необходимости. Также хорошим моментом является то, что в нем имеется плагин для управления фильтрами Sieve, совместимый с Dovecot.

Установка

Установка Roundcube ничем не отличается от установки другого софта. При необходимости его можно установить руками в удобное для вас место, скачав дистрибутив с официального сайта.

После установки Roundcube необходимо создать базу данных, создать пользователя и дать ему права на созданную ранее базу данных. Далее необходимо создать структуру таблиц в базе данных, взять ее для своей базы данных можно в папке SQL (смотреть файл db.initial.sql, где db - ваша СУБД).

Настройка

Конфигурационные файлы Roundcube находятся в папке "config", относительно корня установки. Настройка Roundcube заключается в правке двух конфигурационных файлов: main.inc.php — основной конфигурационный файл и db.inc.php — здесь указываются параметры доступа к базе данных. Стоит отметить, что при использовании некоторых плагинов, может потребоваться правка конфигурационных файлов этих плагинов.

В файле db.inc.php я поправил всего одну строчку:

  1. $rcmail_config['db_dsnw'] = 'driver://user:pass@localhost/dbname';

Проверка конфигурации

Проверка работоспособности Roundcube заключается попыткой подключения к какому-нибудь почтовому ящику. Если что-то не работает, то смотрите в логи веб сервера или куда у вас там PHP выводит отладочные сообщения. Для примера приведу пару скриншотов рабочего интерфейса (жмякните на картинку, чтобы увеличить ее):

Roundcube1.png Roundcube2.png

Настраиваем SPF

В SPF записи мы указываем какие сервера имеют право отправлять почту с вашего домена. В самом простом случае эта запись выглядит следующим образом:

  1. mydomain.ru. IN TXT "v=spf1 a mx ~all"

или/и (если NS позволяет создавать SPF записи)

  1. mydomain.ru. IN SPF "v=spf1 a mx ~all"

Т.е. отправлять почту имеют право сервер с DNS записью в секции «a» и почтовый сервер в секции «mx».

Настраиваем DKIM

DKIM необходим для массовых рассылок и отправки автоматических писем с сайта. Без наличия этой технологии спам фильтры Gmail не пропускают письма, отправленные скриптами. Для того чтобы Exim оправлял письма, подписанные ключем DKIM, необходимо поставить дополнительную утилиту OpenDKIM. Ранее использовалась утилита dkim-filter, разработчики прекратили ее поддержку.

Установка OpenDKIM

  1. aptitude install opendkim opendkim-tools

Генерируем ключи и настраиваем OpenDKIM и DNS записи

Для начала нужно сгенерировать пару ключей — внешний и внутренний. Внешний будет храниться в DNS записях, а внутренний – на сервере.

Итак, генерируем ключи:

  1. opendkim-genkey -D /var/db/opendkim -d <domain.name> -s <selector>

/var/db/opendkim — директория, где будут лежать ключи <domain.name> — доменное имя (example.com) selector — указываем селектор, (например, mail). Селектор будет использоваться в DNS записи и указываться в настройке транспортов exim`а.

В нашем случае пишем следующее:

  1. opendkim-genkey -D /var/db/opendkim -d example.com -s mail

Итак, создается два файла — mail.txt (mail — выбранный нами селектор) и mail.private. Посмотрим их содержимое:

  1. cat /var/db/opendkim/mail.txt
  2. mail._domainkey IN TXT ( "v=DKIM1; k=rsa; t=s; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GN … mpwIDAQAB" ) ; ----- DKIM key mail for example.com.

Содержимое файла mail.txt добавим в DNS зону example.com, причем вот в таком виде (скобки и кавычки нужно удалить):

  1. mail._domainkey IN TXT "v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGS … wIDAQAB"

Советуют еще добавить вот такую DNS запись:

  1. _adsp._domainkey.example.com IN TXT "dkim=unknown"

Дальше на файл mail.private устанавливаем права, чтобы его мог прочитать exim и только он. В нашем случае вот так:

  1. chown mailnull:mail /var/db/opendkim/mail.private
  2. chmod 600 /var/db/opendkim/mail.private

Добавим в config файле opendkim путь к mail.private. Покажу пример моего config:

  1. # This is a basic configuration that can easily be adapted to suit a standard
  2. # installation. For more advanced options, see opendkim.conf(5) and/or
  3. # /usr/share/doc/opendkim/examples/opendkim.conf.sample.
  4.  
  5. # Log to syslog
  6. Syslog yes
  7. # Required to use local socket with MTAs that access the socket as a non-
  8. # privileged user (e.g. Postfix)
  9. UMask 002
  10.  
  11. # Sign for example.com with key in /etc/mail/dkim.key using
  12. # selector '2007' (e.g. 2007._domainkey.example.com)
  13. Domain in-ton.ru
  14. KeyFile /etc/exim4/dkim/in-ton.ru.key
  15. Selector mail
  16.  
  17. # Commonly-used options; the commented-out versions show the defaults.
  18. Canonicalization relaxed/simple
  19. #Mode sv
  20. #SubDomains no
  21. #ADSPDiscard no
  22.  
  23. # Always oversign From (sign using actual From and a null From to prevent
  24. # malicious signatures header fields (From and/or others) between the signer
  25. # and the verifier. From is oversigned by default in the Debian pacakge
  26. # because it is often the identity key used by reputation systems and thus
  27. # somewhat security sensitive.
  28. OversignHeaders From
  29.  
  30. # List domains to use for RFC 6541 DKIM Authorized Third-Party Signatures
  31. # (ATPS) (experimental)
  32.  
  33. #ATPSDomains example.com
  34.  


Так как мы настраивали подпись только к одному домену, то сложностей не возникло.

C opendkim`ом закончили. Перейдем к настройке Exim.

Настройка Exim

Поправим секцию transports: Находим begin transports и сразу же ниже добавляем:

  1. DKIM_DOMAIN = ${lc:${domain:$h_from:}}
  2. DKIM_FILE = /var/db/opendkim/mail.private #- важно!!!! Пишем путь к приватному ключу
  3. DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}

Также заменяем:

  1. remote_smtp:
  2. driver = smtp

На:

  1. remote_smtp:
  2. driver = smtp
  3. dkim_domain = DKIM_DOMAIN
  4. dkim_selector = mail # - выбранный нами селектор.
  5. dkim_private_key = DKIM_PRIVATE_KEY

Перезапустить Exim

/etc/init.d/exim4 restart

Exim запустился, делаем пробную отправку письма.

После успешного запуска DKIM в оригинале письма появится следующая запись:

  1. DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d= example.com; s=mail; h=Date:Message-Id:From:Content-type:MIME-Version:Subject:To; bh=RUN…0qKg=; b=EEla1LMRm…Q6CYJM/VHg=;
  2. Received: from example by xxx.freehost.com.ua with local (Exim 4.80.1 (FreeBSD))

Если запись не появилась – DKIM не запустился.

Материалы