Sendmail - úplné základy

Podíváme se společně na MTA sendmail. Popíšeme si jeho kompilaci a podíváme se na způsob jakým se pomocí m4 makrojazyka konfiguruje.

6.4.2011 00:00 | Radim Kolář | přečteno 12166×

Sendmail

Program Sendmail je opravdová legenda. Je to nejstarší MTA (Mail Transport Agent), který je používán dodnes. Byl napsán v roce 1983 a dlouho byl jediným programem pro posílání pošty. Vzhledem ke své neuvěřitelné flexibilitě konfigurace podporoval snad všechny otevřené mail protokoly. Byl používán pro SMTP, ESMTP, UUCP, HylaFax, DECnet, QuickPage . Historie sendmailu je hezky popsána na wikipedii.

Sendmail je sice dodnes nejpoužívanější MTA, ale je postupně vytlačován programy Postfix, Exim, Microsoft Exchange a Qmail.

RokZastoupení Sendmailu
200141 %
200438 %
200729,4 %
200924 %
V současné době dělá nejvěrohodnější statistiku SMTP MTA server mailradar.com, kterou si můžete prohlédnout zde.

Nejčastěji je sendmail nahrazován programem postfix a častým důvodem pro nahrazování je údajná špatná bezpečnost sendmailu. Není to tak docela pravda, Secunia report pro Postfix 2 2003-2011 ukazuje 4 zranitelnosti stejně jako Secunia report pro Sendmail 8. Musíme však přiznat, že nalezené bezpečnostní problémy v sendmailu byly závažnější.

Druhým důvodem pro nahrazování sendmailu je jeho obtížnější konfigurace. To je pravda a navíc situaci poměrně komplikuje nedostatek detailních návodů na internetu. Většina návodů pro sendmail, které najdete, je poměrně povrchní a ne vždy správná. Doporučuji si sehnat dvě výborné knížky o Sendmailu: sendmail cookbook a sendmail, Fourth Edition.

Kompilace Sendmailu

Sendmail musíme mít přeložený s podporou pro SASL2, STARTTLS a případně LDAP. Dnes už povětšinou sendmail kompilovat nemusíme, protože to za nás již udělali distributoři. Volby s kterými byl náš sendmail přeložen si zobrazíme pomocí sendmail -d0,1 -bv root. Pokud chcete postup jak přeložit sendmail z oficiálních zdrojáků, tak mi to napište do diskuze.

FreeBSD

Ve FreeBSD je sendmail obsažen v základním systému, ale bez voleb LDAP a SASL2. Pokud chceme sendmail s těmito volbama máme dvě možnosti: nainstalovat si port mail/sendmail-ldap nebo si přeložit znovu sendmail co je v základním systému. Já preferuji druhou volbu.

Nejdřív musíme nainstalovat sasl2 a ldap knihovny

cd /usr/ports/security/cyrus-sasl2
make install clean
cd /usr/ports/net/openldap24-sasl-client
make install clean

Do /etc/make.conf přidáme

SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 -DLDAPMAP
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2 -lldap -llber

a pak přeložíme a nainstalujeme nový sendmail, kterým přepíše stávající. Pokud bychom instalovali sendmail z portu tak budeme mít v systému sendmaily dva, což zvyšuje pravděpodobnost chyby tím, že některý z email programů zavolá starý sendmail.

cd /usr/src/lib/libsmutil
# make cleandir depend && make
# cd ../libsm
# make cleandir depend && make
# cd  /usr/src/usr.sbin/sendmail
# make cleandir depend && make && make install

Ubuntu

V Ubuntu máme situaci o poznání jednoduší. Nemusíme totiž ručně nic kompilovat. Stačí nám nainstalovat balíček sendmail včetně závislostí a získáme sendmail s podporou OpenLDAP 2.4, OpenSSL a SASL2.

Verze UbuntuVerze Sendmailu
8.048.14.2
10.048.14.3
10.108.14.3

Sendmail není oficiálně podporován společností Canonical.

M4 Konfigurace

Konfugurační soubory sendmailu se nachází tradičně v adresáři /etc/mail. Snad všechny existující distribuce toto dodržují. V tomto adresáři najdete .mc .cf a .db soubory. Soubory .cf a .db jsou generovány.

Sendmail se konfiguruje především pomocí makrojazyka M4. Na soubor s koncovkou .mc spustíme m4 preprocesor, který nám vygeneruje finální konfigurační soubor sendmail.cf. Makrojazyk M4 se používá ve všech osmičkových a možná i starších verzích sendmailu. S jinou než osmičkovou řadou se za posledních 20 let nepotkáme, osmičková řada vznikla forkem z 4.4 BSD v roce 1993.

Přímá editace konfiguračního souboru sendmail.cf se vzhledem ke své relativně dost velké složitosti nedoporučuje. Je lepší si vytvořit svá .m4 makra a ty pak volat z .mc souboru. Také se to snadněji udržuje a aktualizace konfigurace na novou verzi sendmailu je pak jednoduší.

V dnešních distribucích se již nemusíme o volání m4 preprocesoru starat. Distributor nám připravil Makefile, který po editaci konfiguračních souborů sendmailu zařídí vše potřebné a spustí jednak m4 preprocesor i vytvoří databázové hashtabulky ze vstupních textových souborů.

Ubuntu

V Ubuntu je situace jednoduchá. Poeditujeme co je libo a v /etc/mail spustíme příkaz make, který spustí docela sofistikovaný Makefile, protože kromě aktualizace konfiguračních souborů vypíše i změněné soubory a upozorní nás abychom nezapomněli spustit /etc/init.d/sendmail reload.

FreeBSD

Ve FreeBSD máme situaci o trochu složitější. Pokud v /etc/mail spustíme make tak dojde sice k vytvoření hash databází a konfiguračního souboru ale konfigurační soubor nebude nainstalován a proto bude v platnosti pořád stará konfigurace. K nainstalování nové konfigurace musíme zadat make install a restartovat sendmail pomocí make restart nebo /etc/rc.d/sendmail restart. Nově vytvořené hash databáze ale budou aktivní, netřeba je instalovat a restartovat sendmail.

Základy M4 makrojazyka

Konfigurační .mc soubor sendmailu obvykle začíná příkazem divert(-1) a poté následuje copyright. Vše co následuje po divert(-1) se nezkopíruje do výstupního souboru protože m4 má 10 front číslovaných 0-9. Tyto fronty jsou pak vzestupně seřazeny ve výstupním proudu. Vypnutí výstupu ale neznamená že jsou další m4 příkazy ignorovány - můžeme dále definovat a používat makra, bude jen potlačen jejich případný tiskový výstup. Po copyrightu který může být v libovolném formátu, který není zároveň příkazem m4 pak následuje divert(0), což vypne ignorování výstupu a jedeme již naostro.

Komentáře se v m4 makrojazyku označují zkratkou dnl a končí koncem řádku včetně ukončovacího znaku řádku - obvykle CR. Pokud chceme zabránit aby po příkazech makrojazyka m4 se přidala do výstupního souboru prázdná řádka tak příkaz ukončíme komentářem:

divert(-1)
Sendmail je nejflexibilnejsi MTA co znam
divert(0)dnl

Prázné řádky ve výstupním souboru ve většině případů nevadí a tak končit příkazy makrojazyka komentářem není dnes již bezpodmínečně nutné, ačkoliv to stále budete velmi často vídávat v různých návodech.

Nejčastějším příkazem m4 který budeme potřebovat je příkaz define kterým definujeme m4 makra. Sice si s ním můžeme definovat jakákoliv makra a pak je používat v následujících řádkách konfigurace, ale tato možnost se v praxi používá naprosto minimálně. My budeme definovat jen makra předem známých jmen jejichž existence je pak testována hlavním m4 skriptem pro vytváření konfigurace.

Prvním argumentem příkazu define je jméno makra, druhým je obsah makra. Jelikož m4 umí vytvářet makro v makru, což v našem případě není žádoucí chování je potřeba říci m4 aby jméno a obsah makra vzal tak jak je a nezpracovával ho. Tohoto docílíme umístěním řetězce do `' (obrácená uvozovka a normální uvozovka).

define(`confCW_FILE', `-o /etc/mail/local-host-names')

Je potřeba zvolit v terminálu vhodný font v kterém můžeme snadno tyto dvě uvozovky od sebe odlišit. Pokud je použijeme špatně tak m4 nezobrazí žádnou chybovou hlášku, ale vygenerovaný konfigurační soubor bude chybný. Tato chyba v konfiguraci se navíc špatně hledá.

Pokud nechceme generovat sendmail.cf pomocí připraveného makefile ale ručně tak toho dosáhneme takto:

/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 \
sendmail.mc > sendmail.cf

Příklad na spuštění m4 předpokládá že máme sendmail konfigurační makra umístěná v adresáři /usr/share/sendmail/cf. Tento adresář používá pro uložení konfigurace jak FreeBSD tak Ubuntu.

Online verze článku: http://www.linuxsoft.cz/article.php?id_article=1819