‚Ludzie listy piszą!’ ( konfiguracja postfixa )

24 06 2009

Wpis powstał przy masowym nacisku kolegów z forum Slackware. Miejmy nadzieje że będę miał jeszcze czas zrobić małą obróbkę i wrzucić do ‚propozycji do FAQ. Powodem całego zamieszania jest postfix w połączeniu z dovecot. Ostatnio miałem ‚przyjemność’ stawiać serwerek pocztowy i żeby nie fakt literówki która była powodem ciągłych błędów, wszystko poszłoby bardzo sprawnie.

A więc do rzeczy. Mamy do skonfigurowania serwer poczty – postfix w połączeniu z dovecot – serwerem POP3, IMAP i posiadającym w sobie mechanizm do uwierzytelniania użytkowników sasl. Rozwiązanie które zaprezentuje jest z powodzeniem skonfigurowane na serwerze z Slackware 12.2. Paczka z postfix’em jest dystrybucyjna a dovecot jest z slackbuild’a z slackbuilds.org bodajrze (paczki Postfix i Dovecot. Dovecot wyciąga sobie dane do autoryzacji z bazy danych, jednak w moim przypadku wszystko było podporządkowane pod panel hostingowy więc wyciąganie z bazy danych każdy musi sobie zrobić na własny sposób. W google dużo tego było, jak przeglądałem.

Dużo korzystałem z strony kolegi Lemat’a który również okazał się bardzo pomocny i nie bał się morza pytań 🙂 (http://lemat.priv.pl). W swoim rozwiązaniu wykorzystałem jeszcze amavisa i spamassassina jako filtr antyspamowy, a raczej do oznaczania maili jako spam, bo wszystkie maile które dochodzą do serwera przepuszczam do skrzynek, a te które mają odpowiednią ilość ‚hits’ oznaczam jako spam i od użytkownika zależy czy będzie sobie w skrzynce te wiadomości filtrował.

Do rzeczy, czyli do konfiguracji. Wrzucam tylko bardziej istotne rzeczy a reszta standardowo zostaje lub uzupełniacie według własnych potrzeb jak np. hostname 😉
main.cf


# SASL paramters
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
broken_sasl_auth_clients = yes
#
smtpd_helo_required = yes
#
smtpd_client_restrictions =
# odrzucamy Chiny, Koree, i kilka innych klas
# reject_rbl_client chikor.rbl.tld,
reject_unauth_pipelining,
permit
#
smtpd_helo_restrictions =
reject_unauth_pipelining,
reject_invalid_helo_hostname,
permit
#
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_unknown_address,
check_sender_access pcre:/etc/postfix/sender_checks.pcre
reject_unauth_pipelining,
permit
#
smtpd_recipient_restrictions =
reject_unauth_pipelining,
# sprawdzamy domene odbiorcy
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
# jezeli user sie nie zautoryzowal to szukamy lokalnych adresatow
reject_unauth_destination,
# rejecty: nieprawidlowe helo @me
check_helo_access hash:/etc/postfix/helo_checks,
# rejecty: nieprawidlowe helo @me
check_helo_access hash:/etc/postfix/helo_sender_checks
# rejecty: nieprawidlowy sender @me
check_sender_access hash:/etc/postfix/helo_sender_checks
# odrzucamy adresy dynamiczne
# reject_rbl_client dynamic.rbl.tld,
# odrzucamy adresy dynamiczne - Neo, ppp, niektore tld Brazylia, Japonia itd
# black/whitelista niektorych adresow
# reject_rhsbl_client revdns.rbl.tld,
# reject_rhsbl_helo revdns.rbl.tld,
check_client_access pcre:/etc/postfix/client_checks.pcre,
# permit dla duzych hostingow (bez sprawdzania greylistingu, bez SPF (forwardy), bez RBLi
check_client_access hash:/etc/postfix/whitelist.revdns,
# odrzucamy adresy dynamiczne
reject_rbl_client dul.dnsbl.sorbs.net,
# odrzucamy jesli HELO nie jest nazwa hosta + FQDN
check_helo_access pcre:/etc/postfix/helo_checks.pcre,
reject_unknown_helo_hostname,
reject_non_fqdn_helo_hostname,
# unknown user od razu?
reject_unlisted_recipient,
# sprawdzamy rekordy spf / a / mx aby sie nikt nie podszywal
# check_policy_service unix:private/mxfilter,
reject_rbl_client sbl-xbl.spamhaus.org,
# warn_if_reject
# reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
# greylisting
check_policy_service inet:127.0.0.1:10023,
permit
#
smtpd_data_restrictions = reject_multi_recipient_bounce,
reject_unauth_pipelining
#
# AMaViS parameters; activate, if available/used
content_filter = smtp-amavis:[127.0.0.1]:10024
#
bounce_queue_lifetime = 1d
maximal_queue_lifetime = 1d
delay_warning_time = 4h
smtpd_delay_reject = no
allow_percent_hack = no
show_user_unknown_table_name = no
smtpd_sasl_authenticated_header = yes
strict_rfc821_envelopes = yes
disable_vrfy_command = yes
#
unknown_local_recipient_reject_code = 550
unknown_hostname_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550

master.cf ( zwrócie uwagę na kolumnę chroot wpisów, bo miałem z tym trochę problemów )


# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
-o receive_override_options=no_address_mappings
submission inet n - - - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=reject_sender_login_mismatch,permit
-o receive_override_options=no_header_body_checks,no_address_mappings
-o smtpd_recipient_restrictions=reject_non_fqdn_recipient,reject_unknown_recipient_domain,permit_sasl_authenticated,reject
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o receive_override_options=no_address_mappings
# -o milter_macro_daemon_name=ORIGINATING
#628 inet n - - - - qmqpd
pickup fifo n - - 60 1 pickup
cleanup unix n - - - 0 cleanup
qmgr fifo n - n 300 1 qmgr
#qmgr fifo n - - 300 1 oqmgr
tlsmgr unix - - - 1000? 1 tlsmgr
rewrite unix - - - - - trivial-rewrite
bounce unix - - - - 0 bounce
defer unix - - - - 0 bounce
trace unix - - - - 0 bounce
verify unix - - - - 1 verify
flush unix n - - 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay unix - - - - - smtp
-o smtp_fallback_relay=
# -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq unix n - - - - showq
error unix - - - - - error
retry unix - - - - - error
discard unix - - - - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - - - - lmtp
anvil unix - - - - 1 anvil
scache unix - - - - 1 scache
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=no
mxfilter unix - n n - - spawn user=nobody argv=/usr/sbin/mxfilter
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o mynetworks_style=host
-o strict_rfc821_envelopes=yes
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_client_connection_limit_exceptions=127.0.0.0/8
-o smtpd_client_connection_count_limit=200
-o smtpd_client_connection_rate_limit=200
-o smtpd_client_recipient_rate_limit=1000
-o smtpd_client_message_rate_limit=1000
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver -d ${recipient}

Pod adresem http://outlaw.one.pl/postfix/ znajduje się reszta plików które są w w/w konfiguracji main.cf

Przejdźmy teraz do greylistingu. Co to takiego? Najprościej mówiąc podczas gdy na serwerze jest ustawiony grayliging odbija każdego maila do serwera nadawcy, a gdy ten ponawia próbe wysłania tego maila to nasz serwer go wtedy przyjmuje. Jest to bardzo skuteczna ochrona przez spamem ponieważ serwery z których rozsyłany jest spam najczęściej nie retransmitują jeszcze raz tej samej wiadomości. Najlepiej do tego celu użyć postgrey do którego pod Slackware mamy SlackBuild’a

W /etc/rc.d/rc.postgreyd sprawdzamy czy mamy linijkę

daemon /usr/sbin/postgrey --delay=900 --inet=10023 -d --pidfile=/var/run/postgrey.pid --greylist-text=Greylisted

–inet=10023 > port na którym ma nasłuchiwać postgreyd, jeśli zmieniamy to trzeba pamiętać żeby zmienić również w master.cf
–delay=900 > czas przez jaki ma być mail odrzucany w sekundach, im dłuży czas tym skuteczność jest większa, ale nie należy przesadzać żeby użytkownicy nie musieli czekać na jakąś ważna przesyłkę
Pamiętajcie żeby wrzucić linie uruchamiającą postgreyd przy każdym starcie do rc.local 😉
A tak w logach wygląda wpis dotyczący odrzuconej przesyłki:

Jun 22 09:35:40 postfix/smtpd[26391]: connect from unknown[62.129.208.51]
Jun 22 09:35:40 postgrey: action=greylist, reason=early-retry (499s missing), client_name=unknown, client_address=62.129.208.51, sender=serwis@a-novo.pl, recipient=sklep@domena.pl
Jun 22 09:35:40 postfix/smtpd[26391]: NOQUEUE: reject: RCPT from unknown[62.129.208.51]: 450 4.2.0 : Recipient address rejected: Greylisted; from= to= proto=SMTP helo=
Jun 22 09:35:40 postfix/smtpd[26391]: disconnect from unknown[62.129.208.51]

jeśli action=pass to wtedy oznacza że mail został przyjęty przez serwer.

Po tych wszystkich zabiegach macie 99% spamu z głowy. Przynajmniej tak jest w moim wypadku. Mam dość mało skrzynek na serwerze i od jakiegoś miesiąca nie miałem żadnego spamu na serwerze, ale pewnie przy większej ilości skrzynek kilka przesyłek spamu w miesiącu wpadnie. W tym miejscu wchodzi amavis korzystający z spamassassina do oznaczania spamu.

A więc w /etc/amavis/amavisd.conf

# @bypass_spam_checks_maps > musi być w komentarzu żeby amavis korzystał z filtra do filtrowania spamu
$inet_socket_port = 10024; > port na którym nasluchuje amavis, jeśli zmienicie to trzeba również zmienić w main.cf
wartości jaki mam w przypadku wykrywania spamu:
$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.2; # add ‚spam detected’ headers at that level
$sa_kill_level_deflt = 6.9; # triggers spam evasive actions (e.g. blocks mail)
$sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent

spam_admin_maps => [„lukasz\@$mydomain”], >przy tak małej liczbie spamu można pokusić się o podanie maila który ma przychodzić w przypadku wykrycia spamu w którym znajduje się adres nadawcy i odbiorcy i informacja
To chyba byłoby wszystko z ważniejszych rzeczy, reszte zostawiamy albo uzupełniamy według własnych upodobań.
Został nam jeszcze spamassassin, a więc:

/etc/mail/spamassassin/local.cf:

required_score i rewrite_header nie są tu brane pod uwagę bo nadrzędną konfiguracją jest konfiguracja amavisa. Spamassassin zlicza tylko hity, a amavis decyduje czy dodać dodatkowy nagłówek do tematu i przy jakieś ilości trafień to zrobić.


rewrite_header Subject ****SPAM****
#
# Save spam messages as a message/rfc822 MIME attachment instead of
# modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 1
#
# Set the threshold at which a message is considered spam (default: 5.0)
#
required_score 5.0
#
# Use Bayesian classifier (default: 1)
#
use_bayes 1
#
# Bayesian classifier auto-learning (default: 1)
#
bayes_auto_learn 1
use_bayes_rules 1
#
bayes_auto_learn_threshold_nonspam 1
bayes_auto_learn_threshold_spam 7.5
#
# Set headers which may provide inappropriate cues to the Bayesian
# classifier
#
# bayes_ignore_header X-Bogosity
# bayes_ignore_header X-Spam-Flag
# bayes_ignore_header X-Spam-Status
#
ok_locales all
ok_languages pl en
#
bayes_path /var/amavis/.spamassassin/bayes
bayes_file_mode 0666
#
skip_rbl_checks 0
use_razor2 1
#use_dcc 1
use_pyzor 1
#
allow_user_rules 1
#
score USER_IN_BLACKLIST 100000.000
score USER_IN_WHITELIST 0.0
#
blacklist_from *@*.ru
blacklist_from *.@eu-vest.biz
#
#whitelist_from *@domena.pl
#whitelist_from *@domena2.pl
#
score UNWANTED_LANGUAGE_BODY 5
score HTML_IMAGE_ONLY_08 3
score FREE_TRIAL 5
score ALL_TRUSTED 0
score MICROSOFT_EXECUTABLE 4.5
score DATE_MISSING 1.5
score HTML_MESSAGE 0.5
score MIME_HTML_ONLY 0.5
score MIME_SUSPECT_NAME 0.5
score MISSING_MIMEOLE 1.5
score HTML_RELAYING_FRAME 2
score HTML_LINK_CLICK_HERE 3
score HTML_FONTCOLOR_BLUE 0.5
score HTML_FONTCOLOR_GREEN 0.5
score HTML_FONTCOLOR_RED 0.5
score HTML_20_30 1
score HTML_30_40 1
score HTML_40_50 1
score HTML_50_60 1
score HTML_60_70 1
score HTML_70_80 1
score HTML_80_90 1
score HTML_90_100 1
score CLICK_BELOW 3
score CLICK_BELOW_CAPS 3
score CLICK_TO_REMOVE_1 5
score CLICK_TO_REMOVE_2 5
score FOR_FREE 3
score NO_REAL_NAME 1.5
score PRIORITY_NO_NAME 1.5
score FORGED_YAHOO_RCVD 2
score FORGED_HOTMAIL_RCVD 2
score MISSING_OUTLOOK_NAME 0.5
score FORGED_OUTLOOK_TAGS 1.5
score LINES_OF_YELLING 0.5
score LINES_OF_YELLING_2 0.5
score LINES_OF_YELLING_3 0.5
score BIZ_TLD 1
score HEADER_COUNT_CTYPE 2.5
score MIME_HEADER_CTYPE_ONLY 2.5
score MORE_SEX 5

Whitelist i blacklist chyba nie trzeba tłumaczyć, każdy rozumie chyba o co chodzi. Na koniec należy nakarmić bayes jakimś spamem i poprawnymi mailami, aby to uczynić musimy mieć dwa katalog z poprawnymi maila i katalog z spamem. Jeśli mamy imap to nie ma problemu robimy sobie katalog spam na skrzynce i wrzucamy tam wiadomości które uznajemy za spam a przyszły na naszą skrzynkę. Tutaj wrzuciłem mój katalog SPAM z skrzynki na gmail, można go rozpakować i użyć jako przykład do uczenia, a zwykłych maili chyba nie trzeba pokazywać 🙂 możecie sobie również skopiować z swoich skrzynek. Uczenie wykonujemy tak:

sa-learn –progress –spam /var/mail/skrzynka/.SPAM/ > dla spamu
sa-learn –progress –ham /var/mail/skrzynka/.INBOX/ > dla zwykłej poczty

Gdzie w tych katalogach są maile odpowiednia dla ich przeznaczenia 😉

To chyba byłoby na tyle z konfiguracji serwera pocztowego i jego ochrony przed spamem. Została jeszcze konfiguracja dovecot, ale tam akurat mam standardową instalacje dla bazy danych odpowiednią dla panelu hostnigowego którego używam. Jeśli macie pytania piszcie!

Do usłyszenia!


Opcje

Info

Odpowiedz

Możesz używać tagów : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>