Hlavní navigace

Stavíme vlastní e-mailový server: základní nastavení systému

Michal Pastrňák

Chcete mít svoje e-maily pod kontrolou? Máte dost nadvlády velkých firem? Potřebujete specifické nastavení? Nebo si jen chcete hrát a rozšiřovat obzory? Potom je tento nový seriál přesně pro vás.

Mailserver není maličkost

Rád bych vás provedl kompletní instalací e-mailového serveru na Linuxu, včetně některých přidružených služeb. Server bude svým zaměřením kombinací bezpečnosti a rozumné míry údržby, hodí se proto především pro osobní použití, nebo pro menší firmy. Provoz (nejen) e-mailového serveru ve větším prostředí vyžaduje více péče, pravidelné kontroly, monitoring, řeší se vysoká dostupnost, klade se velký důraz na zálohování a většinou se nasazuje s nějakou vazbou na centrální správu uživatelů, ať už LDAP, Active Directory, NIS, případně další.

V žádném případě nechci udělat návod ve stylu „copy&paste“. Takový přístup nedoporučuji nikomu, vždy je dobré alespoň tušit, co a proč děláte. Tomu se pokusím pomoci popisem některých kroků a technologií, případně přiložím odkazy na relevantní zdroje. Pokud něco není jasné, doporučuji vyzkoušet man, případně poradím. Návod počítá s alespoň základní znalostí práce s OS Linux, práci s nějakým editorem, a předpokládá, že pracujeme v terminálu. Instalace grafického prostředí je na serveru zbytečnost a až na výjimky tam nemá co dělat.

Náš cíl

Cílem by měl být e-mailový server odpovídající aktuálním trendům v oblasti zabezpečení a ochrany proti podvodným e-mailům. Použijeme Postfix, Dovecot, virtuální uživatele v MySQL, SPF, DKIM, DMARC, vše zabezpečíme certifikáty od Let’s Encrypt, k doméně si přidáme TLSA záznamy (DANE), použijeme antivirovou (ClamAV) a antispamovou (Spamassassin) ochranu, našim uživatelům povolíme server side filtry (sieve) a nastavíme jim kvóty na velikost schránky. Pro potřeby serveru nainstalujeme Bind jako DNS recursor a Apache pro webové služby. S poštou bude možné pracovat buď z libovolného klienta přes IMAP a Submission, nebo z webového rozhraní RainLoop a správu uživatelů nám usnadní webové rozhraní Postfixadmin. Server bude své služby poskytovat na IPv4 i IPv6 a bude teoreticky připraven na provozování více domén.

To vše se pokusíme zvládnout se zapnutým SELinuxem. V případě zájmu připravím i návod k instalaci RoundCube a pokud by někdo chtěl použitelnou OSS náhradu MS Exchange, můžeme seriál rozšířit i o groupware SOGo. Protože je návod určen primárně pro instalaci na VPS, není jeho součástí řešení šifrování disků, protože to z mnoha důvodů nedává smysl. Také nebudeme řešit chroot pro jednotlivé služby, a to hned ze dvou důvodů – SELinux nám poskytuje podobné zabezpečení a chroot komplikuje aktualizace – je třeba udržovat prostředí chrootu.

HW, OS a další požadavky

Jak již bylo řečeno, počítá se s instalací na VPS, což je pro osobní použití nejdostupnější a nejlevnější řešení. VPS se dá sehnat za cenu, která je nižší, než náklady na provoz vlastního fyzického serveru a nemusíme řešit hardwarové problémy. Z toho plyne, že počítám s tím, že server má přímo veřejné IP adresy (IPv4 a IPv6). Instalace je možná i ve vnitřní síti s neveřejnou adresou, ale potom je třeba z veřejné adresy směrovat porty nutné pro jeho fungování (minimálně port 25 – SMTP). To je vlastně první požadavek – e-mailový server musí být dostupný přes veřejnou adresu, minimálně na zmíněném portu 25 a také musí být na tomto portu schopný komunikovat s internetem. Pokud chcete server provozovat na domácí přípojce, je možné, že tento port váš poskytovatel blokuje. V takovém případě jej buď musíte přesvědčit, aby vám port povolil, nebo máte smůlu.

Jako OS jsem zvolil CentOS, v době instalace verzi 7.3.1611. Dříve jsem používal pro tyto účely především Debian, ale z různých důvodů jsem se rozhodl jej opustit, poslední kapkou byl neudržovaný SELinux v Debianu. O tom se zmíním později.

Dalším požadavkem je vlastní doména. Pro potřeby tohoto návodu jsem zaregistroval doménu testemail.cz. Teoreticky bylo dle RFC možné provozovat e-mailový server i bez domény, jen na IP adrese, ale dnes by se s námi moc serverů nebavilo a nebylo by možné využít technologie, jako SPF, DKIM a DMARC, které jsou na DNS přímo závislé. Pro tyto technologie bude navíc nutné zapnout pro naši doménu DNSSEC. To vyžaduje podporu registrátora a doporučuji podporu ještě před samotnou registrací ověřit. Pozor, registrátor může DNSSEC podporovat jen pro některé TLD.

Pokud máme doménu registrovanou, je třeba zajistit také reverzní DNS záznamy a to jak pro IPv4, tak IPv6. Tyto záznamy zřizuje poskytovatel připojení, v případě, že máme VPS, tak poskytovatel této služby, pokud jsme se rozhodli pro instalaci vlastního serveru, tak nám reverzní záznam zajistí poskytovatel naší internetové konektivity.

Nastavení DNS

Jak již bylo zmíněno, e-mailový server je s DNS úzce svázán. Jako první krok provedeme nastavení DNS záznamů, nejjednodušší je použít DNS servery registrátora, ale pokud již provozujeme vlastní NSSET, nastavíme údaje na vlastních serverech. Nastavíme si tedy DNS záznamy:

Hostname:       mail.testemail.cz
Typ:            A
TTL:            300
Hodnota:        81.2.241.158

Hostname:       mail.testemail.cz
Typ:            AAAA
TTL:            300
Hodnota:        2001:15e8:110:99e::1

Nenastavujte prosím místo těchto záznamů alias, později je použijeme pro MX záznam a použití aliasu pro MX je v rozporu s RFC. Tím máme nastavené IPv4 (A) a IPv6 (AAAA) názvy. Všimněte si hodnoty TTL, která je záměrně nastavena na relativně nízkou hodnotu 300 vteřin, což nám ušetří spoustu čekání, pokud někde uděláme chybu. Až bude server kompletně funkční, můžeme tyto hodnoty nastavit na hodnotu vyšší, například 3600. Já budu pro všechny nové záznamy (ještě jich pár bude) používat 300, nebo méně.

Základní instalace OS

Pokud instalujeme na VPS, pravděpodobně si pouze vybereme, jaký systém chceme nainstalovat a automaticky proběhne nějaká standardní, většinou minimální instalace. Pokud si server budeme instalovat sami, doporučuji minimální instalaci, vše potřebné si postupně doinstalujeme.

Po instalaci se můžeme přihlásit na uživatele root a provedeme pár základních konfiguračních kroků.

Nastavení sítě

pokud instalujeme VPS, pravděpodobně máme již síť nastavenou, pokud instalujeme vlastní server, nastavili jsme ji při instalaci. Pokud toto nastavení potřebujeme upravit, adresy můžeme změnit v souboru /etc/sysconfig/network-scripts/ifcfg-eth0, případně místo eth0 dosadíme název rozhraní použitého pro připojení.

Pokud máme adresy staticky (doporučeno), můžeme odinstalovat dhclient – nelekněte se, odinstaluje se i network manager, ale to nám nevadí

# yum remove -y dhclient

Nastavení jména

Serveru nastavíme správně jméno, v souboru /etc/hostname

mail.testemail.cz

a v souboru/etc/hosts upravíme záznamy s našimi IP adresami (případně přidáme):

81.2.241.158            mail.testemail.cz mail
2001:15e8:110:99e::1    mail.testemail.cz mail

Nastavení SSH

Nastavíme si vzdálené připojení pomocí SSH. Nebudeme se přihlašovat přímo na uživatele root, ale na neprivilegovaného uživatele a to pomocí klíče a fráze. Zde je možné využít různé postupy, od ponechání přihlášení na roota, nebo třeba využití sudo. Osobně se mi zvolený postup líbí nejvíce, potřebujeme jméno, klíč, frázi a ještě heslo roota, aby bylo možné na serveru něco dělat, ale někomu to může vyhovovat jinak. O pár kroků později bezpečnost zlepšíme nastavením základního firewallu.

Nejdříve tedy vytvoříme nového uživatele

# useradd -m email

nenastavíme mu heslo, ale místo toho se na něj přihlásíme pomocí su a vytvoříme mu ssh klíč, potvrdíme enterem výchozí umístění klíče, zadáme 2× frázi a poté zkopírujeme veřejný klíč do souboru ~/.ssh/authorized_keys

# su - email
# ssh-keygen
# cp .ssh/id_rsa.pub .ssh/authorized_keys

Zkopírujeme si obsah souboru~/.ssh/id_rsa do nějakého souboru na náš lokální počítač, pokud používáme Linux tak například do souboru~/.ssh/testemail.cz.key a nastavíme mu oprávnění

# chmod 600 ~/.ssh/testemail.cz.key

stiskem CTRL+D odhlásíme uživatele email a vrátíme se zpět na roota a upravíme (případně odkomentujeme) následující volby v souboru/etc/ssh/sshd_config  :

PermitRootLogin no
PasswordAuthentication no

a restartujeme ssh

# systemctl reload sshd

Nyní se můžeme zkusit znovu na náš server přihlásit

# ssh -i ~/.ssh/testemail.cy.key email@testemail.cz

zadáme frázi k našemu klíči a přepneme se na uživatele root příkazem

# su -

a zadáním hesla roota.

V celém zbytku návodu předpokládám, že pracujeme jako uživatel root, pokud není uvedeno jinak.

Aktualizace systému

Nejdříve nainstalujeme EPEL repozitář, který poskytuje spoustu komunitních balíčků:

# curl -O http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm
# rpm -ivh epel-release-7-9.noarch.rpm

a poté spustíme samotnou aktualizaci

# yum update

V době instalace testovacího serveru jsem se updatem dostal na verzi systému 7.3.1611.

V tento moment je asi nejlepší metodou pro uplatnění všech změn, restartovat systém, což provedeme příkazem:

# reboot

Nastavení jednoduchého firewallu

CentOS standardně používá firewallD, ale mně se zdá vhodnější použít přímo syntaxi iptables, takže pokud je firewallD nainstalovaný, tak jej zakážeme, nainstalujeme si iptables-services a povolíme jej

# systemctl disable firewalld
# yum install -y iptables-services
# systemctl enable iptables
# systemctl enable ip6tables
# ln -sf /etc/sysconfig/iptables /etc/sysconfig/ip6tables

konfigurace firewallu je umístěna v souboru/etc/sysconfig/iptables a vložíme do něj následující základ:

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp --dport 443 -j  ACCEPT
COMMIT

Ve stručnosti, nastavíme výchozí politiky na DROP (zahodit vše, co neodpovídá žádnému pravidlu), povolíme již navázané komunikace, povolíme icmp (ping), povolíme odchozí dotazy na DNS (udp 53), odchozí navázání komunikace na http (tcp 80) a https (tcp 443) a nastavíme limit pro počet nových připojení z jedné IP adresy na ssh a při jeho překročení spojení zahodíme, čímž významně zpomalíme brute-force útoky (a věřte mi, budou). Tuto konfiguraci budeme dále rozšiřovat tak, jak bude v danou chvíli třeba. Firewall spustíme příkazem:

# systemctl start iptables
# systemctl start ip6tables

Po 0Zde bych upozornil, že toto je pouze jeden z mnoha přístupů, který je v dané kombinaci přihlášení pouze s klíči a limitovaným počtem spojení dostatečně bezpečný, ale je možné použít i další metody zabezpečení, například změna portu SSH na nestandardní, povolení přihlášení pouze z určitých IP adres, ve firemním prostředí se většinou hlásíme do VPN a až z té máme přístup a určitě se najdou i další. Popsaný postup je kompromisem mezi bezpečností a pohodlím, pokud máme k dispozici náš klíč, můžeme se přihlásit odkudkoliv.

Čas

Vždy je dobré, mít na serveru správný čas, nastavíme si proto časové pásmo a synchronizaci času. Kontrolu časového pásma provedeme jednoduše příkazem

# ll /etc/localtime
lrwxrwxrwx. 1 root root 38 Apr 13  2015 /etc/localtime -> ../usr/share/zoneinfo/America/New_York

a vidíme, že tento soubor je pouze link na soubor v zoneinfo. Pokud se nám časové pásmo nelíbí, přepíšeme jej jiným

# ln -sf /usr/share/zoneinfo/Europe/Prague /etc/localtime

Pro synchronizaci času z internetu si povolíme odchozí komunikaci pro protokol NTP, jedná se o UDP port 123. Do souboru/etc/sysconfig/iptables přidáme následující pravidla

-A OUTPUT -p udp --dport 123 -j ACCEPT

provedeme reload

# systemctl reload iptables
# systemctl reload ip6tables

a dále nainstalujeme potřebný software, provedeme první synchronizaci, povolíme start služby při bootu a službu zapneme

# yum install -y ntp
# ntpdate pool.ntp.org
# systemctl enable ntpd
# systemctl start ntpd

Zkontrolujeme čas příkazem

# date

Zde bych opět rád upozornil, že ve větších sítích bývá lokální časový server, který je synchronizovaný s internetem a který poté dodává čas všem ostatním serverům uvnitř.

SELinux

Jak jsem již dříve slíbil, řekneme si pár slov o SELinuxu. Jedná se o rozšířenou bezpečnost, která nám ve zkratce definuje oprávnění na úrovni procesů a uživatelů. Na úrovni jádra přidává kontrolní body pro různá volání, ve kterých potom tyto operace povoluje/zakazuje. SELinux je jeden ze zásadních důvodů, které mě donutily opustit Debian, protože jeho údržba v této distribuci poněkud vázne.

V našem případě se setkáme s oprávněním pro soubory a síťovou komunikaci. Problematika SELinuxu je celkem komplexní, proto vás pro detailnější informace odkážu přímo na seriál o SELinuxu. Nebojte, pokud nechcete studovat celý SELinux, je v tomto návodu vše potřebné pro naše úkoly.

Je škoda, že velká část návodů začíná krokem „Vypnutí SELinuxu“, v našem případě naopak zkontrolujeme, jestli je zapnutý a má správné nastavení. V souboru/etc/sysconfig/selinux by mělo být:

SELINUX=enforcing
SELINUXTYPE=targeted

pokud není, nastavení upravíme a provedeme

# touch /.autorelabel
# reboot

Po restartu by mělo vše fungovat. Targeted není sice nejrestriktivnějším typem, ale měl by nám dobře posloužit pro všechny běžné služby. Je možné nastavit ještě typ mls, ale to už chce hlubší znalosti SELinuxu a spoustu ladění.

ješte si nainstalujeme pár užitečných utilit

# yum install -y setools-console policycoreutils-python

Pokud nejsme na SELinux zvyklí, často se nám může ze začátku stávat, že různé služby budou hlásit chyby typu „permission denied“ a nebudeme tušit proč. Oprávnění na soubory budou v pořádku, firewall nastavený správně a přesto to nebude fungovat. Většinou za to v takovém případě může právě SELinux a než se pustíte do hledání neexistujících chyb, zkuste si zobrazit výpis auditu a poté zopakovat nefunkční akci. Osobně mám výpis tohoto logu při instalaci a konfiguraci nových služeb zapnutý nepřetržitě.

# tail -f /var/log/audit/audit.log

Tím máme hotové základní nastavení serveru a v příští části se podíváme na zajímavější služby.

Našli jste v článku chybu?