Список подавления, который нельзя прочитать

Адреса в списке — хеши, а не адреса

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

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

  • hashed-address — запись списка <address-list>: адрес в нижнем регистре, хешированный SHA-256 и закодированный BASE64URL; такие же записи принимает /config/address-lists;
  • pmtahashedAddress — утилита из поставки, которая считает этот хеш для известного адреса;
  • privacy-policy — прячет в учёте левую часть адресов: заглушкой или хешем SipHash либо HMAC-SHA256 с ключом;
  • digest — считает ключевой хеш тем же способом, чтобы найти в учёте записи известного адреса.

Области у составляющих разные. Хешированные записи живут в списке адресов, политика — в блоке <acct-file>, а хеши считаются где угодно.

Как они взаимодействуют. Это две половины, и они не совпадают. Хеш списка — без ключа и от полного адреса: глазами список не прочесть, но знакомый адрес проверяется по нему мгновенно. Хеш учёта — с ключом и только от левой части: без ключа записи не связать ни с адресом, ни со списком. Цена — ключ: без него поддержка не найдёт записей адреса, а потерянный ключ делает прежние записи несвязываемыми навсегда.

Главная ловушка — считать хеш без ключа тайной. SHA-256 от адреса считается без секрета: список не читается глазами, но знакомый адрес — или целая база адресов — проверяется по нему мгновенно.
Что делает Хаб. Не применяет: списков подавления на узле нет. Отписки прогрева Хаб хранит в своей базе и сверяет с подавлением платформы рассылки, а в учёте адреса получателей идут как есть — privacy-policy не задан.
Рекомендуемые значения

Две половины и их хеши:

Половина Что хешируется Как Кто считает
список подавления полный адрес в нижнем регистре SHA-256 без ключа, BASE64URL pmtahashedAddress
учёт левая часть адреса в нижнем регистре SipHash или HMAC-SHA256 с ключом digest
Формат хешированных записей, утилита, политика учёта и команда хеша — из руководства (§ 3.3.5.2, § 3.3.11.16, § 6.3.32, § 8.3.2). Разбор — наш; схема — гипотеза.
Пример в конфигурации
<address-list suppressed>
    hashed-address iZ0zh6XFp1VdUdLwoLe1Djl_5IH9mlj6-zibfclOEfY~</address-list>
<acct-file /var/log/pmta/acct.csv>
    privacy-policy siphash "secret"
</acct-file>
Хеш — из примера руководства для test@foo.com; ключ учёта — для примера, на узле нужен свой.
жёлтым — — имена директив, голубым — блоки. Так же они подсвечены и в тексте карточки.
Совместимость
PowerMTA 6.0
описана в руководстве этой версии · платформа: любая
С какой версии директива доступна, вендор указывает не для всех — здесь пометки нет. Имя встречается и в издании руководства 5.0.
Как проверить на узле
Посчитать хеш известного адреса для списка:
/usr/sbin/pmtahashedAddress test@FOO.com
Результат iZ0zh6XFp1VdUdLwoLe1Djl_5IH9mlj6-zibfclOEfY~ совпадает с примером руководства: регистр адреса на хеш не влияет.