Elektronická pošta

Rostislav Svoboda, xsvobo14@fi.muni.cz


Obsah


Úvod

Elektronická pošta je jedna z nejstarších aplikací na Internetu. Její historie sahá do původního Arpanetu. Již na počátku sedmdesátých let se objevily první programy pro odesílání emailů. V dnešní době patří email mezi základní služby a je jedním z hlavních důvodů rozvoje Internetu. Původně byla elektronická pošta navržena jako jednoduchá služba (definovaná dokumentem RFC 822), která nedělala nic jiného než kopírovala zprávu z počítače odesílatele na počítač příjemce, kde ji připojila k již existujícímu souboru(schránce). Tento základní princip přetrval i do dnešní doby. Postupem času bylo nutné definovat řadu rozšíření pro vetší variabilitu. Jedná se o neinteraktivní (off-line) komunikaci.


Poštovní systémy

Poštovní systémy se teoreticky skládají ze čtyř různých součástí:

Základním komunikačním protokolem přenosových programů je SMTP (Simple Mail Transport Protocol) definován v RFC 821 nebo ESMTP (Enhanced SMTP) definovaný v RFC 1869, 1870, 1891 a 1985. Většina mailserverů zvládá oba dva protokoly. Klient se sám rozhodne, který bude používat. Server jeho volbu pozná podle pozdravu -- HELO u SMTP a EHLO u ESMTP

Ukázka komunikace v SMTP protokolu

[xsvobo14@nymfe57 ~] $ telnet aisa 25
Trying 147.251.48.1...
Connected to aisa.fi.muni.cz.
Escape character is '^]'.
220 aisa.fi.muni.cz ESMTP Sendmail 8.12.10/8.12.8; Tue, 29 Mar 2005 15:20:51 +0200 (MET
 DST)
EHLO aisa
250-aisa.fi.muni.cz Hello nymfe57.fi.muni.cz [147.251.53.67], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-DELIVERBY
250 HELP
MAIL From: xx@ss.cz
250 2.1.0 xx@ss.cz... Sender ok
RCPT To: steve@mail.muni.cz
250 2.1.5 steve@mail.muni.cz... Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
testik pro spravu UNIXu
.
250 2.0.0 j2TDKp7M19911434 Message accepted for delivery

Další ukázka komunikace v SMTP protokolu

[xsvobo14@nymfe57 ~] $ mail -v -s ttt steve@mail.muni.cz
test
Cc:
[<-] 220 anxur.fi.muni.cz ESMTP NO UCE NO SPAM - CVT Vas lubi.
[->] HELO nymfe57
[<-] 250 anxur.fi.muni.cz
[->] MAIL FROM:
[<-] 250 Ok
[->] RCPT TO:
[<-] 250 Ok
[->] DATA
[<-] 354 End data with .
[->] Received: by nymfe57 (sSMTP sendmail emulation); Tue, 29 Mar 2005 15:25:45 +0200
[->] From: "Rostislav Svoboda" 
[->] Date: Tue, 29 Mar 2005 15:25:45 +0200
[->] To: steve@mail.muni.cz
[->] Subject: ttt
[->]
[->] test
[->] .
[<-] 250 Ok: queued as A239A22AEF6
[->] QUIT
[<-] 221 Bye
Základní vlastnosti SMTP:


Anatomie zprávy

E-mailová zpráva má tři jasně oddělené části:

Obálka definuje, kam bude zpráva dodána, nebo pokud ji nelze dodat, komu by měla být vrácena. Odresy na obálce se obecně shodují s řádky From a To v hlavičce, ale neshodují se, když je zpráva odeslána do elektronické konference. 0bálkový odesílatel je obecně příjemce chybových zpráv. Obálka je pro uživatele neviditelná.
Hlavičky jsou sbírkou párů artibut-hodnota. Formát standardních hlaviček je definován v RFC 2822, jsou povoleny i nestandardní hlavičky, které začínají "X-" např. X-Vtip. Pokud uživatelův MUA nedoplnil hlavičku From, To, Date, činí tak MTA. Dále každý MTA, který se dotkne zprávy, přidá hlavičku Received.
Další hlavičky: Cc, Bcc, Message-Id, In-Reply-to, Reply-to, References, Keywords.

Příklady zastaralých typů adres

Typ adresování Příklad Moderní tvar
UUCP mcvax!uunet!ucbvax!boulder!doupe!evi evi@doupe
Směrovaný <@org1,@org2,...,@orgN:uzivatel@konecna-organizace uzivatel@konecna-organizace
"Trik s procenty" uzivatel%host1%host2@host3 uzivatel@host1

Ukázka hlavičky e-mailové zprávy

Received: from the incoming queue by sender:ariadna.fi.muni.cz@ariadna.fi.muni.cz at Tue, 29 Mar 2005 15:28:37 +0200
X-Muni-Spam-Status: 1 BOGOFILTER_HAM,FORGED_RCVD_HELO,MISSING_SUBJECT,NO_REAL_NAME,
        UNDISC_RECIPS
X-Bogosity: Ham, tests=bogofilter, spamicity=0.014895, version=0.94.2
Received: (qmail 22020 invoked from network); 29 Mar 2005 13:28:36 -0000
Received: from relay.muni.cz (HELO tirith.ics.muni.cz) (root@147.251.4.35)
  by arethusa.fi.muni.cz with SMTP; 29 Mar 2005 13:28:36 -0000
Received: from anxur.fi.muni.cz (anxur.fi.muni.cz [147.251.48.3])
        by tirith.ics.muni.cz (8.13.2/8.13.2) with ESMTP id j2TDSXTv004693
        for ; Tue, 29 Mar 2005 15:28:35 +0200
Received: from aisa.fi.muni.cz (aisa.fi.muni.cz [147.251.48.1])
        by anxur.fi.muni.cz (Postfix) with ESMTP id DC6A222AEF7
        for ; Tue, 29 Mar 2005 15:28:33 +0200 (CEST)
Received: from aisa (nymfe57.fi.muni.cz [147.251.53.67])
        by aisa.fi.muni.cz (8.12.10/8.12.8) with ESMTP id j2TDKp7M19911434
        for steve@mail.muni.cz; Tue, 29 Mar 2005 15:27:26 +0200 (MET DST)
Date: Tue, 29 Mar 2005 15:27:26 +0200 (MET DST)
From: xx@ss.cz
Message-Id: <200503291327.j2TDKp7M19911434@aisa.fi.muni.cz>
To: undisclosed-recipients:;
X-Filter-Version: 1.15 (tirith.ics.muni.cz)
X-Muni-Envelope-From: xx@ss.cz
X-Muni-Virus-Test: Clean
Return-Path: xx@ss.cz
Subject: (none)
X-ISMU-Expires: 2006-03-29

testik pro spravu UNIXu
Tělo zprávy může mít několik částí, kde každá může být jiného MIME (Multipurpose Internet Mail Extensions) typu (RFC 2045). Povoleny jsou jen tisknutelné znaky, to znamená, že binární data musí být kódována BASE64.


Aliasy

Aliasy umožňují systémovému administrátorovi nebo jiným uživatelům přesměrování pošty. Mohou definovat elektronické konference, předávat poštu mezi počítači, nebo umožnit, aby na jednoho uživatele odkazovalo více jmen. Zpracování aliasingu je rekurzivní, proto je možné, aby jeden alias ukazoval na jiné alisy. Standardně bývají umístěny v souboru /etc/mail/aliases nebo /etc/aliases.

Ukázka souboru aliases

# Nezbytne aliasy
postmaster: root, problem
MAILER-DAEMON: postmaster

# Vhodne aliasy
root: ivo, steve
webmaster: root, problem 
hostmaster: root

# Direktiva include
problem: :include:/usr/local/mail/problem.alias, "/usr/local/mail/logs/problems"

# Vychytavka pro spravce
info: "|/usr/local/bin/sendinfo"

# aliasy seminarnich skupin, seznam udrzovan na jednom miste
unix-sprava: skutecna-trida@aisa
skutecna-trida: :include:/usr/local/mail/trida.seznam
Položky v souboru aliases nejsou tříděné, přímé vyhledávání by bylo neúčinné. Místo toho se vytvoří hashovaná verze pomocí databázového systému Berkley nebo ndbm. Toho se docílí pomocí příkazu newaliases. Soubory odvozené z /etc/mail/aliases se nazývají aliases.db pro Berkley a aliases.dir a aliases.pag pro ndbm.

Aliases lze také ukládat v LDAPu. Ovšem díky absenci nástrojů pro jednoduché přidávání, změnu a mazání položek LDAP není zatím výhodné k tomuto řešení přecházet. Více viz. příklad:

dn: uid=steve, dc=speo
objectClass: inetLocalMailRecipient
mailLocalAddress: steve@lab.fi.muni.cz
mailRoutingAddress: steve@mail.muni.cz
uid: steve
odpovídá
steve: steve@mail.muni.cz

Sám uživatel si může přesměrovávat vlastní poštu pomocí souboru ~/.forward. Soubor se skládá z adres na jednom řádku oddělených čárkami, nebo z několika položek na oddělených řádcích.

\ xsvobo14, "/home/xsvobo14/archiv", xy@email.cz
Pošta bude replikovaná na třech místech -- v standardním uložišti pošty, v trvalém archivu v mém domovském adresáři a na serveru email.cz. Zpětné lomítko říká, že se má pošta lokálně dodávat bez ohledu na to, co říkají aliasy nebo soubory pro předávání pošty.


IMAP, POP3

Tyto protokoly slouží k dopravení pošty do emailových klientů typu Outlook, Firebird, Eudora. Oba umí neco jako MD5 autentizaci - což je způsob, jak zajistit, aby hesla nešla po siti jen tak. Většina poštovnich klientů také podporuje možnost provozovat POP3 nebo IMAP nad SSL.

Protokol POP3 (Post Office Protocol 3) (RFC 1939) je jednodušší z obou uvedených. Slouží pro vybírání/mazání mailů ze vzdáleneho serveru. Většína poštovních klientů bývá implicitně nastavena tak, že při stáhnutí mailu nenechává na serveru kopii.
Základní vlastnosti POP3:

Protokol IMAP (Internet Mail Access Protocol) (RFC 3501) je o něco dokonalejší než POP3. Umí prohledávat zprávy podle nějakého filtru, např. podle odesílatele. Většína poštovních klientů, používající IMAP bývá implicitně nastavena tak, že mail nechávají na serveru a stáhnou ho pouze tehdy, když si to uživatel přeje.
Základní vlastnosti IMAP:

Obecne platí, že POP3 je off-line protokol a IMAP on-line protokol. U free-mailovýchschránek bývá většinou přístup umožněn pomocí POP3 protokolu, za IMAP se musí platit.


Relaying, Spam

Relaying -- předávání

Dříve bylo zvykem, že se mailserver choval k mailům stejně, ať byly od lokálního uživatele, nebo je dostal od jiného mailserveru. Každý uživatel internetu jej mohl využít k odeslání své pošty. Tomuto chování se říká open-relay. Od takovéhoto nastavení se v současnosti ustupuje, protože je lehce zneužitelné spamery.
Ochrana proti relayingu se konfiguruje pomocí souborů /etc/mail/*_allow. Tyto textové soubory vychází z konfigurace uzlů, pro které se zajišťuje přijimání a odesílání pošty.
Jednotlivé řádky souboru /etc/mail/ip_allow resp. /etc/mail/name_allow tvoří IP adresy strojů a sítí resp. doménová jména strojů a domén, které mohou posílat poštu po SMTP přes váš počítač. Pokud by se o to pokusil počítač, ktery není uveden ani v jednom z těchto souborů, byl by odmítnut, jako nepovolený relaying.
Sendmailu má pro zabránění relayingu sadu pravidel check_rcpt.

Spam

Pod pojmem spam si nejčastěji představíme nevyžádaný dopis. Jde například o rozesílání hromadných reklamních zpráv. Pohybu těchto zprávám po síti je samozřejmě potřeba zabránit. Nejen pro usnadnění práce lokálnímu uživateli, který by asi po čase nedělal nic jiného, než mazal spamy, ale hlavně z důvodu odstranění neoprávněného relayingu. Ten na náš počítač může přenášet jednak zátěž, ale hlavně se počítač, který nebrání relayingu může dostat na černou listinu.
Základem pro ochranu proti spamu je databáze /etc/mail/deny.db.

Mezi opravdu učinné a v současné době nejčastěji užívané metody (pasivni) obrany patří

Bayes filtry pracují na principu hledaní podobností v nevyžadané poště v kontrastu s běžnou poštou uživatele. Jde o poměrně sofistikovaný algoritmus, ale při dostatečně velké srovnávací základně i velmi účínný. Mezi typické zástupce patří
SpamAssassin spolupracující s procmailem.

Oproti tomu filtry založené na databázích spamu fungují tak, že na vstupu obdrží potenciální spam, ten proženou nějakou hashovací funkcí a výsledek porovnají s databází znamých spamu uloženou na centralním serveru. Uživatel sám má vetšinou možnost nevyžádaný mail označit jako spam, systém posléze přidá do databáze hash tohoto mailu. Mezi zástupce patří nástroj Razor.

V praxi se nejlépe osvědčuje kombinace obou přístupu, vylepšenou např. o přidělování extra "bodů" za maily obsahujici "podezřelá slova."


Mail servery

Na dnešním open-source trhu jsou k dispozici v podstate 4 mailservery, které stojí za úvahu. Jsou to:

Sendmail je asi nejstarší mailserver. V současné době je ve verzi 8.13.4. Jeho vývoj je sponzorován firmou Sendmail, Inc. Jedná se o monolitický program, konfigurace není triviální, vetšinou se používá množina m4 maker. Asi nejpoužívanější open-source mailserver. Díky svému stáří měl/má problémy s bezpečností, autor při návrhu nepočítal s možností útoku na program.

Postfix vznikl jako projekt sponzorovaný firmou IBM. V současné době je ve verzi 2.2. Byl psán s důrazem na bezpečnost, jeho autor je Wietse Venema. Hlavní konfigurační soubor je /etc/postfix/main.cf. Více informací o konfiguraci lze nalézt na serveru unix.kropes.cz.

Qmail je jedním z programů napsaným panen Bernsteinem. V současné době je ve verzi 1.03 (již od roku 1998). Byl také psán s důrazem na bezpečnost. Je portabilní, modularní, skládá se z několika programů. Program se nesmí distribuovat v binární formě, zájemce o tento mailserver si musí stáhnout nejprve zdrojáky, pak potřebné patche. Nikde ovšem nemáte garantováno, že všechny budou moci být aplikovány současně. Více informací o konfiguraci lze nalézt na http://www.lifewithqmail.org/ a v jednom z předchozích referátů.

Exim je vyvíjen University of Cambridge, aktuální verze je 4.50. Standardní mailserver v distribuci Debian/GNU Linux. Funkce eximu odpovídají nejpoužívanějším funkcím programu sendmail. Hlavní konfigurační soubor je /etc/exim.conf, lze ovšem spustit příkaz eximconfig, který počáteční konfiguraci provede za nás. Pro podrobnější konfiguraci bych odkázal na Exim/Mailman HOWTO


Sendmail

Program sendmail verze 5 napsal Eric Allman v roce 1983. Poté vznikly verze IDA a KJS. V současnosti se používá verze 8 -- nejnovější je 8.13.4.

Při typické konfiguraci moderních instalací běží sendmail jako dva démony - jeden, privilegovaný, běží jako SMTP server, čeká na spojení na TCP portu 25 a stará se o odeslání čekající pošty z fronty v /var/spool/mqueue. Druhý občas nahlédne do neprivilegované fronty /var/spool/clientmqueue s poštou nepřijatou k odeslání (většinou proto, že se nepodařilo kontaktovat cílový server) a pokusí se o její opětovné odeslání. Stav neprivilegované fronty lze kontrolovat příkazem mailq -Ac, stav privilegované fronty může superuživatel ověřit příkazem mailq. Ke statistice mailového provozu slouží mailstats.

Sendmail se spouští pod superuživatelem jako dva démony, typicky těmito příkazy:

# Sendmail jako MTA
/usr/sbin/sendmail -L sm-mta -bd -q1h
# Sendmail pro kontrolu MSP fronty
/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m

Pokud nějaký správce systému nahlédne do konfiguračního souboru /etc/mail/sendmail.cf, zcela určitě se zhrozí a začne přemýšlet o jiném mailserveru. Ovšem situace není až tak tragická, protože existuje jednodušší postup, jak sendmail přizpůsobit svým požadavkům. Je jim množina m4 maker, s jejichž pomocí vytvoříme krátký konfigurační soubor, a ten pak zpracujeme makroprocesorem. Příslušná makra možná naleznete ve vaší instalaci -- často /usr/share/sendmail/cf, ale určitě v balíčku se zdrojovým kódem. Spolu s ním nalezneme README, kde jsou základní informace o jednotlivých volbách.

Konfigurace DNS

Toto je nejjednodušší část celé konfigurace - do zónového souboru se dopíše tento řádek:

      IN MX 1 speo-alpha.lab.fi.muin.cz.
Což v zóně lab.fi.muin.cz znamená, že poštu pro tuto doménu spravuje počítač speo-alpha.lab.fi.muin.cz.

Konfigurační soubor sendmail.cf

Konfigurační soubor je optimaliyovaný pro čtení sendmailem na úkor lidské čitelnosti. Řádky souboru sendmail.cf začínají písmeny, které mají specifický význam:

V - definice verze konfiguračního souboru
O - definice konfigurační volby
D - definice makra
C - definice třídy makra
F - definice třídy makra z externího souboru
R - definice přepisovacích pravidel
S - definice startovacích pravidel
H - definice hlaviček
M - definice maileru
P - definice doručovací priority
T - deklarace duvěryhodných (trusted) uživatelů
K - deklarace klíčů databáze

Část konfiguračního soubor sendmail.cf

#####################
#   Trusted users   #
#####################
# this is equivalent to setting class "t"
#Ft/etc/mail/trusted-users
Troot
Tdaemon
Tuucp
#########################
#   Format of headers   #
#########################
H?P?Return-Path: <$g>
HReceived: $?sfrom $s $.$?_($?s$|from $.$_)
        $.$?{auth_type}(authenticated$?{auth_ssf} bits=${auth_ssf}$.)
        $.by $j ($v/$Z)$?r with $r$. id $i$?{tls_version}
        (version=${tls_version} cipher=${cipher} bits=${cipher_bits} verify=${verify})$.$?u
        for $u; $|;
        $.$b
H?D?Resent-Date: $a
H?D?Date: $a
H?F?Resent-From: $?x$x <$g>$|$g$.
H?F?From: $?x$x <$g>$|$g$.
H?x?Full-Name: $x
# HPosted-Date: $a
# H?l?Received-Date: $b
H?M?Resent-Message-Id: <$t.$i@$j>
H?M?Message-Id: <$t.$i@$j>
############################################
###  Ruleset 3 -- Name Canonicalization  ###
############################################
Scanonify=3
# handle null input (translate to <@> special case)
R$@                     $@ <@>
# strip group: syntax (not inside angle brackets!) and trailing semicolon
R$*                     $: $1 <@>                       mark addresses
R$* < $* > $* <@>       $: $1 < $2 > $3                 unmark 
R@ $* <@>               $: @ $1                         unmark @host:...
R$* [ IPv6 : $+ ] <@>   $: $1 [ IPv6 : $2 ]             unmark IPv6 addr
R$* :: $* <@>           $: $1 :: $2                     unmark node::addr
R:include: $* <@>       $: :include: $1                 unmark :include:...
R$* : $* [ $* ]         $: $1 : $2 [ $3 ] <@>           remark if leading colon
R$* : $* <@>            $: $2                           strip colon if marked
R$* <@>                 $: $1                           unmark
R$* ;                      $1                           strip trailing semi
R$* < $+ :; > $*        $@ $2 :; <@>                    catch 
R$* < $* ; >               $1 < $2 >                    bogus bracketed semi
Ruční konfigurace takovéhoto souboru není žádná procházka růžovým parkem. Proto existuje makroprocesor M4.

Konfigurace pomocí M4

Samotná konfigurace spočívá ve vytvoření krátkého konfiguračního souboru *.mc s makry, která reprezentují explicitní nastavení. Pro ostatní volby konfiguračního souboru sendmail.cf bude použito implicitní natavení sendmailu. Z praktických důvodů je lepší konfigurační metasoubor uchovávat vždy spolu s používaným vygenerovaným souborem v adresáři /etc/mail se stejným jménem, ale příponou .mc

Sestavení sendmail.cf

cd /usr/share/sendmail/cf/m4
m4 ../m4/cf.m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
killall -HUP sendmail

Část konfiguračního soubor sendmail.mc

divert(-1)dnl
###Toto je komentář. V konfiguraci se neobjeví.
divert(0)
VERSIONID(`$Id$')
dnl typ operačního systému
OSTYPE(`linux')
dnl typ domény (obecná), pro velke systemy
DOMAIN(`generic')
dnl místní poštu doručuje Procmail
FEATURE(`local_procmail')
FEATURE(`always_add_domain')
dnl připojit definice pro místní poštu
MAILER(`local')
dnl připojit definice pro protokol SMTP
MAILER(`smtp')
dnl připojit definice pro Procmail
MAILER(`procmail')
Základ neprivilegovaného konfiguračního souboru submit.cf najdeme mezi m4 makry jako /usr/share/sendmail/cf/cf/submit.mc (záleží na distribuci).

Pokud chceme přeposílat poštu přes SMTP server jako relay, využijeme následující nastavení:

define(`SMART_HOST', `smtp:speo-beta.lab.fi.muin.cz')
Program sendmail obsahuje podporu pro přístupovou databázi, pomocí které může odmítat zprávy od konkrétních uživatelů nebo domén.
Do souboru sendmail.cf se přidá řádek
FEATURE(`access_db', `hash -o /etc/mail/access.db')
dále se vytvoří soubor /etc/mail/access obdobného obsahu jako v tomto výpise:
aisa.fi.muni.cz 	OK
fi.muni.cz      	OK
informatics.muni.cz     OK
147.251         	RELAY
bad_boy@iol.com		REJECT
hotlivesex@		550 Spam rejected
Nakonec se vytvoří přístupová databáze.
makemap hash /etc/mail/access < /etc/mail/access
Další nastavení:
dnl maskarada pro odcházející poštu:
MASQUERADE_AS(`pokus.fi.muni.cz')
dnl maskarada i pro obalku
FEATURE(`masquerade_envelope')
dnl maskarada pro celou domenu
FEATURE(`masquerade_entire_domain')
dnl maskarada pro přicházející poštu
FEATURE(`always_add_domain')

dnl rozesílat poštu z místní domény
FEATURE(`relay_entire_domain')
dnl přijímat poštu z nedostupných domén, firewall ...
FEATURE(`accept_unresolvable_domains')


Odkazy

http://www.root.cz/clanky/posta-pro-kazdeho/
http://www.root.cz/clanky/stavime-mailserver/

http://www.sendmail.org/
http://www.procmail.org/
http://www.catb.org/~esr/fetchmail/
http://anfi.homeunix.net/cyrus/ -- IMAP server
http://www.faqs.org/docs/Linux-HOWTO/Cyrus-IMAP.html

http://www.faqs.org/rfcs/
http://www.ordb.org/
man sendmail