Включаем SPF в Postfix

может и с опозданием но все же …
добавляем записи в NS
[cc]
vs.kiev.ua. IN TXT «v=spf1 +mx -all»
vs.kiev.ua. IN SPF «v=spf1 +mx -all»
[/cc]

добавляем пользователя от которого будет работать policyd-spf

[cc lang=bash]
pw group add spf -g 1111
pw user add spf -g spf -s /sbin/nologin -u 1111
[/cc]

ставим порт
portinstall mail/postfix-policyd-spf-perl

дальше чуть правим  postfix-policyd-spf-perl чтоб он корректно работал c sqlgrey который я использую для грейлиста Источник ТУТ

root@mx1/usr/local/sbin> vi postfix-policyd-spf-perl

В подпрограмме sender_policy_framework находим строки

    # Reject on HELO fail.  Defer on HELO temperror if message would otherwise
    # be accepted.  Use the HELO result and return for null sender.
    if ($helo_result->is_code('fail')) {
        syslog(
            info => "%s: SPF %s: HELO/EHLO: %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "550 $helo_authority_exp";
    }
    elsif ($helo_result->is_code('temperror')) {
        syslog(
            info => "%s: SPF %s: HELO/EHLO: %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "DEFER_IF_PERMIT SPF-Result=$helo_local_exp";
    }
    elsif ($attr->{sender} eq '') {
        syslog(
            info => "%s: SPF %s: HELO/EHLO (Null Sender): %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "PREPEND $helo_spf_header"
            unless $cache->{added_spf_header}++;
    }

и приводим их к следующему виду

    # Reject on HELO fail.  Defer on HELO temperror if message would otherwise
    # be accepted.  Use the HELO result and return for null sender.
    if ($helo_result->is_code('fail')) {
        syslog(
            info => "%s: SPF %s: HELO/EHLO: %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "550 $helo_authority_exp";
    }
    elsif ($helo_result->is_code('temperror')) {
        syslog(
            info => "%s: SPF %s: HELO/EHLO: %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "DEFER_IF_PERMIT SPF-Result=$helo_local_exp";
    }
    elsif ($attr->{sender} eq '' && $helo_result->is_code('pass')) {
        syslog(
            info => "%s: SPF %s: HELO/EHLO (Null Sender): %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return 'OK';
    }
    elsif ($attr->{sender} eq '') {
        syslog(
            info => "%s: SPF %s: HELO/EHLO (Null Sender): %s",
            $attr->{queue_id}, $helo_result, $attr->{helo_name}
        );
        return "DUNNO"
    }

Эти строки связаны с spf-проверкой заголовка helo. В оригинальной версии, если не произошло spf-отказа (fail) и все нормально работает, то при пустом отправителе, вне зависимочти от статуса (нет spf-записи, pass, softfail или neutral) в заголовки письма добавляется запись типа Received-SPF: pass (mail.domain.ru: xxx.xxx.xxx.xxx is authorized to use бла-бла-бла бла-бла-бла… и письмо проходит дальше. А дальше стоит грейлистинг…

В поправленом варианте, при пустом отправителе, если helo прошло spf-проверку — статус OK, письмо на доставку, если не прошло — мариноваться в грейлистинг.

[cc lang=perl]

# Same approach as HELO….
# syslog(
# info => «%s: SPF %s: Envelope-from: %s»,
# $attr->{queue_id}, $mfrom_result, $attr->{sender}
# );
# if ($mfrom_result->is_code(‘fail’)) {
# return «550 $mfrom_authority_exp»;
# }
# elsif ($mfrom_result->is_code(‘temperror’)) {
# return «DEFER_IF_PERMIT SPF-Result=$mfrom_local_exp»;
# }
# else {
# return «PREPEND $mfrom_spf_header»
# unless $cache->{added_spf_header}++;
# }
#
# return;

#http://hoarywolf.livejournal.com/12525.html

# Same approach as HELO….
syslog(
info => «%s: SPF %s: Envelope-from: %s»,
$attr->{queue_id}, $mfrom_result, $attr->{sender}
);
if ($mfrom_result->is_code(‘fail’)) {
return «550 $mfrom_authority_exp»;
}
elsif ($mfrom_result->is_code(‘temperror’)) {
return «DEFER_IF_PERMIT SPF-Result=$mfrom_local_exp»;
}
elsif ($mfrom_result->is_code(‘pass’)) {
return ‘OK’;
}

return;

[/cc]

Тут тоже все просто. Проверка по отправителю. Вместо добавления аналогичного заголовка и отправки в грейлистинг всех, кто не fail, измененная версия прошедшим проверку — статус OK, письмо на доставку, остальных мариноваться в грейлистинг. Fail изменения не затронули, они все также идут нафиг.

1. Add the following to /etc/postfix/master.cf:

[cc]
spf-policy unix — n n — 0 spawn
user=spf argv=/usr/local/sbin/postfix-policyd-spf-perl
[/cc]

The user nobody is fine if you have no other daemons running as nobody.
Otherwise, you should use a dedicated user and group for this policy
service.

2. Add «spf-policy_time_limit = 3600» to main.cf.

3. Configure the Postfix policy service in /usr/local/etc/postfix/main.cf:

smtpd_recipient_restrictions =

reject_unauth_destination

check_policy_service unix:private/spf-policy

NOTE: Specify check_policy_service AFTER reject_unauth_destination or your
system may become an open relay.

4. Restart Postfix.

 


Обсуждение закрыто.