7. listopadu 2005

Elektronická pošta - SMTP

Josef Kubín, xkubin2@fi.muni.cz


Obsah

Vypnutý JavaScript snižuje čitelnost dokumentu.

Princip fungování SMTP

Cílem protokolu SMTP je přenášet e-maily spolehlivě a efektivně. Tento protokol není závislý na přenosovém subsystému a vyžaduje pouze spolehlivý přenosový kanál. Ve svojí základní podobě je to relativně jednoduchý textově orientovaný protokol, který umí předávat e-maily z jednoho serveru na druhý. Pokud je ta samá zpráva poslána více příjemcům na cílovém serveru, tento protokol zajišťuje přenos pouze jedné kopie. Zpráva může putovat rovnou k cílovému mailserveru a nebo může putovat přes několik SMTP mailserverů typu relay nebo gateway (zpráva se přenáší do nějakého jiného síťového prostředí) až k cílovému mailserveru. "Next-hop" mailserver je vybrán na základě DNS MX záznamu. Když SMTP klient chce poslat e-mail, vytvoří obousměrný přenosový kanál k SMTP serveru. Klientovým úkolem je přenést e-mail na server a nebo ohlásit chybu. Server odpovídá na každý příkaz klienta číselnou odpovědí (Reply), indikující jeho stav. Jakmile je přenosový kanál vytvořen, SMTP klient pošle příkaz MAIL, kterým inicializuje přenos zprávy na mailserver.

	       +----------+                +----------+
   +------+    |          |                |          |
   | User |<-->|          |      SMTP      |          |
   +------+    |  Client- |Commands/Replies|   Server-|
   +------+    |   SMTP   |<-------------->|    SMTP  |    +------+
   | File |<-->|          |    and Mail    |          |<-->| File |
   |System|    |          |                |          |    |System|
   +------+    +----------+                +----------+    +------+

		Client-SMTP                  Server-SMTP

			   Model for SMTP Use

SMTP je "push" protokol, který nedovoluje stahovat e-maily ze vzdáleného serveru. Ke stažení e-mailů se použije poštovní klient za použití protokolu POP3 nebo IMAP.

Binární data se musela vždy konvertovat do textu (Base64), protože tento protokol uměl přenášet pouze ASCII data, což má za následek zvětšení objemu dat o 33.3%. Dnes ale většina SMTP serverů podporuje 8-bit MIME rozšíření, dovolující přenášet binární data stejně dobře jako plain text.

Příklad komunikace přes SMTP

Programem telnet lze jednoduše otestovat funkčnost SMTP serveru otevřením spojení se vzdáleným strojem na TCP portu 25. V následující ukázce je klient označen jako C, server jako S.

telnet www.example.com 25

S: 220 www.example.com ESMTP Postfix
C: HELO mydomain.com
S: 250 Hello mydomain.com
C: MAIL FROM: <sender@mydomain.com>
S: 250 Ok
C: RCPT TO: <friend@example.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: Subject: test message
C: From: sender@mydomain.com
C: To: friend@example.com
C:
C: Hello,
C: This is a test.
C: Goodbye.
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye

Na rozdíl od ukázky téměř všichni klienti místo příkazu HELO použijí napřed příkaz EHLO. Pokud server příkaz nezná, znamená to že nepodporuje ESMTP rozšíření. V tom případě klient použije příkaz HELO.

SMTP server během komunikace vrací číselné kódy (Reply) doprovázené stručným textem, které lze rozdělit do následujících skupin:

1yz příkaz byl přijat, proveden bude později
2yz znamenají úspěch
3yz inicializují přenos zprávy
4yz znamenají dočasnou chybu (tzn. "teď to nejde, ale zkus to za chvíli" - mailservery to většinou zkoušejí po čtyřech hodinách a pokud se jim to po dobu jednoho týdne nepodaří, tak to vzdají)
5yz znamenají permanentní chybu (například "takový mailbox neexistuje")

Minimální implementace SMTP musí podporovat následující množinu příkazů.

EHLO
HELO
MAIL
RCPT
DATA
RSET
NOOP
QUIT
VRFY

Uživatelé se příliš nestarají o řídící sekvence, jako je <CR><LF>.<CR><LF>. Proto SMTP klient musí zařídit zrušení takové sekvence přidáním další tečky na začátek řádku. Když řádek s textem dorazí na SMTP server, ten ověří první znak. Jsou-li dvě tečky na řádku pak jednu odstraní. Je-li jediná tečka na řádku pak to namená konec e-mailu.

Zpět na obsah

DNS MX záznamy versus A záznamy

Příjemcovo doménové jméno je pravá část e-mailové adresy za znakem zavináč. Jen resolvovatelné, plně kvalifikované doménové jméno (FQDN) je dovoleno pro použití v SMTP. Jinými slovy jsou to taková jména, které lze resolvovat na MX záznamy nebo A záznamy. Provedením DNS dotazu na MX záznamy získá SMTP klient seznam adres mailserverů spolu preferenčním číslem. Jestliže nejsou nalezeny žádné MX záznamy ale jen A záznamy, pak jsou tyto použity místo MX záznamů. Jestliže je nalezen jeden nebo více MX záznamů pro dané jméno, pak SMTP systém nesmí použít A záznamy. Jestliže MX záznamy jsou přítomny, ale nejsou použitelné, pak je ohlášena chyba.

Klient se pak pokusí vytvořit SMTP spojení s jedním z těchto serverů počínaje tím, který má nejnižší preferenční číslo. Zprávu předá prvnímu serveru, se kterým se podaří vytvořit spojení.

Zpět na obsah

Formát zpráv

Obálka zprávy

Obálka zprávy je něco jiného než hlavičky zprávy, obsahuje odesílatele zprávy - kam se má vrátit chybová zpráva pokud ten e-mail není doručitelný a obsahuje jednoho nebo více příjemců zprávy. Adresát zprávy nemusí být uvedený v hlavičkách, e-maily jsou doručovány podle obálky a nemusí mít vůbec žádnou korespondenci s hlavičkami e-mailu. Jedná se pouze o transportní věc, takže když se odesílá e-mail, tak si první MTA vygeneruje obálku na základě hlaviček. Pak ten e-mail s obálkou případně různě upravovanou putuje Internetem, a jakmile se doručí na cílový MTA, tak ten tu obálku zahodí a do schránky uživateli uloží jenom hlavičky s tělem zprávy. Obálka je pro uživatele neviditelná.

Pokud se zjistí že e-mail je nedoručitelný, tak se generuje chybová zpráva a posílá se na odesílatele uvedeného v obálce (první MTA). Aby chybové zprávy necyklily Internetem při neexistenci ani toho původního odesílatele, tak se chybová zpráva posílá s prázdným odesílatelem.

Hlavičky + prázdný řádek + tělo zprávy

Hlavičky jsou rozdělené na řádky, které vypadají jako nějaký klíč, například: Subject: mezera <hodnota/parametry>
Hlavičky mohou být napsány na více řádků, pokračovací řádek hlavičky se pozná tak, že začíná bílým znakem. Pokud v hlavičkách neřekneme jinak, tělo zprávy nesmí obsahovat jiné znaky než bílé znaky a tisknutelné ASCII znaky. Chceme-li v e-mailu posílat binární data, je to potřeba předem říci hlavičkou Content-Transfer-Encoding: 8-bit, a nebo data překódovat do textu - Base64. V hlavičkách zprávy nesmí být žádné osmibitové znaky mimo US-ASCII.

Detekce cyklů

Jednoduché prověření počtu Received: ve hlavičkách e-mailu se ukázalo být efektivní metodou detekce cyklů v mailsystémech.

Tělo zprávy

jsou jednoduché řádky z US-ASCII znaků, s určitými omezeními: Zpět na obsah

MIME

V původním RFC 822 se nepočítá s multimediálními netextovými zprávami, taktéž národní textová rozšíření nejsou zahrnuta, dalším omezením je maximální délka řádku do 1000 znaků. Tyto problémy řeší MIME.

Zpět na obsah

Problém spamu

Spammer na rozeslání množství e-mailů s komerčním obsahem vynaloží mizivou hodnotu. Vždy ale na svém úsilí vydělá, pokud dojde třeba jen k nepatrné odezvě na inzerovaný produkt. Že svým chováním obtěžuje miliony uživatelů ho příliš nezajímá. Mezi účinné a v současnosti nejpoužívanějěí metody pasivní obrany patří:

V praxi se osvědčilo uvedené metody kombinovat + ještě další metody.

Oblíbenou technikou spammerů je připojovaní se na servery s nejnižší prioritou (s nejvyšší numerickou hodnotou). Tuhle techniku používají taktéž některé počítačové viry za účelem vyhnutí se antivirovému softwaru.

Zpět na obsah

Relaying, open-relay

Až do roku 1990 bylo normální konfigurací mailserveru dovolit každému na Internetu odesílat přes něj e-maily. Takové nastavení nečinilo tehdy problémy, protože na vládních a univerzitních sítích, kde Internet začínal, bylo zakázáno posílat komerční zprávy. V současné době je open-relay ze známých důvodů nežádoucí, a na Internetu se už téměř nevyskytuje. Pokud ano, pak je to chyba, protože takový mailserver se brzo vyskytne na blacklistu. Všechny odesílané zprávy z něho budou ostatními mailservery odmítány. Open-relay blacklisty jsou často generovány automatickou detekcí, posíláním testovacích e-mailů na takové servery. Open-relay je zneužíváno spammery, protože odeslané e-maily neodkazují na spamerův mailserver, ale na nějaký jiný server. A tak se stane, že se na black-listu místo spammera ocitne zneužitý mailserver.

Zpět na obsah

Antispamové filtry

SpamAssassin

SpamAssassin je e-mailový filtr a klasifikátor, který používá k identifikaci spamu širokou škálu heuristických testů aplikovaných na e-mailové hlavičky a těla. Podrobí každou zprávu testu a přiřadí jí hodnotu indikující pravděpodobnost, že se jedná o spam. Údajná úspěšnost detekce spamu je někde mezi 95% a 100% v závislosti na typu e-mailů, které uživatel dostává. Nesprávné označení e-mailu za spam, který nebyl spamem se udává někde na 0.1%. Zajímavé čtení o úspěšnosti při různém nastavení filtrů naleznete ve stromu rozbalené distribuce: Mail-SpamAssassin-3.1.0/rules/STATISTICS-set*.txt

SpamAssassin-neni program na manipulaci s e-maily.

Distribuce je ke stažení zde: http://wiki.spamassassin.org

Zpět na obsah

Implemetace SMTP

Sendmail

Sendmail je robustní a dnes snad už i vychytaný program. V současnosti se používá verze 8.13.5. Při typické konfiguraci běží sendmail jako dva démony. Jeden démon je privilegovaný jako SMTP server, čeká na spojení na TCP portu 25 a stará se o odeslání čekající pošty z fronty v adresáři /var/spool/mqueue/. Druhý démon běží pod uživatlem a skupinou smmsp, a hlídá zda do neprivilegované fronty s poštou /var/spool/clientmqueue/ nepřibyla nějaká neodeslaná pošta. Tu se pak periodicky pokouší odeslat místnímu SMTP serveru.

Stav neprivilegované fronty lze kontrolovat příkazem:
mailq -Ac

Stav privilegované fronty může superuživatel ověřit stejným příkazem bez parametrů. Ke statistice mailového provozu slouží mailstats.

Sendmail se typicky spouští těmito příkazy:
# Sendmail jako MTA
/usr/sbin/sendmail -L sm-mta -bd -q1h

# Sendmail pro kontrolu MSP fronty ("-q30m" kontroluj frontu každých 30 minut)
/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
Konfigurace

Hlavní konfigurační soubory jsou dva: /etc/mail/sendmail.cf; /etc/mail/submit.cf. Po nahlédnutí do těchto souborů většina rozumných lidí pochopí, že rozsáhlá ruční editace není triviální, protože tyto soubory jsou optimalizovány pro čtení sendmailem.

Konfigurační soubory jsou generovány ze souborů /etc/mail/sendmail.mc; /etc/mail/submit.mc pomocí makroprocesoru m4. Další soubory s příponou ".mc" pro jinou konfiguraci jsou v adresáři /usr/share/sendmail-cf/cf/.
/usr/share/sendmail-cf/m4/ je adresář s makry

Vygenerování konfiguračních souborů:
# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/submit.mc > /etc/mail/submit.cf

Dalším konfiguračním souborem nezbytným pro správnou funkci sendmailu je /etc/mail/local-host-names kde jsou uvedeny adresy počítačů, které má brát sendmail jako lokální. Pokud na server přijde pošta s cílovou adresou na některý z uvedených strojů, tak se uloží do lokálního mailboxu.

Soubor /etc/mail/aliases slouží k definování lokálních aliasů. Jeho řádky mají tvar: alias: adresa1, adresa2, ...
Aby sendmail mohl pracovat se souborem aliases, musí se tento soubor převést do databázového tvaru - to zajistí příkaz newaliases, který ze souboru /etc/mail/aliases vytvoří databázový /etc/mail/aliases.db.

Program sendmail podporuje přístupovou databázi, pomocí které lze odmítat zprávy od konkrétních uživatelů nebo domén.
Příklad souboru /etc/mail/access:

aisa.fi.muni.cz		 	OK
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY
freepics.com			ERROR
sval@bach.fi			REJECT
Databázi vygenerujete takto:
makemap hash /etc/mail/access.db < /etc/mail/access
Příklady maker:
# SMTP server jako relay
define(`SMART_HOST', `smtp:proto-beta.lab.fi.muni.cz')

# přístupová databáze pro odmítání konkrétních uživatelů a domén
FEATURE(`access_db', `hash -o /etc/mail/access.db')
Úplný popis maker naleznete v distribuci: sendmail-8.13.5/cf/README
Manuál k sendmailu: sendmail-8.13.5/doc/op/op.ps
Případně na: http://www.sendmail.org

Relaying

Jednotlivé řádky souboru /etc/mail/ip_allow; příp. /etc/mail/name_allow tvoří IP adresy strojů a sítí příp. 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ů, bude odmítnut.

Zpět na obsah

SMTP

Zpět na obsah