1 Konfiguracja serwera poczty elektronicznejPostfix a spam dr inż. Maciej Miłostan Instytut Informatyki, Politechnika Poznańska
2 Instytut Informatyki, Politechnika PoznańskaAgenda Co to jest Postfix? Podstawowa konfiguracja Autoryzacja, TLS itp. Opcje antyspamowe Integracja zewnętrznych filtrów Podsumowanie Instytut Informatyki, Politechnika Poznańska
3 Instytut Informatyki, Politechnika PoznańskaPostfix MTA (Mail Transfer Agent) IBM Research Secure Mailer open source release (grudzień 1998) Lekki, bezpieczny Alternatywa dla sendmail-a Szybki, łatwy w użytkowaniu i bezpieczny Wietse Zweitze Venema Instytut Informatyki, Politechnika Poznańska
4 Instytut Informatyki, Politechnika PoznańskaUdział w rynku Na podstawie opracowania Ken-a Simpson-a i Stas-a Bekman-a, O’Reilly SysAdmin, Styczeń 2007. Instytut Informatyki, Politechnika Poznańska
5 Wzrost rozmiarów MTA w czasieNa podstawie: Instytut Informatyki, Politechnika Poznańska
6 Architektura tradycyjnego systemu poczty z BSD UNIXimpersonacja wymaga przywilejów, model monolityczny utrudnia kontrolę nad ew. zniszczeniami Sendmail* z sieci do sieci do |komenda** do /plik/nazwa** wykonywane z przywilejami odbiorcy /bin/mail* lokalne zgłoszenie dostarczenie lokalne (local delivery) mailbox (plik) właścicielem jest odbiorca * używa przywilejów root-a (root privileges) ** w plikach .forward użytkowników i bazie aliasów systemowych Instytut Informatyki, Politechnika Poznańska
7 Architektura Postfix-a (client server service oriented)interfejsy wejściowe (input interfaces) interfejsy wyjściowe (output interfaces) rdzeń (core) mail store (np. cyrus) internet etc klient smtp/lmtp serwer smtp smtp client smtpd smtpd smtpd smtpd internet (unprivileged) inne demony nieuprzywilejowany (unprivileged) nieuprzywilejowany (unprivileged) local delivery smtpd mailbox |command /file/name local pickup smtpd uprzywilejowany (privileged) wysyłka lokalna (local submission) to external transports mail queue smtpd uucp fax pager smtpd = uprawnienia root-a = uprawnienia postfix-a uprzywilejowany (privileged) Instytut Informatyki, Politechnika Poznańska
8 Inspekcja zawartości poprzez SMTP (post queue)MTA 1 Filtr MTA 2 wejście smtp smtp wyjście Czerwony = brudny, zielony = czysty. To nie może być takie proste, prawda? Użycie dwóch MTA to marnotrawstwo! Instytut Informatyki, Politechnika Poznańska
9 Inspekcja zawartości poprzez SMTP (post queue)MTA 1 = MTA 2 smtp server smtp client network network local submit local pickup mail queue local delivery mailbox command file smtp server smtp client content filter Złożenie dwóch MTA w jeden system powoduje zaoszczędzenie zasobów, ale zwiększa złożoność Instytut Informatyki, Politechnika Poznańska
10 Milter a Postfix Czerwony = brudny, zielony = czysty. Postfix (subset)local submit local pickup queue inject mail queue smtp server network smtp events header body... milter application(s) Czerwony = brudny, zielony = czysty. Instytut Informatyki, Politechnika Poznańska
11 Milter a Postfix Czerwony = brudny, zielony = czystyPostfix (podzbiór) lokalne zgłoszenie Lokalny odbiór (local pickup) Iniekcja do kolejki (queue inject) Kolejka pocztowa (mail queue) serwer smtp sieć Zdarzenia smtp (events) Nagłówek (header) Zawartość (body)... aplikacje milter Czerwony = brudny, zielony = czysty Twórca Postfixa został uhonorowany nagrodą Sendmaila za dodanie tej funkcjonalności Instytut Informatyki, Politechnika Poznańska
12 Instytut Informatyki, Politechnika PoznańskaPliki konfiguracyjne /etc/postfix/master.cf /etc/postfix/main.cf Dwa główne pliki konfiguracyjne Instytut Informatyki, Politechnika Poznańska
13 Filtracja a protokół SMTP>telnet Trying Connected to localhost. Escape character is '^]'. 220 mail.xxx.poznan.pl ESMTP Postfix on SuperServer helo client.some.domain 250 mail.xxx.put.poznan.pl mail from: Ok rcpt to: Ok DATA 354 End data with
14 Konfiguracja domyślnaNazwa listy ograniczeń Status smtpd_client_restrictions Opcjonalna smtpd_helo_restrictions smtpd_sender_restrictions smtpd_recipient_restrictions Wymagana smtpd_data_restrictions smtpd_end_of_data_restrictions smtpd_etrn_restrictions smtpd_delay_reject = yes Instytut Informatyki, Politechnika Poznańska
15 Restrykcje względem klientów, nadawców i odbiorcówCo możemy sprawdzać: Poprawność składniową adresu Rekordy w DNS: MX NS A TEXT (np. SPF) Zgodność działania klienta z protokołem Czy komendy są przesyłane po uzyskaniu odpowiedzi na poprzednie Czy lokalny użytkownik jest zalogowany Czy lokalny użytkownik może wysyłać z danego adresu Z jakiego adresu IP zostało nawiązane połączenie, czy z zaufanego adresu itp. itd. Instytut Informatyki, Politechnika Poznańska
16 Konfiguracja domyślna i podstawowe parametryNazwa domeny, nazwa hosta /etc/postfix/main.cf: myhostname = host.my.domain (nazwa hosta nie jest FQDN, rose (NFQDN) vs. rose.man.poznan.pl (FQDN)) mydomain = my.domain (gdzie my.domain jest konkretną domeną, np. man.poznan.pl) myhostname = host.virtual.domain (virtual interface) myhostname = virtual.domain (virtual interface) Instytut Informatyki, Politechnika Poznańska
17 Konfiguracja domyślna i podstawowe parametryPoczta wychodząca (outbound mail) /etc/postfix/main.cf: myorigin = $myhostname (domyślnie: wysyła jako myorigin = $mydomain (prawdopodobnie pożądana forma: Instytut Informatyki, Politechnika Poznańska
18 Konfiguracja domyślna i podstawowe parametryPoczta przychodząca – obsługiwane adresy /etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain localhost (domyślnie) mydestination = $myhostname localhost.$mydomain localhost $mydomain (serwer dla całej domeny) mydestination = $myhostname localhost.$mydomain localhost ftp.$mydomain (host z wieloma rekordami A w DNS) Uwaga: w celu uniknięcia pętli (mail delivery loops) trzeba wylistować wszystkie nazwy danej maszyny Instytut Informatyki, Politechnika Poznańska
19 Konfiguracja domyślna i podstawowe parametryOgraniczanie przesyłania z naszych adresów, czyli „what clients to relay mail from” /etc/postfix/main.cf: mynetworks_style = subnet (default: authorize subnetworks) mynetworks_style = host (safe: authorize local machine only) mynetworks = /8 (safe: authorize local machine only) mynetworks = / /32 (authorize local machine) mynetworks_style jest ignorowane Instytut Informatyki, Politechnika Poznańska
20 Konfiguracja domyślna i podstawowe parametryMetoda doręczania – pośrednio czy bezpośrednio /etc/postfix/main.cf: relayhost = (default: direct delivery to Internet) relayhost = $mydomain (deliver via local mailhub) relayhost = [mail.$mydomain] (deliver via local mailhub) relayhost = [mail.isp.tld] (deliver via provider mailhub) Nawiasy eliminują wyszukiwanie rekordu MX w DNS-ie Instytut Informatyki, Politechnika Poznańska
21 Konfiguracja domyślna i podstawowe parametryPostmaster /etc/aliases: postmaster: you root: you O czym (domyślnie) informować: /etc/postfix/main.cf: notify_classes = resource, software Instytut Informatyki, Politechnika Poznańska
22 Konfiguracja domyślna i podstawowe parametryO czym informować (notify_classes) bounce 2bounce delay policy protocol resource software Instytut Informatyki, Politechnika Poznańska
23 Konfiguracja domyślna i podstawowe parametry/etc/postfix/main.cf: inet_interfaces = all inet_interfaces = virtual.host.tld (virtual Postfix) inet_interfaces = $myhostname localhost... (non-virtual Postfix) Instytut Informatyki, Politechnika Poznańska
24 Dostarczanie do skrzyneklocal_recipient_maps local_recipient_maps = proxy:unix:passwd.byname $alias_maps (odrzucanie maili do nieznanych użytkowników, domyślne ustawienie) mailbox_transport (default:empty) mailbox_transport = lmtp:unix:/var/imap/socket/lmtp (dostarczanie za pomocą protokołu LMTP np. do skrzynek cyrus imap-a nasłuchującego na lokalnym gniazdku (socket)) Niezbędne przy dostarczaniu i do użytkowników bez konta unix-owego Instytut Informatyki, Politechnika Poznańska
25 Przykładowa konfiguracja/etc/postfix/main.cf … myhostname = cos.costam.poznan.pl mydomain = costam.poznan.pl inet_interfaces = all notify_classes = resource, software relayhost = relay_domains = $mydestination mydestination = $myhostname, localhost.$mydomain, $mydomain, mail.$mydomain mynetworks = x.x, /8 alias_database = hash:/etc/mail/aliases alias_maps = hash:/etc/aliases smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination Instytut Informatyki, Politechnika Poznańska
26 Instytut Informatyki, Politechnika PoznańskaProblemy Pocztę na zewnątrz mogą wysyłać tylko użytkownicy sieci/hostów wyspecyfikowanych w mynetworks Spamerzy mogą podszywać się pod wewnętrznych użytkowników Wewnętrzni użytkownicy mogą fałszować adresy nadawców i wysyłać do dowolnych odbiorców Instytut Informatyki, Politechnika Poznańska
27 Instytut Informatyki, Politechnika PoznańskaRozwiązanie problemu Pocztę na zewnątrz mogą wysyłać tylko użytkownicy sieci/hostów wyspecyfikowanych w mynetworks Rozwiązanie: wykorzystać check_sender_access hash:/etc/postfix/access użyć autoryzacji SMTP AUTH = permit_sasl_authenticated + SASL Instytut Informatyki, Politechnika Poznańska
28 Instytut Informatyki, Politechnika PoznańskaAutoryzacja SASL /etc/postfix/main.cf: smtpd_sasl_auth_enable = yes smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = $myhostname (smtpd_sasl_authenticated_header = yes) (broken_sasl_auth_clients = yes) Instytut Informatyki, Politechnika Poznańska
29 Instytut Informatyki, Politechnika PoznańskaAutoryzacja Cyrus SASL version 2.1.x /etc/sasl2/smtpd.conf: pwcheck_method: saslauthd mech_list: PLAIN LOGIN W celu użycia PAM (Pluggable Authentication Modules), uruchom saslauthd z opcją "-a pam". Instytut Informatyki, Politechnika Poznańska
30 Testowanie autoryzacji>printf '\0username\0password'|mimencode AHVzZXJuYW1lAHBhc3N3b3Jk >telnet server.example.com 25 . . . 220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 250-ETRN 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME AUTH PLAIN AHVzZXJuYW1lAHBhc3N3b3Jk 235 Authentication successful Instytut Informatyki, Politechnika Poznańska
31 Instytut Informatyki, Politechnika PoznańskaProblem z hasłem Hasło jest przesyłane „czystym tekstem” Rozwiązanie: szyfrowanie transmisji, czyli TLS Instytut Informatyki, Politechnika Poznańska
32 Instytut Informatyki, Politechnika PoznańskaSzyfrowanie TLS /etc/postfix/main.cf smtpd_use_tls = yes smtpd_tls_auth_only = no smtpd_tls_key_file = /etc/postfix/postfix.key smtpd_tls_cert_file = /etc/postfix/postfix.crt smtpd_tls_CAfile = /etc/postfix/CA.crt smtpd_tls_loglevel = 2 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom Instytut Informatyki, Politechnika Poznańska
33 Instytut Informatyki, Politechnika PoznańskaProblemy Pocztę na zewnątrz mogą wysyłać tylko użytkownicy sieci/hostów wyspecyfikowanych w mynetworks Spamerzy mogą podszywać się pod wewnętrznych użytkowników Wewnętrzni użytkownicy mogą fałszować adresy nadawców (niekoniecznie lokalnych) i wysyłać do dowolnych odbiorców Instytut Informatyki, Politechnika Poznańska
34 Fałszowanie nagłówków>telnet mail.xxx.poznan.pl Trying mail.xxx.poznan.pl... Connected to localhost. Escape character is '^]'. 220 mail.xxx.poznan.pl ESMTP Postfix on SuperServer helo client.some.domain 250 mail.xxx.poznan.pl mail from: Ok rcpt to: Ok DATA 354 End data with
35 Mapy kont i użytkownikówRelacja: adresy pocztowe a nazwy użytkowników Adresy pocztowe nadawców Nazwy użytkowników Instytut Informatyki, Politechnika Poznańska
36 Mapy kont i użytkownikówsmtpd_sender_login_maps = hash:/etc/postfix/login_maps /etc/postfix/main.cf: reject_sender_login_mismatch /etc/postfix/login_maps postmap /etc/postfix/login_maps Instytut Informatyki, Politechnika Poznańska
37 Przykładowa sesja (fałszerstwo): użytkownik=kowalski,hasło=jan>printf '\0kowalski\0jan'|mimencode AGtvd2Fsc2tpAGphbg== >telnet host.xxx.poznan.pl 25 . . . 220 host.xxx.poznan.pl ESMTP Postfix EHLO client.example.com 250-host.xxx.poznan.pl 250-PIPELINING 250-SIZE 250-ETRN 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME AUTH PLAIN AGtvd2Fsc2tpAGphbg== 235 Authentication successful MAIL Ok RCPT Sender address rejected: not owned by user Instytut Informatyki, Politechnika Poznańska
38 Przykładowa sesja (prawidłowa):>printf '\0kowalski\0jan'|mimencode AGtvd2Fsc2tpAGphbg== >telnet host.xxx.poznan.pl 25 220 host.xxx.poznan.pl ESMTP Postfix EHLO client.example.com 250-host.xxx.poznan.pl … 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME AUTH PLAIN AGtvd2Fsc2tpAGphbg== 235 Authentication successful MAIL Ok RCPT Ok DATA 354 End data with
39 Mapy kont i użytkowników – przykładowa sesja (bez autoryzacji)>telnet host.xxx.poznan.pl 25 . . . 220 host.xxx.poznan.pl ESMTP Postfix EHLO client.example.com 250-host.xxx.poznan.pl 250-PIPELINING 250-SIZE 250-ETRN 250-AUTH DIGEST-MD5 PLAIN CRAM-MD5 250 8BITMIME MAIL Ok RCPT Sender address rejected: not logged in Instytut Informatyki, Politechnika Poznańska
40 REJECT (user@d1 nie zautoryzował się)Wada tego rozwiązania Potencjalny problem z forwardami MX domain d1 MX domain d2 .forward (user): REJECT nie zautoryzował się) Instytut Informatyki, Politechnika Poznańska
41 Instytut Informatyki, Politechnika PoznańskaProblemy Pocztę na zewnątrz mogą wysyłać tylko użytkownicy sieci/hostów wyspecyfikowanych w mynetworks Spamerzy mogą podszywać się pod wewnętrznych użytkowników Wewnętrzni (zautoryzowani) użytkownicy mogą fałszować adresy nadawców (niekoniecznie lokalnych) i wysyłać do dowolnych odbiorców Spamerzy mogą podszywać się pod nieistniejących użytkowników Instytut Informatyki, Politechnika Poznańska
42 Przykładowa sesja bez check_sender_access220 host.xxx.poznan.pl ESMTP Postfix helo mm 250 host.xxx.poznan.pl mail Ok rcpt Ok DATA 354 End data with
43 Przykładowa sesja bez check_sender_access220 host.xxx.poznan.pl ESMTP Postfix helo mm 250 host.xxx.poznan.pl mail Ok rcpt Relay access denied Nieistniejący adres lokalny Istniejący adres zewnętrzny Instytut Informatyki, Politechnika Poznańska
44 Ograniczanie możliwości wysyłaniaJak uniemożliwić wysyłanie z nieistniejących lokalnych adresów? check_sender_access type:table smtpd_recipient_restrictions = permit_mynetworks, reject_sender_login_mismatch, check_sender_access hash:/etc/postfix/access, reject_unauth_destination Instytut Informatyki, Politechnika Poznańska
45 Instytut Informatyki, Politechnika Poznańskasmtpd_recipient_restrictions = … check_sender_access hash:/etc/postfix/access OK OK OK OK OK OK OK OK host.xxx.poznan.pl REJECT xxx.poznan.pl REJECT parent_domain_matches_subdomains >postconf -d |grep parent_domain_matches_subdomains parent_domain_matches_subdomains = debug_peer_list,fast_flush_domains,mynetworks,permit_mx_backup_networks,qmqpd_authorized_clients,relay_domains, smtpd_access_maps Instytut Informatyki, Politechnika Poznańska
46 Instytut Informatyki, Politechnika PoznańskaPrzykładowa sesja 220 host.xxx.poznan.pl ESMTP Postfix helo mm 250 host.xxx.poznan.pl mail Ok rcpt Sender address rejected: Access denied quit Bye Nieistniejący adres lokalny Instytut Informatyki, Politechnika Poznańska
47 Instytut Informatyki, Politechnika PoznańskaCzarne listy Dodajemy na końcu smtpd_recipient_restrictions reject_rhsbl_client blackhole.securitysage.com, reject_rhsbl_sender blackhole.securitysage.com, reject_rbl_client relays.ordb.org, reject_rbl_client blackholes.easynet.nl, reject_rbl_client cbl.abuseat.org, reject_rbl_client proxies.blackholes.wirehub.net, reject_rbl_client bl.spamcop.net, reject_rbl_client sbl.spamhaus.org, reject_rbl_client opm.blitzed.org, reject_rbl_client dnsbl.njabl.org, reject_rbl_client list.dsbl.org, reject_rbl_client multihop.dsbl.org, Instytut Informatyki, Politechnika Poznańska
48 Instytut Informatyki, Politechnika PoznańskaCzarne listy Zewnętrzna kontrola Czasami dodawane są całe klasy adresowe Problem z usuwaniem wpisanych hostów Adresy popularnych dostawców znajdują się często na wielu listach. Dla przykładu: Adresy TP S.A. / Orange Adresy Polskiej Telefonii Cyfrowej Adresy Polkomtela Instytut Informatyki, Politechnika Poznańska
49 Analiza nagłówków i zawartościheader_checks(5) header_checks = regexp:/etc/postfix/maps/header_checks /^HEADER: .*content_to_act_on/ ACTION /^Subject: .*Make Money Fast!/ REJECT mime_header_checks = regexp:/etc/postfix/maps/mime_header_checks /name=[^>]*\.(bat|com|exe|dll)/ REJECT body_checks = regexp:/etc/postfix/maps/body_checks /content_to_act_on/ ACTION Instytut Informatyki, Politechnika Poznańska
50 Instytut Informatyki, Politechnika PoznańskaInne restrykcje reject_unauth_destination, reject_invalid_hostname, reject_unauth_pipelining, reject_non_fqdn_sender, reject_unknown_sender_domain, reject_non_fqdn_recipient, reject_unknown_recipient_domain, check_client_access hash:/etc/postfix/maps/access_client, check_helo_access hash:/etc/postfix/maps/access_helo, check_sender_access hash:/etc/postfix/maps/access_sender, check_recipient_access hash:/etc/postfix/maps/access_recipient, Instytut Informatyki, Politechnika Poznańska
51 Przepisywanie adresów (canonical rewriting)Jak wymusić standaryzację adresów? canonical_maps = hash:/etc/postfix/canonical sender_canonical_maps = hash:/etc/postfix/sender_canonical recipient_canonical_maps = hash:/etc/postfix/recipient_canonical mm Kowalski … Instytut Informatyki, Politechnika Poznańska
52 Zewnętrzne filtry (before queue)Internet -> Postfix SMTP server -> Before queue filter -> Postfix SMTP server -> Postfix cleanup server -> smtp Postfix queue -< local virtual Instytut Informatyki, Politechnika Poznańska
53 Wady i zalety filtrów przedkolejkowychPoczta jest odrzucana, zanim skończy się sesja z klientem Wydłużenie czasu odpowiedzi serwera przy połączeniach SMTP wynikające z konieczności filtrowania „on-line” Duże wymagania pamięciowe niektórych filtrów wymuszają ograniczenie liczby ich instancji, w efekcie jeszcze bardziej wydłużając czas obsługi Instytut Informatyki, Politechnika Poznańska
54 Konfiguracja filtrów przedkolejkowychPostfix komunikuje się z filtrami poprzez protokół SMTP Internet -> Postfix SMTP server on port 25 -> filter on localhost port > Postfix SMTP server on localhost port > Postfix cleanup server -> Postfix incoming queue Instytut Informatyki, Politechnika Poznańska
55 Konfiguracja: /etc/postfix/master.cf# ============================================================= # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) # # Before-filter SMTP server. Receive mail from the network and # pass it to the content filter on localhost port smtp inet n n smtpd -o smtpd_proxy_filter= :10025 -o smtpd_client_connection_count_limit=10 # After-filter SMTP server. Receive mail from the content filter # on localhost port :10026 inet n n smtpd -o smtpd_authorized_xforward_hosts= /8 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions= -o mynetworks= /8 -o receive_override_options=no_unknown_recipient_checks Uwaga: nie używać spacji wokół znaków "=" lub ",". Adres i port filtra Ograniczenie liczby sesji z domyślnych 100 do 20 Jeden klient może zużyć max. 10 procesów filtra Adres i port, na którym Postfix odbiera filtrowaną pocztę Umożliwia logowanie oryginalnych nagłówków Instytut Informatyki, Politechnika Poznańska
56 Inne parametry konfiguracyjnesmtpd_proxy_timeout (domyślnie: 100s): limit czasu połączenia z przedkolejkowymi filtrami zawartości (ang. before-queue content filter), włącznie z czasem przesyłania komend i danych. Wszystkie błędy (ang. proxy errors) są logowane w pliku logu poczty (ang. maillog). Ze względów ochrony prywatności zdalni klienci SMTP w przypadku przekroczenia tego limitu otrzymują błąd „451 Error: queue file write error” (Błąd zapisu do kolejki). Nie jest wskazane ujawnianie szczegółów wewnętrznej konfiguracji nieznanym osobom z zewnątrz. smtpd_proxy_ehlo (domyślnie: $myhostname) Instytut Informatyki, Politechnika Poznańska
57 Zewnętrzne filtry (after queue)MTA 1 = MTA 2 smtp server smtp client network network local submit local pickup mail queue local delivery mailbox command file smtp server smtp client content filter Instytut Informatyki, Politechnika Poznańska
58 Zewnętrzne filtry (after queue): przekazywanie poczty do filtra/etc/postfix/main.cf: content_filter = scan:localhost:10025 receive_override_options = no_address_mappings /etc/postfix/master.cf: # ============================================================= # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) scan unix n smtp -o smtp_send_xforward_command=yes -o disable_mime_output_conversion=yes -o smtp_generic_maps= Instytut Informatyki, Politechnika Poznańska
59 Zewnętrzne filtry: uruchamianie filtra spawn vs. standalone/etc/postfix/master.cf: # =================================================================== # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) localhost:10025 inet n n n spawn user=filter argv=/path/to/filter localhost 10026 "filter" – dedykowany użytkownik command_time_limit – ogranicza czas działania filtra Filtry nasłuchujące cały czas należy uruchamiać bez użycia usługi spawn Instytut Informatyki, Politechnika Poznańska
60 Odbieranie poczty z filtra#/etc/postfix/master.cf # =================================================================== # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) localhost:10026 inet n n smtpd -o content_filter= -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters -o smtpd_helo_restrictions= -o smtpd_client_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks= /8 -o smtpd_authorized_xforward_hosts= /8 Wyłączenie filtrowania poczty wracającej z filtra, inne ustawienie może spowodować zapętlenie Nie chcemy sprawdzać tego, co już zostało sprawdzone Nie wyspecyfikowano: no_address_mappings, gdyż mapowanie nie było wykonane wcześniej w wyniku użycia parametru receive_override_options w /etc/postfix/master.cf Instytut Informatyki, Politechnika Poznańska
61 Kwestie wydajności filtrów (after queue)Za mała liczba procesów filtrów powoduje gromadzenie poczty w kolejce (active queue ) Za duża liczba procesów powoduje nadmierną konsumpcję zasobów i opóźnianie dostarczania poczty z powodu braku odpowiedzi z filtra Dopasowywanie wartości parametrów odbywa się metodą prób i błędów Analiza wydajności jest „upośledzona” ze względu na współdzielenie kolejki przez wiadomości przefiltrowane i nieprzefiltrowane Instytut Informatyki, Politechnika Poznańska
62 Analiza wydajności i usuwanie wiadomości z kolejkiNarzędzie qshape(1) (zobacz też: QSHAPE_README) > qshape deferred > qshape incoming active deferred > qshape hold > qshape maildrop mailq postsuper –d
63 Zewnętrzne filtry – amavisd-newInterfejs pomiędzy MTA filtrami Ułatwia integrację programów antywirusowych Napisany w PERLu, ale charakteryzujący się dość dobrą wydajnością Standardowo dystrybuowany razem z modułem do SpamAssassina Instytut Informatyki, Politechnika Poznańska
64 Instytut Informatyki, Politechnika PoznańskaAmavisd-new a Postfix /etc/main.cf: content_filter = smtp-amavis:[ ]:10024 /etc/master.cf: smtp-amavis unix y smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=no :10023 inet n y smtpd -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks= /8 -o strict_rfc821_envelopes=yes /etc/amavisd.conf: $forward_method = 'smtp:[ ]:10023'; Instytut Informatyki, Politechnika Poznańska
65 Dodatkowy filtr antwyirusowy lub antyspamowyAmavis posiada wsparcie dla wielu popularnych produktów antywirusowych Jeżeli filtr działa w oparciu o SMTP, to można go dodać w sposób analogiczny do przedstawionego dla amavisa. W tym celu należy dodać kolejne demony SMTP odbierające pocztę z kolejnych filtrów. Dla tych demonów parametr content-filter wskazuje na następny filtr. Kolejne filtry przekazują pocztę do kolejnych demonów SMTP. Dla ostatniego demona SMTP opcja -o content-filter= musi zostać ustawiona na wartość pustą Instytut Informatyki, Politechnika Poznańska
66 Filtry Milter a PostfixPostfix (podzbiór) lokalne zgłoszenie Lokalny odbiór (local pickup) Iniekcja do kolejki (queue inject) Kolejka pocztowa (mail queue) serwer smtp sieć Zdarzenia smtp (events) Nagłówek (header) Zawartość (body)... aplikacje milter Czerwony = brudny, zielony = czysty Instytut Informatyki, Politechnika Poznańska
67 Instytut Informatyki, Politechnika PoznańskaMilter a Postfix pickup(8) sendmail(1) incoming network local : smtpd(8) SMTP-only filters qmqpd(8) non-SMTP filters cleanup(8) Filtry są uruchamiane przed zakolejkowaniem wiadomości Instytut Informatyki, Politechnika Poznańska
68 Instytut Informatyki, Politechnika PoznańskaMilter a Postfix Filtry są pisane w językach C, JAVA i Perl W przypadku C potrzebna jest biblioteka implementująca protokół Sendmail 8 Milter Postfix nie dostarcza takiej biblioteki - trzeba skorzystać z biblioteki dostarczanej przez Sendmaila (libmilter) Biblioteka jest zwykle dostępna w pakiecie sendmail-devel, ew. można pobrać źródła i skompilować samemu Instytut Informatyki, Politechnika Poznańska
69 Instalacja przykładowego filtraKompilacja dkim-milter (analogcznie sid-milter) $ gzcat dkim-milter-x.y.z.tar.gz | tar xf $ cd dkim-milter-x.y.z $ make [...dużo komunikatów...] Uruchamianie # /some/where/dkim-filter -u userid -p ...other options... Wartość userid nieużywana przez inne aplikacje (nie "postfix", nie "www", itd.) Instytut Informatyki, Politechnika Poznańska
70 Konfiguracja Postfix-a/etc/postfix/main.cf: # Milters for mail that arrives via the smtpd(8) server. smtpd_milters = inet:localhost:portnumber ...other filters... unix:pathname inet:host:port # Milters for non-SMTP mail. non_smtpd_milters = inet:localhost:portnumber ...other filters... Instytut Informatyki, Politechnika Poznańska
71 Obsługa błędów, protokół etc.accept, reject, tempfail. milter_default_action = tempfail milter_protocol = 2 UWAGA: Implementacja Miltera w Postfix-ie jest nie pełna (niektóre opcje nie działają). Zobacz: limitations. Dla przykładu Postfix wspiera tylko wersję 2.4 protokołu Miltera. Instytut Informatyki, Politechnika Poznańska
72 Instytut Informatyki, Politechnika PoznańskaSPF a Postfix Sender Policy Framework Próba kontroli fałszowanych i Daje możliwość specyfikowania legitymowanych źródeł poczty Implementowany jako rekordy DNS-owe Protokół opracowany przez grupę ochotników Rozwijany od 2003 roku Instytut Informatyki, Politechnika Poznańska
73 Jak sprawdzać rekordy SPFC:\>nslookup Serwer domyślny: dns.server.domain Address: x.x >set type=TXT >wp.pl wp.pl text = "v=spf1 ip4: /19 mx -all" Instytut Informatyki, Politechnika Poznańska
74 Instytut Informatyki, Politechnika PoznańskaSPF a Postfix Mechanizmy SPF all | ip4 | ip6 | a | mx | ptr | exists | include Modyfikatory (modifiers) redirect | exp Kwalifikatory "+"Pass "-"Fail "~"SoftFail "?"Neutral Instytut Informatyki, Politechnika Poznańska
75 Instytut Informatyki, Politechnika PoznańskaSPF a Postfix Kolejność ewaluacji mechanizmów (od lewej do prawej) "v=spf1 -all" "v=spf1 a -all" "v=spf1 a mx -all" "v=spf1 +a +mx -all" Instytut Informatyki, Politechnika Poznańska
76 Ewaluacja rekordów SPFWynik Wyjaśnienie Zamierzony efekt (Intended action) Przepuść (Pass) Rekord SPF określa adres hosta uprawnionego do wysyłania. akceptacja (accept) Odrzuć (Fail) Rekord SPF określa adres hosta jako nieuprawniony do wysyłania odrzucenie (reject) „Miękkie” odrzucenie (SoftFail) Rekord SPF określa adres hosta jako nieuprawniony do wysyłania, ale jest to stan przejściowy akceptacja z oznaczaniem (accept but mark) Neutralny (Neutral) Rekord SPF określa ściśle, że nic nie można powiedzieć na temat ważności Żaden (None) The domain does not have an SPF record or the SPF record does not evaluate to a result Błąd (PermError) Wystąpił permanentny błąd (np. źle sformatowany rekord) Nieokreślona (unspecified) Błąd przejściowy (TempError) Nastąpił przejściowy błąd Akceptacja albo odrzucenie (accept or reject) Instytut Informatyki, Politechnika Poznańska
77 Zaawansowany przykład> gmail.com gmail.com text = "v=spf1 redirect=_spf.google.com” >_spf.google.com _spf.google.com text = "v=spf1 ip4: /19 ip4: /19 ip4: /20 ip4: /18 ip4: /17 ip4: /20 ip4: /16 ?all" Instytut Informatyki, Politechnika Poznańska
78 Instytut Informatyki, Politechnika PoznańskaSPF a Postfix Milter postfix-policyd-spf-perl /etc/postfix/master.cf policy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/lib/postfix/policyd-spf-perl /etc/postfix/main.cf smtpd_recipient_restrictions =[…] reject_unauth_destination,check_policy_service unix:private/policy Uwaga: ta opcja musi wystąpić przed check_policy_service, w innym przypadku host może stać się open relayem Instytut Informatyki, Politechnika Poznańska
79 Instytut Informatyki, Politechnika PoznańskaPodsumowanie Postfix jako MTA o bezpiecznej architekturze Duże możliwości konfiguracyjne Liczne filtry podstawowe Możliwość wprowadzania własnych rozszerzeń na różnych etapach przetwarzania Obszerna dokumentacja i liczne przykłady dostępne w sieci Internet Instytut Informatyki, Politechnika Poznańska
80 Instytut Informatyki, Politechnika PoznańskaPytania i uwagi DZIĘKUJĘ ZA UWAGĘ Instytut Informatyki, Politechnika Poznańska