[sendmail-conf] Про хаки...

Victor Ustugov victor на corvax.kiev.ua
Вт Авг 17 19:05:59 EEST 2004


Sergey wrote:

>>1. одно действие на все суффиксы?
> 
> Хотябы это.

в первом приближении сделал:
http://corvax.falbi.kiev.ua/sendmail-cf/hack/check_helo.m4

в переменной confCHECK_HELO_FORGED_RESOLVE_FAIL можно указать действие 
при ошибках разрешения имени хоста рилея, что приведет к невозможности 
сравнить доменную зону хоста и суффикс helo.
возможные значения:
DEFER     - возвращать 4xx клиенту
REJECT    - возвращать 5xx клиенту
PASS      - пропускать проверку forged helo
значение по умолчанию - DEFER:
define(`confCHECK_HELO_FORGED_RESOLVE_FAIL', `DEFER')dnl

итак, логика проверки forged helo, перечисленных в access_db:

1. в самом начале хака на всякий случай проверяем существование 
переменной confCHECK_HELO_FORGED_RESOLVE_FAIL и длину ее значения. если 
переменная не существует или она пустая, присваиваем ей значение DEFER

2. после штатной проверки helo по access_db проводим еще один поиск helo 
в access_db с квалификатором HeloSuffix. поиск проводится правилом AdvD 
(продвинутый D :), который давным-давно назывался LookUpDomain). AdvD 
отличается от простого D тем, что в результате запроса выводит не только 
сам результат, но и значение, которое он нашел в access_db, которое 
может отличаться от того, которое мы задали при поиске, т. к. этот самый 
поиск рекурсивный. AdvD описан в cfhead.m4, так что надо не забыть 
обновить и его

3. если в результате поиска возникла ошибка (не прочитался access_db или 
что-то в этом роде), или ничего не нашли, или нашли запись со значением 
OK или SKIP, то прекращаем проверку

4. если нашли запись со значением REJECT или DISCARD или ERROR или TEMP 
(что означает, что данный суффикс проверяемый и надо сравнивать его с 
доменной зоной хоста отправителя), проверяем резолвинг рилея.

5. если резолвинг хоста рилея закончился неудачно (нет записи в 
реверсной зоне, временные проблемы резолвинга или записи из прямой и 
реверсной зоны не совпадают), то в соответствии со значением переменной 
confCHECK_HELO_FORGED_RESOLVE_FAIL клиенту возвращается 4xx или 5xx или 
проверка прекращается

6. если резолвинг рилея закончился удачно, то в соответствии с найденной 
записью возвращаем сообщение об ошибке клиенту. вид ошибки и текст 
ошибки указываются в access_db, в hack'е есть примеры


пока во всем этом я вижу слабое место в проверке ризолвинга рилея. ведь 
если у _нас_ проблемы с резолвером, то {client_resolve} будет иметь 
значение TEMP. тогда корректнее даже при значении 
confCHECK_HELO_FORGED_RESOLVE_FAIL, равном REJECT, все же возвращать 
tempfail клиенту (DEFER), ибо можно из-за проблем со своей системой 
отвергнуть валидную почту
-- 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Best wishes Victor Ustugov   mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:        http://victor.corvax.kiev.ua/corvax.asc
ICQ: 77186900, 32418694      CRV2-RIPE, CRV-UANIC




Подробная информация о списке рассылки sendmail-conf