Pull to refresh

Антиспам средствами postfix+spamassassin

Reading time5 min
Views13K
У меня небольшой домен, который я поддерживаю и в один прекрасный момент спам настолько достал, что было решено минимизировать его насколько это возможно. Результатом я более чем доволен спама я в принципе не вижу бывает 1 письмо за месяца 3-4 в инбокс падает. Конечно есть ложные срабатывания, но они в основном от рассылок.
Это моя личная конфигурация которой я хочу поделиться, возможно некоторые вещи сделать можно лучше я этого не отрицаю. Так же в зависимости от сайта нужно будет делать свой тюнинг в определенную сторону.

Итак для этого нам понадобятся postfix, spamassassin, amavisd-new. Я использую Debian, ставим пакеты apt-get install postfix, postfix-pcre, spamassassin, amavisd-new


Конфигурационный файл /etc/postfix/main.cf

myhostname = mail.example.com
mydestination = $myhostname
mynetworks = 127.0.0.0/8 # сети из которых можно принимать почту без авторизации для релея.

smtpd_banner = $myhostname ESMTP $mail_name
biff = no

smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/mail.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_received_header = yes # Добавлять заголовки о TLS сесси в письмо
smtpd_tls_auth_only = yes # Авторизация только если установлена TLS сессия
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

# appending .domain is the MUA's job.
append_dot_mydomain = no

alias_maps = hash:/etc/aliases
virtual_alias_maps = hash:/etc/postfix/virtual
proxy_interfaces = 1.1.1.1 # айпи адрес на WAN интерфейсе, если у вас сервер использует внутрение адреса.
smtpd_helo_required = yes
strict_rfc_envlopes = yes
disable_vrfy_command = yes


# smtpd_delay_reject = yes — Дефалт поэтому все правила применяться лишь после команды RCPT TO.

smtpd_recipient_restrictions =
reject_non_fqdn_sender
reject_non_fqdn_recipient
reject_unlisted_recipient
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
reject_unknown_sender_domain
reject_unknown_recipient_domain
check_recipient_access hash:/etc/postfix/spam_trap # список адресов которые кушают спам без запретов.
reject_unknown_reverse_client_hostname
reject_invalid_hostname
reject_non_fqdn_hostname
check_client_access cidr:/etc/postfix/trusted_IP # белый лист
check_helo_access pcre:/etc/postfix/helo_checks # регулярные выражения для ловли типичных спамерских HELO.
check_helo_access hash:/etc/postfix/helo_checks_text
check_sender_access hash:/etc/postfix/not_our_domain_as_sender # Если отправитель в нашем домене, требовать авторизацию
check_sender_mx_access cidr:/etc/postfix/sender_mx_access # список не маршрутизируемых сетей
## Looking up for DNSBL
reject_rbl_client zen.spamhaus.org
permit

smtpd_data_restrictions =
reject_multi_recipient_bounce
reject_unauth_pipelining # Можно использовать эту опцию вне data_restriction только если smtpd_delay_reject = NO установлено, например для задержки показа приветствия (HELO)

smtpd_etrn_restrictions = reject
smtpd_soft_error_limit = 3

header_checks = pcre:/etc/postfix/header_checks # обычная проверка на присутствие в Recived полях нашего домена
mime_header_checks = pcre:/etc/postfix/mime_header_checks # блокировка атачментов

# Это часть конфига для авторизации через dovecot и направления писем в хранилище.
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_authenticated_header = yes

dovecot_destination_recipient_limit = 1
mailbox_transport = dovecot
virtual_transport = dovecot
virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/vmailbox


/etc/postfix/helo_checks
/^mail\.example\.com$/ Reject That's my hostname, use your own
/^1\.1\.1\.1$/ Reject That's my IP address, use your own
/^[1\.1\.1\.1]$/ Reject That's my IP address, use your own
/^[0-9.]+$/ Reject Your client not RFC 2821 compilant
/([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}\.([0-9]){1,3}/ 553 SPAM-raw-ip-in-helo
/(^|[0-9.-])([axv]dsl|isadsl|as|bgp|dynamicIP|broadband|cable|[ck]lient|dhcp|dial|dialin|dialup|dialer|dip|dsl|dslam|dup|dyn|dynamic|host|ip|isdn|modem|nas|node|pool|ppp|pppo[ae]|sirius.*ukrtel.*|user|users|vpn)[0-9.-]/i 553 SPAM_DYNAMIC-in-helo
/([0-9]*-){3}[0-9]*(\..*){2,}/i 553 SPAM-ip-add-rr-ess_networks-in-helo
/([0-9]*\.){4}(.*\.){3,}.*/i 553 SPAM-ip-add-rr-ess_networks-in-helo
/smtp[-0-9]*\.orange\.nl/i 553 SPAM-orange.nl
/smtp[-0-9]*\.orange\.fr/i 553 SPAM-orange.fr
/\.lan$/i 533 SPAM-lan-in-helo

/etc/postfix/sender_mx_access
127.0.0.0/8 Reject MX points to LOCALHOST
192.168.0.0/16 Reject MX points to RFC1918 unreachbale network
10.0.0.0/8 Reject MX points to RFC1918 unreachable network
172.16.0.0/12 Reject MX points to RFC1918 unreachable network
14.0.0.0/8 Reject MX points to RFC3330 special network
224.0.0.0/4 Reject MX in class D multicast network


/etc/postfix/header_checks
if /^Received:/
/^Received: +from +(example\.com) +/
reject forged client name in Received: header: $1
/^Received: +from +[^ ]+ +\(([^ ]+ +[he]+lo=|[he]+lo +)(example\.com)\)/
reject forged client name in Received: header: $2
/^Received:.* +by +(example\.com)\b/
reject forged mail server name in Received: header: $1


Все адреса которые указаны в /etc/postfix/spam_trap, так же присутствую в /etc/postfix/virtual где они все направляються на один ящик spam@example.com.

/etc/amavis/conf.d/50-user
$max_servers = 8; # num of pre-forked children (2..15 is common), -m
$mydomain = 'example.com'; # a convenient default for other settings

@local_domains_maps = ( [ ".$mydomain", '.example.org' ] );

$sa_spam_subject_tag = 'Spam> ';
$sa_tag2_level_deflt = 6.0; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 14.0; # triggers spam evasive actions (e.g. blocks mail)

$final_banned_destiny = D_REJECT;
$final_spam_destiny = D_REJECT;

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

@spam_lovers_maps = ( ['spam@example.org'], );


Отредактируем /etc/spamassassin/local.cf
clear_internal_networks
internal_networks 192.168.0.0/24
bayes_auto_learn 1
bayes_path /var/lib/amavis/.spamassassin/bayes
bayes_auto_learn_threshold_nonspam -0.1
score BAYES_00 0.0001 0.0001 -6.0 -6.0
score BAYES_05 0.0001 0.0001 -3.0 -3.0
score BAYES_20 0.0001 0.0001 -1.0 -1.0
score BAYES_50 0.0001 0.0001 1.6 1.6
score BAYES_60 0.0001 0.0001 2.0 2.0
score BAYES_80 0.0001 0.0001 4.0 4.0
score BAYES_95 0.0001 0.0001 6.5 6.5
score BAYES_99 0.0001 0.0001 10.0 10.0
score RDNS_NONE 0.0001 0.0001 3.0 3.0 # используеться когда нету правила reject_unknown_reverse_client_hostname


Простейший скрипт который будет выполнять обучение bayes фильтра



chmod 777 -R /var/mail/store/spam\@example.com
su amavis -c 'sa-learn --spam --dir /var/mail/store/spam\@example.com/new/'
rm /var/mail/store/spam\@example.ru/new/*

Его я запускаю раз в 15 минут через кронтаб. Для того чтобы убедиться что обучение идет нормально используем команду sa-learn --dump magic обращаем внимание на nspam и nham. В моем случае мне никогда не приходилось в ручную обучать ham ввиду хороших значении для низкого процента.

Я не использую базы данных или LDAP т.к. домен небольшой и управлять файлами гораздо быстрее на данный момент.
Tags:
Hubs:
+7
Comments0

Articles

Change theme settings