Pošta

Petr Kostka, xkostka1@fi.muni.cz



Obsah:

Úvod
Formát zprávy
SMTP
Sendmail



Úvod

Elektronická pošta je založena na skutečnosti, že každý uživatel má někde na počítači připojeném v síti vytvořen účet, jehož součástí je i poštovní schránka (mailbox). Schránka je datový soubor, kam operační systém doručuje přijaté maily a do kterého má uživatel přístup pomocí svého poštovního klienta. 

Koncepce elektronické pošty je popsána v dokumentu RFC-2822 "Internet Message Format", který nahrazuje RFC-822. Tento dokument popisuje formát vlastních e-mailových zpráv, které díky rozšířením popsaným v dalších RFC mohou kromě textu obsahovat v podstatě cokoliv, včetně obrázků, hudby, atd.

Na počátku celého řetězce stojí program, který se jmenuje MUA, tedy Mail User Agent. Typicky Mutt, Pine a grafické programy jako třeba Outlook.
Hlavním úkolem MUA je převzít od odesílatele zprávy text a adresáta, přidat základní hlavičky a celé odevzdat k doručení dalšímu programu, kterým je MTA (Mail Transfer Agent). Určitě nejrozšířenějším MTA je Sendmail . Jedná se o velice robustní program, který má své kořeny v dávné unixové historii. Tomu bohužel odpovídá i značně nemoderní design a poněkud složitější konfigurace. V minulosti byl Sendmail proslulý svými četnými bezpečnostními problémy, nicméně v poslední době, zdá se, už je v tohle směru situace lepší. Existují i alternativní MTA např.: qmail, Exim a Postfix.

Poté, co MTA převezme od MUA zprávu, doplní její hlavičku o další údaje. Potom se zaměří na doménovou část adresy příjemce (napravo od zavináče) a pomocí DNS zjistí, který počítač je zodpovědný za přijímání pošty pro danou doménu. Jakmile se tak stane, otevře s tímto počítačem spojení a prostřednictvím protokolu SMTP mu zprávu přenese. Každá doména může mít určeno hned několik počítačů přijímajících poštovní zprávy. V systému DNS jsou seřazeny podle své priority. Pokud se nepodaří spojení s hlavním mailserverem, je osloven některý z náhradních, přičemž v takovém případě přebírá odpovědnost za doručení on. Pokud se nepodaří spojení s žádným autoritativním počítačem, může být odeslání zprávy odloženo a později stornováno s vygenerováním chybové zprávy odesílateli nebo správci poštovního serveru.

Přijímající MTA zkontroluje jmennou část adresy (nalevo od zavináče) a doručí zprávu do schránky s tímto jménem. Tradičním místem pro ukládání mailboxů bývá adresář /var/spool/mail.

Pro úplnost dodejme, že mezi MTA a poštovní schránkou uživatele může působit také MDA (Mail Delivery Agent). MDA prozkoumá zprávu a aplikuje na ni celou řadu předem definovaných filtrů. Tak lze docílit například doručení do různých mailboxů, automatické odpovědi odesílateli, odfiltrování nežádoucích dopisů, přesměrování mailu na mobil, aj. To vše přímo na serveru bez aktivního zásahu adresáta. Nejznámějším MDA programem je procmail.

Jen co dojde k doručení zprávy do mailboxu, může si ji adresát přečíst. Buď k tomu použije MUA, který běží přímo na serveru (pokud na něm má účet), nebo si ji stáhne na svůj osobní počítač. K tomu jsou navrženy například protokoly POP nebo novější IMAP.



Formát zprávy

Zpráva se skládá z hlavičky (header) a těla (message body). Hlavička se skládá z jednolivých parametrů, kde každý parametr je na novém řádku a je zadán pomocí schématu:

<název parametru>: <hodnota>
víceřádkové parametry se dále zadávají jako
<bílý znak><pokračování hodnoty>

Typickými parametry hlavičky jsou: From, Sender, Reply-To, To, Cc, Bcc, Subject, Date, Message-Id, Received

Navíc ještě existuje obálka zprávy, která slouží transportnímu médiu k dodání informací jako adresa odesílatele a adresáta potřebných k doručení zprávy.



SMTP

(Simple Mail Transfer Protocol)
je protokol obstarávající přenos elektronické pošty v TCP/IP definovaný v RFC 821 a nověji RFC 2821. Pokud chce klient poslat zprávu připojí se typicky na port 25 SMTP serveru a zahají přenos zprávy pomocí SMTP příkazů. Adresa tohoto serveru je část adresy za zavináčem. Tento server může být cílový stroj zprávy nebo se může jednat o tzv. relay - tedy server, který není cílový, ale který se postará a správné doručení (nebo informování odesílatele o nedoručení zprávy) na cílový SMTP server. Zpráva tedy může být doručena přes několik SMTP serverů. Relaying by měl být omezen a poskytován jen klientům příslušejících danému serveru, protože jinak by mohl tento server být zneužíván k rozesílaní spamu, což by mohlo mít za následek přidání tohoto serveru do black-listu a ignorování ostatními SMTP servery.

Schéma SMTP se nechá znázonit takto:

            +----------+                +----------+
+------+    |          |                |          |
| User |<-->|          |      SMTP      |          |
+------+    |  Client- |Příkazy/Odpovědi| Server-  |
+------+    |   SMTP   |<-------------->|    SMTP  |    +------+
| File |<-->|          |    a Pošta     |          |<-->| File |
|System|    |          |                |          |    |System|
+------+    +----------+                +----------+    +------+
             SMTP klient                SMTP server




Základní průběh předání zprávy vypadá následovně:
Inicializace:
HELO nebo EHLO - EHLO slouží k následnému domluvení klienta a serveru, která další rozšíření SMTP použijí
Předání obálky:
MAIL FROM: <odesilatel>
RCPT TO: <prijemce>
Předání zprávy:
DATA
<zpráva> - ukončena samotnou tečkou na řádku
.
Ukončení relace:
QUIT




Sendmail

je možno stáhnout z
ftp://ftp.sendmail.org/pub/sendmail/
rozbalení:
tar zxvf sendmail.8.x.x.tar.gz
Instalace (v příkladě je použita verze sendmail-8.12.2)
se skládá z několika částí: nastavení kompilace, kompilace, nastavení sendmailu a instalace souborů (viz soubor ./INSTALL v rozbaleném adresáři sendmailu)

Nastavení kompilace
se provádí tak, že se v adresáři ./devtools/Site vytvoří soubor site.config.m4 a do něj se zadají jednotlivé parametry kompilace, které chceme změnit od defaultních hodnot. Více k této problematice lze najít v ./devtools/Site/README./devtools/README
Pozn.: Jediný parametr, který jsem musel změnit, aby mi úspěšně proběhla kompilace bylo umístění man stránek.

Kompilace
se provede příkazem "sh Build" v rozbaleném adresáři sendmailu

Nastavení sendmailu
je realizováno souborem /etc/mail/sendmail.cf (dříve v /etc/sendmail.cf). Struktura tohoto souboru je však poměně složitá a proto se k vytvoření tohoto souboru používá sada maker pro makroprocesor m4.
V mém případě jsem vytvořil soubor ./cf/cf/sendmail.mc s požadovaným nastavením a v adresáři ./cf/cf jsem provedl příkaz "sh Build sendmail.cf", který vytvoří sendmail.cf příslušný souboru senmail.mc a příkaz "sh Build install-cf " provede umístění souboru sendmail.cf do adresáře /etc/mail .
Příklad souboru sendmail.mc:

divert(-1)
# priklad sendmail.mc
divert(0)
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)
DOMAIN(generic)
MASQUERADE_AS(`lab.fi.muni.cz')
FEATURE(masquerade_entire_domain)
FEATURE(relay_entire_domain)
MAILER(local)
MAILER(smtp)

příkaz divert se používá k odstranění přebytečného textu (část mezi divert(-1) a divert(0) bude ignorována).
řádky začínající znakem # jsou komentáře.
VERSIONID je nepovinné makro určující verzi konfigurace.
OSTYPE slouží k určení operačního systému - nastaví inkludování spravných nastavení pro daný systém.
DOMAIN určuje v jaké doméně pobeží náš server - hodnota generic by měla být dostačující.
MASQURADE_AS říká, aby se náš server tvářil jako že je server uvedený v parametru - to znamená, že u odchozí pošty bude přepisovat adresy FROM z lokálních adres na adresu zadanou tímto parametrem (kromě roota).
makro FEATURE slouží k nastavování něktrerých dalších parametrů mailserveru.
makra MAILER(local) a MAILER(smtp) jsou vpodstatě povinná a neměla by být měněna a musí být na konci souboru.
více k této problematice lze najít v ./cf/README

Celý sendmail.cf je de facto formální automat se sadou pravidel, podle kterých se řídí. V souboru můžeme nalézt například přepisovací pravidla:
R$+@$+		$:$1<@$2> focus on domain
R$+<$+@$+> $1$2<@$3> moce gaze right
Další možnosti příkazu:
M	Definuje agenta pro doruceni posty 
D Definuje makro
R Přepisovací pravidlo
O Definice nastavení
H Definice hlavičky
P Priorita
Jak se zpracovává posta:
   0 *	Parsing
1 * Sender rewriting
2 * Recipient rewriting
3 * Canonicalization
4 * Post cleanup
5 * Local address rewrite (after aliasing)

Další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í - tzn. pokud na server přijde pošta s cílovou adresou na kěkterý z uvedených strojů, tak se uloží do lokálního mailboxu.

/etc/mail/aliases slouží k definování lokálních aliasů. Jeho řádky mají tvar
alias: adresa1, adresa2, ..
přičemž adresaN může být jakákoli i nelokální adresa, příkaz nebo soubor
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

Uživatel si může svojí poštu přesměrovat pomocí souboru .forward ve svém domovském adresáři - na jednotlivých řádcích tohoto souboru jsou uvedeny adresy, příkazy (začinají znakem |) nebo soubory, do kterých se má jeho pošta přesměrovat.  

Záverečná instalace
Před finální instalací je nutno vytvořit uživatele smmsp a nastavit přístupová práva jak je popsáno v ./sendmail/SECURITY
Instalace se provede příkazem "sh Build install" v rozbaleném adresáři sendmailu .

Spuštění sendmailu
se typicky provádí přikazem "/usr/sbin/sendmail -bd -q1h".
Parametr -bd říká, aby sendmail bězěl jako démon a parametr -q určuje, jak často má kotrolovat svoji frontu - v tomto případe každou hodinu

Pokud chceme (např. po pádu) vylít frontu sendmailu, provedeme příkaz "/usr/sbin/sendmail -q"

Výpisy sendmailu můžeme sledovat v souboru /var/log/maillog

Ochrana pred spammem
se může provést např. tím, že v souboru sendmail.mc zavedeme pravidlo FEATURE(`dnsbl'), což má za následek ignorování mailserverů z blacklistu mail-abuse.org .. je nutno se zaregistrovat.
Relaying je defaultně vypnut - k jeho nastavení můžeme použít makra v sendmail.mc např.: F EATURE(`relay_entire_domain') ,FEATURE(`relay_based_on_MX') , FEATURE(`relay_local_from'), FEATURE(`relay_mail_from') nebo FEATURE(`access_db') , které zavádí kontrolu přístupu k našemu mailserveru pomocí souboru /etc/mail/access, apod. (viz dokumentace v ./cf/README sekce ANTI-SPAM CONFIGURATION CONTROL )