Mailserver s virtuálními účty HOWTO
Z Gentoo Linux Wiki
Obsah |
[editovat] Úvod
E-maily jsem vždycky považoval za něco jako černou skříňku - fungovaly a neměl jsem ponětí jak. Možná už jsem na to trochu přišel, takže kdo máte zájem rozeběhnout dobře spravovatelný e-mailový server, můžete zkusit následující HowTo. Jeho výsledkem by měl být SMTP a POP3/IMAP server, který:
- pro ukládání údajů o doménách, schránkách a aliasech používá MySQL databázi
- umožňuje použít SSL/TLS šifrování (SSL šifrování zatím není popsáno pro Postfix)
- používá SMTP autorizaci
- obsahuje zákládní obranu proti SPAMu
V MySQL databázi není všechno - každá doména v tomto howto používá vlastní systémový účet, který musí být vytvořen. To ale není příliš velký problém zautomatizovat.
[editovat] Výběr programů
Brzy jsem zjistil, že jenom s jedním programem si nevystačím (jaký to objev). Budeme potřebovat:
- SMTP server, který se bude starat o doručování pošty z našeho počítače a stejně tak i o přijímání pošty. Ve chvíli, kdy ale poštu přijme a chceme si jí přečíst třeba v Outlooku, tak budeme potřebovat i
- POP3 / IMAP server. Většina programů umí oba protokoly s tím, že IMAP je jakožto novější protokol preferovaný. Z toho důvodu budu dále psát jenom o IMAP serveru
[editovat] SMTP server - Postfix
Postfix je moderní SMTP server, jehož základy napsal známý bezpečnostní expert Wietse Venema. Je napsán s ohledem na bezpečnost, snadnou konfiguraci a má výbornou dokumentaci. Postfix mi od začátku perfektně vyhovoval, takže jsem neměl potřebu zkoušet jiné SMTP servery. Dalším důvodem je, že k Postfixu byla vydána velice dobrá kniha Postfix - kompletní průvodce.
Kniha popisuje verzi 2.1, což není příliš velký problém - postupy v ní uvedené budou fungovat. Ve skutečnosti mě překvapila na české podmínky neobvyklou aktuálností.
[editovat] IMAP server - Dovecot
Výběr vhodného IMAP serveru byl na druhou stranu trochu utrpení, pokud bych to měl vzít popořadě, tak jsem postupně vyzkoušel:
- Courier-IMAP z vcelku jednoduchého důvodu - je to nejpoužívanější IMAP server ve všech možných HowTos. Vadila mi u něj jediná maličkost a to, že v klientech typu MS Outlook blbě zobrazoval hierarchii IMAP složek a bez další konfigurace Outlooku to nebylo možné změnit. Je to prkotina, ale já jsem perfekcionista a nechtěl jsem se s tím smířit.
- Cyrus-IMAP (prý) extrémně výkonný IMAP server, který používá vlastní formát úložiště, hromadu indexů atd. Na druhou stranu má i podivný nástroj cyr-adm, není příliš user-friendly a má mizernou dokumentaci. A hlavní důvod je, že mi po nějaké chvíli přestal automaticky vytvářet mailboxy a nedokázal jsem to spravit, takže dalším v pořadí a mým celkovým vítězem se stal
- Dovecot. Poměrně mladý projekt (13. dubna 2007 vyšla stabilní verze 1.0.0), který je napsán s ohledem na bezpečnost (autor vypsal odměnu za nalezení bezpečnostní chyby), má jednoduchou konfiguraci a dobrou dokumentaci.
[editovat] Instalace
Rozhodnul jsem se v obou případech použít testovací balíčky z Gentoo. U Postfixu to je z důvodu, že verze 2.3 umožňuje použití Dovecot-SASL pro SMTP autorizaci (viz dále) kromě standardního Cyrus-SASL. To by mi umožnilo obejít se bez dalšího běžícího démona, další konfigurace a dalšího mizerně zdokumentovaného kusu softwaru. U Dovecotu jsem to udělal, protože stále není k dispozici stabilní verze a každý další RC většinou opravuje něco navíc. Z toho důvodu se snažím mít vždy aktuální verzi.
[editovat] Nastavení Portage
[editovat] /etc/portage/package.keywords
Že chceme testovací balíčky je potřeba nastavit:
# echo '=net-mail/dovecot-1.0* ~x86' >> /etc/portage/package.keywords # echo '=mail-mta/postfix-2.3* ~x86' >> /etc/portage/package.keywords
[editovat] USE flagy
Pro Postfix budeme chtít podporu MySQL a Dovecot-SASL, naopak se docela dobře obejdeme bez PAMu.
# echo 'mail-mta/postfix -pam dovecot-sasl' >>/etc/portage/package.use
mysql mám mám v globálních USE flags v /etc/make.conf, stejně tak v nich mám i ssl a hardened
Pro Dovecot opět MySQL a vypnout PAM, navíc ještě zapnout podporu pro POP3.
# echo 'net-mail/dovecot -pam pop3d' >> /etc/portage/package.use
[editovat] Instalace
Pokud jste už instalovali například Vixie-cron, tak ten jako jednu ze svých závislostí používá Simple SMTP server, který Postfix blokuje a je potřeba ho nejdřív odinstalovat:
# emerge -avC ssmtp
A teď opravdu můžeme začít:
# emerge -av dovecot postfix
These are the packages that would be merged, in order:
Calculating dependencies... done! [ebuild N ] net-mail/dovecot-1.0_rc2 USE="mysql pop3d ssl -debug -doc -ipv6 -kerberos -ldap -mbox -pam -postgres -vpopmail" 0 kB [ebuild N ] mail-mta/postfix-2.3.0 USE="dovecot-sasl hardened mysql ssl -cdb -ipv6 -ldap -mailwrapper -mbox -nis -pam -postgres -sasl" 0 kB
Total size of downloads: 0 kB
Would you like to merge these packages? [Yes/No] y
[editovat] MySQL
Všechno je hotové a začíná pořádná práce...
[editovat] Tabulky
Předpokládám, že databázi už máte založenou a že se jmenuje například db. V té potom vytvořte tabulky podle následujících SQL příkazů:
Toto schéma je bohužel úplně nevhodné pro použití například s Ruby on Rails. Pokud budete používat RoR na administraci, tak je potřeba ho odpovídajícím způsobem upravit a dále upravit SQL příkazy pro Postfix a Dovecot (níže).
[editovat] Domény
CREATE TABLE `domain` ( `dom_id` int(11) unsigned NOT NULL default '0', `dom_name` varchar(255) collate utf8_czech_ci NOT NULL default , PRIMARY KEY (`dom_id`), UNIQUE KEY `dom_name` (`dom_name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
nebo
CREATE TABLE `domain` ( `dom_id` INT(11) unsigned NOT NULL , `dom_name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL , PRIMARY KEY (`dom_id`) , UNIQUE (`dom_name`) ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_czech_ci;
[editovat] E-mailové účty
CREATE TABLE `email_user` ( `emlu_user` varchar(64) collate utf8_czech_ci NOT NULL default , `emlu_password` varchar(32) collate utf8_czech_ci NOT NULL default , `emlu_domain` int(11) unsigned NOT NULL default '0', `emlu_homedir` varchar(255) collate utf8_czech_ci NOT NULL default , PRIMARY KEY (`emlu_user`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
[editovat] Aliasy
CREATE TABLE `email_alias` ( `emla_domain` int(11) unsigned NOT NULL default '0', `emla_alias` varchar(64) collate utf8_czech_ci NOT NULL default , `emla_destination` varchar(64) collate utf8_czech_ci NOT NULL default , PRIMARY KEY (`emla_alias`,`emla_destination`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Dále založíme uživatele pro přístup k těmto tabulkám. Z důvodu bezpečnosti je mnohem lepší nápad, když každá služba používá svého vlastního uživatele pro MySQL pouze s nezbytně nutnými právy.
mysql> GRANT SELECT ON db.domain TO 'postfix'@'localhost' IDENTIFIED BY 'secret'; mysql> GRANT SELECT ON db.email_user TO 'postfix'@'localhost'; mysql> GRANT SELECT ON db.email_alias TO 'postfix'@'localhost'; mysql> GRANT SELECT ON db.email_user TO 'dovecot'@'localhost' IDENTIFIED BY 'secret';
[editovat] Data
Vložíme do MySQL databáze alespoň nějaká data. K tomu jenom pár poznámek:
- dom_id a emlu_domain musí odpovídat uid Unixového uživatele domény
- emlu_user je celá e-mailová adresa
- emlu_password je CRYPT heslo uživatele
- emlu_homedir je cesta k e-mailové schránce relativně od virtual_malbox_base. Musí vždy končit lomítkem, aby Postfix věděl, že má použít formát maildir.
A to je vše, můžeme popojet...
[editovat] Postfix
[editovat] Základní nastavení
Základní a nejvíce upravovaným konfiguračním souborem Postfixu je /etc/postfix/main.cf. Když si ho otevřete ve svém oblíbeném editoru, tak zjistíte, že je velice dobře okomentovaný a používá klasický formát parametr = hodnota (pro hodnoty přes více řádků je potřeba každý další začínat odsazením).
Pokud si chcete ušetřit zbytečnou práci s pozdějšími updaty pomocí etc-update nebo dispatch-conf, tak prostě piště všechny svoje nové věci na konec souboru.
Jako první je dobré nastavit parametr mynetworks. Ten určuje které IP adresy se budou brát jako lokální pro potřeby povolení/odeslání pošty. Osobně povoluji pouze localhost:
mynetworks = 127.0.0.0/8
Jako druhé je nastavení adresáře, který bude sloužit jako základní cesta ke schránkám, takže například:
virtual_mailbox_base = /var/mail
Postfix automaticky vytvoří adresář s e-mailovou schránkou, nevytvoří ale tuším adresář nad ním, tzn. pokud budete dále rozlišovat účty podle domén, tak musíte pro každou doménu vytvořit adresář ve virtual_mailbox_base.
Jako třetí a poslední je nastavení "map". Mapy jsou úložiště s levou částí (klíčem) a pravou částí (hodnotou). Některé z nich mají pouze levou část, tzn. testuje se jestli v nich záznam je, hodnota už není zajímavá. Mapy mohou mít spoustu různých formátů, my ale chceme mít všechno perfektně spravovatelné, takže použijeme MySQL. Na konec souboru přidejte:
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uids-map.cf virtual_gid_maps = static:1000 virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-aliases-map.cf virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains-map.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-map.cf
Vytvoření jednotlivých souborů je popsáno dále. virtual_gid_maps mapuje uživatele na group id odpovídajícího unixového uživatele. V mém případě mají všichni gid 1000, proto jsem použil mapu static. Pokud to pro vás neplatí, tak není problém si vytvořit vlastní mapu podle následujícího vzoru.
Zde je docela pěkne vidět, že pro rozeběhnutí Postfixu není potřeba udělat prakticky nic. Postfix v základní konfiguraci není open-relay a začne okamžitě doručovat na lokální účty. Osobně si myslím, že takhle by měl fungovat každý SW :-)
[editovat] MySQL mapy
MySQL mapy jsou soubory popisující SQL příkazy pro získávání nastavení a potřebné parametry pro připojení k MySQL databázi. Platí, že jeden soubor obsahuje vždy jednu mapu. Pokud jste použili tabulky podle předchozího návodu, tak můžete vytvořit soubory takto:
[editovat] Domény
/etc/postfix/mysql-virtual-domains-map.cf:
user = postfix password = secret hosts = localhost dbname = db query = SELECT "1" FROM domain WHERE dom_name = '%s';
[editovat] UID
/etc/postfix/mysql-virtual-uids-map.cf:
user = postfix password = secret hosts = localhost dbname = db query = SELECT emlu_domain FROM email_user WHERE emlu_user= '%s'
[editovat] E-mailové schránky
/etc/postfix/mysql-virtual-mailbox-map.cf
user = postfix password = secret hosts = localhost dbname = db query = SELECT emlu_homedir FROM email_user WHERE emlu_user = '%s'
[editovat] Aliasy
/etc/postfix/mysql-virtual-aliases-map.cf
user = postfix password = secret hosts = localhost dbname = db query = SELECT emla_destination FROM email_alias WHERE emla_alias = '%s'
Postfix musí mít k těmto souborům právo pro čtení. Pokud stejně jako já používáte roota s umask 077, tak to nepoletí. Nejlepší způsob je nastavit jim skupinu na skupinu pod kterou Postfix běží a práva na 640.
# chown :postfix /etc/postfix/mysql* # chmod 640 /etc/postfix/mysql*
Tento formát map je funkční od verze 2.2, z toho důvodu není popsaný v Postfix knize. Je ale mnohem přehlednější, proto jsem ho použil. Starý způsob je stále funkční, je ale možné, že v dalších verzích bude odstraněn.
[editovat] Ready, steady, go
Postfix potřebuje ke svému behu existující soubor s aliasy. Ty nemají nic společného s aliasy v MySQL, ale prostě musí existovat, takže spusťe:
# newaliases
Nakonec Postfix spustíme odpovídajícím init.d skriptem:
# /etc/init.d/postfix start
a přidáme do runlevelu default:
# rc-update add postfix default
Teď se můžete připojit na port 25, napsat EHLO mydomain a kochat se tím, že se něco děje :-) Na testování odesílání e-mailů přes telnet jsem dost líný (i když to jde), takže si raději vytvořím testovací účet v e-mailovém klientu a zkouším tak. Pokud zpráva dorazí v pořádku, tak to poznáte jednak z logu, ve kterém se objeví něco na způsob:
Jul 22 20:18:39 localhost postfix/qmgr[4095]: A0BEBB00030C: from=<user@domain.tld>, size=4334, nrcpt=1 (queue active) Jul 22 20:18:39 localhost postfix/virtual[4105]: A0BEBB00030C: to=<user@domain.tld>, relay=virtual, delay=0.24,
delays=0.14/0.06/0/0.04, dsn=2.0.0, status=sent (delivered to maildir)
a zároveň se můžete na zprávu podívat přímo v jejím úložišti (virtual_mailbox_base / emlu_homedir / new).
[editovat] Troubleshooting
[editovat] Kontrola konfigurace a logování
Správnou syntaxi konfiguračních souborů můžete ověřit pomocí:
# postfix check
Když je všechno v pořádku, tak příkaz nic nevrací.
[editovat] Logování
Postfix standardně loguje do /var/log/mail.log. Pokud informace, které podává z nějakého důvodu nestačí, tak je dobré zvýšit ukecanost (verbosity) logování. Pro to přidejte -vv (čím více v, tím větší verbosity) na konec řádku smtp v souboru /etc/postfix/master.cf a restartujte Postfix.
[editovat] Logování SQL dotazů
Je možné zapnout logování SQL dotazů přímo na úrovni MySQL. V souboru /etc/mysql/my.cnf nastavte
log = /tmp/mysqld.sql
[editovat] Dovecot
[editovat] Základní nastavení
Hlavní nastavení Dovecotu se nachází v souboru /etc/dovecot.conf. Soubor opět používá formát parametr = hodnota, s tím, že určité části konfigurace uzavírá mezi složené závorky, například:
protocol imap {
}
V souboru je potřeba provést pár změn:
[editovat] Povolit POP3
protocols = imap imaps pop3 pop3s
[editovat] Povolit plaintext autentifikaci
Pokud si dokážete vynutit používání SSL/TLS, tak to není potřeba, v opačném případě nastavte:
disable_plaintext_auth = no
[editovat] Formát cesty ke schránce
Cestu ke schránce budeme vždy vracet přímo z MySQL:
default_mail_env = maildir:%h
Další možností je mít schránky nějak standartizované, pokud například budete mít všechno v /var/mail/domena.tld/user/, tak můžete použít:
default_mail_env = maildir:/var/mail/%d/%u/
[editovat] POP3 UIDL formát
Bez mučení se přiznám, že vůbec netuším o co jde, ale POP3 protokol bez toho nefunguje. V komentářích je napsáno, že to musí být nastaveno na nejlépe na %08Xu%08Xv, takže proč se toho nedržet:
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
[editovat] Přihlašování
Vše se nastavuje v sekci auth default. Zakomentujeme existující nastavení a zapneme ověřování hesla přes SQL a uživatele pomocí prefetch. Výsledek bez komentářů bude vypadat takto:
auth default {
mechanisms = plain
passdb sql {
args = /etc/dovecot-sql.conf
}
userdb prefetch {
}
user = root
}
[editovat] Připojení k MySQL
V /etc/dovecot-sql.conf musíme nastavit připojení k MySQL databázi. Soubor je opět hodně dobře okomentovaný, takže napíšu jenom funkční konfiguraci:
driver = mysql
connect = host=/var/run/mysqld/mysqld.sock dbname=db user=dovecot password=secret
default_pass_scheme = CRYPT
password_query = SELECT emlu_user AS user, emlu_password AS password, CONCAT('/var/mail/', emlu_homedir) AS userdb_home,
emlu_domain AS userdb_uid, 1000 AS userdb_gid FROM email_user WHERE emlu_user = '%u'
[editovat] Ready, steady, go
To je vše, nyní můžete Dovecot spustit
/etc/init.d/dovecot start
připojit se pomocí svého e-mailového klienta a začít stahovat poštu. Nakonec opět přidat do odpovídajícího runlevelu:
# rc-update add dovecot default
[editovat] Troubleshooting
Dovecot opět loguje do /var/log/mail.log. Standardně loguje jenom přihlášení a odhlášení uživatele a některé chyby, pro ladění přihlašování (s ničím jiným snad ani problém být nemůže) povolte volby auth_verbose, auth_debug a případně i auth_debug_passwords v /etc/dovecot.conf:
auth_verbose = yes auth_debug = yes # pokud chcete vidět i heslo odeslané z e-mailového klienta auth_debug_passwords = yes
Na rozdíl od Postfixu není potřeba logovat MySQL dotazy, Dovecot se o to postará.
[editovat] Nastavení SASL
Máme funkční SMTP server, který má ale jednu nevýhodu - umožňuje posílat e-maily pouze na lokální domény, do zbytku internetu pouze z localhostu (nebo co jste nastavili do mynetworks). Nejjednodušší cesta jak můžete zpřístupnit SMTP server uživatelům je použít SASL protokol, který si vynutí autorizaci (SMTP protokol byl navržený v dobách "přátelského" internetu, takže autorizaci neobsahuje).
[editovat] Dovecot
V sekci auth default v souboru /etc/dovecot.conf zapněte vytvoření socketu pro uživatele postfix:
auth default {
mechanisms = plain login
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
[editovat] Postfix
Do souboru /etc/postfix/main.cf přidáme několik nových nastavení:
# povolit SASL autorizaci smtpd_sasl_auth_enable = yes # povolit pokazene klienty (od koho asi?) broken_sasl_auth_clients = yes # nastavit Dovecot-SASL smtpd_sasl_type = dovecot # nastavit spravnou cestu smtpd_sasl_path = private/auth
# a to hlavni - nastavit pravidla, ktera se kontroluji ve chvili kdy dojde SMTP prikaz RCPT TO:
# standartni nastaveni je smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination
# diky cemuz neni Postfix open-relay
smtpd_recipient_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
[editovat] Ready, steady, go
Restartujte Postfix i Dovecot
# /etc/init.d/dovecot restart && /etc/init.d/postfix restart
nastavte si ve svém e-mailovém klientu že SMTP server požaduje ověření a že uživatelské jméno i heslo jsou shodné se serverem příchozí pošty a můžete posílat zprávy i do zbytku internetu.
[editovat] Obrana proti SPAMu
Na závěr bych chtěl přidat pár pravidel, kterými je možné SMTP server ochránit před nešikovnými spammery (a těch je dost, což brzy zjistíte při prohlížení logu). V žádném případě to nemá nahradit pokročilé filtry jako SpamAssassin a jiné, zachytí to ale dost SPAMů, kterými by se potom tyto filtry musely zabývat.
Analýza e-mailu Bayesovským filtrem je mnohem náročnější na procesrový čas než jednoduchá kotrola jestli klient odeslal správně HELO nebo EHLO příkaz, navíc e-mail je potřeba nejdříve celý přijmout.
Všechna nastavení budou v souboru /etc/postfix/main.cf:
# Klienti musi zacit komunikaci HELO nebo EHLO. Normalni klienti to delaji
smtpd_helo_required = yes
# Muzeme zahodit nesikovne spammery jeste pred zacatkem komunikace po prikazu HELO(EHLO)
smtpd_helo_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_invalid_hostname
reject_non_fqdn_helo_hostname
reject_unauth_pipelining
# par omezeni pro odesilatele
smtpd_sender_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unknown_sender_domain
reject_non_fqdn_sender
reject_unauth_pipelining
# a par omezeni pro prijemce, aby se Postfix nemusel zabyvat zpravama,
# ktere nema kam dorucit a plnil tim frontu
smtpd_recipient_restrictions =
permit_sasl_authenticated
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_recipient
reject_unknown_recipient_domain
Většina těchto omezení má svoje opodstatnění v odpovídajících RFC. Prakticky se nemůže stát, aby to zablokovalo odesílání autorizovaného uživatele, prozatím se mi pouze jednou stalo, že došlo k zablokování příjmu pošty z nějakého domácího SMTP serveru se špatně nastaveným hostname. To je vše, teď stačí znovu nahrát konfiguraci
# postfix reload
a trochu otestovat. Nejlepší je vždy vyzkoušet jestli je možné:
- odeslat poštu na jiný server, pokud je zapnuto SMTP ověřování
- přijmout poštu odeslanou na náš server z jiného
Zároveň nesmí jít odeslat e-mail z našeho serveru bez přihlášení, tím se server stává open-relay a velice rychle míří na černou listinu.
[editovat] Postfix - poslední detaily
Pro náš server můžeme v klidu vypnout službu biff. Biff zasílá Unixovým uživatelům upozornění na přijaté maily, pokud jsou ale všichni uživatele virtuální, tak to ztrácí smysl.
biff = no
Další zbytečnost je VRFY, neboli kontrola jestli e-mail existuje. Skvělá věc pro spammery, takže je lepší ji vypnout.
disable_vrfy_command = yes
[editovat] Odkazy
K problematice e-mailů je na internetu ohromné množství znalostí, uvedu ty nejzajímavější, ze kterých jsem čerpal:
- Virtual Mailhosting System with Postfix Guide - postarší, ale stále použitelné Gentoo Howto, které používá Postfix + Courier-IMAP + Cyrus-SASL
- HOWTO Email: A Complete Virtual System - návod na vytvoření kompletního e-mailového systému. Je potřeba si z něj vybrat pouze odpovídající části.
- Dokumentace Postfixu - jedna z nejlepších dokumetací, které jsem doposud viděl. Kromě příkladů obsahuje i abecedně řazený přehled všech konfiguračních direktiv pro main.cf (asi tak 95% z nich nebudete nikdy potřebovat).
- PostfixWiki - opravdu velká hromada návodů k Postfixu.
- DovecotWiki - ne tak skvělá dokumentace jako k Postfixu, ale stále dobře použitelná.
- RFC 822 a RFC 2822 - základní RFC, popisující doručování zpráv na internetu (resp. ehm, ARPA Internetu). Pouze pro hard core administrátory.
