RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

6. Конфигурационный файл exim во время выполнения

Во время выполнения exim использует один конфигурационный файл (run time configuration file), читаемый каждый раз при выполнении двоичного файла exim. Обратите внимание, что в нормальных условиях это происходит часто, поскольку exim спроектирован для работы распределённым способом, без центрального контроля. Если при чтении конфигурационного файла обнаруживается синтаксическая ошибка, exim записывает сообщение на стандартный поток ошибок и завершается с ненулевым кодом возврата. Также записывается сообщение в журнал тревоги. Примечание: в это время могут быть детектированы лишь простые синтаксические ошибки. Значения любых раскрываемых опций не проверяются, пока не произойдёт раскрытие, даже когда раскрытие не изменяет строку.

Имя файла рабочей конфигурации (run time configuration file) вкомпилировано в исполняемый модуль по соображениям безопасности и указывается компиляционной опцией CONFIGURE_FILE. В большинстве конфигураций, она задаёт единственный файл. Однако, разрешается задать список имён файлов, разделённых двоеточиями, в этом случае exim использует первый существующий файл из списка.

Файл рабочей конфигурации должен принадлежать пользователю root или пользователю, заданному во время компиляции опцией CONFIGURE_OWNER (если установлена). Конфигурационный файл не должен быть читаемым для всех или для группы, исключая группу, указанную при компиляции в опции EXIM_GROUP или в CONFIGURE_GROUP.

Предупреждение:

В обычной конфигурации, где файл exim setuid root, любой, кто имеет право редактировать файл рабочей конфигурации, обладает простым способом запускать команды от root. Если Вы делаете почтовых администраторов членами группы exim, но не доверяете им права root, убедитесь, что рабочая конфигурация недоступна на запись группе.

Конфигурационный файл по умолчанию, который будет корректно работать в простых ситуациях, представлен в файле src/configure.default. Eсли опция CONFIGURE_FILE задаёт лишь одно имя файла, инсталляционный процесс копирует конфигурационный файл по умолчанию в новый файл, если он не существовал (то есть, существующий файл не будет перезаписан). Если CONFIGURE_FILE задает список, он не инсталлируется автоматически. Подробности в разделе 7, в обсуждении "сквозного контроля" заданной по умолчанию конфигурации.

6.1. Использование иного конфигурационного файла

Одноразовая альтернативная конфигурация может быть задана использованием опции -C командной строки, которая может задать единственный файл или список файлов. Однако, когда используется опция -C, exim отменяет свои root-привилегии, за исключением запуска его root (или, если параметр для -C идентичен со встроенным значением из CONFIGURE_FILE) или перечислен в файле TRUSTED_CONFIG_LIST и вызывающий пользователь Exim или пользователь, определенный в CONFIGURE_OWNER. Опция -C, главным образом, полезна для проверки синтаксиса конфигурационного файла до его инсталляции. Проверки владельца и группы для конфигурационного файла, заданного опцией -C, не проводятся.

Даже пользователю Exim не доверяют определить произвольный конфигурационный файл опцией -C, которая будет использоваться с привилегиями root, если тот файл не перечислен в файле TRUSTED_CONFIG_LIST. Это блокирует возможность тестирования конфигурационного файла с использованием опции -C на приём сообщений и доставку, даже если exim будет вызван от пользователя root. Приём работает, но к тому времени exim работает от своего пользователя, таким образом когда он перезапускает себя для возвращения root привилегий для доставки, использование опцию -C заставляет его потерять права доступа. Однако, root может тестировать приём и доставку, используя две разные команды (одна для помещения сообщения в очередь -odq, а другая для доставки -M).

Если ALT_CONFIG_PREFIX задана в Local/Makefile, она определяет строку префикса, с которой должен начинаться любой файл в опции командной строки -C. Кроме того, имя файла не должно содержать последовательность "/../". Нет настройки по умолчанию для ALT_CONFIG_PREFIX: когда она не задана, любое имя файла может использоваться с опцией -C".

Одноразовые изменения конфигурации могут быть заданы опцией командной строки -D, определяющей и отменяющей значения для макросов, используемых в конфигурационном файле. Однако, как и -C, использование этой опции непривелигированными пользователями вынуждает exim отменить свои root-права. Если в Local/Makefile задана опция DISABLE_D_OPTION, использование опции -D полностью отключено, и попытка её использования вызывает немедленный выход с ошибкой. Некоторые серверы могут использовать один и тот же двоичный файл exim на различных машинах с совместно используемой файловой системой, но используя разные конфигурационные файлы на каждой машине. Если в Local/Makefile задана опция CONFIGURE_FILE_USE_NODE, exim вначале ищет конфигурационный файл с именем конфигурационного файла, сопровождаемого точкой и именем узла машины, полученным из функции uname(). Если файл не существует, используется стандартное имя. Эта обработка происходит для каждого имени файла из списка, заданного CONFIGURE_FILE или -C.

В некоторых ситуациях различные версии exim могут быть запущены под разными эффективными uid и определена опция CONFIGURE_FILE_USE_EUID, чтобы помочь этому. Смотрите комментарии в src/EDITME для деталей.

6.2. Формат конфигурационного файла

Файл конфигурации exim разделён на множество частей. Общие параметры настройки должны всегда быть в начале файла. Другие части являются опциональными и могут фигурировать в любом порядке. Каждая часть, кроме первой, вводится словом начинающимся с "begin", сопровождаемым именем части. Опциональные части:

  • ACL: Списки контроля доступа для контроля входящей SMTP-почты.
  • authenticators: Конфигурационые настройки для драйверов аутентифкации. Они связаны с командой SMTP AUTH (смотрите раздел 33).
  • routers: Конфигурационные настройки для драйверов роутеров. Маршрутизаторы обрабатывают адреса и определяют, как сообщение необходимо доставлять.
  • transports: Конфигурационные настройки для драйверов транспортов. Транспорты задают механизмы для копирования сообщения в места назначения.
  • retry: Правила повторов для использования, когда сообщение не может быть доставлено немедленно.
  • rewrite: Правила глобальной перезаписи адресов для использования, когда сообщение приходит, и когда новые адреса сгенерированы во время доставки.
  • local_scan: Частная опция для функции local_scan(). Если Вы хотите использовать эту возможность, Вы должны задать:
    LOCAL_SCAN_HAS_OPTIONS=yes
    
    в Local/Makefile до сборки exim. Полные данные о средстве local_scan() даны в разделе 41.

Начальные и замыкающие пробелы в строках конфигурации всегда игнорируются. Пустые строки в файле и строки, начинающиеся с символа # (игнорируя начальное пустое пространство), обрабатываются как комментарии и игнорируются. Примечание: Символ # кроме как в начале строки не обрабатывается специальным образом и не является комментарием.

Любая строка, не являющаяся комментарием, может быть продолжена, если её завершить символом обратного слэша ("\"). Обратите внимание, что общее правило для пустого пространства означает, что появление пробелов после обратного слэша и начальных пробелов в начале строк продолжения игнорируется. Строки комментариев, начинающиеся с # (но не пустые строки), могут появиться в середине последовательности строк продолжения.

Удобный способ создания конфигурационного файла заключается в том, чтобы начать с представленного в src/configure.default и добавлять, удалять или изменять настройки, как требуется.

ACL, правила повторов и правила перезаписи имеют собственный синтаксис, который описан в разделах 39, 32 и 31 соответственно. Другие части конфигурационного файла имеют некоторые общие синтаксические пункты, и они описаны ниже, от раздела 6.10 и далее. До этого описаны средства включения, макрокоманд и условий средств.

6.3. Включение файлов в конфигурационый файл

Вы можете включать другие файлы внутри файла рабочей конфигурации exim, используя этот синтаксис в отдельных строках:
.include file name
.include_if_exists file name

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

Включенный файл может быть на любой глубине вложенности, но помните, что exim часто читает конфигурационый файл, поэтому хорошей идеей будет хранить их на минимальной глубине. Если Вы меняете содержимое включенного файла, Вы должны дать демону сигнал HUP, поскольку файл в момент чтения конфигурации пребывает в режиме доступа только на чтение.

Обработка включений происходит рано, на физическом уровне строки, таким образом, как и строки комментариев, включения могут использоваться в середине параметра настройки, например:
hosts_lookup = a.b.c \
.include /some/file

Процесс включения присходит после обработки макрокоманд (смотрите ниже). Этот эффект обрабатывает включенные строки так, как будто они находятся в месте, где произошло включение.

6.4. Макросы в конфигурационном файле

Если строка в основной части конфигурации (до первой строки "begin") начинается с символа верхнего регистра, она берётся как макроопределение и должна иметь форму:
name = rest of line

Имя должно состоять из букв, цифр и символов подчёркивания, нет необходимости, чтобы все они были в верхнем регистре, хотя это рекомендуется. Оставшаяся часть строки, включая любое продолжение, является текстом замены, и из неё удаляется начальное и завершающее пустое пространство. Кавычки не удаляются. Текст замены не может завершаться символом обратного слэша.

Макросы также могут быть заданы между роутером и транспортом, аутентификатором или определением ACL. Однако, они не могут быть определены внутри определённых драйверов или ACL, в local_scan или секции повторов конфигурации.

6.5. Макроподстановка

Как только макрос определён, все последующие строки файла (и любых включенных файлов) сканируются на предмет имени макроса. Если есть несколько макросов, строки сканируются по очереди их опредления для каждого макроса. Текст замены не сканируется повторно, для текущей макрокоманды, хотя он сканируется для впоследствии заданных макросов. Поэтому, имена макрокоманд не могут содержать как подстроку имя ранее заданного макроса. Например, Вы могли бы задать:
ABCD_XYZ = <something>
ABCD = <something else>
но помещение объявлений в обратном порядке, вызвало бы конфигурационную ошибку. Раскрытие макросов применяется к индивидуальным физическим строкам файла до проверки продолжения строки или включений (смотрите выше). Если строка состоит лишь из имени макроса, и раскрытие макроса пустое, строка игнорируется. Макрос в начале строки может превратить строку в строку комментария или в строку ".include".

6.6. Переопределение макроса

После определения значение макроса может быть переопределно позднее, в конфигурации (или во включенном файле). Переопределение задаётся использованием "==" вместо "=". Например:
MAC = initial value
...
MAC == updated value

Переопределение не меняет порядок, в котором макрос применяется к последующим строкам конфигурации. Порядок остаётся тем же самым, в котором макросы были изначально заданы. Всё, что изменяется, значение макроса. Переопределение позволяет накапливать значения. Например:
MAC = initial value
...
MAC == MAC and something added

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

6.7. Отмена значения макроса

Набор значений для макроса в конфигурационном файле может быть отменён опцией -D командной строки, но при её использовании, exim снимает свои root права, если он вызван не root или пользователем exim. Задание опции -D в командной строке заставляет игнорироваться все определения и переопределения в пределах файла.

6.8. Пример использования макроса

Как пример макроса, рассмотрим конфигурацию, где алиасы ищутся в БД MySQL. Это помогает оставить файл менее беспорядочным, если длинные строки, например SQL-запросы, определены отдельно, как макрос, например:
ALIAS_QUERY = select mailbox from user where \
              login=${quote_mysql:$local_part};

Тогда это может использоваться в роутере redirect, устанавливаемом примерно так:
data = ${lookup mysql{ALIAS_QUERY}}

В более ранних версиях exim, макрос, иногда, использовался для списков доменов, хостов или адресов. В exim v4 они лучше обрабатываются именованными списками: смотрите раздел 10.5.

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

Вы можете использовать директивы ".ifdef", ".ifndef", ".elifdef", ".elifndef", ".else" и ".endif" для динамического включения или исключения частей конфигурационного файла. Обработка происходит каждый раз, когда файл читается (то есть, когда запускается exim). Реализация очень проста.

Примеры четырёх первых директив должны сопровождаться текстом, включающим имена одного и более макросов. Условие проверяет, действительно ли происходила подстановка макроса в строке. Таким образом:
.ifdef AAA
message_size_limit = 50M
.else
message_size_limit = 100M
.endif
устанавливает ограничение размера сообщения в 50mb, если задан макрос "AAA", и 100mb в ином случае. Если задано более одного имени макроса в строке, условие истинно, если задано любое из них. Таким образом, это условие "or" ("или"). Чтобы получить условие "and", необходимо использовать вложенное .ifdef. Хотя Вы можете использовать макрораскрытие для создания одной из этих директив, это не очень полезно, поскольку условие "в этой строке была макроподстановка" будет всегда истинным.

Текст следующий за ".else" и ".endif" игнорируется и может использоваться как комментарий, чтобы сделать пояснения к сложным вложениям.

6.10. Общий синтаксис опции

Для основного набора опций, опций драйвера и опции local_scan() каждая настройка находится в отдельной строке и начинается с имени, состоящего из символов в нижнем регистре, и символов подчёркивания. Многие опции требуют значение с данными, и в этом случае, имя должно сопровождаться символом равно ("=") с опциональными пробелами, а затем значением. Например:
qualify_domain = mydomain.example.com

Некоторые параметры настройки могут содержать уязвимые данные, например, пароль для доступа к базам данных. Для недопущения прочтения этих значений неадминистративными пользователями, используя опцию командной строки -bP, Вы можете предварять их словом "hide". Например:
hide mysql_servers = localhost/users/admin/secret-password

Для неадминистративных пользователей такие опции отображаются как в примере:
mysql_servers = <value not displayable>

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

6.11. Булевы (двоичные) опции

Опции, тип которых даётся как булева переменная: переключатели on/off. Возможны два способа определить такие опции: с и без значения данных. Если имя опции указано само по себе, без данных, это значит "on", а если ему предшествует "no_" или "not_", это значит "off". Однако, булевы опции могут быть сопровождены символом равно "=" и одним из слов "true", "false", "yes" или "no", как альтернативный синтаксис. Например, следующие два параметра настройки, будут иметь одинаковый эффект:
queue_only
queue_only = true

Следующие две строки также имеют одинаковый (обратный) эффект:
no_queue_only
queue_only = false

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

6.12. Целочисленные значения

Если целочисленные элемент данных начинается с символов "0x", оставшаяся его часть интерпретируется как шестнадцатеричное число. Иначе, он обрабатывается как восьмеричное, если начинается с цифры "0", и десятичное в остальных случаях. Если целочисленное значение сопровождается символом "K", оно умножается на 1024, если оно сопровождается символом "M", умножается на 1024x1024.

Когда выводятся значения целочисленных опций, значения, явялющиеся точным множителем 1024 или 1024x1024, иногда, но не всегда, печатаются с использованием символов "K" и "M". Стиль печати независим от использовавшегося фактического входного формата.

6.13. Целочисленные восьмеричные значения

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

6.14. Числовые значения с фиксированной точкой

Число с фиксированной точкой состоит из десятичного целого опционально сопровождаемого десятичной точкой и до трёх дальнейших цифр.

6.15. Значения временных интервалов

Интервал времени указывается как последовательность чисел, каждое сопровождаемое буквой, без пробелов:
буква
значение
s секунды
м минуты
h часы
d дни
w недели

Например, "3h50m" задаёт 3 часа и 50 минут. Значения временных интервалов выводятся в таком же формате. Exim не ограничивает значения: он допускает, например, указать "90m" вместо "1h30m".

6.16. Строковые значения

Если строковый элемент данных не начинается с символа двойной кавычки, он берётся как состоящий из остатка строки, плюс любые строки продолжения, начинающиеся с первого символа после любых начальных пробелов, с удалением пробелов в конце, и без интерпретации символов в строке. Поскольку exim удаляет строки комментариев (начинающиеся с "#") на ранней стадии, они могут появляться в середине многостроковых строк. Поэтому следующие настройки эквивалентны:
trusted_users = uucp:mail
trusted_users = uucp:\
# This comment line is ignored
mail

Если строка начинается с символа двойной кавычки, она должна завершаться заключительной двойной кавычкой, и любые символы обратного слэша, кроме как используемые для продолжения строки, интерпретируются как специальные символы (escape-последовательности) следующим образом:
последовательность
значение
\\ одиночный обратный слэш
\n символ новой строки
\r символ возврата каретки
\t символ табуляции (TAB)
\<octal digits> до трёх восьмеричных цифр, определяющих один символ
\x<hex digits> до двух шестнадцатеричных цифр, определяющих один символ

Если обратные слэш сопровождается какими-то другими символами, включая двойные кавычки, этот символ заменяет пару обратный слэш и символ.

Квотирование необходимо лишь если вы хотите использовать escape-последовательности для вставки специальных символов, или необходимо определить значение с начальными и конечными пробелами. Эти случаи редки, таким образом использование двойных кавычек почти не необходимо в текущих версиях exim. В версиях exim до 3.14, двойные кавычки требовались для продолжения строки, таким образом, вы можете натолкнуться на старые конфигурационные файлы, и примеры, в которых применяется излишнее использование двойных кавычек.

6.17. Раскрытие строк

Некоторые строки в конфигурационном файле подвергаются раскрытию строки (string expansion), при помощи которого различные части строки могут быть заменены, по обстановке (см. раздел 11).

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

6.18. Имена пользователей и групп

Имена пользователей и групп задаются как строки, с использованием синтаксиса описанного выше, но строки интерпретируются специальным образом. Имя пользователя или группы должно состоять полностью из цифр, или быть именем, которое может быть найдено функциями getpwnam() или getgrnam() соответственно.

6.19. Построение списков

Данные для некоторых конфигурационных опций: список элементов, с двоеточием в качестве разделителя. Многие из этих опций показываются типом "список строк" ("string list") в описаниях, позже в этом документе. Другие перечислены как "domain list", "host list", "address list" или "local part list". Синтаксически они все одинаковы: однако, все, кроме "string list", являются объектами для интерпретации так, как описано в разделе 10.

Во всех случаях, весь список обрабатывается как единая длинная строка, как того требует синтакис. Пример: установка опции trusted_users выше в секции 6.16. Если реально необходимо использовать двоеточие как элемент в списке, оно должно быть введено как два двоеточия. Начальные и конечные пробелы в каждом элементе списка игнорируются. Это позволяет включать элементы начинающиеся с двоеточия, в частности, определённые формы адресов IPv6. Например, список:
local_interfaces = 127.0.0.1 : ::::1
содержит два IP-адреса: адрес IPv4 "127.0.0.1" и адрес IPv6 "::1". Примечание: несмотря на то, что начальные и конечные пробелы игнорируются в списке индивидуальных элементов, они не игнорируются при анализе списка. Пробел после первого двоеточия в примере выше, необходим. Если бы его там не было, то список интерпретировался бы как два элемента "127.0.0.1::" и "1".

Удвоение двоеточий в адресах IPv6 неприятная рутинная операция, таким образом был предоставлен механизм позволяющий изменить разделитель списка. Если список начинается с левой угловой скобки, сопровождаемой каким-либо символом пунктуации, этот символ используется вместо двоеточия, как разделитель элементов списка. Для примера, список выше может быть переписан с использованием точки с запятой в качестве разделителя:
local_interfaces = <; 127.0.0.1 ; ::1

Это средство применяется ко всем спискам, за исключением списка в log_file_path. Допустимо использовать символ новой строки и другие управляющие символы (коды меньше, чем 32, плюс символ DEL) как разделители в списках.

6.20. Пустые элементы в списках

Пустые элементы в конце списков всегда игнорируются. Другими словами, конечный симавол разделителя игнорируется. Таким образом, список в
senders = user@domain :
содержит лишь один элемент. Если вы хотите включить пустую строку в качестве одного из элементов списка, она не должна быть последним элементом списка. Например, этот список содержит три элемента, второй из которых пустой:
senders = user1@domain : : user2@domain

Примечание: Должно быть пустое пространство, между этими двумя двоеточиями, иначе они будут интерпретированы как один символ двоеточия (и тогда список содержал бы лишь один элемент). Если вы хотите задать список, содержащий лишь один пустой элемент, вы можете сделать это, как в этом примере:
senders = :

В этом случае первый элемент пуст, а второй игнорируется, поскольку он в конце списка.

6.21. Формат конфигурации драйвера

Есть отдельные части в конфигурации, для определения роутеров, транспортов и аутентификаторов. В каждой части, вы определяете множество примеров драйверов, каждый с его собственным набором опций. Каждый пример драйвера задаётся последовательностью строк, такого типа:
<instance name>:
<option>
...
<option>

В следующем примере имя образца localuser и он сопровождается тремя опциями:
localuser:
driver = accept
check_local_user
transport = local_delivery

Для каждого образца драйвера Вы определяете, какой модуль кода exim он использует, путём установки опции driver и, опционально, некотрые параметры крнфигурации. Например, в случае транспортов, если Вы хотите чтобы транспорт доставлял по SMTP, Вы использовали бы драйвер smtp, если Вы хотите доставлять почту в локальный файл, Вы использовали бы appendfile. Каждый из драйверов подробно описан в его собственной главе, позже, в этом руководстве.

Вы можете иметь несколько роутеров, транспортов или аутентификаторов, которые основаны на одном и том же основном драйвере (каждый должен иметь своё имя).

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

В пределах определения образца драйвера есть два вида опций: универсальный (generic) и частный (private). Общие опции это те, которые применяются ко всем драйверам одного типа (то есть, все роутеры, все транспорты или все аутентификаторы). Опция driver общая опция, которая должна появляться в каждом определении. Частные опции являются специальными для каждого драйвера, и ни одна не должна появляться, поскольку все они имеют значения по умолчанию.

Опции могут появляться в любом порядке, за исключением того, что опция driver должна предшествовать частным опциям, поскольку они зависимы от неё. Поэтому рекомендуется, чтобы опция driver всегда была первой.

Имена экземпляров драйверов, которые используются для ссылок в журналах и других местах, могут быть любой последовательностью букв, цифр и подчёркиваний (начинающихся с буквы). Они должны быть уникальными среди драйверов того же типа (но не других типов!). Роутер и транспорт (для примера), могут иметь одинаковое имя, но никакие два маршрутизатора не могут быть с одим именем. Имя экземпляра драйвера не должно быть перепутано с именем базового модуля драйвера. Например, конфигурационные строки:
remote_smtp : driver = smtp
создают экземпляр драйвера транспорта smtp, имя которому remote_smtp. Тот же самый код драйвера может использоваться более одного раза с различными именами экземпляров и параметрами настроек в каждом случае. Второй экземпляр транспорта smtp с другиими опциями может быть задан таким образом:
special_smtp:
driver = smtp
port = 1234
command_timeout = 10s

Имена remote_smtp и special_smtp использовались бы для ссылки на эти экземпляры транспорта из маршрутизаторов, и эти имена фигурировали бы в строках протоколов. Строки комментариев могут присутствовать в середине спецификации драйвера. Полный список опций настройки для любого частного драйвера, включая все значения по умолчанию, может быть создан, используя опцию командной строки -bP.

Поиск

 

Найди своих коллег!