Mailserver - Nastavení databáze

Aby to bylo přehledné a případně šla udělat nějaká aplikační aministrace, použijeme pro uchovávání dat databázi. V databázi tedy budou informace o doménách, které budeme znát, jednotlivé uživatele, kteří existují, aliasy k jejich schránkám a další. Sám jsem použil jako databázi postgres; přiložený dump databáze je z postgresu. Bez problémů lze použít také MySQL, na rozdíly se dále v konfiguraci pokusím upozornit. Při vytváření databáze - v MySQL jde použít datový typ enum, který postgres neumí; místo něj mám nadefinované jednotlivé kontroly pro hodnoty. Druhým rozdílem je, že v postgresu se u datového typu boolean používají jako hodnoty 't' a 'f' (jako true a false). MySQL čistě boolean neumí, obvykle se nahrazuje malým číslem a pak se tedy porovnává '0' a '1'.

Struktura databáze

V následujících odstavcích bude podrobně popsána celá struktura použité databáze. Pro případné urychlení jsem také udělal dump struktury z postgresql databáze (dump je shodný s tímto; pro vlastní použití ale lze jméno schématu a případně uživatelů napravit přes najít/nahradit).

Tabulka: postfix_access

V této tabulce jsou víceméně definovány pravidla, na základě kterých se naše MTA bude se vzdáleným vůbec bavit či ne. Přístup se definuje v políčku access, kde možné hodnoty jsou OK, REJECT nebo libovolná regulérní odpověď (třeba 550 nepujde to). Pokud je v políčku type vepsáno recipient, porovnává se obsah políčka se source s tím, co naše MTA obdrželo jako adresáta pro mail. Pokud tedy víme, že náš MTA bude přijímat e-maily z domény spamik.cz, vložíme záznam s type recipient, source spamik.cz a access OK. V source může být také e-mailová adresa.

Type sender funguje obdoným způsobem, ale porovnává se to s tím, co naše MTA obdrželo jako odesílatele e-mailu. Pokud nás tedy obtěžuje jedna e-mailová adresa, můžeme jí takto zablokovat (source je daná e-mailová adresa, type sender, access REJECT).

Type client se týká domény, odkud se nějaké jisté MTA na nás připojuje. Zadáním access REJECT, type client a source jouda.com zajistíme, že MTA na jouda.com nám nic nepředá.

Struktura tabulky
Název sloupceDatový typPopis
idinteger (default hodnota ze sekvence)Číselný identifikátor
sourcevarchar (128)Hodnota, která se porovnává
accessvarchar (128)Odpověď, která nastane při shodě (OK, REJECT, případně jiná odpověď)
typevarchar (128)Typ hodnoty, která se porovnává

Tabulka: postfix_transport

Tato tabulka specifikuje, jak budou doručovány e-maily pro jednotlivé domény. Způsob doručování je ve sloupečku destination. My se budeme zabývat a používat hodnotami virtual:, local: a dovecot:

virtual: značí, že e-maily pro tuto doménu se budou doručovat přímo virtuálním uživatelům. Tedy postfix po tomto si vyhledá příjemce v seznamu virtuálních mailboxů (což v našem případě je databáze), najde si cestu k jeho mailboxu a tam zprávu doručí.

local: řekne postfixovi, že e-maily z této domény patří lokálním uživatelům - tedy postfix nehledá cestu k jejím mailboxům v databázi, ale doručí je tam, kam je to pro lokální systémové uživatele zadané (obykle někam do jejich home složky).

dovecot: znamená, že mail bude doručen přes delivery agenta dovecotu (MDA). Postfix tedy pouze zjistí, jaká je pravá e-mailová adresa adresáta (v případě, že e-mail má jít na alias, tak postfix zjistí, kam alias směřuje) a předá to LDA a ten se již dál stará o doručení pošty.

Struktura tabulky
Název sloupceDatový typPopis
idinteger (default hodnota ze sekvence)Číselný identifikátor
domainvarchar (128)Doména, pro kterou pravidlo platí
destinationvarchar (128) (omezen na local:, virtual: a dovecot:)Způsob zpracování e-mailů v této doméně

Tabulka: postfix_users

Nejdůležitější tabulka, nese záznamy o virtuálních uživatelích, podle kterých potom postfix určuje, kde má daný uživatel mailbox a kam má zprávu doručit. Tabulku také používá i dovecot pro autorizaci uživatelů.

Struktura tabulky
Název sloupce Datový typ Popis
id integer (default hodnota ze sekvence) Číselný identifikátor
email varchar (128), unikátní E-mail zadaného uživatele, zároveň slouží jako přihlašovací jméno
password varchar (128) Heslo daného uživatele; z bezpečnosti sem budeme dávat pouze otisk jeho hesla
name varchar (255) Jméno daného uživatele (jen pro přehlednost)
uid integer UID uživatele v systému určeného pro doručování mailů virtuálním uživatelům (viz dále v návodu; default hodnotu doporučuji dát jako uid daného vytvořeného uživatele)
gid integer To samé jako uid, ale platí pro GID dané skupiny
maildir varchar (255) Relativní cesta k samotnému maildiru daného uživatele od base složky pro doručování e-mailů virtuálním uživatelům (pokud budeme mít maily v /home/mails a uživatel jarda bude mít maildir v /home/mails/jarda/.maildir/, bude v tomto sloupci jarda/.maildir/). Lomítko na konci je povinné; značí, že se jedná o maildir!
quota varchar (64) Omezení velikosti schránky daného uživatele
access boolean Značí, zda má uživatel přístup pro vybírání schránky
postfix boolean Značí, zda je schránka aktivní pro doručování zpráv
homedir varchar (255) Cesta do domovského adresáře virtuálního uživatele; ne přímo do maildiru (v příkladě výše by to bylo /home/mails/jarda)
admin boolean Zatím nevyužitá hodnota; bude fungovat pro web managment uživatelů, který se pokusím napsat a označí tohoto uživatele jako správce mailserveru
domainadmin boolean Podobně jako admin; tato hodnota označí uživatele jako správce dané domény

Tabulky postfix_alias a postfix_virtual

V těchto tabulkách se specifikují aliasy. Podstatné jsou dva sloupce - v jednom se specifikuje daný alias a v druhém umístění, kam se má přesměrovat (třeba cílová e-mailová adresa). V tabulce postfix_virtual jsou aliasy pro virtuální uživatele (tedy pro ty, kteří jsou uvedeni v postfix_users), tabulka postfix_alias je pro lokální účty.

Struktura tabulky postfix_alias
Název sloupce Datový typ Popis
id integer (default hodnota ze sekvence) Číselný identifikátor
alias varchar (128) Daný alias, který se bude přesměrovávat
destination varchar (128) Umístění, kam se email přepošle (např. lokální uživatel)
Struktura tabulky postfix_virtual
Název sloupce Datový typ Popis
id integer (default hodnota ze sekvence) Číselný identifikátor
email varchar (128) E-mail aliasu, který se přesměruje
destination varchar (128) E-mail skutečné schránky, kam alias směřuje

Tabulky postfix_trash a postfix_email

Postfix_trash slouží pro zapínání doménového koše. V tabulce se uvede doména, pro kterou má být koš zaplý a e-mail, kam všechny budou chodit.

V tabulce e-mail se uvádějí výjimky, které nemají skončit v koši. Pokud tedy například zapnu doménový koš na doméně spamik.cz a budu chtít, aby e-maily z admin@spamik.cz skončily někde jinde, než všechny ostatní z koše, uvedu admin@spamik.cz do této tabulky.

Struktura tabulky postfix_trash
Název sloupce Datový typ Popis
id integer (default hodnota ze sekvence) Číselný identifikátor
email varchar (128) Doména, na které se zapne doménový koš (ve formátu @domena.neco)
destination varchar (128) Adresa, kam se maily přesměrují
Struktura tabulky postfix_email
Název sloupce Datový typ Popis
id integer (default hodnota ze sekvence) Číselný identifikátor
email varchar (128) E-mailová adresa, která nespadá do doménového koše

Uživatelé v databázi a jejich práva

Na všechno, co potřebujeme, se dá vystačit s jedním uživatelem. Osobně to ale nedoporučuji; takhle se dají případně i snáze hledat problémy. Vytvořil jsem uživatele dva, jednoho jsem pojmenoval postfix, druhého dovecot. Jak jejich jména napovídají, uživatel postfix bude používat MTA, dovecot zase POP3/IMAP server. Co se týče jejich oprávnění; obou uživatelům stačí, když budou smět dělat SELECTy, nic jiného nevyžadují. Konkrétně postfix by měl mít práva SELECT na všechny tabulky, dovecotu stačí jenom na tabulku postfix_users.