POP3 protokol, qmail - SMTP/POP3 server

Jakub Nešetřil, nesetril@mail.muni.cz



Obsah

POP3 protokol
Transakční fáze
Fáze úprav
Fáze autorizace
Shrnutí
 
qmail
Instalace
Konfigurace
POP3 server
Shrnutí


POP3 protokol

POP3 protokol byl standardizován v roce 1996 v RFC 1939. Jeho účelem je jednoduché a rychlé stahování pošty ze vzdáleného úložiště na počítač, který nemusí být nutně nepřetržitě připojen k internetu. V případech, kdy to okolnosti dovolují (jde hlavně o trvalou konektivitu), doporučuje raději pro doručování pošty používat SMTP.

Protokol POP3 má pro své účely vyhrazen TCP port 110. Komunikace probíhá v střídajících se výměnách mezi klientem a serverem. Příkaz vždy začíná na začátku řádky, v základní implementaci POP3 mají příkazy 3 nebo 4 znaky. Příkazy nerozlišují velká a malá písmena. Za příkazem můžou následovat další argumenty, oddělené mezerami. Řádky jsou oddělovány pomocí CRLF. Každá odpověď od serveru musí začínat indikací stavu operace - buď +OK, nebo -ERR. Následovat může textový řetězec s popsaným důvodem stavu. POP3 implementace jsou často poměrně komunikativní a dají se užívat i "ručně".

Po otevření TCP spojení začíná komunikaci server stavovým řádkem +OK (často následován nejakým textovým řetězcem, např. typ serveru, nebo APOP razítkem). Po uvítacím řádku přechází spojení do fáze autorizace, ve které se musí klient serveru prokázat, že je oprávněn přistupovat k informacím. Po úspěšné autorizační fázi přichází na řadu transakční fáze, ve které probíhá informování o počtu mailů, jejich stahování a mazání. Veškeré změny (hlavné mazání) v této fázi jsou pouze zaznamenávány, avšak nejsou prováděny. Klient uzavírá spojení pomocí příkazu QUIT. Po něm přechází spojení do fáze úprav (UPDATE), ve které jsou všechny dříve provedené změny reálně provedeny a zapsány na disk. Poté dochází k rozpojení spojení. POP3 server nemá v původním RFC žádnou předepsanou povinou autorizační metodu, existuje více různých způsobů. Protože je to nejsložitější fáze celého spojení, necháme ji až na konec. Nejdříve popíšeme standardem požadované minimum.


Transakční fáze

Po uzavření autorizační fáze přechází spojení do transakční fáze. V této fázi je POP3 server povinen vyhradit zámek pro exkluzivní přístup do dané schránky. Veškeré změny prováděné v tomto spojení jsou poté zaznamenávány a prováděny pouze virtuálně a k jejich realizaci dojde až ve fázi úprav. Server také maily ve schránce očísluje čísly v desítkové soustavě. Tyto čísla se u některých příkazů používají ke specifikaci konkrétního mailu.

RFC 1939 uvádí následující povinné příkazy, které musí implementovat každý POP3 server:

Dále definuje protokol další dva příkazy použitelné v transakční fázy. Tyto příkazy nejsou v původním RFC povinné, nicméně jsou dnes poměrně široce implementovány a využívány.


Fáze úprav

Poté, co klient odešle příkaz QUIT, postoupí spojení do fáze úprav, ve které se provedou všechny předešlé úpravy a uvolní se alokovaný zámek. Poté dojde k uzavření spojení. Podstatné je, že pokud dojde k uzavření spojení z jiných příčin, např. díky timeoutu, předchozí změny se neprovedou. K uvolnění zámku však dojde také.


Autorizační fáze

Pro protokol POP3 je kritickým bodem (jako u mnoha jiných protokolů) autorizační fáze. Původní protokol nepředepisuje žádnou konkrétní formu autorizace, uvádí však 2 volitelné: metoda USER/PASS a APOP. Další formy autorizace byly navrhnuty např. v RFC 1734, 2449, 2195 a 2222.

První metoda implementuje autorizace pomocí dvojice příkazů USER a PASS. Klient odesílá příkaz USER jmeno. Pokud server odpoví pozitivně (+OK), následuje příkaz PASS heslo. Pokud jméno a heslo odpovídá údajům na serveru, spojení je autorizováno. Jméno a heslo jsou nicméně přenášeny bez jakékoliv ochrany a tak není velký problém je (především na lokální síti) odposlechnout. Tento způsob je stále bezkonkurenčně nejrozšířenější a nejlépe implementovaný v klientech i serverech.

Autorizace pomocí APOP vyžaduje, aby server indikoval schopnost používat tuto formu přímo v úvodní uvítací zprávě +OK text. Součástí textu za stavem musí totiž být i unikátní časové razítko ve formátu msg-id z RFC 822. Pokud chce klient použít tuto metodu, odešle příkaz APOP jméno hash, kde hash je tvořen výsledkem md5(<razítko serveru>heslo). Server provede stejný hash a pokud se výsledky hashe schodují, spojení je autorizováno.

Další formy autorizace zahrnují příkaz AUTH, pomocí nějž se lze autorizovat i přes Kerberos a SASL.


Shrnutí

Vyžadované příkazy: STAT,LIST,RETR,DELE,NOOP,RSET,QUIT. Nepovinné příkazy: TOP,UIDL,USER,PASS,APOP,AUTH

Protokol je dále podstatným způsobem rozšířen v RFC 2449, ve kterém se zavádí např. překrývající se příkazy (PIPELINING) či oznamování seznamu podporovaných příkazů (CAPA).

Ukázka POP3 komunikace (převzáno z RFC). S: server, K: klient


      S: <čeká na otevření spojení na portu 110>
      K: <otevření spojení>
      S:    +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
      K:    APOP mrose c4c9334bac560ecc979e58001b3e22fb
      S:    +OK mrose's maildrop has 2 messages (320 octets)
      K:    STAT
      S:    +OK 2 320
      K:    LIST
      S:    +OK 2 messages (320 octets)
      S:    1 120
      S:    2 200
      S:    .
      S:    +OK message 1 deleted
      K:    RETR 2
      S:    +OK 200 octets
      S:    <the POP3 server sends message 2>
      S:    .
      K:    DELE 2
      S:    +OK message 2 deleted
      K:    QUIT
      S:    +OK dewey POP3 server signing off (maildrop empty)
      K:  <zavření spojení>
      S:  <čeká na další spojení>

Seznam veškerých RFC souvisejících s POP3 (a dalšími mailovými protokoly jako IMAP4 či SMTP) je na adrese http://www.imc.org/rfcs.html#clienttoshost.


qmail

qmail je dalším kusem software z díly djb. Podobně, jako jeho ostatní programy, je qmail rychlý, spolehlivý, malý a především bezpečný. Podobně jako u djbdns je na první bezpečnostní chybu vypsána odměna $500, která zatím nebyla udělena. Poslední verze qmail 1.03 je z roku 1998. Oficiální stránky programu se nacházejí na http://cr.yp.to/qmail.html, avšak hlavní centrálou pro qmail jsou stránky http://www.qmail.org/. Zde je k dispozici velký počet rozšiřujících programů, záplat přinášejících nové funkce, dokumentace v mnoha jazycích apod. Lokální mirror (dostupný z hlavních stránek) je i v Brně na VUT.


Instalace

Před začátkem instalace je dobré si nainstalovat ovládající a pomocné programy z balíků daemontools a ucspi-tcp, jejichž instalaci už jsem popsal v předchozím referátu. Zdrojové kódy u qmailu získáme zde. Po rozbalení balíku bude třeba připravit ještě prostředí systému. Je třeba vytvořit složku /var/qmail, do které se standardně instaluje hotový produkt (můžete si ho ale nakonfigurovat i jinam). Také je třeba přidělat 7 nových uživatelů a 2 nové skupiny - qmail je tvořen mnoha malými kousky programů a každý z nich běží jako jiný uživatel. Vytváření Vám usnadní soubor INSTALL.ids, kde jsou obsaženy konkrétní instrukce pro většinu hlavních platforem. Po těchto přípravách by mělo stačit ve složce balíku zadat make setup check. Ujistěte se, že Váš souborový systém rozlišuje velká a malá písmena, jinak instalace bude postupně přepisovat některé své části novými soubory a výsledek nedopadne dobře.

Od začátku je možno postupovat podle souboru INSTALL obsaženého v distribuci. Ten je ale už 5 let starý a místy neodpovídá nejen aktuálním požadavkům, ale ani nynějším doporučením samotného autora. Existuje hned několik způsobů, jak si qmail po instalaci nakonfigurovat. Ten nejčastější z nich, kterým se budu v tomto referátu řídit, je výborně popsán na skvělé stránce Life With qmail.

Předně je třeba ještě ve složce, ve které jsme qmail právě zkompilovali, zavolat příkaz ./config. Ujistěte se ale předem, že máte korektně nakonfigurované reverzní DNS záznamy pro stroj, na kterém právě pracujete - skript si totiž zjišťuje hostname stroje pomocí DNS, takže při nedostupnosti záznamu nedojde ke správné konfiguraci. Pokud nemáte DNS aktuálně dostupný (například instalujete offline), musíte zavolat ./config-fast FQDN, kde FQDN je plně kvalifikované doménové jméno Vašeho počítače.

Při dalším postupu je třeba se rozhodnout pro typ lokálního doručování. Pokud totiž SMTP server nemá fungovat jenom jako relay, nýbrž bude ukládat nějakou poštu i pro uživatele na disk, např. pro stahování přes POP3, je třeba se dohodnout, kam se pošta bude ukládat. K dispozici máte standardně 3 varianty: mbox, Mailbox a Maildir. mbox je standardní formát, ve kterém ukládá maily Sendmail. Typicky se ukládají do /var/spool/mail. Dan má na svých stránkách hned několik pádných důvodů, proč mbox nepoužívat, jeden z nejzávažnějších je možnost jednoduše přijít o data při problémech (např. výpadku proudu). Podobně je na tom i Mailbox, který ovšem ukládá data do domovské složky každého uživatele zvlášť. Nejzajímavější je formát Maildir, se kterým Dan přišel. Umožňuje např. bezpečné používání přes NFS a garantuje, že email se po cestě nikdy neztratí - za žádných okolností.

Po instalaci bude třeba také nastavit doručování pošty pro několik privilegovaných uživatelů. Z bezpečnostních důvodů totiž qmail nedoručuje poštu pro roota, protože by za některých okolností musel získat práva pro zápis jako root. Existuje centrální sběrný uživatel alias s domovskou složkou /var/qmail/alias. Tam se zkouší doručit veškerá nedoručitelná pošta, včetně roota. Návod Vás tedy provede i vytvořením souborů .qmail-root, .qmail-postmaster.


Konfigurace

Po spuštění samotného SMTP serveru (s lokálním doručováním, avšak bez POP3 apod), bude běžet 5 procesů (a ještě nějaké další monitorovací a logovací procesy). Jsou to: qmail-send, qmail-lspawn, qmail-rspawn, qmail-smtpd a qmail-clean. Každý z nich má svoji odpovídající manuálovou stránku. I tak je ale celková orientace trochu obtížnější, a tak vznikly velmi názorné obrázky s celkovým popisem funkce qmail systému při různých úkolech. Pokud jste s qmailem ještě nepracovali, doporučuji vytisknout si je všechny jako referenci, usnadní Vám výrazně orientaci. Obsahují i zmínky o qmtp serveru a qmqp protokolu - ty můžete ovšem s klidným srdcem vynechat. Jedná se o Danův nový protokol, který funguje rychleji a lépe než SMTP. Je proto vhodný pro nasazení uvnitř jedné organizace, kde můžete veškerou poštu směrovat a předávat pomocí QMTP. Na veřejném Internetu je však nepoužitelný, protože není standardizovaný.

Většina klíčových proměných se ovládá přes soubory v /var/qmail/control. Jejich kompletní seznam najdete v man qmail-control. Manuálové stránky se sice při instalaci nahrají, ale do složky /var/qmail/man. Je tedy třeba si přidat tuto cestu do proměnné MANPATH, jinak uvedené stránky nenajdete. Důležité je zaměřit se hlavně na soubory:

Pro lokální doručování je alfou a omegou soubor .qmail (popis v man dot-qmail). Ten umožňuje (podobně jako .forward u Sendmailu) každému uživateli individuálně nastavovat přesměrovaní pošty jinam. Na rozdíl od Sendmailu umožňuje ale i např. vytváření správu emailových konferencí, zapojení antivirové ochrany, vytvoření autoresponderu pro automatické odpovídání na příchozí poštu a jiné. Můžete zkrátka email poslat v několika různých instancích rourou do různých programů a na základě jejich výsledků potom dále směrovat. Např. můžete pustit antivirovou ochranu, která Vám bude doručovat veškerou poštu a v případě nalezení viru Vám pošle SMS. Nebo pomocí jednoduchého grepu vyhledávat klíčová slova ve zprávě a v případě nálezu email přesměrovat jinam. Nejmocnější zbraní je ale následující princip: pokud máte schránku (a lokální účet) jmeno@domena.cz, bude na tento účet směrována i veškerá pošta formátu jmeno-cokoliv@domena.cz. Přestože se to zdá na první pohled nepodstatné, můžete si se svojí jednou schránkou vytvořit například konferenci jmeno-list@domena.cz a přihlašování do konference pustit na adrese jmeno-list-subscribe@domena.cz. To vše pouhými pár řádky v souboru .qmail, bez vytváření jakýchkoliv dalších schránek. Jedno z řešení pro rozsáhlé mailové farmy například doručuje veškerou lokální poštu na jedinného lokálního uživatele, který ji posílá přes jednoduchý skript pro archivaci do MySQL databáze. Následně je možné nakonfigurovat i POP3 server pro výběr pošty z MySQL databáze.


qmail POP3 server

Díky tomu, že je qmail sadou malých, úzce zaměřených a vzájemně spolupracujících nástrojů, je možno s qmail SMTP serverem použít celou řadu POP3 serverů - například qpopper nebo velmi kvalitní Courier-IMAP Součástí instalace qmailu je i standardní qmail-pop3d, což je modulární POP3 server, který podporuje kompletní sadu příkazů z RFC 1939 a může používat externí moduly pro autorizaci.

Popis konfigurace najdete v sekci 5.2 zmíněného Life With Qmail. Jedná se v podstatě pouze o vytvoření složky pro zápis logů, přidání pár spoustěcích příkazů do startovacího skriptu qmailctl a vytvoření spouštěcích skriptů pro supervise Za pozornost stojí bod 2, kde si můžete vybrat autorizační modul. Existují i moduly pro APOP, AUTH, nebo porovnávání proti SQL databázi.


Shrnutí

Pro splnění úkolu se Vám bude ještě hodit doplňek na stránkách Live With Qmail, nazvaný qmail-LDAP. Jedná se o popis instalace několika záplat, které umožňí qmailu používat místo lokálních uživatelů uživatele uložené v LDAP databázi. Pokud budete chtít spravovat více emailových konferencí, rozhodně se podívejte na ezmlm (Easy Mailing List Manager), také od Dana Bernsteina, který se s qmail nádherně doplňuje. Pro analýzu vytíženosti serveru se Vám bude hodit qmail-analog. Pokud chcete provozovat virtuální domény, bude se Vám hodit VmailMgr. Mnoho a mnoho dalších nástrojů najdete na www.qmail.org, včetně několika webmail rozhraní pro výběr pošty.

Přehled instalace:

tar xzf qmail-1.03.tar.gz; mkdir /var/qmail
# přidat 7 uživatelů a 2 skupiny: cat INSTALL.ids (pozor na format passwd, může se lišit)
cd qmail-1.03; vi conf-*; make setup check
# zajistit funkční DNS včetně reverzního záznamu na sebe
./config
# nebo ./config-fast FQDN
# nastavit /var/qmail/rc (vybrat Maildir/mbox), vytvořit /var/qmail/bin/qmailctl
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
# vytvořit /var/qmail/supervise/*/run a /var/qmail/supervise/*/log/run
chmod 755 /var/qmail/supervise/qmail-send/run
chmod 755 /var/qmail/supervise/qmail-send/log/run
chmod 755 /var/qmail/supervise/qmail-smtpd/run
chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
mkdir -p /var/log/qmail/smtpd
chown qmaill /var/log/qmail /var/log/qmail/smtpd
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service
# uzivatel - účet, kam se má ukládat pošta pro postmastera
echo uzivatel > /var/qmail/alias/.qmail-root
echo uzivatel > /var/qmail/alias/.qmail-postmaster
echo uzivatel > /var/qmail/alias/.qmail-mailer-daemon
chmod 644 /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-postmaster \
 /var/qmail/alias/.qmail-mailer-daemon

/var/qmail
/var/qmail/man - přidat do MANPATH
/var/qmail/bin - přidat do PATH