Stavíme mailserver (1)

22. 1. 2002
Doba čtení: 9 minut

Sdílet

Správná konfigurace emailového serveru patří co do obtížnosti mezi ty složitější úkoly, se kterými se musí správce unixového serveru vypořádat. Proto jsem pokládal za užitečné napsat seriál, který by nenáročnou formou popisoval stavbu kompletního emailového řešení pro malou až střední firmu a jehož první část vám ROOT.CZ dnes přináší.

Protože více čí méně podařených návodů na toto téma najdeme na Internetu desítky, rozhodl jsem se ten svůj ozvláštnit tím, že nebudu popisovat notoricky známá řešení, ale vyberu si tu méně častou, o to však zajímavější a dle mého názoru i v mnoha ohledech lepší variantu.

Ukážeme si, jak poskládat kompletní podnikové řešení elektronické pošty postavené na vysoce spolehlivých open-source programech, které zahrnuje MTA, podporuje více virtuálních domén, POP3 a IMAP server apod. To vše doplníme Webmailovým programem, který zprostředkuje přístup ke správě uživatelských kont i k poště samotné skrze uživatelsky přívětivé WWW rozhraní. Zmíníme se také o problematice bezpečnosti, ukážeme si, jak co nejlépe ochránit náš mailserver před spammery (SMTPauth, SMTP after POP), jak zabezpečit přenos zpráv přemostěním přes protokoly SSL/TSL, a zbyde-li čas, zmíníme se také o možnostech antivirové kontroly průchozích mailů.

Když jsem před lety začínal s Linuxem na serveru a potřeboval jsem rozchodit svůj první MTA server, nezbylo mi než použít Sendmail coby historický standard. Každý, kdo se s ním kdy setkal, mi potvrdí, že se jedná o velmi mocný, avšak co do konfigurovatelnosti dosti těžkopádný program. Jeho nastavování se blíží více programování než správě moderního programu. V minulosti měl také četné problémy s bezpečností a z té doby také pochází ustálené spojení „být děravý jako Sendmail“. I dnes, kdy nám autoři distribucí servírují přednastavené balíčky a existují četné konfigurační nástroje, existuje podle mého názoru stále ještě výhodnější řešení. Ano, mluvím o qmailu.

qmail

Původ qmailu sahá do roku 1996. Jeho autorem je Daniel Bernstein (DJB), profesor na Chicagské univerzitě, jenž je počítačové veřejnosti znám také svým vyhraným soudním sporem s americkou vládou ohledně možnosti zveřejnění kryptografických algoritmů. DJB je nepochybně výtečný programátor, ovšem jeho svérázný styl, který prostupuje všemi jeho programy, bývá příčinou četných vzrušených debat na usenetu. DJB zastává názor, že každý program má mít jen co možná nejužší množinu potřebných funkcí, která je nezbytbě nutná k jeho funkčnosti. DJB jen zřídka přidává do svých programů nové (nadbytečné) funkce, i když by to často bylo zapotřebí. Aktuální verzí qmailu již několik let(!) zůstává 1.03, přičemž existují desítky uživatelských patchů a rozšíření, na které jsou uživatelé odkázáni, když od MTA očekávají trochu víc, než co mu dal do vínku DJB. Pouze vyšší moc by DJB přinutila uvolnit novou verzi. Navzdory této politice, nebo snad díky ní, však asi nenajdete bezpečnější, spolehlivější ani rychlejší MTA než qmail.

DJB si totiž jednoho dne řekl, že nemá cenu plýtvat energií na zalepování bezpečnostních děr Sendmailu, a napsal qmail, který je postaven na úplně jiné koncepci. Celý program je tvořen řadou modulů tvořících řetězec, kterým prostupuje každá zpráva. Jednotlivé moduly jsou navrženy tak, aby byly pokud možno jednoúčelové a mohly běžet s minimálními nutnými uživatelskými právy. qmail tedy není jedním programem, třeba /usr/bin/qmail, ale stavebnicí mnoha dílů, které si přes dobře stanovené rozhraní předávají zprávu a dohromady tvoří funkční MTA. Díky této vlastnosti se qmail stal jedním z nejbezpečnějších MTA programů vůbec.

Domovskou stránku qmailu udržuje autor tady, ovšem zájemcům o qmail jistě lépe poslouží ta neoficiální na www.qmail.org. Na těchto stránkách najdete také obrovské množství nejrůznějších patchů a rozšiřujících programů, stejně jako velké množství dokumentace a odkazů na další zdroje. Pokud se během používání qmailu setkáte s problémy, jistě vás neodmítnou ani v české diskusní konferenci sendmail@linux.cz

Základní verzi qmailu je historickým zvykem instalovat výhradně ze zdrojových souborů. Na tomto místě je dobré podotknout, že jak je u programů od DJB běžným standardem, téměř neexistují binární balíčky a qmail ani není součástí žádné významné distribuce. Je šířen se svou vlastní licencí (není tedy GPL), která dovoluje neomezené použití, ovšem autor si vyhrazuje kontrolu nad šířením modifikovaných verzí a binárních souborů.

Program tedy nainstalujeme kompilací ze zdrojových kódů, které najdete tady. Kompilace by měla probíhat na stejném počítači, na kterém pak bude program běžet, protože už při ní dochází k nastavování některých funkcí.

Před tím, než se pustíte do instalace qmailu, je dobré odinstalovat Sendmail, případně jiný MTA, protože koexistence více MTA na jednom počítači může být problematická. Odstranit můžeme také další programy, např. imap-2000, které nejsou s qmailem kompatibilní. Na distribucích Red Hat nebo podobných bude stačit něco takového (parametr –nodeps bude nutný, pokud používáte balíčky, např. mutt nebo fetchmail, které ke své funkci potřebují MTA a které by se bránily porušování závislostí):

# /etc/rc.d/init.d/sendmail stop
# rpm -e sendmail  --nodeps
# rpm -e imap-2000c

Ještě před tím, než spustíte samotný překlad, je nutné vytvořit pro qmail vhodné zázemí. Nebyl by to DJBware, kdyby se qmail instaloval běžným způsobem do /usr/bin. qmail odjakživa náleží do /var/qmail, kde ho také hledají všechny spolupracující programy. Také je třeba vytvořit UID konta, protože jak už bylo uvedeno výše, qmail používá pro své komponenty jemnější rozlišení práv:

# mkdir /var/qmail
# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g nofiles -d /var/qmail qmaild
# useradd -g nofiles -d /var/qmail qmaill
# useradd -g nofiles -d /var/qmail qmailp
# groupadd qmail
# useradd -g qmail -d /var/qmail qmailq
# useradd -g qmail -d /var/qmail qmailr
# useradd -g qmail -d /var/qmail qmails

Pak už můžeme program zkompilovat a nainstalovat pomocí:

# make setup check

Nyní máme program zkompilován (problémy v tomhle stádiu jsou díky odladěnosti qmailu velice vzácné) a můžeme tedy přistoupit k jeho konfiguraci. Nejprve řekneme qmailu, jaké je jméno našeho počítače. Dodejme, že qmail úplně ignoruje soubor /etc/hosts nebo jiná tradiční linuxová nastavení, a všechna kanonická jména, se kterými se při své práci setká, resolvuje výhradně skrze DNS. Proto je kritickou podmínkou mít při porovozování qmailu v pořádku DNS. Také kvůli této vlastnosti je qmail vhodný jen pro počítače, které jsou k síti připojeny trvale (ačkoliv existuje i rozšíření pro dial-up). Konfigurace DNS není nápní tohoto článku.

# ./config-fast mojejmenopocitace.mojedomena.tld

Tímto příkazem jsme vytvořili sérii konfiguračních souborů v adresáři /var/qmail/control, které řídí jednotlivé funkce qmailu. Například v souboru me se nachází jméno počítače, na kterém qmail běží. V souboru rcpthosts je seznam domén, pro které qmail přijme poštu (na rozdíl od jiných MTA nedoručuje qmail implicitně poštu pro cizí domény, není tedy tzv. open-relay). Podobný význam má soubor „/var/qmail/con­trol/locals“, ve kterém je seznam domén považovaných za lokální. Chceme-li tedy pro začátek qmail zkonfigurovat na přijímání pošty pro doménu mojedomena.cz, musíme tuto doménu zapsat do souborů rcpthosts i locals:

# echo "mojedomena.cz" >> /var/qmail/controls/locals
# echo "mojedomena.cz" >> /var/qmail/controls/rcpthosts

Protože qmail (z bezpečnostních důvodů) nedoručuje poštu do speciálních systémových účtů, je nutné vytvořit aliasy, kterými případné zprávy, chybová hlášení apod. přesměrujeme regulernímu uživateli:

# cd ~alias;
# echo "&pepa@mojedomena.cz" > .qmail-postmaster
# cp .qmail-postmaster .qmail-root
# cp .qmail-postmaster .qmail-mailer-daemon
# chmod 644 ~alias/.qmail*

Adresář ~alias (resp. /var/qmail/alias) obsahuje aliasy (náhrady) za uživatelské účty. Pokud například přijde mail na adresu postmaster@mojedomena.cz, qmail zkontroluje, zda existuje soubor .qmail-postmaster, aby zjistil, že má mail přeposlat (&) na adresu pepa@mojedomena.cz. Soubory .qmail* jsou alternativou sendmailovských souborů .forward a můžeme s nimi vůbec provádět různé kousky. Každý uživatel může mít jeden takový soubor ve svém adresáři přizpůsobit si jej podle svého uvážení. Například někdo může chtít, aby mu při doručení mailu přišlo upozornění v podobě SMS na mobilní telefon. Udělá to tak, že si do souboru .qmail ve svém adresáři napíše třeba:

&00420602xxxxxx@sms.eurotel.cz

Dalším krokem je rozhodnutí, do jakého formátu mailboxu bude qmail zprávy doručovat. Preferovaným formátem je Maildir (jehož autorem není nikdo jiný než DJB), který oproti tradičnímu formátu mbox přináší mnohé výhody. Díky tomu, že Maildir není tvořen jen jedním souborem, k němu může současně přistupovat několik klientských programů, aniž by hrozila nekonzistence dat. Také je potencionálně spolehlivější a bezpečnější než klasický unixový způsob doručování souborů do mailboxů ve /var/spool/mail. Pokud nemáte nějaké zvláštní důvody, proč tak neučinit (nekompatibilní klientský software, velké množství existujícíh mailboxů, …), použijte jej i vy. Maildir je nutné vytvořit pomocí příkazu maildirmake. Tuto činnost můžete samozřejmě jakkoliv zautomatizovat pro všechny své účty,

# su pepa
$ /var/qmail/bin/maildirmake ~/Maildir

Protože Sendmail je standardním programem, jehož přítomnost v systému předpokládá řada unixových aplikací, obsahuje qmail speciální program /var/qmail/bin/sen­dmail, který přebere od aplikací zprávu ve formátu určeném pro Sendmail a přesměruje ji do subsystému qmailu. Tento program (tzv. wrapper) se instaluje následovně:

# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

Vlastní qmail se spouští pomocí příkazu /var/qmail/bin/qma­il-start, který je nutné spustit někde v systémovém startovacím skriptu s následující syntaxí:

/var/qmail/bin/qmail-start ./Maildir/ /var/qmail/bin/splogger qmail &

Uvedené volání znamená, že program je zkonfigurován pro doručování pošty do adresářů Maildir v domovských adresářích uživatelů a výstupy má posílat do dystémového logu pomocí programu splogger. Existuje mnoho způsobů, jak spouštět qmail-start, například můžeme chtít doručovat poštu pomocí MDA programu procmail, apod. Zájemcům doporučuji studium ukázkových skriptů v adresáři /var/qmail/boot/. Pokud máte raději volání démonů ve stylu SystemV, jak je obvyklé u distribuce Red Hat a dalších, můžete namísto volání ze systémového skriptu použít tento konfigurační skript, který zkopírujete do /etc/rc.d/init.d a nainstalujete pomocí: (uživatelé jiných distribucí si určitě poradí sami ;)

# chmod a+x /etc/rc.d/init.d/qmail
# chkconfig --add qmail
# chkconfig --level 35 qmail on
# service qmail start

Kromě vlastního procesu qmail, který se zabývá zpracováváním fronty zpráv a doručováním do mailboxů uživatelů, je nutné nainstalovat také qmail-smtpd, což je síťový modul qmailu, zajišťující vlastní služby SMTP. Narozdíl od qmail-start se qmail-smtpd nespouští přímo, ale prostřednictvím speciálního programu – superserveru. Takových programů existuje v Linuxu celá řada, za všechny jmenujme třeba inetd (xinetd), který naleznete téměř v každé distribuci, a také tcpserver (další DJBware). Ten je pochopitelně doporučován autorem qmailu a zdá se, že nikoliv bezdůvodně, neboť je i rychlejší a pro spolupráci s qmailem lépe odladěn, proto jej i my použijeme v našem příkladě.

tcpserver je součástí komplexnějšího balíku ucspi-tcp. Naleznete jej tady. Kompilace a instalace balíku je jednoduchá:

# gunzip ucspi-tcp-0.88.tar
# tar -xf ucspi-tcp-0.88.tar
# cd ucspi-tcp-0.88
# make setup check

Program tcpserver má několik parametrů, jejichž přesný význam je uveden v jeho manuálové stránce. Nejjednodušší konfigurace tcpserveru nutná pro zavedení qmail-smtpd může vypadat třeba nějak takto: (Jistě si najdete svůj způsob, jak tento zápis „propašovat“ do svých startovacích skriptů.)

bitcoin školení listopad 24

# tcpserver -v -u QMDUID -g QMDGID 0 smtp /var/qmail/bin/qmail-smtpd &

Kde za QMDUID a QMDGID dosadíme UID, resp. GID uživatele qmaild, které zjistíme ze souboru /etc/passwd, resp. /etc/groups. Znak „&“ na konci příkazu znamená, že program je pouštěn interaktivně – z příkazové řádky nebo ze startovacího skriptu – a způsobí, že daný příkaz bude spuštěn na pozadí.

Nyní jsme se dostali do stádia, kdy máme zkonfigurovaný funkční mailserver, který doručuje poštu všem našim uživatelům. Tím jsme tematicky vyčerpali první část seriálu. Příště si náš mailserver vylepšíme o funkce pop3/imap a seznámíme se s programem pro správu virtuálních uživatelských kont a domén vpopmail.