2009
Part I Základy poštovního subsystému
Program 1 2
ový subsystém Komponenty MUA Mail User Agent rozhraní mezi uživatelem a subsystémem Mozilla, Lotus Notes, Pegasus, Eudora MTA Mail Transport Agent směruje/doručuje poštu mezi uzly SMTP;, QMail, MDA Mail Delivery Agent doručuje na správné místo v rámci lokálního stroje mh e-maily v extra souborech, mbox vše v jednom souboru
Schéma modulů MUA MDA Síť MTA MTA MTA
MTA : je všude 2 pomalejší než postfix zdaleka nejděravější (určité pozitivum může být sendmail X) : z dílny IBM a další: QMail, Exim, Lotus Notes, Exchange...
MDA, formát úložiště mbox nové e-maily se připojují na konec souboru/schránky uživatele problém se zamykaním, zejména na síťových svazcích rychlé vyhodnocování regulárních dotazů nad veškerou došlou poštou mh/maildir nové e-maily alokují vždy nový soubor v adresáři/schránce uživatele podporuje složky v rámci schránky podporuje sdílení složek mezi více uživateli
Maildir formát adresáře cur, new, tmp nový e-mail: vytvoření unikátního souboru v tmp, přesun do new po příjmu zprávy přesun z new do cur Odpovídající strukturu vytváří např. makemaildir(1) (dovecot).
Sucks-Rules-O-Meter Produkt Sucks + Sux Rocks + Rox Index qmail 165 758 4.594 exim 107 495 4.626 sendmail 278 1532 5.511 postfix 265 1620 6.113 nevědecké měření kvality Windows Unix (http://srom.zgp.org/) vítěz je Unix 47, 6 312 310, 8 193
(Eric Allman) 1979 deliverman BSD 4.0 1983 sendmail BSD 4.1c 1998 Inc. Konfigurace obsahuje přepisovací pravidla pro parsování e-mailů a volbu správných MTA či MDA pro další doručování. Konfigurace se píše v makro jazyce, po kompilaci m4(p) vzniká použitelný a pro laiky zcela nepřehledný konfigurační soubor sendmail.cf: SCanonify2=96 R$* < @ localhost > $* $: $1 < @ $j. > $2 R$* < @ localhost. $m > $* $: $1 < @ $j. > $2 R$* < @ localhost. UUCP > $* $: $1 < @ $j. > $2
M4 macro processor proudově-orientovaný (nedetekuje řádky, pouze čte proud dat) ignorování za konec řádky: dnl definice makra: define( WWW, www.nic.cz ) Opatrně s nevinnými konstrukcemi define( SMART_HOST, central-relay.firma.cz ) FEATURE( use_cw_file ) dnl Tohle je opravdu poznamka # ale odkaz na FEATURE( use_cw_file ) bude expandován i tady
Přepisovací pravidla konfigurační soubor definuje skupiny přepisovacích pravidel, tzv. rulesets pravidla: zpracují adresy z hlavičky normalizují je určí jak dopis zpracovat (smtp, relay, local) pravidla odpovídají gramatice, která pracuje nad tokeny (nikoliv samostatnými znaky!)
Užitečná makra/konstanty $j FQDN serveru $m domainname serveru $w hostname serveru
Levá strana pravidel (LSP) $@ prázdno $* žádný nebo více tokenů $+ alespoň jeden token $- právě jeden token
Příklad $* < $+ > Shoda s Josef Novak < jn@x.y > < jn@x.y > Není shoda s Josef Novak <> Josef Novak <>
Pravá strana pravidel (RSP) $n n-tý výraz v LSP $>n zbytek řádku bude parsován a předán skupině pravidel n k vyhodnocení; výstup z podprogramu je pak výstupem tohoto pravidla $#M $@H $:U cíl, např. smtp/mail.firma.cz/josef Přepisovací pravidlo je aplikováno opakovaně, dokud nastává příslušná shoda. Změna tohoto standardního přístupu je skrze: $@ skupina pravidel je ukončena a výsledek je zůstatek na RSP $: neukončuje zpracování ve skupině pravidel, ale jen v daném pravidle
Skupiny pravidel 0 určí trojici mailer, host, user 1 aplikováno na adresy odesílatelů 2 aplikováno na adresy příjemců 3 preprocess všech adres 1 4 postprocess všech adres 2 5 přepisuje nealiasované lokální uživatele 1 převod na obecný vnitřní formát, např. user < @ host. domain. > 2 revertuje vnitřní formát, např. user@host.domain
Forma zápisu Sm Rlsp rsp volitelná poznámka R... R... Sn R... R... Syntaxe Položky na R-řádcích odděluje tabulátor!
Příklad modifikace pravidel define( SMART_HOST,... ) # pred smart-host resolving v ruleset0 LOCAL_NET_CONFIG # lokalni postu posilej primo, ostatni (mozna) via smart host R$* < @ $*.$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3
Klasický tok přes skupiny pravidel příjemci jsou analyzováni skupinou 3 0 (vznikne doručovací trojice) adresy příjemců zpracuje skupina 3 2 R = n 4 3 adresy odesílatelů zpracuje skupina 3 1 S = n 4 4 Msmtp, P=[IPC], F=mDFMuX, S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP, E=\r\n, L=990, T=DNS/RFC822/SMTP, A=TCP $h 3 R = n diktuje doručovací agent, 0=nedef 4 S = n diktuje doručovací agent, 0=nedef
Testování pravidel root@fw:2772: # /usr/libexec/sendmail/sendmail -Ctest.cf -bt ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> > 3,0 galambos@egothor.org canonify input: galambos @ egothor. org Canonify2 input: galambos < @ egothor. org > Canonify2 returns: galambos < @ egothor. org. > canonify returns: galambos < @ egothor. org. > parse input: galambos < @ egothor. org. > Parse0 input: galambos < @ egothor. org. > Parse0 returns: galambos < @ egothor. org. > ParseLocal input: galambos < @ egothor. org. > ParseLocal returns: galambos < @ egothor. org. > Parse1 input: galambos < @ egothor. org. > Mailertable input: < egothor. org > galambos < @ egothor. org. > Mailertable input: egothor. < org > galambos < @ egothor. org. > Mailertable returns: galambos < @ egothor. org. > Mailertable returns: galambos < @ egothor. org. > MailerToTriple input: < > galambos < @ egothor. org. > MailerToTriple returns: galambos < @ egothor. org. > Parse1 returns: $# esmtp $@ egothor. org. $: galambos < @ egothor. org. > parse returns: $# esmtp $@ egothor. org. $: galambos < @ egothor. org. > Zkuste i sendmail -Ctest.cf -d21.12 -bt
Zjištění sendmail parametrů root@fw:2776: # /usr/libexec/sendmail/sendmail -d0 </dev/null Version 8.14.3 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = fw (canonical domain name) $j = fw.xyz (subdomain name) $m = xyz (node name) $k = fw.xyz ======================================================== Recipient names must be specified
Blokování pošty Tento příklad vyžaduje podporu MAP REGEX v sendmail-u! LOCAL_CONFIG Kkoreatea regex -m text/html[; ]*charset="?(iso-2022-kr euc-kr) LOCAL_RULESETS HContent-Type: $>Block_charset SBlock_charset R$* $: $(koreatea $1 $: <OK> $) R<OK> $@ OK R$+ $#error $: 599 Poslete mi to cesky
Správa sendmail-u mailq(1) - obsah front 5 runq(1) - zpracování front 6 mailstats(8) - statistika přenosů (per mailer) hoststat(8) - statistika transferu (per host) 7 purgestat(8) - anulování statistik per host 8 newaliases(1) - aktualizace báze aliasů 9 5 sendmail -bp 6 sendmail -q 7 sendmail -bh 8 sendmail -bh 9 sendmail -bi
Praktická doporučení soubor s aliasy by neměl být volně přístupný běžným uživatelům přesměrujte poštu pro systémové uživatele (root, operator, www) na svůj účet po každé změně textové podoby báze aliasů 10 spusťte newaliases(1) ověřte, že jste omylem nenakonfigurovali open-relay! 10 Typicky /etc/aliases nebo /etc/mail/aliases
1997 VMailer 1998 Secure Mailer (IBM) 1999 Obsahuje malé procesy s malou potřebou na oprávnění root-a. Základní konfigurace je v main.cf: mydomain jméno lokální domény myorigin na jakou doménu se maškaráduje lokálně odesílaná pošta mydestination pro jaké domény přijímáme poštu relayhost (opt) náš relay host Reload konfigurace: postfix reload více viz postfix(1).
: Schéma konfigurace From: blue@pc32.it.priklad.cz To: user@mff.cuni.cz mynetworks=clientzone relayhost=cd @mff.cuni.cz MX 10 smtp1 MX 20 fake MX 30 smtp3 mydestination=mff.cuni.cz smtp3 clientzone relaydept CD Internet smtp1 mydestination=mff.cuni.cz mynetworks=relaydept myorigin=priklad.cz masquerade_domains=priklad.cz From: blue@priklad.cz To: user@mff.cuni.cz fake relay_domains=mff.cuni.cz
Správa postfix-u postfix(1) - start/stop/check/flush/reload/status postalias(1) - nahrazuje newaliases(1) postcat(1) - zobrazuje obsah front postconf(1) - správa main.cf postmap(1) - stavba/správa pomocných tabulek, např. canonical, virtual postqueue(1) - tisk obsahu nebo vyvolání zpracování fronty
Eliminace nechtěné pošty využívání filtrovacích serverů/služeb (spamassassin, spamd, clamd) filtrovací systémy (amavis) blokování seznamů IP adres, odesílatelů, domén, státu původu podpora na FW (spamd + feed blokovaných z poštovního systému)
Filtrování nechtěné pošty Amavis spustí se několik (původně virgin) démonů každý z démonů aplikuje filtry a modifikuje vstupní e-mail: modifikace předmětu zprávy (***** SPAM *****) změna adresáta (na virusalert@, spamalert@) odtržení virů, atp. výsledek je poslán přes SMTP do druhé instance MTA dynamická adaptace: sdílený SPAM/HAM box (IMAP) monitorování činnosti: mailgraph
Amavis diagram smtpd :25 clamd amavis :10023 smptd :10024 spamassassin plain SMTP unauth TLS (destination) auth TLS (relay) smtpd :10025 Přístup pouze z localhost
Backscatter SPAMer použije adresu nevinné oběti jako odesílatele naše oběť: někdo@mff.cuni.cz cílové stroje buď odmítnou SPAM, anebo se SPAMer trefuje na neexistující příjemce začne vznikat velké množství nedoručenek příjem zajišťuje server se schránkou oběti pokud poštu přijmeme, zahltíme schránku oběti
Backscatter - řešení 1 Obětí je neexistující emailová adresa. v defaultní konfiguraci odmítá příjem. Poznámka: nemá smysl zamezovat samotným TCP spojením, neboť nepocházejí od SPAMera.
Backscatter - řešení 2 Obětí je existující emailová adresa. Z analýzy hlavičkových údajů v nedoručence zjistíme, zda šel takový email skutečně od nás. Hledat můžeme jak položky Message-ID nebo i Received.
Backscatter - řešení 2 Kontrola hlavičkových údajů header_checks = pcre:/etc/postfix/header_checks /ˆReceived:.* +by +(egothor\.org)\b/ REJECT forged mail server name in Received: header: $1 Kontrola obsahu (viz odsazení v regex-u) body_checks = pcre:/etc/postfix/body_checks /ˆ[> ]*Received:.* +by +(egothor\.org)\b/ REJECT forged mail server name in Received: header: $1
Blokování nechtěné pošty MTA může implementovat whitelisting seznam nepovolených (Realtime Blackhole List) IP, které se blokují graylisting seznam povolených IP, ostatní se jen dočasně blokují (bulkmailery spamerů na tom většinou shoří) Problém Jak spravovat seznamy (ne)povolených?
DNS Black List 1 příjímací MTA zjistí IP odesílajícího MTA, např. 192.168.300.1 2 adresa se otočí jako při revers DNS, tj. 1.300.168.192 3 suffix se použije jméno DNSRBL, např. 1.300.168.192.blacklist.ibm.com 4 Áčkový (A RR) dotaz do DNS úspěch IP je na seznamu chyba NXDOMAIN z DNS serveru IP není v seznamu 5 (volitelné) TXT RR může obsahovat vysvětlivku k danému záznamu 6 validní Áčka jsou dle úmluvy ve 127/8, konkrétní hodnoty mají i dohodnutý význam
Konfigurace DNSBL $TTL 2d $ORIGIN blacklist.ibm.com @ IN SOA ns.ibm.com. hostmaster.ibm.com. ( 2006110101 ; serial number 3h ; refresh 15m ; retry 3w ; expiry 3h ; minimum ) IN NS ns.ibm.com. IN NS ns2.ibm.com. # dle dohody slouží následující Áčko pro # externí testování 2.0.0.127 IN A 127.0.0.2 # black list 1.300.168.192 IN A 127.0.0.2 IN TXT "Spammer"...
Návratové hodnoty sorbs.net 127.0.0.2 Open HTTP Proxy Server (http.dnsbl... ) 127.0.0.3 Open SOCKS Proxy Server (socks.dnsbl... ) 127.0.0.4 Open Proxy Server not listed in the SOCKS or HTTP lists (misc.dnsbl... ) 127.0.0.5 Open SMTP relay server (smtp.dnsbl... ) 127.0.0.6 Hosts sending spam/uce/ube to SORBS, netblocks of spam supporting service providers (spam.dnsbl... ) 127.0.0.7 Web servers email vulnerabilities (FormMail scripts,... ) (web.dnsbl... ) 127.0.0.8 Hosts demanding not to be tested by SORBS (block.dnsbl... ) 127.0.0.9 Networks hijacked from original owners (zombie.dnsbl... ) 127.0.0.10 Dynamic IP Address ranges (dul.dnsbl... ) 127.0.0.11 Domain names with bad A or MX RRs (badconf.rhsbl... ) 127.0.0.12 Domain names with no email originating (nomail.rhsbl... )
MTA: Praxe zablokování anonymní relay doménový koš TLS podpora zahazování SPAMu (analýza obsahu > regulární výrazy na hlavičce emailu) eliminování backscatter emailů (regulárními výrazy)
Vyzkoušejte si nainstalujte postfix inicializujte MTA (postfix) 1 postfix-enable(x) 2 sendmail flags="-bd -q30m" 3 crontab(1): crontab -e (disable clientmqueue) nakonfigurujte postfix /etc/postfix/* (hlavně main.cf) quick hint: cd /etc/mail;cp aliases..;newaliases zkuste poslat e-mail root-ovi přes telnet(1) sledujte záznamy v /var/log/maillog
Vyzkoušejte si: telnet localhost 25
Vyzkoušejte si zaveďte si MX pro vaši doménu nechte si poslat e-mail odjinud navzájem si poskytněte RELAY služby nebo si je zajistěte sami na svém dalším VPC zaveďte další MX s prioritou 0 na neplatný/neživý stroj sledujte prodlevy při doručování pošty