Sendmail

Petr Hekerle, xhekerle@fi.muni.cz


Obsah


Úvod

Sendmail je nejrozšířenějším MTA (Mail Transport Agent), to jest programem pro dopravu pošty po síti. Má monolitickou architekturu, takže jediný program funguje jako SMTP server i klient, zajišťuje směrování pošty, opakování při problémech, vracení nedoručitelných dopisů, ukládání do mailkoxů atd. Současně je sendmail setuid na roota, což znamená velký problé z hlediska bezpečnosti, protože chyby v programu mohou umožnit získání práv roota. V posledních letech se také několik závažných bezpečnostích děr objevilo (nejznámější je Internet worm). To je také důvod hledání náhrad sendmailu. Nejvážnějšími kondidáty se jeví qmail a exim. Oba programy jsou modulární (více malých programů) a byly psány se snahou odstranit největší problémy sendmailu (pramalá bezpečnost a poměrně velké zatížení počítače).

Soubory sendmailu

Sendmail samozřejmě netvoří pouze program sendmail, ale skládá se z více souborů a adresářů. Takovým klíčem k sendmailu je konfigurační soubor /etc/sendmail.cf, který obsahuje cesty k ostaním souborům, různé volby a sady pravidel (gramatiku) pro přepisování adres. Fronta zpráv /var/spool/mqueue zadržuje zprávy než budou doručeny. Soubor /etc/aliases obsahuje lokální aliasy, po jejichž změně je potřeba spustit sooubor newaliases. Aliasing je také přístupný pro uživatele pomocí souboru .forward v jejich domovských adresářích. K lokálnímu doručování lze potom použít například program /bin/mail/procmail.

Konfigurace

Konfigurační soubor sendmail.cf

Konfiguraci sendmailu lze provádět nejen formou parametrů na příkazové řádce (dost hrůza), ale také nastavením konfiguračního souboru /etc/sendmail.cf (menší hrůza). Tento soubor otvírá a parsuje sendmail při každém svém spuštění (při každé práci s poštou). Proto je napsán tak, aby byl dobře čitelný pro program sendmail. Bohužel už není tak dobře čitelný pro nás.

Volby v sendmail.cf, tvoří řádky začínající písmeny:
V - definice verze konfiguračního souboru
O - definice konfigurační volby
D - definice makra
C - definice třídy makra
F - definice třídy makra z externího souboru
R - definice přepisovacích pravidel
S - definice startovacích pravidel
H - definice hlaviček
M - definice maileru
P - definice doručovací priority
T - deklarace duvěryhodných (trusted) uživatelů
K - deklarace klíčů databáze
Motto: Člověk není opravdovým správcem systému, dokud nezkusil ručně editovat sendmail.cf. Člověk je blázen, pokud to zkusil víc než jednou. :)

Použití maker M4

Mnohem jednoduší cestlou k vztvoření a modifikaci konfiguračního souboru sendmail.cf je použití sady maker M4. Pro toto nastavení je potřeba nainstalovat alík pro konfiguraci sendmailu v aktuální verzi (např. sendmail-8.9.3-20.i386.rpm). jeho soubory budou umístěny do adresáře /usr/lib/sendmail.cf.
Samotná konfigurace pak spočívá ve vytvoření krátkého konfiguračního souboru *.mc s makry, která reprezentují explicitní nastavení. Pro ostatní volby konfiguračního souboru sendmail.cf bude použito implicitní natavení sendmailu.
Kompletní M4 makra pro sendmail jsou popsána v souboru README v adresáři /usr/lib/sendmail.cf. Zde najdete jednoduše a srozumitelně, krok za krokem vyloženy instrukce pro jejich použití.

Příklad souboru sendmail.mc:
include(`/usr/lib/sendmail-cf/m4/cf.m4')
define(`confDEF_USER_ID',``8:12'')
OSTYPE(`linux')
undefine(`UUCP_RELAY')
undefine(`BITNET_RELAY')
define(`confAUTO_REBUILD')
define(`confTO_CONNECT', `1m')
define(`confTRY_NULL_MX_LIST',true)
define(`confDONT_PROBE_INTERFACES',true)
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')
FEATURE(`smrsh',`/usr/sbin/smrsh')
FEATURE(`mailertable',`hash -o /etc/mail/mailertable')
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(procmail)
MAILER(smtp)
FEATURE(`access_db')
FEATURE(`blacklist_recipients')
Samotné vygenerování souboru sendmail.cf spustíme takto:
m4 ${CFDIR}/m4/cf.m4 config.mc > config.cf

Maškaráda domény

Používá se pro případ, kdy má počítač přejímat poštu pro jinou směrovou adresu či doménu, než je jeho jméno. Tato konfigurace vypadá následovně:
# Pro odcházející poštu:
MASQUERADE_AS(
server)dnl
FEATURE(masquerade_envelope)dnl
# Pro přicházející poštu
FEATURE(always_add_domain)
FEATURE(use_cw_file)
MX záznam s nejnižší prioritou pro server však musí ukazovat na stroj, který má poštu pro server přijímat a domény, pro které počítač přijímá poštu, je potřeba vyjmenovat v souboru /etc/sendmail.cw.

Lokální doručování - procmail

Program /usr/bin/procmail je takzvaní MDA - Mail Delivery Agents nebo též. lokální mailer. Jeho úkolem je doručování poštovních zpráv do přihrádky adresáta. V praxi to vypadá tak, že email obdrží MTA (Mail Transfer Agent - například sendmail) a ten se podle několika údajů (nastavení DNS, konfigurace SMTP a domény adresáta) rozhoduje, zda jde o email k lokálnímu doručení či k předání dál. Pakliže jde o email pro lokální doručení, přichází ke slovu MDA. Ten může být v podstatě velice primitivní a pouze umístit email do předem určeného mailboxu podle adresáta a nebo naopak může být mocným nástrojem pro filtrování příchozích zpráv. A právě do této druhé skupiny patří procmail.

Příklad souboru procmailrc:
:0
* ^Subject: send file [0-9a-z]
* !^X-Loop: yourname@your.main.mail.address
* !^Subject:.*Re:
* !^FROM_DAEMON
* !^Subject: send file .*[/.]\.
{
 MAILDIR=$HOME/fileserver # chdir to the fileserver directory

 :0 fhw                   # reverse mailheader and extract name
 * ^Subject: send file \/[^ ]*
 | formail -rA "X-Loop: yourname@your.main.mail.address"

 FILE="$MATCH"            # the requested filename

 :0 ah
 | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
}

Spam a relaying

Pod pojmem Spam rozumíme nevyžádaný dopis Jde například o rozesílání hromadných reklamních zpráv. Pohybu těchto zprávám po naší síti je samozřejmě potřeba zabránit. Nejen pro usnadnění práce lokálnímu uživateli, který by asi po čase nedělal nic jiného, než mazal spamy, ale hlavně z důvodu odstranění neoprávněného relayingu. Ten na náš počítač může přenášet jednak zátěž způsobenou směrováním a distribucí pošty dál, ale hlavně se počítač, který nebrání relayingu můžou dostat na tzv. černou listinu stejně jako stroje smamerů.
Základní prostředky pro ochranu proti spamujsou součástí automatické konfigurace sendmailu. tato opatřenízajišťuje použití databaze /etc/mail/deny.db, která obsahuje celé e-mailové adresy i jejich části, které v případě nalezení v obálce v adrese odesílatele způsobí odmítnutí dopisu (k tomu v sendmailu slouží sada pravidel chech_relay). Dále obsahuje IP adresy sítí se kretými nebude počítač navazovat SMTP spojení (sada pravidel check_mail). Tato databáze je vyrobena ze souboru /etc/mail/deny.
Ochrana proti relazingu se konfiguruje pomocí souborů /etc/mail/*_allow. Jejich obsah se nemění často, proto jsou to jen textové soubory nikoli databáze, jako tomu bylo u /etc/mail/deny.db. Tyto soubory totiž vychází z konfigurace uzlů, pro které se zajišťuje přijímání a odesílání pošty.
Jednotlivé řádky souboru /etc/mail/ip_allow resp. /etc/mail/name_allow tvoří IP adresy strojů a sítí resp. 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ů, byl by odmítnut, jako nepovolený relaying.
Dalším nástrojem sendmailu pro zabránění relayingu je sada pravidel check_rcpt, kter8 kontroluje, jestli pošta přicházející z externích strujů není určena externím adresátům.
Petr Hekerle xhekerle@fi.muni.cz