Как узел решает, впустить ли запрос по HTTP

критично

API key and access level
Два способа представиться, и второй сильнее

У узла три интерфейса HTTP — API конфигурационных файлов (§ 8.2), API конфигурации (§ 8.3) и API команд (§ 8.4), — и все три отвечают на одном порту вместе с веб-монитором. Правило допуска у них общее, и состоит оно из двух половин.

Первая половина — уровень доступа по адресу. Он берётся из http-access: monitor читает состояние, operator вдобавок читает конфигурацию и выполняет команды, admin ещё и правит конфигурацию.

Вторая половина — ключ http-api-key в заголовке X-API-Key. Руководство формулирует его силу трижды и одинаково: правильный ключ отменяет ограничение по адресу, и запрос принимается с любого адреса.

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

Запрос, не прошедший ни по одной половине, получает 403. И ответ разговорчив: тело отказа называет путь к файлу конфигурации, путь к журналу монитора и готовую строку http-access <адрес> admin — проверено на узле парка.

Главная ловушка — считать две половины слоями защиты. Они не складываются: ключ не добавляется к ограничению по адресу, а заменяет его. Узел, закрытый узким списком адресов и снабжённый ключом, открыт всему миру для того, у кого этот ключ есть.
Что делает Хаб. Пользуется обеими половинами по назначению: своему адресу даёт monitor — чтения телеметрии хватает, — а команды подаёт ключом. Так уровень admin не достаётся всем машинам за общим выходом в сеть.

🔴 Слабое место у нас не в схеме, а в канале: ключ уходит на узел по обычному http://, потому что в шаблоне стоит http-redirect-to-https false. Половина, которая сильнее, — и именно она передаётся открыто.

Рекомендуемые значения

Собственных значений у механизма нет: их задают две директивы.

Что нужно Чем достигается Умолчание
чтение состояния http-access уровня monitor none, то есть закрыто
чтение конфигурации, команды уровень operator закрыто
правка конфигурации http-api-key в заголовке ключей нет

Разным приложениям — разные ключи: отзыв одного не рвёт остальные.

Правило допуска, отмена ограничения по адресу и обязательность ключа на изменение — из руководства (§ 8.2, § 8.3, § 8.4). Что тело отказа выдаёт пути и готовую строку — наша проверка на узле парка.
Пример в конфигурации
# чтение — по адресу, изменение — по ключу
http-mgmt-port 1000
http-access 127.0.0.1 admin
http-access 10.0.0.5 monitor
http-api-key abcd_0123_abcd_0123_abcd_0123_ab
Адресу Хаба хватает чтения: административные действия он выполняет ключом. Так уровень admin не достаётся каждой машине за тем же выходом в сеть.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
▲

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

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

Считают ключ вторым фактором поверх списка адресов

§ 8.2

Чем чреватоПоловины не складываются. Ключ отменяет список, а не дополняет его, и узел открыт откуда угодно тому, у кого ключ есть.
Как заметитьСписок доступа узкий, а в журнале монитора успешные запросы извне.
Как правильноСчитать ключ равным полному доступу к узлу и защищать его соответственно.

Выдают ключ ради чтения

§ 8.3

Чем чреватоДля чтения состояния и конфигурации хватает уровня доступа по адресу. Ключ, выданный ради выгрузки отчётов, попутно даёт право переписать конфигурацию и выполнить любую команду.
Как заметитьКлюч есть у приложения, которое только читает.
Как правильноДать адресу operator и обойтись без ключа.

Передают ключ по незашифрованному соединению

наш опыт

Чем чреватоСильная половина механизма уходит на провод открытым текстом. Перехвативший получает полный доступ к узлу с любого адреса.
Как заметитьВ конфигурации http-redirect-to-https false, а клиент шлёт X-API-Key.
Как правильноВключить перенаправление на https и научить клиента доверять сертификату монитора.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Наследование
Наследования у механизма нет — наследуются директивы, которыми он включается, а обе пишутся в корне файла, раздел Global. Разделения по интерфейсам нет никакого: один список адресов и один набор ключей обслуживают и монитор, и все три API.
Как проверить на узле
Проверять надо обе половины по очереди. Сначала адрес без ключа:
curl -s -o /dev/null -w '%{http_code}\n' http://NODE:1000/status
403 означает, что адрес не разрешён. Теперь тот же запрос с заголовком -H ‘X-API-Key: КЛЮЧ’: ответ 200 подтверждает, что ключ отменяет ограничение по адресу — то есть механизм работает так, как описан.
В Хабе
Цена ошибки
обратимо: вредит, пока стоит
Сценарии
Подготовить узел к отправке · Безопасность узла
Важность
критично