Jak jsme si již řekli minule, k Sendmailu patří balík m4 maker sloužící pro snadnou konfiguraci. Vytvoříme jednoduchý konfigurační metasoubor a jeho zpracováním získáme vlastní konfigurační soubor. V něm už se nešťouráme. Je pravda, že takto nelze dosáhnout atypického nastavení, ale většiny toho, co běžně potřebujeme, ano.
Z praktických důvodů si konfigurační metasoubor uchovávám vždy spolu s používaným vygenerovaným souborem v adresáři /etc/mail se stejným jménem, ale příponou .mc. Vyhnu se tak problémům s jeho hledáním. Provedu-li změny, aktivuji je jeho zpracováním a odesláním signálu běžícímu Sendmailu (použití
../m4/cf.m4 záleží na tom, je-li ve vlastním konfiguračním metasouboru vloženo; umístění maker závisí na distribuci; odeslání signálu HUP démonu též a killall není čistým řešením).
cd /usr/share/sendmail/cf/m4 m4 ../m4/cf.m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf killall -HUP sendmail
Takto vypadá typický základ konfiguračního metasouboru /etc/mail/sendmail.mc pro GNU-Linux:
divert(-1)dnl Toto je komentář. V konfiguraci se neobjeví. divert(0)dnl dnl Pokud nechcete tento soubor psát jako dnl argument m4, odkomentujte toto: dnl include(`../m4/cf.m4')dnl dnl takto si lze označit konfiguraci VERSIONID(`toto se objeví v konfiguraci jako komentář')dnl dnl typ operačního systému OSTYPE(`linux')dnl dnl typ domény (obecná) dnl (Nastavení je určeno pro správce velkých systémů.) DOMAIN(`generic')dnl dnl místní poštu doručuje Procmail FEATURE(`local_procmail')dnl dnl připojit definice pro místní poštu MAILER(`local')dnl dnl připojit definice pro protokol SMTP MAILER(`smtp')dnl dnl připojit definice pro Procmail MAILER(`procmail')dnl
Komentáře v m4 začínají dnl (Delete to New Line) nebo se uzavírají mezi divert().
Ostatní parametry, uváděné dále, jsou zařazovány v tomto pořadí:
VERSIONID OSTYPE DOMAIN FEATURE lokální definice maker MAILER LOCAL_CONFIG LOCAL_RULE_* LOCAL_RULESETS
Základ neprivilegovaného konfiguračního souboru submit.cf najdeme mezi m4 makry jako /usr/share/sendmail/cf/cf/submit.mc (záleží na distribuci). V tomto článku je jen jediné nastavení vhodné do tohoto souboru.
Jak Sendmail spustit
Přesto, že to většinou řeší distribuce, není na škodu vědět více.
Novější Sendmail používá dvě konfigurace – /etc/mail/sendmail.cf, pokud je spouštěn jako superuživatel nebo je v příkazovém řádku -Am, a /etc/mail/submit.cf, pokud není spouštěn jako superuživatel nebo je v příkazovém řádku -Ac.
Sendmail se tedy spouští pod superuživatelem jako dva démony, typicky těmito příkazy:
# Sendmail jako MTA /usr/sbin/sendmail -L sm-mta -bd -q1h # Sendmail pro kontrolu MSP fronty /usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
Argument -bd říká, že se spustí jako SMTP démon, -L slouží k identifikaci v systémových záznamech, a -qinterval říká, jak často se bude pokoušet odeslat poštu čekající ve frontě.
Pokud spustíme Sendmail s parametrem -q, Sendmail se nespustí jako démon, ale pouze projde frontu a pokusí se odeslat všechnu neodeslanou poštu. Toho lze využít na vytáčených linkách. Při přihlášení k Internetu spustíme příkaz na vyprázdnění fronty. Pokud používáme pppd, bývá typické umístění souboru /etc/ppp/ip-up, a i když pppd (které je suid) spustí neprivilegovaný uživatel, soubor se vykonává s právy superuživatele.
# vyprázdnit neprivilegovanou (MSP) frontu /usr/sbin/sendmail -L sm-msp-queue -Ac -q & # vyprázdnit MTA frontu /usr/sbin/sendmail -L sm-mta -q &
Na stav front se lze zeptat jako superuživatel:
# dotázat se na fronty mailq -Ac ; mailq
K příkazům lze přidat argument -v, který zapne upovídaný režim. Pak můžeme sledovat navazování komunikace mezi programy.
Konfigurace Sendmailu
Je několik možností, jak nakonfigurovat Sendmail:
Sendmail vůbec nespouštět.
Toto nastavení je možné na samostatném počítači a systému, který nepracuje jako SMTP server.
Problémem tohoto nastavení je fakt, že nedoručená zpráva zůstane ve frontě. Nevím, zda lze Sendmail nakonfigurovat, aby takovou poštu ihned vrátil. Na pevné lince proto tedy tento postup nelze doporučit.
Na vytáčené lince se fronta explicitně vyprázdní při připojení. Může se však stát, že pošta z nějakého důvodu při připojení neodejde. V tomto případě nedostaneme žádné varování, takže je nutné se explicitně dotázat na stav fronty.
V tomto nastavení se zřejmě uchýlíme ke staršímu, méně bezpečnému typu instalace (nepřepokládám, že bychom sami na sebe prováděli lokální útoky) a Sendmail nastavíme jako suid root. Konfigurace submit.cf bude jen symbolickým odkazem na sendmail.cf; /var/spool/clientmqueue pak můžeme zrušit. Ušetříme si tím komplikace a na stav fronty se bude moci příkazem mailq ptát i běžný uživatel.
Sendmail spustit pouze jako přijímající agent.
Pokud jsme odpojeni od sítě, nemá smysl, aby se Sendmail pokoušel zprávu doručit. K tomu slouží označení daného protokolu za „drahý“. Tím instruujeme Sendmail, aby zprávy neodesílal, není-li k tomu explicitně vyzván:
dnl přihlédnout k ceně protokolu define(`confCON_EXPENSIVE',`True')dnl dnl SMTP je drahý protokol MODIFY_MAILER_FLAGS(`SMTP', `+e')dnl
Démony v takové konfiguraci spustíme bez argumentu -qinterval.
Nevýhody jsou zřejmé: Pokud rozesíláme po firmě poštu pomocí SMTP, neodejde. Po připojení k Internetu budeme muset vyměnit konfigurační soubor a zaslat démonům Sendmailu signál HUP. Pokud bychom si však dali s konfigurací více práce, lze tento systém rozchodit lépe (definicí nového MAILERu, který bude identický se SMTP, nebude označen jako „drahý“, a bude rozesílat poštu po firmě).
Výhody jsou jen dvě: Pokud budeme odpojeni od Internetu, nebude se démon prohrabovat na disku a pokoušet se doručit poštu. Pokud je systém nastaven na vytáčení na žádost, je možné touto konfigurací zajistit, že se počítač nepřipojí k Internetu kvůli každé zprávě zvlášť.
K tomu však potřebujeme ještě zablokovat Sendmailu žádosti na DNS. To lze pomocí /etc/mail/service.switch (jeho syntaxe je stejná jako /etc/nssswitch.conf).
Sendmail spustit plně.
Je to asi nejjednodušší, a přitom univerzální nastavení. Lze jej použít i na vytáčených linkách, protože Sendmail nepovažuje dočasně nefunkční vyhledání příjemce pomocí DNS za důvod pro vrácení zprávy.
Užitečná nastavení
Sendmail používá stovky nastavovacích voleb. Nyní popíšu ty, které považuji za nejužitečnější. Musíte si z nich vybrat podle vlastních potřeb. Jsou zde uvedeny podle logických souvislostí a jejich pořadí v konfiguračním metasouboru určuje výše uvedené schema. Jsou určeny pro konfiguraci sendmail.mc.
Pokud chceme přeposílat poštu přes SMTP server providera jako Relay, využijeme následující nastavení:
define(`SMART_HOST', `esmtp:smtp.muj_provider.cz')dnl
Má to své výhody i nevýhody. Pošta poputuje o něco déle, avšak budeme se při tom připojovat k blízkému serveru, a proto rychleji odejde. Posíláme-li hromadnou zprávu, její hromadné odesílání pak připadne až dalšímu serveru. Toto nastavení je vhodné i z jiného důvodu: Některé antispamové filtry blokují poštu, která přichází ze SMTP serveru na vytáčených linkách.
Pokud se připojujeme k Internetu jen jednou denně, přijde vhod prodloužení času, za který dostaneme varování:
dnl varování, není-li zpráva odeslána za 2 dny define(`confTO_QUEUEWARN',`3d')dnl dnl vrátit neodeslanou zprávu za 32 dny define(`confTO_QUEUERETURN', `32d')dnl dnl varování, není-li naléhavá zpráva odeslána za 4 hodiny define(`confTO_QUEUEWARN_URGENT',`4h')dnl
Toto nastavení je užitečné přidat do obou konfiguračních souborů (tedy i submit.mc).
Pokud Sendmail používáme na vytáčené lince nebo za firewallem i pro přijímání pošty, může se hodit, abychom přijali poštu i v době, kdy je DNS server odesílatele nedostupný. Vyhneme se tak nechtěnému vrácení pošty jako nedoručitelné:
dnl přijímat poštu z nedostupných domén FEATURE(`accept_unresolvable_domains')dnl
Pokud provozujeme malou lokální síť, nedostupnou z Internetu, SMTP server, který sbírá poštu, může mít nastaveno:
dnl rozesílat poštu z místní domény FEATURE(`relay_entire_domain')dnl
Obecnější nastavení pak umožňuje zadat výčet adres, ze kterých budeme poštu přijímat. Vyhněme se však následujícímu:
dnl rozesílat poštu z celé sítě
FEATURE(`promiscuous_relay')dnl
Jinak vás během několika dnů najdou spameři, aby s vaší nechtěnou pomocí mohli beztrestně rozesílat poštu na stamilióny adres. Několik dnů nato skončíte na černé listině a žádný seriózní provider od vás poštu nepřijme.
I Sendmail ovládá maškarádu. U vytáčených linek je to vlastnost velmi důležitá – bez ní bychom odpovědi dostávali na adresu, kterou nám při připojení k Internetu dočasně přidělil provider.
Moderní programy vše v jednom to sice umí také, ale takto to elegantně provedeme ve všech programech, navíc s možností výhrady lokální pošty po firmě, která tak nebude putovat přes providera.
Pokud má celá firma vlastní doménu, můžeme veškerou poštu vydávat za poštu z této domény:
dnl maskovat se jako moje_firma.cz MASQUERADE_AS(`moje_firma.cz')dnl dnl maskovat jména v doméně moje_firma.dialup.muj_provider.cz MASQUERADE_DOMAIN(`moje_firma.dialup.muj_provider.cz')dnl
Tyto vlastnosti jsou pak volitelné:
dnl maskovat celou místní doménu FEATURE(`masquerade_entire_domain')dnl dnl maskovat i obálku zprávy FEATURE(`masquerade_envelope')dnl dnl maškaráda i pro lokální poštu dnl (aby šla přes providera) FEATURE(`allmasquerade')dnl
Standardní nastavení zakazuje maškarádu pro uživatele root. Doufám, že nikdo z vás nepoužívá konto superuživatele na vyřizování pošty.
Pokud chceme maskovat každého uživatele jinam, nepoužijeme maškarádu. Slouží k tomu generická tabulka. Aby byla použita, je třeba tuto schopnost aktivovat:
dnl použít generickou tabulku FEATURE(`genericstable')dnl dnl volitelně generickou tabulku pro celou místní doménu FEATURE(`generics_entire_domain')dnl dnl použít na jména v doméně moje_firma.dialup.muj_provider.cz GENERICS_DOMAIN(`moje_firma.dialup.muj_provider.cz')dnl
Namísto jména moje_firma.dialup.muj_provider.cz si zapíšeme jméno, které jsme svému stroji dali (zjistíme to příkazem hostname -f).
Vlastní tabulka se ukládá do souboru /etc/mail/genericstable a může vypadat třeba takto:
bfu franta.b.u@seznam.cz lamer big.brain@hotmail.com hacker pepa@sourceforge.net
Před použitím musí být zkompilovaná pomocí:
# zkompilovat generickou tabulku makemap hash /etc/mail/genericstable
Pokud pak bfu pošle z libovolného programu z místního účtu poštu, v kolonce odesílatele se automaticky objeví franta.b.u@seznam.cz.
Tím jsme zdaleka nevyčerpali možnosti Sendmailu. Pro běžné nastavení malého serveru to stačí, a zbytek si dohledáte v README.
Doporučení: Než začnete experimentovat, ujistěte se, že ve frontách nejsou žádné důležité zprávy a ani žádné nepřijdou. Po nastavení si pošlete poštu na své účty a vyzvedněte si ji. Pošta musí odejít k providerovi a vrátit se. Nezapomeňte jí zkontrolovat hlavičky, zejména položku From! Musí tam být adresa vašeho konta na Internetu. Pošta se špatnou hlavičkou From se sice může v pořádku vrátit, ale o odpovědi na ní už to platit nebude.
UPDATE 10. 2. 2003:
Chcete-li používat dvoudémonový režim (MSP/MTA) v nejnovějším Sendmailu a zároveň maškarádu resp. generickou tabulku, musíte ještě přidat následující řádky:
MASQUERADE_DOMAIN_FILE(`/etc/mail/soubor')dnl
resp.
GENERICS_DOMAIN_FILE(`/etc/mail/soubor')dnl
Soubor, na který tabulky ukazují, musí obsahovat jména lokálních počítačů, kterých se převod jmen odesílatelů týká. Používáte-li soubor /etc/mail/local-host-names, může jít o odkaz na něj. Důvodem této změny je fakt, že podle RFC musí provést kvalifikaci jména již MSP, nikoliv až MTA, jak to dělaly předchozí verze.
UPDATE 21. 9. 2003:
Aby MSP mohl tuto kvalifikaci provést, musíte ze souboru sendmail.mc do souboru submit.cf zkopírovat všechny konfigurační volby k tomu potřebné (tedy především údaje o generické tabulce a maškarádě). Pokud to neprovedete, odchozí mail se nejdříve uloží jako nedoručený (s nekvalifikovaným odesílatelem) do fronty, a teprve při dalším pokusu (tedy za půl hodiny až za hodinu) je opraven a poslán.