http-extra-headers

<include-config>

Файл с заголовками запроса за конфигурацией
в конфигурации это строкаhttp-extra-headersвнутри блока <include-config>
Ключ доступа — файлом, а не в адресе

Строка называет файл; каждая его строка становится заголовком HTTP-запроса, который узел делает, забирая файл конфигурации.

Задумано ради авторизации. Руководство приводит именно этот пример: Authorization с ключом. Обычная форма include этого не умеет — адрес не может содержать имя пользователя, строку запроса и якорь, а значит передать ключ через адрес негде.

Узел содержимое не разбирает. Проверяется только форма строки заголовка; что за заголовок и что в нём — MTA безразлично.

Главная ловушка — права на файл. В нём лежит ключ доступа в открытом виде, и по умолчанию он читается всеми, кому доступен каталог конфигурации. Плюс попадает в резервные копии — то есть ключ живёт дольше, чем о нём помнят.
Что делает Хаб. Не пишет: конфигурацию Хаб собирает целиком и кладёт на узел сам, а не заставляет узел за ней ходить. Обратное направление — узел тянет конфигурацию по HTTP — означало бы, что доступность Хаба нужна в момент перезагрузки узла, а это худший момент для внешней зависимости.
Рекомендуемые значения

Значение — путь к файлу. Что в нём и как с ним обращаться:

Что Как
по заголовку на строку форма обычная, Имя: значение
ключ доступа в открытом виде — других вариантов MTA не даёт
права на файл как на конфигурацию, не шире
ротация ключа правкой файла и перечитыванием конфигурации

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

Форма файла и то, что содержимое не разбирается, — из руководства (§ 3.3.24.1). Замечания про права и ротацию ключа — наши.
Пример в конфигурации
# заголовок авторизации задаётся файлом
<include-config https://10.1.2.3:4000/my/config/file>
    http-extra-headers /etc/pmta/include-config-http-headers.txt</include-config>
Содержимое файла из руководства — одна строка Authorization: 14ac5499cfdd2bb2859e4476d2e5b1d2bad079bfd. Ключ лежит открытым текстом, поэтому права на файл держат такими же, как на конфигурацию.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

Типичные ошибки и проблемы

что делают не так и чем это кончается3 ошибки▶

Оставляют файл с ключом доступным всем

§ 3.3.24.1

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

Рассчитывают, что узел проверит заголовки

§ 3.3.24.1

Чем чреватоMTA смотрит только на форму строки. Опечатка в имени заголовка или в ключе станет отказом на стороне сервера, а на узле — неудачной перезагрузкой в неподходящий момент.
Как заметитьКонфигурация перестала применяться, и причина не в самой конфигурации.
Как правильноПроверять запрос снаружи, командой из справки, до того как конфигурация начнёт от него зависеть.

Ставят внешнюю зависимость на путь перезагрузки

наш опыт

Чем чреватоФайл тянется при каждом чтении конфигурации. Недоступный источник означает, что узел нельзя перенастроить — ровно тогда, когда это обычно и требуется.
Как заметитьПерезагрузка не проходит, при том что на узле ничего не меняли.
Как правильноЛибо держать копию конфигурации локально и обновлять её отдельно от перезагрузки, либо принять зависимость сознательно и следить за доступностью источника.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Справочные данные
Синтаксис
http-extra-headers <path>
Значения
путь к файлу, по одному заголовку HTTP на строку
Применение
reload, перезапуск не нужен
Очередь
уже поставленное в очередь не затронет
Где писать
<include-config>
Сколько раз
один раз в блоке
Всё здесь — из руководства, с разделом.
Наследование
Наследования у строки нет: она действует внутри своего блока <include-config>. Сам блок ставится там же, где и include, — в корне файла или внутри <source>, <domain>, <virtual-mta>, <smtp-pattern-list>, — и подключённое читается на его месте.
Как проверить на узле
Что запрос уходит с нужным заголовком, проверяют тем же способом, что и сам адрес, — снаружи:
curl -sI -H "@/etc/pmta/include-config-http-headers.txt" https://10.1.2.3:4000/my/config/file
Ответ 200 означает, что и адрес, и заголовок приняты. 401 или 403 — ключ не подошёл, и на узле это проявится неудачной перезагрузкой конфигурации, а не предупреждением.
В Хабе
Цена ошибки
опасно: последствия переживут откат
Сценарии
Безопасность узла