Poštovní server




Funkční popisované minimum je courier-imap,postfix,postfixadmin,mysql,apache,php
Můžeme doplnit o kontextovy filtr amavis-new,antivir clamAV a spamassina +webové poštovní rozhraní Squirrelmail


Popis struktury článku
Článek budu doplnovat postupně. V první části bude popsána vždy teorie a možnosti, jaké ten který program nabízí a následovat bude popis instalace a funkčního řešení. U článků, na které jsem se ještě nedostal, bude nejspíše jen to řešení včetně instalace a základní konfigurace,tak aby to fungovalo


OBSAH

Postfix


Postfix
Pomocné utility (newaliases, postqueue, postsuper)
Spouštěče omezení
Vestavěné filtry
Whitelist a blacklist
Graylist
Virtuální domény
Autentizace SMTP
TLS/SSL
Před instalací
Instalace postfixu
Config main.cf
Config master.cf
Config pro mysql
Dokončení
Kontrola běhu
Užitečnosti

Courier imap + SASL2


Instalace
Config imapd
Config imapd-ssl
Config pop3d
Config pop3d-ssl
Config authmysqlrc
Config authdeamonrc
Kontrola běhu

Postfixadmin


Instalace
Vytvoření db
Kontrola db
Config
Doladění
Vakace
Autentizace
Užitečnosti

Clam AV


Instalace
Configy
Doladění

Amavis-new


Instalace
Config
Doplnění configů postfixe

Spamassassin


Instalace
Config
Razor
FuzzyOCR

Squirrelmail


Instalace
Nastavení apache
Upgrade Squirrelmail



Postfix


Postfix má dva konfigurační soubory. Main.cf a master.cf. Main.cf je konfigurák, který říká postfixu , jak se má chovat v určitých situacích. Master.cf spouští různé démony. Po každé změně konfiguračního souboru se musí postfix reloadnout, aby se změny znovunačetly. Při změnách různých map je třeba provést hash textového souboru, který vytvoří databázovou podobu souboru.

Pomocné utility


newaliases

alias je mailová adresa na kterou bude zaslána zpráva určená pro jiného uživatele. Nastavit se nechají pomocí postfixadmina, nebo přímo v souboru /usr/local/etc/postfix/aliases
syntaxe je následující

jmeno_puvodniho_uzivatele: jmeno_noveho_uzivatele

takže konkrétně třeba
root: kemnedomu@dvorec.eu

nakonec musíme ještě provést rehash DB příkazem
newaliases


postqueue

je uživatelské rozhraní pro postfixové fronty
-f doručí všechny zprávy z fronty
-p vytiskneme si obsah fronty
-s domena.com doručí včechny zprávy pro doménu domena.com


postsuper

provádí údržbu úloh ve frontách
-d ID odstraní zprávu s ID z fronty
-h ID umístní zprávu do fronty hold, takže se nebude postfix jí pokoušet odeslat
-H ID vyjme zprávu z fronty hold
-p vymaže dočasné soubory z disku, které zbyli po havárii
-r ID znovuzařadí zprávu s ID do fronty
-s oprava a kontrola struktury fronty

postconf

je utilita pomocí které můžeme editovat postfix
bez parametru aktuální nastavení
-d vytiskne defaultní hodnoty
-e editujeme main.cf (postconf -e "smtpd_helo_required = yes")
-hukáže pravou stranu (hodnotu) parametru (postconf -h myhostname)
-m vytiskne podporované druhy map

postmap

utilita na vytváření DB podoby textových map a na jejich prohlížení.
V textovém souboru je na pravé straně klíč a na levé hodnota
-m zobrazí databázové typy které jsou podporovány (btree,cdb,dbm,hash,sdbm )
-q zobrazí hodnoty z mapy: postmap -q aaapoptavka.cz /usr/local/etc/postfix/sender_access



Spouštěče omezení


Jsou to jakési skupiny kterými se omezují určité části komunikace serveru s klientem. Položky pro jednotlivé skupiny se píší za = a oddělují se čárkou. Přehlednější způsob je je dávat jednotlivé záznamy na samostatnou řádku POZOR: pred jednotlivými záznamy musí být na začátku řádky mezera (tabelátor)
Definují se v souboru main.cf

smptpd_client_restrictions

spouštěč se vztahuje k IP adrese nebo jménu (případně obojímu) klienta. Defaultně bez omezení
reject_unknown_client odmítá poštu od klientů, kteří nemají v pořádku DNS záznamy (PTR), tj jejichž IP adresa nemá přiřazené jméno (chyba 450)
permit_mynetworks povolí požadavky od klientů, kteří patří do naší sítě (specifikují se parametrem $mynetworks)
reject_rbl_client domain.tld odmítne klienty jejichž reverzní záznam odpovídá záznamu na veřejných blacklistech v doméně domain.tld. Toto omezení se může použít několikrát za sebou s různými servery. Ale dost to zatěžuje počítač, takže je dobré uvádět max 4 blacklistové domény. (chyba 554)
reject_rhsbl_client domain.tld odmítne klienty jejichž hostname odpovídá záznamu na veřejných blacklistech v doméně domain.tld. Toto omezení se může použít několikrát za sebou s různými servery. Ale dost to zatěžuje počítač, takže je dobré uvádět max 4 blacklistové domény.
check_client_access maptype:mapname provede akci uvedenou v mapname souboru v závislosti na jménu,IP,doméně klienta. Povolené akce-viz odstavec pod touto tabulkou "všeobecná omezení"


příklad:
smtpd_sender_restrictions = hash:/etc/postfix/access,
reject_rhsbl_sender dsn.rfc-ignorant.org (free service)

smtpd_client_restrictions = permit_mynetworks,
reject_unknown_client

smptpd_helo_restrictions

spouštěč se vztahuje k IP adrese nebo jménu (případně obojímu) parametru HELO/EHLO. Defaultně bez omezení
reject_invalid_hostname odmítne klienta, pokud HELO/EHLO parametr má špatnou syntaxi (chyba 501)
reject_unknown_hostname odmítne klienta, pokud klientovo jméno v příkazu HELO/EHLO nemá platný A nebo MX záznam (chyba 450)
reject_non_fqdn_hostname odmítne klienta, pokud klientovo jméno v příkazu HELO/EHLO nemá platné jméno podle RFC (chyba 504)
check_helo_access maptype:mapname provede akci uvedenou v mapname souboru v závislosti na jménu uvedeném v příkaze HELO/EHLO. Povolené akce-viz odstavec pod touto tabulkou "všeobecná omezení"


příklad:
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

smptpd_sender_restrictions


spouštěč se vztahuje k odesílateli obálky, k parametru MAIL FROM. Defaultně smí posílat zprávy každý odesílatel obálky
reject_unknown_sender_domain odmítne požadavek, pokud odesílatelova adresa nemá v pořádku A nebo MX záznam (chyba 450)
reject_rhsbl_sender domain.tld odmítá poštu od odesílatelů jejichž hostname odpovídá záznamu na veřejných blacklistech v doméně domain.tld. Toto omezení se může použít několikrát za sebou s různými servery. Ale dost to zatěžuje počítač, takže je dobré uvádět max 4 blacklistové domény.
reject_non_fqdn_sender odmítá poštu pokud v příkazu MAIL FROM není plně kvalifikované jméno podle RFC (chyba 504)
reject_sender_login_mismatch
check_sender_access maptype:mapname provede akci uvedenou v mapname souboru v závislosti na jménu,IP,doméně pro odesílatele. Tato mapa se používá jako black/whitelist. Povolené akce-viz odstavec pod touto tabulkou "všeobecná omezení"


příklad:
smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain

smptpd_recipient_restrictions

spouštěč se vztahuje k parametru RCPT TO. Defaultně povoluje pouze příjemce z domén uvedených v relay_domains a mydomains. Tím se brání otevřenému předávání zpráv (open-relay) adress_verify_map = btree:/var/spool/postfix/verified_senders
permit_auth_destination povolí požadavky , pokud je splněna jedna z následujících podmínek: cílová adresa je v následujícím parametru či mapě $relay_domains, $mydestination, $inet_interfaces, $virtual_alias_domains, nebo $virtual_mailbox_domains
reject_unauth_destination odmítne požadavky, pokud není splněna jedna z následujících podmínek: cílová adresa je v následujícím parametru či mapě $relay_domains, $mydestination, $inet_interfaces, $virtual_alias_domains, nebo $virtual_mailbox_domains (chyba 554)
permit_mx_backup odmítne požadavky pokud lokální mail system je MX hostitel pro cílovou destinaci
check_recipient_access maptype:mapname provede akci uvedenou v mapname souboru v závislosti na jménu,IP,doméně adresáta. Povolené akce-viz odstavec pod touto tabulkou "všeobecná omezení"
check_recipient_maps odmítne požadavky pokud adresát není obsažen v následujících mapách: $mydestination,$inet_interfaces, $virtual_alias_domains, $virtual_mailbox_domains, $relay_domains, $local_recipient_maps, $virtual_alias_maps, $virtual_mailbox_maps, $relay_recipient_maps
reject_unknown_recipient_domain odmítne požadavky, pokud adresát nemá v pořádku A nebo MX záznamy (chyba 450)
reject_rhsbl_recipient domain.tld odmítá poštu adresátům jejichž hostname odpovídá záznamu na veřejných blacklistech v doméně domain.tld. Toto omezení se může použít několikrát za sebou s různými servery. Ale dost to zatěžuje počítač, takže je dobré uvádět max 4 blacklistové domény. (chyba 554)
reject_non_fqdn_recipient odmítá poštu adresátům pokud není v příkazu RCPT TO plně kvalifikované jméno (chyba 504)
reject_invalid_hostname odmítá poštu pro neexistující adresáty
reject_unverified_sender jo to vlasně greylistování. Doručená zpráva se pozdrží a odesílateli se odešle kontrolní mail serveru, který poslal původní mail. Pokud je adresa odesílatele druhým serverem akceptována, postfix doručí původní zprávu. Pokud adresa akceptována není, je původní mail zahozen. Toto je velice náročná akce, takže se uvádí jako poslední filtr. Aby se postfix mohl představit jako odesílatel, musí se mu nastavit adresa. Defaultní je postmaster@domena, ale nechá se nastavit parametrem adress_verify_sender = spravce@mojedomena.cz. Tento odesilatel ale musí existovat, protože jiné servery si jej mohou také ověřit. abychom urychlili proces ověřování, můžeme si nadefinovat mapu, kam bude postfix ukládat kladné i záporné výsledky. Tato Db může být docela velká. Nadefinujeme si ji v main.cf parametrem


příklad:
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination

poznámka: tato sekce musí končit jedním z těchto příkazů (reject, defer, defer_if_permit, nebo reject_unauth_destination), jinak postfix odmítne odeslat email


smptpd_data_restrictions

spouštěč se vztahuje ke klientovi, který pošle obsah mailu předtím, než postfix odpoví na příkaz DATA. Defaultně bez omezení
reject_multi_recipient_bounce blokuje zprávy určené více příjemcům s prázdnou adresou


smptpd_etrn_restrictions

spouštěč se vztahuje ke klientovi, který by chtěl zahltit frontu zpráv. Defaultně bez omezení
check_etrn_access maptype:mapname provede akci uvedenou v mapname souboru v závislosti na doméně použité v ETRN příkazu. Povolené akce-viz odstavec pod touto tabulkou "všeobecná omezení"


příklad:
smtpd_etrn_restrictions = permit_mynetworks, hash:/etc/postfix/etrn_access, reject


všeobecná omezení
permit povolí žádost
defer odloží žádost
reject zamítne žádost
warn_if_reject používá se při ladění. Pokud budeme chtít zprávu odmítat, použijeme toto omezení. Zpráva bude doručena, ale v logu bude zpráva warn_if_reject
reject_unauth_pipelining pokud klient pošle předčasně SMTP příkazy, aniž by věděl jestli postfix podporuje ESMTP, bude zpráva odmítnuta.


přepínatelná (yes/no)
smtpd_helo_required požaduje po klientovi na začátku sezení poslat příkaz HELO/EHLO (RFC 821, RFC 2821)
strict_rfc821_envelopes požaduje po klientovi striktně dodržovat pravidla RFC 821, ale mnoho programů toto nedodržuje
disable_vrf_command zakáže použití příkazu SMTP VRF, kterým se můžeme přesvědčit, zda existuje nějaký příjemce
allow_percent_hack povoluje přepisování adres z tvaru uživatel%doména na tvar uživatel@doména


pokud nastavujeme omezení, záleží na pořadí a na množství fitrů a omezení. Pokud je přehodíme, můžeme se stát open relay serverem a dříve nebo později se ocitneme na blacklitu. U pravidel platí, že první vyhrává. Tj pokud požadavek vyhoví pravidlu na povolení, tak již není testován dalším pravidlem, které by jej blokovalo. Stejně tak příliš restriktivní nastavení způsobí, že postfix bude odmítat skoro všechnu poštu. K vám se sice spam nedostane, ale nedostanete ani mnoho legitimních mailů. Stejně tak pokud definujete moc veřejných blaclistových serverů, může se stát, že vám třeba Seznam.cz nebude chodit pošta, protože než se zpracují veškerá filtry uplyne nějaká doba a na Seznamu mají nastveno čekat max 10sec. (i když to není podle RFC).
V seznamu filtrů je důležitý parametr permit_mynetworks. Ten tvoří hranici, před kterou uvedená pravidla platí jak pro vnější, tak i pro vnitřní sít. To co je uvedeno za tímto parametrem platí pouze pro venkovní sít. Kvůli spamu je dobré nejdřív odfiltrovat odesílatele, kteří nemají v pořádku DNS, poté použít veřejné blacklisty a jako poslední používat greylisty. Vlastní white/blacklisty je třeba dát co nejvýše, aby se aplikovali jako první

Whitelist a blacklist


můžeme na to použít soubor /usr/local/etc/postfix/sender_access
do main.cf vložíme řádek
smtpd_sender_restrictions = check_sender_access hash:/usr/local/etc/postfix/sender_access,
uvedeme jej v pravidlech co nejvýše, aby se zpracoval jako první

vytvoříme soubor sender_access
ee /usr/local/etc/postfix/sender_access
a vložíme do něj domény, které chceme blokovat/povolit

syntaxe je následující:
odesílatel VOLBA volitelny_text
příklad
lump@seznam.cz REJECT "Ve skolce jsi mi rozslapal kachnicku!!!!!!" #blokujeme maily z lump@seznam.cz + mu napiseme , proc je blokovany

seznam.cz REJECT # blokujeme všechny maily ze seznam.cz

jan.novy@odnekud.com OK # povolíme uživatele z jinak (třeba RBL listem ) blokované domény


blokovat můžeme pro odesílatele:
jen jednu adresu nekdo@domena.cz
celou doménu domena.cz
uživatele bez ohledu na domenu uzivatel@



Pro vybrané domény/adresy můžeme provést tyto akce
OK vybraný záznam bude povolen (whitelistován)
4xx text 4xx znamená chybový kod, kdy za xx si doplníte číslo podle toho o jakou akci se jedná. Text je popis chyby který se zobrazí odesílateli.
Podle http://tools.ietf.org/html/rfc3463 RFC 3463 4xx je chybový kod znamenající "zkus později"
5NN text 5xx znamená chybový kod, kdy za xx si doplníte číslo podle toho o jakou akci se jedná. Text je popis chyby který se zobrazí odesílateli.
Podle http://tools.ietf.org/html/rfc3463 RFC 3463 5xx je chybový kod znamenající "znovu to již nezkoušej"
REJECT volitelny_text zamítnutí mailu pro daného odesílatele
DEFER volitelny_text prakticky stejné jako předcházející
BCC nejaka@mailova_adresa.com pošle jednu kopii na zadanou adresu ode všech uvedených odesílatelů
DISCARD volitelny_text potvrdí úspěšné přijetí, ale v tichosti zprávu odloží
REDIRECT nejaka@mailova_adresa.com přepošle mail na uvedenou adresu místo původnímu příjemci

Více informací na http://www.postfix.org/access.5.html

rehash souboru pro vytvoření db, aby pravidla byla akceptována
postmap /usr/local/etc/postfix/sender_access

pro kontrolu, zda se změny projevili, použijeme příkaz postmap s parametrem -q , druhým parametrem je dotazovaná doména/adresa a třetím je soubor ve kterém by toto nastavení mělo být
postmap -q aaapoptavka.cz /usr/local/etc/postfix/sender_access
REJECT "Obtezujete nevyzadanou postou"

Graylist

Postfix má v sobě již možnost používat greylisty. Jedná se o to, že postfix zprávu odmítne s kodem 450 (zkus později) a adresu odesílatele použije jako ve zkušební zprávě a tu odešle zpět odkud přišla. Pokud server který odeslal původní zprávu akceptuje adresu původního odesílatele (existuje na tom daném serveru), tak náš postfix smaže zkušební zprávu a přijme zprávu od původního klienta. Pokud na vzdáleném serveru původní adresa neexistuje, tak se jedná pravděpodobně o spam a náš postfix smaže zkušební zprávu a zprávu od původního klienta odmítne.

Aby nám greylisty fungovali, musíme provést několik kroků

Zapnutí greylistů
do main.cf do sekce smtpd_recipient_restrictions vepíšeme před uzavírací permit volbu reject_unverified_sender,


smtpd_recipient_restrictions =
..
..
..
reject_unverified_sender,
permit



Nastavení odesilatele
Při vytváření zkušební zprávy, se postfix musí představit. Defaultní hodnota je postmaster@$myorigin
Tuto hodnotu můžeme změnit parametrem adress_verify_sender v main.cf. Tento uživatel ale musí existovat, protože jiné servery si jej také mohou chtít ověřit.

adress_verify_sender = odesilatel@vase_domena.cz


Kešování výsledků ověření
Aby se postfix nemusel pokaždé dotazovat na již jednou ověřené mailové adresy, můžeme mu parametrem adress_verify_map nastavit mapu, do které si bude výsledky ukládat pro pozdější zpracování.

adress_verify_map = btree:/usr/local/etc/postfix/verify_sender

poté reloadneme postfixe, který si vytvoří DB do které ukládá jak pozitivní , tak i negativní výsledky.
Pokud budeme chtít kešovat pouze pozitivní výsledky (u negativních je jedno, že je prodleva při omezování, stejně skončí zablokováním) přidáme do main.cf ještě parametr

adress_verify_negative_cache = no


Ověřování pouze některých domén
V okamžiku , kdy máme velkou zátěž serveru, se může stát, že greylist je úzké místo, které brzdí provoz. Proto můžeme ověřovat maily pouze z některých domén (většinou fremailové služby) parametr reject_unverified_sender NAHRADÍME parametrem check_sender_access. Pokud je v souboru uvedená doména a u ní je reject_unverified_sender, postfix bude adresu ověřovat. Pokud uvedená není, pravidlo se ignoruje a pokračuje se dalším pravidlem v configu

check_sender_access = hash:/usr/local/etc/postfix/sender_access
vytvoříme soubor /usr/local/etc/postfix/sender_access, do kterého zapíšeme na levou stranu doménu a na pravou stranu co se stane se zprávou

příklad souboru sender_access
seznam.cz reject_unverified_sender
qmail.com reject_unverified_sender


nezapomene rehasnout mapu
postmap hash:/usr/local/etc/postfix/sender_access

Můžeme ověřovat třeba jen domény, které mají v názvu podezřelé slovo
toto provedeme další mapou, tentokrát typu regexp (s předchozí mapou může klidně koexistovat a uvedeme je za sebou)

check_sender_access = regexp:/usr/local/etc/postfix/sender_access_keywords

vytvoříme soubor /usr/local/etc/postfix/sender_access, do kterého zapíšeme na levou řetězec, který doménové jméno obsahuje a na pravou stranu co se stane se zprávou

příklad souboru sender_access_keywords
/sale/ reject_unverified_sender
/seznam/ reject_unverified_sender



Vestavěné filtry


Filtry porovnávají obsah zpráv s danými vzorky. V případě shodného výsledku se provede nadefinovaná akce.Různé filtry kontrolují různé časti zprávy. Definují se pro ně mapy ve kterých je uveden vzorek a akce která se má provést. První nalezená shoda v mapě způsobí, že se akce provede a následující akce nejsou brány v potaz. Mapy typů PCRE, regexp, CIDR jsou textové soubory, které se načítají reloadem postfixu

header_checks filtr kontrolující hlavičku zpráv (vše od prvního řádku až po první prázdný řádek)
body_checks filtr kontrolující tělo zprávy (vše co se nachází mezi hlavičkami)
mime_header_cheks filtr kontrolující MIME hlavičku zpráv
nested_header_checks filtr kontrolující jiné hlavičky zpráv než je MIME (pracuje s hlavičkami vnořených zpráv)



Akce definované ve filtrech
REJECT volitelny_text zpráva se odmítne a odesilatel dostane volitelny_text
IGNORE řádek, na kterém je shoda bude odstraněný
WARN volitelny_text zpráva se doručí, odesílateli se zašle volitelný text
HOLD volitelny_text zpráva se doručí do fronty HOLD, kde bude čekat, dokud admin nerozhodne co s ní, odesílateli se zašle volitelný text
DISCARD volitelny_text zpráva se vymaže, ale odesílatel je informován, že zpráva byla doručena
FILTER maptype:mapname zpráva bude předána filtru (nadefinovaný v main.cf)
REDIRECT jmeno@domena.com zpráva bude přesměrována na definovaného příjemce. Tato akce má prioritu před všemy ostatními.


Použití filtrů

Je třeby si zjistit, jaké typy map jsou podporovány naším postfixem. provedeme to příkazem
postconf -m
btree
cidr
environ
hash
mysql
pcre
proxy
regexp
static
unix


dále musíme vytvořit mapu, tj textový soubor který bude obsahovat vzorek a akci, třeba header_checks
ee /usr/local/etc/postfix/header_checks

budeme kontrolovat třeba zda v předmětu není slovo viagra, pokud ano, zprávu přepošleme oblíbenému nadřízenému
do souboru napíšeme
/^Subject: *viagra*/ REDIRECT reditel@domena.cz

vytvoříme testovací soubor (test) , do kterého vložíme následující

From: bla@bla.cz
Subject: bla viagra bla
qwert qwertz qwertzu


uložíme jej někam (třeba do /home/test )a podstrčíme jej filtru k otestování

postmap -q - regexp:/usr/local/etc/postfix/header_checks < /home/test

pokud to funguje, měl by výsledkem být vyfiltrovaný řádek a akce. pokud shoda nenastala, nevypíše se nic

jestliže je vše OK, do main.cf přidáme řádku
header_checks = regexp:/usr/local/etc/postfix/header_checks

a reloadneme postfixe
/usr/local/etc/rc.d/postfix reload


Virtuální domény


Virtuální aliasové domény


Postfix může zpracovávat zprávy pro více domén a to pomocí virtuálních domén. Tyto jsou definované pomocí parametru virtual_alias_domains . Hodnoty se berou z databáze (odkazuje na soubor, kde jsou údaje pro připojení k DB- viz řešení v instalaci) , nebo v souboru kde jsou uvedené na pravé straně domény a na levé datum vytvoření domény (může být libovolný, nemá žádný podstatný význam, ale být musí).

Příklad souboru virtual_alias_domains
doma.com 20093004
jinde.cz 20092905


do main.cf přidáme řádku
virtual_alias_domains = hash:/usr/local/etc/postfix/virtual_alias_domains
a poté musíme rehasnout DB
postmap hash:/usr/local/etc/postfix/virtual_alias_domains

dále musíme vytvořit soubor virtual_alias_domains_maps kde namapujeme virtuální příjemce na lokální

Příklad souboru virtual_alias_maps
#virtualni prijemci #lokalni prijemci
abuse@doma.com spravce@mojedomena.cz
postmaster@jinde.cz spravce@mojedomena.cz, druhyspravce@mojedomena.cz
@zasejina.cz spravce@mojedomena.cz #vše z domeny zasejina.cz bude chodit na spravce@mojedomena.cz


poté musíme rehasnout DB

postmap hash:/usr/local/etc/postfix/virtual_alias_maps
a do main.cf přidáme řádku
virtual_alias_domains = hash:/usr/local/etc/postfix/virtual_alias_maps
a reloadneme postfixe
/usr/local/etc/rc.d/postfix reload

Upozornění:
-nedávejte virtuální doménu do parametru mydestination.
-v souboru virtual_alias_maps na pravé straně uvádějte vždy plné jméno domény.
-v souboru virtual_alias_maps je možné používat regulární výrazy
Virtuální schránkové domény

Defaultně postfix používá pro doručování lokální uživatele, ale můžeme mu nadefinovat i uživatele, kteří nemají s lokálními účty nic společného. Můžeme je definovat ručně, pomocí DB, nebo LDAP serveru.
V master.cf je třeba zkontrolovat, zda se spouští démon virtual (nesmí být v chrootu - 5tý sloupec)

#service type private unpriv chroot wakeup maxproc command + args
virtual unix - n n - - virtual



do main.cf vložíme řádek , kde na pravé straně jsou domény odděleny mezerami
virtual_mailbox_domains = domena1.cz domena2.cz
případně můžeme použít i soubor a odkazovat se na něj
virtual_mailbox_domains = /usr/local/etc/postfix/virtual_domains
syntaxe souboru virtual_domains je na každé řádce jedna doména (nezapomene nastavit práva pro postfixe)
cat /usr/local/etc/postfix/virtual_domains
domena1.cz
domena2.cz
domena3.cz



nadefinujeme vlastníka souborů virtuálních schránek parametry v main.cf

virtual_uid_maps = hash:/usr/local/etc/postfix/virtual_uids
virtual_gid_maps = hash:/usr/local/etc/postfix/virtual_gids


kde pak musíme soubory virtual_uids a virtual_gids načíst příkazem postmap

nebo je můžeme definovat přímo
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001



příkazem
adduser vytvoříme uživatele "vuser" a přiřadíme mu uid 1001 a gid 1001

přiřadíme kam se budou ukládat schránky virtuálních uživatelů
virtual_mailbox_base = /var/spool/vmail

tento adresář vytvoříme a přiřadíme vlastníka a nastavíme práva
mkdir /var/spool/vmail
chown vuser:vuser /var/spool/vmail
chmod 700 /var/spool/vmail



vytvoříme mapu příjemců. Do main.cf vložíme parametr
virtual_maibox_maps = hash:/usr/local/etc/postfix/virtual_recepients

vytvoříme soubor s mapou

ee /usr/local/etc/postfix/virtual_recepients

a do něj nastavíme na levé straně jména příjemců a na pravou dáme jména schránek, do kterých se bude pošta ukládat. Defaultně je použitý mailbox, ale pokud použijeme na pravé straně
za názvem schránky lomítko (/), bude použit formát maildir.
příklad souboru
#jména příjemců #jména schránek
jarda@domena1.cz jarda
pepa@domena1.cz pepa
honza@domena1.cz honza/ #toto bude formát maildir


nesmíme mapu zapomenout převést na DB příkazem

postmap hash:/usr/local/etc/postfix/virtual_recepients


pokud chceme použít virtuální aliasy, musíme do main.cf přidat řádku
virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_aliases

kde na levé straně uvedeme aliasy a na pravé cílové adresy

příklad souboru virtual_aliases
#aliasy #cílové adresy
king@domena1.cz jarda@domena1.cz
hnup@domena1.cz pepa@domena1.cz


opět vytvoříme DB

postmap hash:/usr/local/etc/postfix/virtual_aliases

a reloadneme postfixe

Pokud bychom chtěli pro každou virtuální doménu mít jiného vlastníka, tak vlastníky musíme nejdříve vytvořit a přiřadit jim UID a GID
např
domenak1 s UID 1001 a GID 1001
domenak2 s UID 1002 a GID 1002

jediný rozdíl spočívá v tom, že musíme pro každou doménu vytvořit vlastní podadresář a přiřadit mu vlasníka, tj podadresář pro domena1 bude mít vlastníka domenak1 a podadresář pro domena2 bude mít vlastníka domenak2 a musíme do souboru virtual_uid_maps vložíme na levou stranu mailovou adresu (případně celou doménu-začíná zavináčem) a na pravou stranu UID

příklad souboru uid_maps

jarda@domena1.cz 1001
pepa@domena1.cz 1001
@domena2.cz 1002


do main.cf vložíme řádek
virtual_uid_maps = hash:/usr/local/etc/postfix/virtual_uid_maps

a vytvoříme DB
postmap hash:/usr/local/etc/postfix/virtual_uid_maps

analogicky to provedeme i s GID

Autentizace SMTP



používá se pro připojení uživatelů, kteří nemají pevnou IP (obchodní cestující, freemail servery) , které není možné přihlásit jiným bezpečným způsobem (openVPN, Ipsec a pod)

nejdříve musíme nainstalovat cyrus-sasl2 a cyrus-sasl2-saslauthd


cd /usr/ports/security/cyrus-sasl2-saslauthd
make all install clean
make install



Options for cyrus-sasl 2.1.22
─────────────────────────────────────────────
[ ] BDB Use Berkeley DB
[X] MYSQL Use MySQL
[ ] PGSQL Use PostgreSQL
[ ] SQLITE Use SQLite
[ ] DEV_URANDOM Use /dev/urandom
[ ] ALWAYSTRUE Enable the alwaystrue password verifier
[ ] KEEP_DB_OPEN Keep handle to Berkeley DB open
[X] AUTHDAEMOND Enable use of authdaemon
[X] LOGIN Enable LOGIN authentication
[X] PLAIN Enable PLAIN authentication
[X] CRAM Enable CRAM-MD5 authentication
[X] DIGEST Enable DIGEST-MD5 authentication
[ ] OTP Enable OTP authentication
[X] NTLM Enable NTLM authentication


POZNÁMKA
OTP(Volba OneTime Password je pro praci s jednorazovymi hesly),
když jí vyberete a objeví se vám hláška v logu ("OTP unavailable
because can't read/write key database /etc/opiekeys: Permission denied") je třeba
nastavit práva. Nebo ji vůbec nevybírat.

cd /usr/ports/security/cyrus-sasl2-saslauthd <


aby jste neměli problémy se stupidními klienty Microsoft Outlook/Outlook Express, přesuneme soubory NTLM do jiného adresáře
cd /usr/local/lib/sasl2
mkdir deactivated
mv *ntlm* deactivated



start při spuštění stroje umožníme takto:
do rc.conf zapíšeme
saslauthd_enable="YES"
saslauthd_flags=" -a pam"


aktivace SMTP AUTH na straně serveru (v main.cf zapíšeme)

smtpd_sasl_auth_enable = "yes"


konfigurace ověřování (v main.cf zapíšeme)
smtpd_sasl_security_options = noanonymous, noplaintext

máme tyto možnosti
noanonymous je nutné jej vždy ponechat, jinak by mohlo dojít k open relay
noplaintext z ověřování vyloučíme nešifrované mechanismy
noactive z ověřování vyloučíme mechanismy které jsou neúčinné proti aktivním útokům
nodicdionary z ověřování vyloučíme mechanismy prolomitelné pomocí slovníkového útoku
mutual_auth tímto se server autentizuje klientovi

povolíme stupidní klienty od M$
broken_sasl_auth_clients = yes

můžeme ponechat prázdné, pokud jej nevyžaduje nějaký zásuvný modul
smtpd_sasl_local_domain = $myhostname

smtpd_sender_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
permit_sasl_authenticated,


oznamuje SASL autentizovanému uživateli jméno v smtpd
smtpd_sasl_authenticated_header = yes

ti co používají dovecot přidají i
#smtpd_sasl_type = dovecot
#smtpd_sasl_path = private/auth



vytvoříme konfigurák SASL a upravíme práva
ee /usr/local/lib/sasl2/smtpd.conf

volby
log_level: 3 ukecanost v rozsahu 0-7
pwcheck_method: saslauthd pokud použijeme zásuvné moduly (auxprop) , nastavíme tam tento , jinak necháme saslauthd
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 ověřovací mechanismy
auxprop_plugin: sasldb


příklad configu
log_level: 3
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5
auxprop_plugin: sasldb


nastavíme práva souboru
chmod 644 /usr/local/lib/sasl2/smtpd.conf

kontrola běhu
/usr/local/etc/rc.d/saslauthd status
saslauthd is running as pid 77000.

a otestujeme telnetem

telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.dvorec.eu.
Escape character is '^]'.
220 mail.dvorec.eu ESMTP Postfix
ehlo ja.dvorec.eu
250-mail.dvorec.eu
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN

250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5

250 8BITMIME


dále vytvoříme SASLdb

volby pro SASLdb
-c vytvoř uživatele
-d smaž uživatele
-u oblast (musí být stejná jako v parametru smtpd_sasl_local_domain)


jarda = přihlašovací jméno
postconf -h myhostname = zjištění parametru myhostname (můžemejej ale napsat i ručně)
saslpasswd2 -c -u `postconf -h myhostname` jarda

vyzve vás k zadání hesla a ověření
Password:
Again (for verification):


nastavíme (při zadávání prvního uživatele) práva a přiřadíme skupinu postfix
chmod 640 /usr/local/etc/sasldb2.db
chgrp postfix /usr/local/etc/sasldb2.db


spustíme démona příkazem
/usr/local/etc/rc.d/saslauthd start

při odeslání testovacího mailu by mělo být vidět v logu

Jul 15 09:45:04 www postfix/smtpd[84569]: connect from mail.keytec.cz[85.207.55.210]
Jul 15 09:45:06 www postfix/smtpd[84569]: 578C1126B5E: client=mail.keytec.cz[85.207.55.210], sasl_method=CRAM-MD5, sasl_username=jarda@mail.dvorec.eu
Jul 15 09:45:06 www postfix/cleanup[84570]: 578C1126B5E: message-id=<4A5D8900.9050002@dvorec.eu>
Jul 15 09:45:06 www postfix/qmgr[84521]: 578C1126B5E: from=<jaroslav@dvorec.eu>, size=683, nrcpt=1 (queue active)



pokud by jste dostli něco takového v logu, zkontrolujte, zda jste vytvořili sasldb2 databázi, nasměrovali na ní démona a postfix má práva číst
Poznámka: funguje to i tak, ale ověřuju se proti jménu a heslu uživatelů v systému

Jul 15 07:35:11 www postfix/smtpd[83562]: connect from mail.keytec.cz[85.207.55.210]
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: SASL authentication failure: no user in db
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: SASL authentication failure: no user in db
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: SASL authentication failure: no secret in database
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: mail.keytec.cz[85.207.55.210]: SASL CRAM-MD5 authentication failed
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: SASL authentication failure: no user in db
Jul 15 07:35:11 www postfix/smtpd[83562]: warning: SASL authentication failure: no user in db


seznam uživatelů v sasldb2 vylistujeme příkazem
sasldblistusers2
jarda@mail.dvorec.eu: userPassword

kde jarda je jméno použité při autentizaci


Pokud budete chtít použíte pro autentizaci MYSQL, config by mohl vypadat následovně (netestováno)

/usr/local/lib/sasl2/smtpd.conf

pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
mech_list: sql plain login
sql_hostnames: localhost
sql_user: postfix
sql_passwd: your-password
sql_database: postfix
sql_statement: SELECT clear FROM postfix_smtp WHERE
email = '%u@%r'
sql_verbose: yes




tímto příkazem si vypíšeme autentizační mechanismy
saslauthd -v
saslauthd 2.1.23
authentication mechanisms: sasldb getpwent kerberos5 pam rimap


Omezení odesílatelů
Defaultně může jakýkoliv klient, který se autentizuje posílat zprávy s libovolnou adresou. Např klient který se autentizoval jako jarous může posílat zprávy jako jarda@dvorec.eu, nebo pepa@dvorec.eu, nebo třeba qwertz@dvorec.eu (jeho schránka ale většinou musí existovat-podle nastavení postfixu)
My ale jedinou mapou můžeme omezit na to, že autentizovaný klient jako jarous může posílat maily pouze jako jarda@dvorec.eu

do main.cf přidáme řádku
smtpd_sender_login_maps = hash:/usr/local/etc/postfix/smtpd_sender_login_maps

vytvoříme soubor
/usr/local/etc/postfix/smtpd_sender_login_maps
touch /usr/local/etc/postfix/smtpd_sender_login_maps
a vložíme do něj tyto řádky
# mailova adresa #prihlasovaci jmeno
jarda@dvorec.eu jarous
kingove@dvorec.eu jarous, pepa


poté musíme rehashnout db
postmap hash:/usr/local/etc/postfix/smtpd_sender_login_maps

posledním krokem je nastavení main.cf, do sekce smptpd_recipient_restrictions
zapíšeme
smptpd_recipient_restrictions =
...
...
reject_unauthenticated_sender_login_mismach
...


a samozřejmě musíme reloadnout postfixe

Vyjmutí určitých sítí z autentizace


Můžeme si nastavit, že některé sítě budou ze SMTP AUTH vyjmeté. V main.cf použijeme parametr
smtpd_sasl_exceptions_network = $myhostname, 10.0.0.0/24

použít můžeme rozsah sítí , nebo parametry postfixu ($myhostname)


TLS/SSL



Jedná se o šifrované spojení mezi klientem a poštovním serverem. Rozdíl mezi TLS a SSL je minimální a pro potřeby poštovního serveru spočívá prakticky jen v tom, že TLS komunikuje na portu 25 a server musí odpovědět 250-STARTTLS a SSL komunikuje na portu 465 a odpověd nevyžaduje.


Nejdříve si nainstalujeme OpenSSL
cd /usr/ports/security/openssl/
make install clean
rehash



Připravíme si adresář pro certifikáty
mkdir -p /usr/local/etc/postfix/certs/CA
cd /usr/local/etc/postfix/certs/CA
mkdir certs crl newcerts private
echo "01" > serial
touch index.txt
cp /usr/src/crypto/openssl/apps/openssl.cnf .


upravíme, případně doplníme následující údaje v configu

edit openssl.cnf
dir = /usr/local/etc/postfix/certs/CA
[ req_distinguished_name ]
countryName = CS
countryName_default = CS
stateOrProvinceName = Czech rep.
stateOrProvinceName_default = Czech rep.
localityName = Borovany
localityName_default = Borovany
0.organizationName = server Dvorec.eu
0.organizationName_default = server Dvorec.eu
organizationalUnitName = server
organizationalUnitName_default = server
commonName = mail.dvorec.eu
commonName_default = mail.dvorec.eu
commonName_max = 64
emailAddress = sprav@dvorec.eu
emailAddress_default = sprav@dvorec.eu



Vytvoření certifikační autority
nezapomente vložené heslo, jinak nebudete schopni generovat nové certifikáty.
U commonName je třeba použít resolvovatelný název, nebo IP adresu. Pokud jej nevyplníme, defaultní nastavení ssl vyhodí chybu při vytváření mykey.pem. Tento soubor pak má nulovou velikost a TLS pak samozřejmě nefunguje.
openssl req -new -x509 -keyout private/cakey.pem -out cacert.pem -days 3650 -config openssl.cnf

Vygenerování požadavku
openssl req -nodes -new -x509 -keyout mykey.pem -out myreq.pem -days 3650 -config openssl.cnf

Podepsání
openssl x509 -x509toreq -in myreq.pem -signkey mykey.pem -out tmp.pem

Odstranění hesla
openssl ca -config openssl.cnf -policy policy_anything -out mycert.pem -infiles tmp.pem
pak se zeptá
Certificate is to be certified until Aug 28 06:23:27 2022 GMT (3650 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
obojí potvrdíme

Odstranění dočasného souboru
rm tmp.pem

Překopírování a nastavení práv
cp cacert.pem mycert.pem mykey.pem /usr/local/etc/postfix/certs/
cd /usr/local/etc/postfix/certs/
chown root:wheel cacert.pem mycert.pem
chown root:postfix mykey.pem
chmod 755 cacert.pem
chmod 644 mycert.pem
chmod 440 mykey.pem



upravíme config main.cf

smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /usr/local/etc/postfix/certs/mykey.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/certs/mycert.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/certs/cacert.pem
smtpd_tls_loglevel = 2
smtpd_tls_recieved_header = yes
smtpd_tls_note_starttls_offer = yes
smtpd_sasl_tls_security_options = noanonymous
tls_random_source = dev:/dev/urandom



otestujeme telnetem

telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.dvorec.eu.
Escape character is '^]'.
220 mail.dvorec.eu ESMTP Postfix
ehlo ja.dvorec.eu
250-mail.dvorec.eu
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN

250-STARTTLS
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME



při zaslání testovací zprávy na server by jste měli dostat něco podobného v logu
tail /var/log/maillpg
Jul 17 13:05:26 www postfix/smtpd[23441]: connect from mail.keytec.cz[85.207.55.210]
Jul 17 13:05:26 www postfix/smtpd[23441]: setting up TLS connection from mail.keytec.cz[85.207.55.210]
Jul 17 13:05:34 www postfix/smtpd[23441]: TLS connection established from mail.keytec.cz[85.207.55.210]: SSLv3 with cipher DHE-RSA-AES256-SHA (256/256 bits)


Selektivní použití TLS


při více doménách si můžeme specifikovat, která doména musí být přes TLS a která ne. Provedeme to mapou v main.cf

smtp_tls_per_site = hash:/usr/local/etc/postfix/tls_per_site


volby jsou

NONE TLS je zablokované
MAY TLS je možno použít
MUST TLS se musí použít
MUST_MOPEERMATCH mírnější verze MUST


do souboru uvedeme na levou stranu uvedeme doménu a na pravou stranu uvedeme hodnotu

příklad souboru tls_per_site

dvorec.eu MUST
nedvorec.eu NONE


nezapomeneme vytvořit mapu
postmap hash:/usr/local/etc/postfix/tls_per_site

Poznámka:
pokud tuto vobu v configu zapneme, tak počítače které nejsou v mapě se berou automaticky s protkolem TLS

Jestliže vám chodí pokud v klientu zapnete SSL a TLS nechodí a pokud telnet zvenčí místo 250-STARTTLS nabízí 250-XXXXXXXA (nebo něco podobného) a klient řve že server nenabízí STARTTLS, problém bude ve firewallu/routeru (většinou CISCO) někde cestou ven (u mě to byl provider)

telnet z localhosta

telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.dvorec.eu.
Escape character is '^]'.
220 mail.dvorec.eu ESMTP Postfix
ehlo ja.jsem
250-mail.dvorec.eu
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN

250-STARTTLS
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.



telnet zvenci

telnet mail.dvorec.eu 25
Trying 89.31.47.158...
Connected to mail.dvorec.eu.
Escape character is '^]'.
220 ****************************
ehlo ja.jsem
250-mail.dvorec.eu
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN

250-XXXXXXXA
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.



Nastavení klientů

Do adresy serveru vyplnte stejné jméno jako jste dávali v Common Name při generování certifikátu, jinak vám to bude hlásit, že certifikát je podvržený.

Mozilla thunderbid

Nástroje => Nastavení účtu
v bílém sloupci nalevo je dole položka Server odchozí pošty (SMTP)
poklikáme na název serveru



Poznámka:
Pro použití autentizace, zaškrtněte příslušné políčko a vyplnte autentizační jméno
Pro použití TLS/SSL zaškrtněte příslušné políčko

MS Outlook 2003
Nástroje => E-mailové účty => Zobrazit nebo změnit existující účty (Další) => klik na jméno serveru => Salší nastavení => druhá karta-Server pro odchozí poštu



Poznámka:Zaškrtněte políčko Server pro odchozí poštu požaduje ověření, zpřístupní se ostatní volby. První volba je pokud ověřovací jméno souhlasí s přihlašovacím (tak to má nastaven seznam.cz), jinak vyberte druhou volbu

Popis řešení

Postfix bude nainstalován s autentizací, podporou TLS/SSL, antivirem, antispamem a vakacemi. Uživatelé budou virtuální a jejich údaje uloženy v DB. O grafické rozhraní se postará PHP aplikace postfixadmin. Pošta bude vybírána ze schránek programem Courier imap a jako webové rozhraní poslouží Squirrelmail. Bohužel jednotlivé aplikace se spolu proplétají a proto jedno nastavení často ovlivnuje jiný program.

Před instalací


Nejdříve nainstalujte MYSQL a Apache s PHP, pokud chcete používat postfixadmina
Než něco začneme dělat s poštou, je třeba mít nastavený DNS server. At už svůj, nebo někde u providera, ale musí být dostupný z internetu, protože ten říká klientům, kde mají hledat vaší doménu.
Podrobněji je tomu věnovaná stránka o DNS
Základem je nastavit MX záznam. Ten říká klientovi, který server pro danou doménu doručuje poštu. Neméně důležité je, aby byly v pořádku reverzní záznamy. Jinak hrozí, že váš server bude odmítán jako spammer.
Upozornění: Reverzní záznam má odkazovat přímo na A záznam a nikoliv na CNAME.
Je možno pro jednu doménu nadefinovat více mailserverů, přičemž hodnota udává , který bude jako primární a který bede záložní. Čím nižší číslo, tím je vyšší priorita tohoto serveru.
zde je část výpisu příkazu dig
dig mail.seznam.cz mx

email.seznam.cz. 300 IN MX 10 mx1.seznam.cz.
email.seznam.cz. 300 IN MX 20 mx2.seznam.cz.


Instalace


cd /usr/ports/mail/postfix
make all install clean


Vybrat

[X] PCRE Perl Compatible Regular Expressions
[X] SASL2 Cyrus SASLv2 (Simple Auth. and Sec. Layer)
[ ] DOVECOT Dovecot SASL authentication method
[ ] SASLKRB If your SASL req. Kerberos select this option
[ ] SASLKRB5 If your SASL req. Kerberos5 select this option
[ ] SASLKMIT If your SASL req. MIT Kerberos5 select this option
[X] TLS Enable SSL and TLS support
[ ] BDB Berkeley DB (choose version with WITH_BDB_VER)
[X] MYSQL MySQL maps (choose version with WITH_MYSQL_VER)
[ ] PGSQL PostgreSQL maps (choose with DEFAULT_PGSQL_VER)
[ ] OPENLDAP OpenLDAP maps (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB maps lookups
[ ] NIS NIS maps lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] TEST SMTP/LMTP test server and generator



během instalace se zeptá,na aktivaci v mailer.conf
Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
Dejte Y

upravit /etc/rc.conf

sendmail_enable=”NO”
sendmail_submit_enable=”NO”
sendmail_outbound_enable=”NO”
sendmail_msp_queue_enable=”NO”
postfix_enable=”YES”



upravit periodic.conf
ee /etc/periodic.conf

daily_clean_hoststat_enable=”NO”
daily_status_mail_rejects_enable=”NO”
daily_status_include_submit_mailq=”NO”
daily_submit_queuerun=”NO”


můžeme si zobrazit používané knihovny

ldd /usr/local/libexec/postfix/smtpd
vypíše to následující
##################
/usr/local/libexec/postfix/smtpd:
libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x280c1000)
libssl.so.4 => /usr/lib/libssl.so.4 (0x280dc000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x2810a000)
libdb-4.1.so.2 => /usr/local/lib/libdb-4.1.so.2 (0x281fd000)
libmysqlclient.so.15 => /usr/local/lib/mysql/libmysqlclient.so.15 (0x282bb000)
libz.so.3 => /lib/libz.so.3 (0x28315000)
libcrypt.so.3 => /lib/libcrypt.so.3 (0x28326000)
libm.so.4 => /lib/libm.so.4 (0x2833e000)
libc.so.6 => /lib/libc.so.6 (0x28354000)
##################



v main.cf je třeba upravit dle potřeby. Pokud se rozhodnete pro vlastní řešení, ve kterém nebudou jednotlivé položky jako u mě, zakomentujte (vymažte) příslušnou sekci.
ee /usr/local/etc/postfix/main.cf



##################zacatek main.cg#####################################


###############Hlavni sekce###########################
# jmeno hostitele ve formatu FQDN..
myhostname = mail.dvorec.eu
# jmeno domeny pro kterou prijimam maily-je treba k nemu nastavit v DNS reverzni zaznam
mydomain = dvorec.eu
myorigin = $myhostname
# na jakejch rozhranich posloucha
inet_interfaces = all
# parametry ,kam bude posta dorucovana lokalne
#mydestination = $myhostname, localhost.$mydomain, localhost,
# odkud prijimam maily
mynetworks = 192.168.0.0/24, 127.0.0.0/8, 10.0.0.0/24
###############Hlavni sekce###########################


###############Ostatní nastaveni###############
readme_directory = no
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
html_directory = no
setgid_group = maildrop
# cesta k prikazum postfixu (postmap, postconf, postdrop)
command_directory = /usr/local/sbin
manpage_directory = /usr/local/man
# cesta k demonum postfixu
daemon_directory = /usr/local/libexec/postfix
newaliases_path = /usr/local/bin/newaliases
mailq_path = /usr/local/bin/mailq
# cesta kde budou ulozeny maily
queue_directory = /var/spool/postfix
# vlastnik mailu
mail_owner = postfix
# kod chybove odpovedi SMTP server
unknown_local_recipient_reject_code = 450
###############Ostatní nastaveni###############


###############Antispamova sekce###############
# nutne pro stupidni klienty typu outlook express
broken_sasl_auth_clients = yes

smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unauth_destination,
  reject_unauth_pipelining,
  reject_invalid_hostname,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client sbl-xbl.spamhaus.org
#vyhozeni mailu co nemaj v poradku DNS zaznam
  reject_unknown_client,
#odmitnuti mailu s falesnou adresou
# reject_unverified_sender,
  reject_unknown_sender_domain,

#black/white list
smtpd_sender_restrictions = check_sender_access hash:/usr/local/etc/postfix/sender_access,
  permit
###############Antispamova sekce###############


##################### SASL/TLS Authentication###########################
###############SASL sekce###############
#nutne pro stupidni klienty typu outlook express
  broken_sasl_auth_clients = yes
  smtpd_sasl_auth_enable = yes
  smtpd_sasl_authenticated_header = yes
  smtpd_sasl_local_domain = #$myhostname
  smtpd_sasl_security_options = noanonymous
  #smtpd_sasl_type = dovecot
  #smtpd_sasl_path = private/auth
###############SASL sekce###############


###############TLS sekce###############
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /usr/local/etc/postfix/certs/mykey.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/certs/mycert.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/certs/cacert.pem
smtpd_tls_loglevel = 2
smtpd_tls_recieved_header = yes
smtpd_tls_note_starttls_offer = yes
smtpd_sasl_tls_security_options = noanonymous
tls_random_source = dev:/dev/urandom
###############TLS sekce###############
######################konec SASL/TLS #############


###############MySQL konfigurace ###############
# cesta ,kde hledat informace o aliasech
virtual_alias_maps = proxy:mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
#cislo musi byt shodne s MYSQL_GID_FIELD a MYSQL_UID_FIELD v /usr/local/etc/authlib/authmysqlrc
virtual_gid_maps = static:125
virtual_uid_maps = static:125
virtual_minimum_uid = 125
#umistneni virtualnich schranek
virtual_mailbox_base = /usr/local/virtual
# cesta ,kde hledat informace o domenach
virtual_mailbox_domains = proxy:mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
#velikost virtualnich schranek
#virtual_mailbox_limit = 51200000
# cesta ,kde hledat informace o postovnich schrankach
virtual_mailbox_maps = proxy:mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_transport = virtual
relay_domains = proxy:mysql:/usr/local/etc/postfix/mysql_relay_domains_maps.cf
###############MySQL konfigurace###############


###############nastavení schránek###############
#virtual_create_maildirsize = yes
#virtual_mailbox_extended = yes
# cesta ,kde hledat informace o kvotach
virtual_mailbox_limit_maps = proxy:mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps
 $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains
 $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps
 $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks
 $virtual_mailbox_limit_maps
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, this user has overdrawn their diskspace quota. Please try again later
virtual_overquota_bounce = yes
# Omezeni zpravy na 10Mb
message_size_limit = 10485760
###############nastavení schránek###############


##### zakomentujte nasledujici sekce,pokud je nepouzivate
###############Sekce pro vakace###############
transport_maps = hash:/usr/local/etc/postfix/transport
vacation_destination_recipient_limit = 1
###############Sekce pro vakace###############


###############Sekce pro amavis###############
#Toto zajistuje vstup do obsahoveho filtru amavisu na portu 10024
content_filter=smtp-amavis:[127.0.0.1]:10024
###############Sekce pro amavis###############


####################konec main.cf###########################







nastavit master.cf

ee /usr/local/etc/postfix/master.cf

smtp inet n - n - - smtpd
  -o content_filter=spamassassin
smtps inet n - n - - smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache


##### zakomentujte nasledujici sekce,pokud je nepouzivate


#pro vakace
vacation unix - n n - - pipe
flags=DRhu user=vacation argv=/var/spool/vacation/vacation.pl


#spamassasin -dale je treba zablokovat 2 radku
spamassassin unix - n n - - pipe
  user=spamd argv=/usr/local/bin/spamc -f -e
  /usr/sbin/sendmail -oi -f ${sender} ${recipient}

#Demon Amavisu na vystupu z postfixu na portu 25
smtp-amavis unix - - n - 2 smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20



#Start druhe instance postfixu na portu 10025-pouze pri pouziti amavisu
127.0.0.1:10025 inet n - n - - smtpd
 -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks


#################################




Vytvoření konfigů pro mysql

změnte si "heslo_postfixe" na své

ee /usr/local/etc/postfix/mysql_virtual_alias_maps.cf

user = postfix
password = heslo_postfixe
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address=’%s’ AND active = 1


ee /usr/local/etc/postfix/mysql_virtual_domains_maps.cf

user = postfix
password = heslo_postfixe
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain=’%s’
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain=’%s’ and backupmx = ‘0′ and active = ‘1′


ee /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf

user = postfix
password = heslo_postfixe
hosts = localhost
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username=’%s’ AND active = 1


ee /usr/local/etc/postfix/mysql_virtual_mailbox_limit_maps.cf

user = postfix
password = heslo_postfixe
hosts = localhost
dbname = postfix
query = SELECT quota FROM mailbox WHERE username=’%s’


ee /usr/local/etc/postfix/mysql_relay_domains_maps.cf

user = postfix
password = heslo_postfixe
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain=’%s’ and backupmx = ‘1′


nastavíme práva
chmod 640 /usr/local/etc/postfix/mysql_* && chgrp postfix /usr/local/etc/postfix/mysql_*

updatneme DB transportů

postmap /usr/local/etc/postfix/transport

upravíme aliasy-vložíme řádek kde evedeme mail,na který mají chodit rootovské maily

ee /etc/aliases
root: Tvuj_mail@Tvoje_doména

vytvoříme DB aliasů
/usr/bin/newaliases


vytvoříme virtuální adresář a nastavíme práva

mkdir /usr/local/virtual
chown -R postfix:postfix /usr/local/virtual
chmod -R 700 /usr/local/virtual


Autentizace


Pro použití autentizace, se podívejte výše, kde je popsána instalace
link je ZDE

TLS/SSL


Pro použití TLS/SSL, se podívejte výše, kde je popsána instalace
link je ZDE


nahodíme postfix
/usr/local/etc/rc.d/postfix start

zkontrolujte /var/log/maillog a /var/log/messages,jestli se tam nevyskytli nějaké chyby

tail -n50 /var/log/maillog



otestování telnetem

telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.domain.tld.
Escape character is ‘^]’.
220 test.domain.tld ESMTP Postfix
EHLO test.com
250-test.domain.tld
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN




Užitečnosti


vymazání fronty mailů
postsuper -r ALL



pokud chceme ve scriptu posílat přílohu, použijeme program mutt
mutt -s "<Predmet>" -a <Soubor1> -a <Soubor2> me@my.com < <Text_mailu>


Je třeba mít správně nastavenou DNS pro poštovní server, jinak nás mohou některé servery odmítat. RFC1912 přímo píše

RFC1912: Common DNS Operational and Configuration Errors

2.1 Inconsistent, Missing, or Bad Data Every Internet-reachable host should have a name. The consequences of this are becoming more and more obvious. Many services available on the Internet will not talk to you if you aren't correctly registered in the DNS. Make sure your PTR and A records match. For every IP address, there should be a matching PTR record in the in-addr.arpa domain. If a host is multi-homed, (more than one IP address) make sure that all IP addresses have a corresponding PTR record (not just the first one). Failure to have matching PTR and A records can cause loss of Internet services similar to not being registered in the DNS at all. Also, PTR records must point back to a valid A record, not a alias defined by a CNAME. It is highly recommended that you use some software which automates this checking, or generate your DNS data from a database which automatically creates consistent data.


Zasílání mailů pomocí telnetu (testování odesílání)

telnet mail.keytec.cz 25
Trying 85.207.55.210...
Connected to mail.keytec.cz.
Escape character is '^]'.
220 mail.keytec.cz ESMTP Postfix


kod 220 potvrzuje jméno serveru
představíme se "helo" pro SMTP nebo "ehlo" pro ESMTP

helo jarda.keytec.cz

server nám potvrdí pozdrav kodem 250 a sdělí své jméno

250 mail.keytec.cz

vytvoříme obálku mailu-do zobáčků napíšeme odesílatele

mail from: <jarda@keytec.cz>
250 Ok

server nám potvrdil vytvoření

zadáme příjemce-adresa se píše do zobáčků

rcpt to: <spravce@nekam.cz>
250 Ok

server nám potvrdil vytvoření, můžeme zadat opakováním příkazu rcpt to: další příjemce

příkazem data vytvoříme zprávu

data
354 End data with <CR><LF>.<CR><LF>

příkazem subject: napíšeme předmět, po odentrování píšeme tělo mailu
subject: zprava

toto je telo mailu


zprávu pošleme znakem tečky na samostatném řádku
.
250 Ok: queued as C271B2DA6EE

server nám potvdil přijetí

.


příkaz
postfix upgrade-configuration
updatne main.cf a master.cf informacemi, které postfix potřebuje k běhu. Přidá nebo upraví služby a konfigurační parametry.

postfix upgrade-configuration
Editing /usr/local/etc/postfix/master.cf, adding missing entry for proxywrite service
Editing /usr/local/etc/postfix/master.cf, adding missing entry for postscreen TCP service
Editing /usr/local/etc/postfix/master.cf, adding missing entry for smtpd unix-domain service
Editing /usr/local/etc/postfix/master.cf, adding missing entry for dnsblog unix-domain service
Editing /usr/local/etc/postfix/master.cf, adding missing entry for tlsproxy unix-domain service

Note: the following files or directories still exist but are
no longer part of Postfix:

/usr/local/etc/postfix/transport

COMPATIBILITY: editing main.cf, setting inet_protocols=ipv4.
Specify inet_protocols explicitly if you want to enable IPv6.
In a future release IPv6 will be enabled by default.


pokud v logu bude hláška
warning: dict_nis_init: NIS domain name not set - NIS lookups disabled

zkontrolujeme si nastavení
postconf | grep nis
alias_maps = hash:/etc/aliases, nis:mail.aliases
lmtp_sasl_mechanism_filter =
smtp_sasl_mechanism_filter =

zkompilovali jsme si postfixe s podporou NIS . Zabijeme jej v main.cf řádkem
alias_maps = hash:/etc/aliases





Porozumění logu při přijetí e-mailu

příchozí mail je doručený

Aug 31 07:44:24 www postfix/smtpd[72760]: initializing the server-side TLS engine
Aug 31 07:44:24 www postfix/smtpd[72760]: connect from mail.brizatkove.cz[193.85.252.34]
Aug 31 07:44:24 www postfix/smtpd[72760]: setting up TLS connection from mail.brizatkove.cz[193.85.252.34]
Aug 31 07:44:24 www postfix/smtpd[72760]: mail.brizatkove.cz[193.85.252.34]: TLS cipher list "aNULL:-aNULL:ALL:+RC4:@STRENGTH"
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:before/accept initialization
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 read client hello A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write server hello A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write certificate A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write key exchange A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write server done A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 flush data
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 read client key exchange A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 read finished A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write change cipher spec A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 write finished A
Aug 31 07:44:24 www postfix/smtpd[72760]: SSL_accept:SSLv3 flush data
Aug 31 07:44:24 www postfix/smtpd[72760]: Anonymous TLS connection established from mail.brizatkove.cz[193.85.252.34]: TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)
Aug 31 07:44:24 www postfix/smtpd[72760]: B05FA34C3D8: client=mail.brizatkove.cz[193.85.252.34]
Aug 31 07:44:24 www postfix/cleanup[72764]: B05FA34C3D8: message-id=>OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu<
Aug 31 07:44:24 www postfix/qmgr[72713]: B05FA34C3D8: from=>xyz@europasta.eu<, size=27674, nrcpt=1 (queue active)

předání spamassassinu

Aug 31 07:44:24 www spamd[72595]: spamd: connection from localhost [127.0.0.1] at port 46732
Aug 31 07:44:24 www spamd[72595]: spamd: setuid to spamd succeeded
Aug 31 07:44:24 www spamd[72595]: spamd: processing message >OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu< for spamd:58
Aug 31 07:44:24 www postfix/smtpd[72760]: disconnect from mail.brizatkove.cz[193.85.252.34]
Aug 31 07:44:26 www spamd[72595]: spamd: clean message (1.8/5.0) for spamd:58 in 1.7 seconds, 27250 bytes.
Aug 31 07:44:26 www spamd[72595]: spamd: result: . 1 - HTML_IMAGE_ONLY_08,HTML_MESSAGE scantime=1.7,size=27250,user=spamd,uid=58,required_score=5.0,rhost=localhost,raddr=127.0.0.1,rport=46732,mid=>OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu<,autolearn=no
Aug 31 07:44:26 www postfix/pipe[72765]: B05FA34C3D8: to=>xyz@dvorec.eu<, orig_to=>jv@dvorec.eu<, relay=spamassassin, delay=2, delays=0.28/0.01/0/1.7, dsn=2.0.0, status=sent (delivered via spamassassin service)
Aug 31 07:44:26 www postfix/qmgr[72713]: B05FA34C3D8: removed
Aug 31 07:44:26 www postfix/pickup[72712]: 8ABC334C3EB: uid=58 from=>xyz@europasta.eu<
Aug 31 07:44:26 www postfix/cleanup[72764]: 8ABC334C3EB: message-id=>OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu<
Aug 31 07:44:26 www postfix/qmgr[72713]: 8ABC334C3EB: from=>xyz@europasta.eu<, size=27953, nrcpt=1 (queue active)
Aug 31 07:44:26 www spamd[72594]: prefork: child states: II
Aug 31 07:44:26 www postfix/smtpd[72771]: initializing the server-side TLS engine

předání amavisu

Aug 31 07:44:26 www postfix/smtpd[72771]: connect from localhost[127.0.0.1]
Aug 31 07:44:26 www postfix/smtpd[72771]: B7C0834C41F: client=localhost[127.0.0.1]
Aug 31 07:44:26 www postfix/cleanup[72764]: B7C0834C41F: message-id=>OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu<
Aug 31 07:44:26 www postfix/smtpd[72771]: disconnect from localhost[127.0.0.1]
Aug 31 07:44:26 www postfix/qmgr[72713]: B7C0834C41F: from=>xyz@europasta.eu<, size=28153, nrcpt=1 (queue active)

amavis scanuje email

Aug 31 07:44:26 www amavis[76470]: (76470-10) Passed CLEAN {RelayedInbound}, [192.1.1.143] >xyz@europasta.eu< -< >xyz@dvorec.eu<, Message-ID: >OF203EA770.D512AD01-ONC1257A6B.001FDFA1-C1257A6B.001F892E@europasta.eu<, mail_id: n_BnNS3UDTxV, Hits: -, size: 27953, queued_as: B7C0834C41F, 183 ms

předání postfixu a vyřazení z fronty

Aug 31 07:44:26 www postfix/smtp[72769]: 8ABC334C3EB: to=>xyz@dvorec.eu<, relay=127.0.0.1[127.0.0.1]:10024, delay=0.21, delays=0.01/0.01/0/0.18, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as B7C0834C41F)
Aug 31 07:44:26 www postfix/qmgr[72713]: 8ABC334C3EB: removed

předání do uživatelovi schránky

Aug 31 07:44:26 www postfix/virtual[72772]: B7C0834C41F: to=>xyz@dvorec.eu<, relay=virtual, delay=0.02, delays=0.01/0.01/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Aug 31 07:44:26 www postfix/qmgr[72713]: B7C0834C41F: removed


na téhle adrese si můžeme otestovat, jestli váš pošták není openrelay
http://www.spamhelp.org/shopenrelay/