Stavíme vlastní e-mailový server: Apache, DANE, Bind a Postfix

13. 6. 2017
Doba čtení: 20 minut

Sdílet

V minulém článku jsme si připravili DNS a operační systém. V dnešním díle se pustíme do konfigurace serverových služeb, vystavíme si certifikáty a naučíme svůj server komunikovat s okolním světem.

Apache

Poněkud netradičně zahájíme konfigurace služeb webovým serverem Apache. Má to dobrý důvod, usnadní nám generování certifikátu od Let’s Encrypt hned v dalším kroku. Nejdříve tedy jeho instalace:

# yum install -y httpd mod_ssl

do konfigurace firewallu přidáme následující pravidla – povolíme příchozí spojení na port 80 (http) a 443 (https) a opět provedeme reload firewallu

-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# systemctl reload iptables
# systemctl reload ip6tables

otevřeme soubor/etc/httpd/conf.d/welcome.conf a zakomentujeme všechny řádky (soubor nemazat, při aktualizaci by byl vytvořen znovu)

vytvoříme nový soubor/etc/httpd/conf.d/mail.testemail.cz.conf a vložíme do něj následující obsah:

<VirtualHost *:80>
       ServerName mail.testemail.cz
       ServerAdmin webmaster@testemail.cz
       DocumentRoot /var/www/mail.testemail.cz
</VirtualHost>

vytvoříme potřebný adresář a v něm testovací soubor

mkdir /var/www/mail.testemail.cz
echo Test > /var/www/mail.testemail.cz/index.html

a nyní můžeme webový server spustit

# systemctl enable httpd
# systemctl start httpd

Pokud je vše v pořádku, na adresehttp://mail.testemail.cz vidíme testovací stránku – prostý nápis “Test”.

Certifikáty Let’s Encrypt

Když máme funkční web server, je možné vygenerovat certifikáty zdarma od certifikační autority Let’s Encrypt. Protože chceme využít certifikáty i pro postfix a chceme využít DANE, budeme si muset nejdříve vygenerovat soubor CSR (Certificate Signing Request), který budeme používat i pro obnovu certifikátu. Někdo tvrdí, že generování nových certifikátů se stále stejným CSR snižuje bezpečnost, nicméně nám to umožní automatickou obnovu vydaných certifikátů bez nutnosti měnit při každé obnově TLSA záznam v DNS. V případě, že váš doménový registrátor poskytuje nějaké rozumné API nebo používáte vlastní DNS, je možné zautomatizovat celý proces, včetně používání pokaždé nových CSR, ale považuji to za zbytečné.

Pro generování certifikátů využijeme skriptACME.sh  – umí vše, co potřebujeme (a mnohem více). Začneme tedy instalací skriptu:

# curl https://get.acme.sh | sh

nyní se odhlásíme a opět přihlásíme a můžeme pokračovat – vytvoříme si adresář a vygenerujeme klíč

# mkdir ~/.acme.sh/mail.testemail.cz
# openssl genrsa -out ~/.acme.sh/mail.testemail.cz/mail.testemail.cz.key 2048

a poté můžeme vygenerovat samotný request – nelekejte se, je to jeden příkaz s použitím heredoc, zajímavý je řádek CN, kde zadáváme název serveru.

# openssl req -new -key ~/.acme.sh/mail.testemail.cz/mail.testemail.cz.key -out ~/.acme.sh/mail.testemail.cz/mail.testemail.cz.csr -config <(  cat <<-EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = mail.testemail.cz
EOF
)

Samotný certifikát vygenerujeme příkazem

# acme.sh --signcsr --csr ~/.acme.sh/mail.testemail.cz/mail.testemail.cz.csr -w /var/www/mail.testemail.cz

a nainstalujeme jej

# acme.sh --installcert -d mail.testemail.cz \
  --certpath /etc/pki/tls/certs/mail.testemail.cz.cert.pem \
  --keypath /etc/pki/tls/private/mail.testemail.cz.key \
  --fullchainpath /etc/pki/tls/certs/mail.testemail.cz.chain.pem \
  --reloadcmd "systemctl reload httpd"

Nyní si upravíme několik konfigurací, začneme souborem/etc/httpd/conf/httpd.conf a zakomentujeme v něm řádek

 Listen 80

dále upravíme konfiguraci naší testovací stránky v souboru/etc/httpd/conf.d/mail.testemail.cz.conf následovně:

<VirtualHost *:443>
       ServerName mail.testemail.cz
       ServerAdmin webmaster@testemail.cz
       DocumentRoot /var/www/mail.testemail.cz
       SSLEngine on
       SSLProtocol all -SSLv2 -SSLv3
       SSLCipherSuite "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
       SSLCertificateFile "/etc/pki/tls/certs/mail.testemail.cz.cert.pem"
       SSLCertificateKeyFile "/etc/pki/tls/private/mail.testemail.cz.key"
       SSLCertificateChainFile "/etc/pki/tls/certs/mail.testemail.cz.chain.pem"
       Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
       Header always set X-Frame-Options DENY
</VirtualHost>

a z konfigurace firewallu/etc/sysconfig/iptables odstraníme řádek

-A INPUT -p tcp --dport 80 -j ACCEPT

nyní můžeme reloadovat nastavení firewallu i Apache

# systemctl reload iptables
# systemctl reload ip6tables
# systemctl reload httpd

Tím máme hotovou konfiguraci https. Předešlými kroky jsme navíc zcela vypnuli http na portu 80. Pevně věřím, že pokud bude server sloužit pouze pro e-maily, nemá cenu http vůbec provozovat. Ověřit můžeme tím, že na adresehttps://mail.testemail.cz se zobrazí náš známý “Test”, ale na http už by se neměl prohlížeč vůbec připojit, respektive v našem případě budeme přesměrování na https, což nám zajišťují poslední dva řádky konfigurace, takzvané HSTS, které prohlížeči řekne, že naše stránky fungují vždy pouze zabezpečeně. Stačí stránku navštívit jednou, prohlížeč si tuto informaci uloží, a pokud budeme přistupovat znovu, automaticky nám vnutí https, i když do adresního řádku napíšeme pouze http. Jedná se o ochranu proti MITM útokům a takzvanému SSL downgradu. Na https rovnou můžeme ověřit, jestli je v pořádku certifikát.

DANE

Úkolem DANE je ve stručnosti vystavit otisk certifikátu v DNS a nahradit tak certifikační autoritu. Opět odkážu na jiný článek, kde už byla problematika popsána v článku o DANE.

Je to první z několika věcí, která je bezpodmínečně závislá na DNSSEC, proto se ujistěte, že jej máte funkční. Ověřit se dá například na stránce dnssec-debugger.verisignlabs.com.

TLSA záznam do DNS můžeme vygenerovat buď online na některé z mnoha stránek, nebo z příkazového řádku. Já zvolím generování z příkazového řádku, a pro tento účel si nainstalujeme potřebné utility

# yum install -y hash-slinger

po nainstalování záznam vygenerujeme příkazem

# tlsa --create --selector 1 --certificate /etc/pki/tls/certs/mail.testemail.cz.cert.pem mail.testemail.cz

do DNS přidáme následující záznam, hostname a hodnotu samozřejmě upravíme podle naší domény a záznamu vygenerovaného předchozím příkazem.

Hostname:       _443._tcp.mail.testemail.cz
Typ:            TLSA
TTL:            300
Hodnota:        3 1 1 cb2adfcd68cbef5ac7ca01d972bc26bfc2ac860028456f60bca161027993b55a

Tím je nastavení DANE zatím hotovo, později přidáme další záznamy. Ověřit funkčnost lze například na www.huque.com/bin/danecheck. Pokud test neprojde, možná bude stačit pár minut počkat.

Na tomto místě si můžeme říct i neco o HPKP (HTTP Public Key Pinning). Princip je velmi podobný DANE, jen se otisky klíčů nevystaví do DNS, ale posílají se HTTP hlavičkou. Nedoporučoval bych jeho nasazení s certifikáty Let's Encrypt, zde už by to opravdu chtělo při obnovení certifikátu také automatické změny konfigurace, a navíc je doporučeno mít i záložní klíče. Pokud se nám s HPKP něco nezadaří, povede to k nedostupnosti stránek, takže bych byl velmi opatrný. HPKP nám na rozdíl od DANE slouží pouze pro webové stránky, neřeší jiné protokoly než HTTPS.

Bind

Jak už jsme si řekli v úvodu, e-mailové služby jsou zcela závislé na funkčním DNS, a proto bývají tyto služby často spojovány. I my si nastavíme vlastní DNS server, konkrétně Bind9. Budeme jej používat pouze jako rekurzor, a proto není třeba do něj přidávat záznamy. Začneme instalací potřebného softwaru:

# yum install -y bind bind-utils

soubor/etc/resolv.conf upravíme následovně:

nameserver 127.0.0.1
nameserver ::1

a pro pořádek zapíšeme tyto DNS i do /etc/sysconfig/network-scripts/ifcfg-eth0 .

Výchozí konfigurace je přesně tak, jak ji potřebujeme, proto stačí bind spustit a povolit ho při spuštění, nejdříve si ale povolíme porty ve firewallu

-A INPUT -i lo -p udp --dport 53 -j ACCEPT
-A INPUT -i lo -p tcp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 53 -j ACCEPT

a načteme potřebnou konfiguraci.

# systemctl reload iptables
# systemctl reload ip6tables
# systemctl enable named
# systemctl start named

Pokud se divíte, že používáme DNS na UDP i TCP, bude se to později hodit. Především DKIM má celkem dlouhé dotazy, které překračují povolenou velikost paketu pro UDP a přepíná se na TCP.

Můžeme otestovat například příkazy

# dig @127.0.0.1 testemail.cz ANY
# dig @::1 testemail.cz ANY

a pokud jsou v ANSWER SECTION vypsány záznamy typu NS, MX, A, AAAA, PRSIG a DNSKEY, máme vše funkční, včetně IPv6 a DNSSEC.

Postfix

Než se pustíme do opisování nicneříkajících řádek a příkazů, rád bych trochu objasnil princip, jak postfix funguje a jak se konfiguruje. Existuje spousta návodů, které vám řeknou, jak postfix nastavit, ale mám takový dojem, že většina z nich je výsledkem metody pokus/omyl, která sice může vést k funkčnímu výsledku, ale bez jakékoliv možnosti pochopit princip. Služba postfix je jen obálka pro mnohem větší skupinu dalších služeb, které se nám potom starají o průchod e-mailů serverem a jejím primárním úkolem je nastavit proměnné a poté spustit postfix-script, který ovládá hlavní proces master. Ten zůstává spuštěn jako démon a spouští na vyžádání další procesy. Konfigurace postfixu je ve dvou souborech, prvním z nich je /etc/postfix/main.cf , který obsahuje volby pro samotné spuštění a dále výchozí hodnoty pro další procesy.

Druhým konfiguračním souborem je /etc/postfix/master.cf , což je konfigurace právě pro proces master. Zde jsou definovány procesy, jako qmgr, anvil, pickup, cleanup a další, které jsou nezbytné pro fungování celého poštovního systému, ale také zde lze definovat další postfixové, nebo externí služby. Tyto procesy jsou potom spouštěny na vyžádání hlavním procesem master. Součástí konfigurace master.cf jsou také parametry, se kterými jsou tyto procesy spouštěny. Parametry pro jednotlivé procesy je možné uvést buď za definicí služby na jednom řádku, nebo častěji na dalších řádcích, ale v tom případě je nutné, aby začínaly mezerou, nebo tabulátorem, jinak by byly brány jako další definice služby a konfigurace by byla neplatná. Pokud je zde uveden parametr, tak se použije, pokud není, použije se parametr z main.cf a pokud není ani tam, použije se výchozí hodnota.

Začneme tedy s konfigurací postfixu, který nám v tuto chvíli poslouží pro odesílání a příjmání pošty přes smtp z našeho serveru, později v něm nastavíme ještě submission, který bude přebírat poštu od našich klientů. K postfixu a jeho konfiguraci se budeme postupně vracet při instalaci dalších služeb. Součástí postfixu je také utilita postconf , která slouží pro snadnou konfiguraci. Vše, co nastavujeme přes postconf, je možné nastavit i editací konfiguračních souborů. Použijeme obě metody, podle toho, která je v daný moment přehlednější. (main.cf většinou nastavuji postconfem, master.cf přímo editací)

Nejdříve opět otevřeme administraci DNS a přidáme následující MX záznam, kterým říkáme, že pro naši doménu zpracovává poštu server mail.testemail.cz s prioritou 10 – čím vyšší číslo, tím menší priorita, v budoucnu je možné přidat třeba záložní server, třeba s prioritou 20:

Hostname:       testemail.cz
Typ:            MX
TTL:            300
Hodnota:        10 mail.testemail.cz

A můžeme pokračovat instalací postfixu (pravděpodobně je již nainstalovaný, ale stejně ověříme) a rovnou si s ním nainstalujeme i program mailx, který nám umožní pracovat s poštou v příkazovém řádku

# yum install -y postfix mailx

Nejdříve nastavíme jméno serveru, které musí sedět s reverzním záznamem, nastavíme si mynetworks, což jsou naše sítě, ze kterých je možné odesílat zprávy, a mydestination, což jsou domény, pro které náš server zprávy přijímá, a myorigin, což je doména odesílatele:

# postconf -e mynetworks="127.0.0.0/8 [::1]/128"
# postconf -e inet_interfaces=all
# postconf -e mydestination="testemail.cz, mail, localhost"
# postconf -e myhostname="mail.testemail.cz"
# postconf -e myorigin="$mydomain"

pro jistotu nastavíme spouštění postfixu při startu a restartujeme jej

# systemctl enable postfix
# systemctl restart postfix

nyní si v konfiguraci firewallu povolíme port 25 pro příchozí i odchozí spojení a poté znovu načteme jeho konfiguraci

-A INPUT -p tcp --dport 25 -j ACCEPT
-A OUTPUT -p tcp --dport 25 -j ACCEPT
# systemctl reload iptables
# systemctl reload ip6tables

Pokud šlo všechno dobře, můžeme si zkusit odeslat zprávu někam ven do internetu – pro tento účel doporučuji použít, nebo založit, účet na gmail.com, později nám bude pěkně ukazovat SPF, DKIM a DMARC a sám tyto technologie používá, takže je bude možné ověřit i na druhou stranu

# echo Test | mailx -s "test" nejaka_adresa@gmail.com

a pokud nám zpráva dojde, je možné na ni odpovědět a na serveru ji přečteme příkazem

# mailx

Pokud se nám podařilo zprávu odeslat i přijmout, základní konfiguraci postfixu máme hotovou a pro jistotu jen ověříme, jestli server nefunguje jako open relay, třeba na adrese mxtoolbox.com/diagnostic.aspx. Pro neznalé – open relay je server, který odešle cokoliv kamkoliv. Může to znít pěkně, ale internet je plný robotů, kteří vyhledávají právě takové servery a pokud jej najdou, zneužijí ho pro odesílání spamů. Je otázkou minut, maximálně jednotek hodin, než to někdo zkusí, a proto je třeba na to dávat pozor od první chvíle, kdy náš server začne komunikovat s ostatními.

Od této chvíle se nám vyplatí otevřít druhý terminál a spustit si výpis logu, bude se nám hodit.

# tail -f /var/log/maillog

Postfixadmin

Postfixadmin je webové rozhraní, které nám umožní pohodlnou správu domén, uživatelů, přesměrování atd.

Nejdříve si nainstalujeme potřebné závislosti:

# yum install -y  php php-mysql mariadb-server mariadb php-mbstring php-imap php-xml
# systemctl reload httpd

a poté samotný postfixadmin. V době vzniku návodu je poslední verze 3.0.2. Následně srovnáme oprávnění na složce/var/www

# curl -L https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.0.2/postfixadmin-3.0.2.tar.gz | tar -xzf - -C /var/www/mail.testemail.cz/
# chown -R apache:apache /var/www

Postfixadmin máme nainstalovaný ve složce /var/www/mail.testemail.cz/postfixadmin-3.0.2, zde si otevřeme souborconfig.inc.php a upravíme následující volby:

$CONF['configured'] = true;
$CONF['default_language'] = 'cs';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'tajne_heslo_rw';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'postmaster@testemail.cz';
$CONF['smtp_client'] = 'mail.testemail.cz';
$CONF['password_validation'] = array(
    '/.{8}/'      => 'password_too_short 8',
    '/[a-zA-Z]/'  => 'password_no_characters 1',
    '/[0-9]/'     => 'password_no_digits 1',
);
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Home';
$CONF['footer_link'] = 'https://mail.testemail.cz/postfixadmin/main.php';
$CONF['quota'] = 'YES';
$CONF['domain_quota'] = 'NO';
$CONF['quota_multiplier'] = '1048576';
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';

Pozor na password_validation, ve výchozí instalaci vyžaduje jen 5 znaků, 3 písmena a 2 čísla, nicméně výrazy mají drobné nedostatky. Takto upraveno to vyžaduje 8 znaků a alespoň jedno písmeno a jedno číslo.

Dále můžeme nastavit výchozí aliasy v sekci $CONF[‚default_aliases‘], případně je nastavíme později pro naši doménu ve webovém rozhraní.

Dále bych rád upozornil na jednu zvláštnost mysql, o které ne každý ví. Host localhost se chová jinak než 127.0.0.1. Funkční je teoreticky obojí, ale localhost se snaží nejdříve připojit na socket, zatímco IP adresa vždy na síťový port.

Ještě nastavíme databázi, nejdříve nastartovat

# systemctl enable mariadb
# systemctl start mariadb

připojíme se k ní následovně

# mysql -u root

ve výchozím stavu nemá root heslo, což napravíme SQL příkazem

SQL> set password = password('tajne_heslo');

a dále si vytvoříme databázi postfix a k ní dva uživatele – postfixadmin pro administraci a postfix jen pro čtení

SQL> create database postfix;
SQL> grant all privileges on postfix.* to 'postfixadmin'@'localhost' identified by 'tajne_heslo_rw';
SQL> grant select on postfix.* to 'postfix'@'localhost' identified by 'tajne_heslo_ro';
<CTRL+D>

Vše by mělo být nachystáno, ještě pro větší pohodlí upravíme konfiguraci apache /etc/httpd/conf.d/mail.testemail.cz.conf , kam přidáme

Alias /postfixadmin /var/www/mail.testemail.cz/postfixadmin-3.0.2

a reloadneme

systemctl reload httpd

Nyní můžeme přejít na stránku https://mail.testemail.cz/pos­tfixadmin/setup.php . Při kontrole zjistíme, že SELinux blokuje zípis do templates_c , což se postfixadminu příliš nelíbí. Existuje několik různých řešení, ale nejčistší bude změnit danému adresáři a jeho obsahu kontext. Nebudu vás dlouho napínat a zbytečně vysvětlovat dávno vysvětlené, vezmeme to hopem. Podíváme se, jaký kontext má adresář

# ll -Zd /var/www/mail.testemail.cz/postfixadmin-3.0.2/templates_c
drwxrwxr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/mail.testemail.cz/postfixadmin-3.0.2/templates_c

vidíme, že má httpd_sys_content_t a změníme jej na httpd_sys_rw_content_t. Popravdě, nechci vás zatěžovat tím, jak jsem na to přišel. Kdo má zájem, ten si to zjistí. Uděláme to následovně, prvním příkazem definujeme pravidlo, druhým potom obnovíme kontext dle nastavených pravidel

# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/mail.testemail.cz/postfixadmin-.*/templates_c(/.*)?"
# restorecon -R -v /var/www/mail.testemail.cz/postfixadmin-3.0.2/templates_c/

všíměte si, že do cesty v prvním příkazu jsme zadali postfixadmin-.* , čímž jsme nastavili pravidlo i pro případné budoucí verze a nebude tak nutné po každé aktualizaci postfixadmina řešit SELinux znova. Je ale třeba si uvědomit, jak máme nastavený web server a v případě aktualizace ho upravit, a pokud nám nová verze funguje, starou nejlépe smazat. Opět zkusíme zobrazit adresář

# ll -Zd /var/www/mail.testemail.cz/postfixadmin-3.0.2/templates_c
drwxrwxr-x. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 /var/www/mail.testemail.cz/postfixadmin-3.0.2/templates_c

a vidíme, že se dílo zdařilo. Pokud opět vyzkoušíme https://mail.testemail.cz/pos­tfixadmin/setup.php , už by měly být všechny kontroly v pořádku. Pokud budete chtít, můžete vyzkoušet i metodu s audit2allow , bude stručně popsána v dalším díle, konkrétně příkazem (nic nemění, pouze vypíše preview)

# grep templates_c /var/log/audit/audit.log | audit2allow -a
#============= httpd_t ==============
#!!!! This avc can be allowed using the boolean 'httpd_unified'
allow httpd_t httpd_sys_content_t:dir write;

nicméně to není nejvhodnější, protože tím dáte právo pro apache na zápis do spousty míst, zobrazit je můžeme příkazem

# semanage fcontext -l | grep httpd_sys_content_t

Vygenerujeme instalační heslo ve spodním formuláři a postfixadmin nám ukáže jeden řádek, který je třeba upravit v config.inc.php, vypadá cca takto:

$CONF['setup_password'] = '833a5d154b1428a9e6582af09d326367:39a57606930b3f8f3a5833c92794c1024900481c';

Nyní můžeme přidat super admina. Postfixadmin nám sice tvrdí, že není nutné mazat setup.php, ale raději bych ho smazal nebo přesunul mimo dosah webserveru, protože nám ukazuje verze některých komponent, a to není z hlediska bezpečnosti nejlepší. Ale nechám to na vás.

Pokud šlo vše dobře, můžeme se přihlásit k našemu superadmin účtu na adrese https://mail.testemail.cz/postfixadmin , vytvořit si naši doménu a třeba testovacího uživatele test@testemail.cz . Věřím, že tento krok není třeba detailně popisovat, rozhraní je jednoduché a přímočaré. Pozor, odeslání uvítacího e-mailu se nezdaří, je to v pořádku. Tím je hotová konfigurace postfixadmina, ale zatím není provázán s postfixem, který o něm neví a to je náš úkol v dalším kroku.

Propojení postfix a postfixadmin

Postfixadmin má uložené údaje v databázi, ale postfix stále používá systémové uživatele. Je potřeba postfixu sdělit, kde má hledat domény a uživatele a změnit mu některé další volby. Začneme vytvořením souborů, které postfix použije jako konfigurace pro přístup k databázi, nejdříve si pro ně pro pořádek vytvoříme adresář

# mkdir /etc/postfix/mysql

a v tomto adresáři první soubor/etc/postfix/mysql/db-map-domain.cf s následujícím obsahem

user = postfix
password = tajne_heslo_ro
hosts = localhost
dbname = postfix
query = SELECT 1 FROM domain WHERE domain='%s' AND active=1

Jedná se o informace potřebné pro připojení k databázi a dotaz, kterým získáme doménu. Další soubory jsou velmi podobné, pouze s jiným dotazem.

/etc/postfix/mysql/db-map-user.cf

user = postfix
password = tajne_heslo_ro
hosts = localhost
dbname = postfix
query = SELECT 1 FROM mailbox WHERE username='%s' AND active=1

/etc/postfix/mysql/db-map-alias.cf

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

U těchto souborů opět pozor na localhost vs 127.0.0.1, opět se jedná o MySQL a opět je chování jiné.

Nyní si vytvoříme uživatele pro doručování pošty – veškerá pošta bude pod uživatelem a skupinou vmail

# groupadd -g 10000 vmail
# useradd -g vmail -u 10000 vmail -d /home/vmail

změníme konfigurace postfixu

# postconf -e virtual_uid_maps=static:10000
# postconf -e virtual_gid_maps=static:10000
# postconf -e virtual_mailbox_base=/home/vmail
# postconf -e mydestination=localhost
# postconf -e virtual_mailbox_domains=mysql:/etc/postfix/mysql/db-map-domain.cf
# postconf -e virtual_mailbox_maps=mysql:/etc/postfix/mysql/db-map-user.cf
# postconf -e virtual_alias_maps=mysql:/etc/postfix/mysql/db-map-alias.cf

a provedeme reload

# systemctl reload postfix

Pokud si teď pošleme email na našeho uživatele test@testemail.cz, tak jej náš server přijme a doručí, ale pouze do souboru /home/vmail/1 , kam bude doručovat veškerou poštu. Můžete to vyzkoušet a podívat se do něj, je čitelný. O doručování do jednotlivých schránek se nám postará Dovecot, na který přijde řada později.

Certifikáty pro postfix

Nyní použijeme certifikáty Let’s Encrypt, které jsme dřive vygenerovali, také pro postfix. To bude chtít menší hack, ale nic složitého. Postfix potřebuje certifikát i mezilehlé certifikáty v jednom souboru a klíč zvlášť.

Nejdříve tedy sloučíme certifikáty do správného souboru:

# cat /etc/pki/tls/certs/mail.testemail.cz.cert.pem /etc/pki/tls/certs/mail.testemail.cz.chain.pem > /etc/pki/tls/certs/mail.testemail.cz.combined.pem

Tuto operaci je nutné provést při každé obnově certifikátu, což vyřešíme změnou konfigurace ACME.sh. Otevřeme si soubor/root/.acme.sh/mail.testemail.cz/mail.testemail.cz.conf a najdeme si řádek

Le_ReloadCmd='systemctl reload httpd;'

který upravíme následovně (vše na jednom řádku):

Le_ReloadCmd='systemctl reload httpd; cat /etc/pki/tls/certs/mail.testemail.cz.cert.pem /etc/pki/tls/certs/mail.testemail.cz.chain.pem > /etc/pki/tls/certs/mail.testemail.cz.combined.pem; systemctl reload postfix;'

Jistě jste pochopili, že se nejedná o nic jiného než zápis předchozích ručních akcí do konfigurace ACME.sh. Nakonec jsme doplnili reload konfigurace postfixu.

Nyní si nastavíme TLSA záznam také pro smtp protokol. Opět navštívíme administraci DNS záznamů, kde si vytvoříme ještě jeden záznam TLSA a to pouhým zkopírováním již existujícího záznamu:

_443._tcp.mail.testemail.cz ...

do nového stejného záznamu, pouze s odlišným portem

_25._tcp.mail.testemail.cz ...

Vše máme nachystáno a můžeme změnit konfiguraci postfixu, aby začal používat šifrování, a na závěr konfiguraci opět načteme:

# postconf -e smtp_use_tls=yes
# postconf -e smtp_tls_security_level=may
# postconf -e smtp_tls_loglevel=1
# postconf -e smtp_tls_CAfile=/etc/ssl/certs/ca-bundle.trust.crt
# postconf -e smtp_tls_protocols=\!SSLv2,\!SSLv3
# postconf -e smtp_tls_mandatory_protocols=\!SSLv2,\!SSLv3
# postconf -e smtpd_use_tls=yes
# postconf -e smtpd_tls_security_level=may
# postconf -e smtpd_tls_CAfile=/etc/ssl/certs/ca-bundle.trust.crt
# postconf -e smtpd_tls_cert_file=/etc/pki/tls/certs/mail.testemail.cz.combined.pem
# postconf -e smtpd_tls_key_file=/etc/pki/tls/private/mail.testemail.cz.key
# postconf -e smtpd_tls_security_level=may
# postconf -e smtpd_tls_loglevel=1
# postconf -e smtpd_tls_protocols=\!SSLv2,\!SSLv3
# postconf -e smtpd_tls_mandatory_protocols=\!SSLv2,\!SSLv3

# systemctl reload postfix

Nastavení můžeme vyzkoušet opět zasláním emailu na gmail.com a zpět, při odchozí i příchozí zprávě by mělo být z logu patrné, že se použilo TLS. Poněkud hezčí test nám poskytne stránka https://ssl-tools.net/mailservers , kde po zadání naší domény ověříme i funkční DANE. Pokud vám DANE nefunguje, možná bude stačit počkat delší dobu, než se projeví změna v DNS. V testu bude pravděpodobně problém s protokolem, konkrétně s povolením slabých šifer. Jestli tento problém chcete vyřešit, je jen na vás, ale je třeba si uvědomit, že čím víc šifer zakážeme, tím větší šance je, že spojení nebude šifrováno vůbec. Je na zvážení, jestli není špatná šifra lepší, než žádná. Ostatně, security level máme na may, což znamená, že se spojení naváže i nešifrovaně, pokud není jiná možnost, proto se v tomto případě nehoním za dokonalostí v testech. Máme pouze zakázané protokoly SSLv2 a SSLv3, které opravdu nejsou považovány za bezpečné a jejich zajázání je doporučeno. Rád bych také upozornil, že dle RFC 2487 je nutné, aby mohl server v internetu komunikovat i nešifrovaně. Můžete si zkusit nastavit security level na encrypt , čímž šifrování vynutíte a pro většinu serverů s tím nebude problém, ale může se stále stát, že narazíte na server, který šifrování nepodporuje, a v takovém případě se s ním nedomluvíte.

ict ve školství 24

Můžeme si zde také všimnout, že konfigurace je rozdělena na dvě části – co začíná smtp_ , to se týká smtp klienta, tedy odchozích zpráv (klient se připojuje ke vzdálenému serveru), zatímco druhá část, začínající smtpd_ , je nastavení našeho serveru, ke kterému se připojují klienti, tedy zprávy příchozí.

Konfigurační volby jsou celkem srozumitelné, nebudu je tedy popisovat každou zvlášť, za zmínku stojí _tls_CAfile , což je soubor s certifikačními autoritami – není to povinné, je to v našem případě spíše kosmetická volba, aby bylo v logu patrné, kdy se bavíme se serverem, který používá důvěryhodný certifikát. Pokud používá třeba self-signed, komunikace stejně proběhne a šifrovaná bude. Další dvě volby, které stojí za zmínku, jsousmtpd_tls_cert_file a smtpd_tls_key_file , což je cesta k našemu certifikátu a klíči.