Управляющий вход, доступный только своим

Монитор — не публичная страница, а пульт

Задача. Веб-монитор работает на каждом узле, пользуются им или нет; схема оставляет доступ к нему Хабу — и никому больше.

Из чего складывается:

  • http-access — список адресов с уровнями, сверяется сверху вниз;
  • http-api-key — ключ, которым представляется Хаб: он даёт права администратора с любого адреса;
  • http-redirect-to-https — не пускает ключ по открытому http://;
  • http-csrf-protection — не даёт менять состояние узла запросом GET.

Области у составляющих разные. Все четыре — уровня узла.

Как они взаимодействуют. Список адресов и ключ — два независимых пути к полному доступу: держателя ключа список не фильтрует, поэтому обращение с ключом не менее важно, чем фильтр по адресам. Защита транспорта и защита от подделки запросов закрывают два способа, которыми ключ утекает или используется не по назначению.

Главная ловушка — выключить https ради простоты опроса. Ключ из http-api-key даёт права администратора с любого адреса, а по http:// он идёт открытым текстом в каждом запросе: перехвативший его обходит и список адресов.
Что делает Хаб. Применяет наполовину. Список доступа и ключ стоят: 127.0.0.1 и ::1 — admin, адреса Хаба — monitor, а команды Хаб отправляет ключом http-api-key. Но http-redirect-to-https false — ключ ходит по открытому http:// при каждом опросе; http-csrf-protection не задан, и действует умолчание — защита включена.
Рекомендуемые значения

Четыре строки:

Строка Умолчание Что задать
http-access закрыто всем admin — только 127.0.0.1, остальным не выше нужного
http-api-key нет свой ключ на узел; смена — добавить новый, потом убрать старый
http-redirect-to-https true оставить true
http-csrf-protection true оставить true
Строки, порядок сверки адресов и умолчания — из руководства (§ 3.3.1.58.2–3.3.1.58.5). Сама схема — наша гипотеза.
Пример в конфигурации
http-access 127.0.0.1 admin
http-access 198.51.100.7 monitor
http-api-key 5f6e7e426949e3a5e4ec38e747e71963http-redirect-to-https true
Адрес Хаба — для примера; ключ — из примеров руководства, на узле нужен свой.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Проверить, принимает ли монитор открытый http://:
curl -s -o /dev/null -w '%{http_code}\n' 'http://127.0.0.1:8080/status?format=json'
Перенаправление — открытый текст закрыт; 200 — монитор принимает ключ и данные без шифрования.