Vlastní mailserver ad1)

Rozhodl jsem se popsat od nuly jak nastavit vlastní mailserver pod Linuxem, vzhledem k tomu, že nejsem Linux admin tak jsem si pomohl velmi hezkým českým návodem ze serveru http://root.cz.

ORIGINÁLNÍ SERIÁL „STAVÍME VLASTNÍ E-MAILOVÝ SERVER“ NA ROOT.CZ

Pojedu přesně podle výše uvedeného seriálu s tím, že zde budu uvádět zkrácené informace a nebudu tak detailní jako v seriálu (případně budu citovat). Do detailu budu zacházet v rozdílech a nebo při doplnění uvedeného seriálu.

Server budu provozovat na vlastní doméně a jeho provoz budu plně virtualizovat na Hyper-V (platforma Windows Server 2019 STD, X64). Do začátku dám serveru 4GB operační paměti a dvě jádra CPU.

Stejně jako v seriálu využiji CentOS ale ve verzi 8. Stáhl jsem konkrétně CentOS-8.2.2004-x86_64-minimal.iso.

Ze začátku si musíme stanovit, jak bude vypadat veřejná adresa serveru. Pro potřeby návodu budu používat IP adresu veřejné přípojky 123.123.123.100 a v DNS bude zavedena jako mx.mojedomena.cz .

Instalace OS

Instalace OS na 400GB disk probíhala běžně v GUI, jazyk serveru jsem kvůli občas matoucím překladům ponechal na angličtinu. Ale přidal jsem si české rozložení klávesnice a dal si ho jako výchozí. Ve výběru „Software Selection“ jsem zvolil jako profil pro instalaci „Server“. V „Network & Host Name“ jsem povolil síť a nastavil jsem hostname na „mx.mojedomena.cz“.

během instalace serveru jsem nastavil heslo pro root uživatele a vytvořil si vlastního uživatele pro správu. osobně doporučuji mít hesla k rootu na každý server jiná a bokem si je poznamenat.

Poznámka: tam kde to jde tak výchozí admin účet zakazuji nebo omezuji co to jde. Zvlášť, když není možné u něj změnit uživatelské jméno.

Poznámka autora

Pokud i vy, stejně jako já, řídíte síť pomocí DHCP, tak určitě v této chvíli nastavte serveru rezervaci IP adresy.

Po instalaci a nutném restartu naběhl terminál serveru.

V rámci návodu na root.cz se mluví o tom, že je dobré odinstalovat DHCP klienta a mít nastavenou síť staticky. Vzhledem k tomu, že svou síť řídím pomocí DHCP, tento krok vynechávám. Pokud tak chcete učinit:

yum remove -y dhclient

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

https://www.root.cz/clanky/stavime-vlastni-e-mailovy-server-zakladni-nastaveni-systemu/

Vzdálený přístup

Ve výchozí výše popsané instalaci má server aktivní přístup přes SSH na portu 22. Jelikož mám server za Firewallem a budu na něj přistupovat výhradně z místní sítě (PC fyzicky v budově nebo pomocí VPN), tak přeskakuji v návodu část o zabezpečení SSH „Nastavení SSH“. Podotýkám ale, že návod je v tomto ohledu dobrý a pokud chcete SSH mít veřejné tak je dobré jej maximálně zabezpečit.

Pokud jako já nejste úplně Linux admini, vložím sem malé info, které by mohlo dost pomoci – mě tedy pomohlo. Používám pro administraci a přístup na terminál aplikaci Putty. Je sice super, že spoustu věcí při psaní příkazů doplníte klávesou TAB (například adresáře a složky), velkým pomocníkem vzhledem k tomu, že nefunguje CTRL+V i informace, že text ze schránky do terminálu vložíte kliknutím pravým tlačítkem myši do terminálu.

Poznámka autora

Instalace EPEL repozitáře

V návodu je zmíněna instalace EPEL repo v části „Aktualizace systému“. Příkaz v návodu uvedený je pro CentOS 7, popíši tedy tento blok návodu v modernizované verzi :).

Zdroj informací: How To Enable and Install EPEL Repo on CentOS 8

Přihlásil jsem se přes SSH na svůj účet a zvýšil si práva n roota

su

Zkuste si, zda aktuálně máte k dispozici EPEL ke stažení

yum search epel
yum info epel-release

Výstup by měl vypadat zhruba takto, tedy žádný error:

CentOS-8 - Base                                                                                                                                                                                                                                 4.3 kB/s | 3.9 kB     00:00    
CentOS-8 - Extras                                                                                                                                                                                                                               1.7 kB/s | 1.5 kB     00:00    
Available Packages
Name         : epel-release
Version      : 8
Release      : 8.el8
Architecture : noarch
Size         : 23 k
Source       : epel-release-8-8.el8.src.rpm
Repository   : extras
Summary      : Extra Packages for Enterprise Linux repository configuration
URL          : http://download.fedoraproject.org/pub/epel
License      : GPLv2
Description  : This package contains the Extra Packages for Enterprise Linux (EPEL) repository
             : GPG key as well as configuration for yum.

No a teď je potřeba EPEL nainstalovat

sudo yum install epel-release

Během instalace vše potvrďte. EPEL se váže ještě na balíčky a závislosti s PowerTools, takže to doladíme

sudo yum config-manager --set-enabled PowerTools

Nečekejte, že uvidíte nějakou zpětnou vazbu, prostě se kód provede. Pokud uvidíte chybu tak doinstalujte

sudo yum install 'dnf-command(config-manager)'

A spusťte příkaz výše znovu.

Nyní provedeme UPDATE systému

sudo yum update

A aktualizujeme i repozitáře

sudo yum repolist

A teď už se vracíme zpět k návodu z root.cz :).

Pro jistotu ještě jednou update a reboot, ať se server nenudí.

yum update
reboot

osobně souhlasím s tím, že autor seriálu vyřadil firewallID a použil iptables, takže kód zkopíruji + přidávám úvodní přihlášení jako root

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

Nyní je potřeba otevřít a upravit pravidla Firewallu, mám rád editor nano, takže použiji ten

nano /etc/sysconfig/iptables

Ovládání editoru NANO je ze začátku trochu matoucí, všimněte si spodní „lišty“, je tam uveden seznam příkazů se symbolem ^. Když místo symbolu ^ použijete CTRL tak máte ovládání :). Tedy stručně:
CTRL+O = zapsat změny, zeptá se na název souboru a buď přepíše nebo uloží.
CTRL+X = ukončení editoru (nezapomeňte uložit!!!)

Poznámka autora

Obsah souboru upravíme dle doporučení takto

*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

Cituji odůvodnění, které je přesné

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.

https://www.root.cz/clanky/stavime-vlastni-e-mailovy-server-zakladni-nastaveni-systemu/

Spustíme Firewall

systemctl start iptables
systemctl start ip6tables

Nyní nastavíme několik drobností, jednou z nich je synchronizace času, ta je u mailserveru velmi důležitá. Nejprve ověřte, jakou časovou zónu na serveru máte

ll /etc/localtime

Pokud tam stejně jako já máte Europe/prague (nastaveno během instalace serveru) tak je to OK, pokud ne tak je možné časovou zónu upravit

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

Čas si můžete zkontrolovat příkazem

date

A jak tedy na automatickou synchronizaci? Vzpomínáte na Firewall a jeho striktní zakázání většiny komunikace? No musíme jít a povolit synchronizaci.

nano /etc/sysconfig/iptables

Přidejte do pravidel tento řádek, před COMMIT

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

Tím povolíte komunikaci na portu UDP123, tedy primárně protokol NTP.

Nyní restartujeme firewall aby se aplikovali změny.

systemctl reload iptables
systemctl reload ip6tables

Nyní nahodíme balíčky pro synchronizaci a zapneme jí.

yum install chrony
systemctl enable chronyd

Pokud chcete upravit server, ze kterého čas stahovat tak je třeba upravit konfigurační soubor chrony.

nano /etc/chrony.conf

Na jednom z prvních řádků je seznam poolů – tedy serverů s odkazy na další servery. Dále restartujeme službu pro synchronizaci času.

systemctl restart chronyd

Je velmi důležité vědět s čím pracujeme a v další části budeme pracovat s SELinux, proto zde vložím krátkou citaci z původního návodu.

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í.

https://www.root.cz/clanky/stavime-vlastni-e-mailovy-server-zakladni-nastaveni-systemu/

Kde je nastavení SELinuxu?

nano /etc/sysconfig/selinux

V nastavení by nemělo být zaremováno (zapoznámkováno, skryto, …)

SELINUX=enforcing
SELINUXTYPE=targeted

Pokud v souboru provede změnu, je třeba ji zavést a restartovat server.

touch /.autorelabel
reboot

U mě bylo vše ve výchozím v pořádku a nastavené.

Autor doporučuje ještě instalaci dodatečných utilit

yum install -y setools-console
yum install -y policycoreutils-python

Mě se ovšem druhou zmíněnou nepodařilo nainstalovat, zatím ji vynechávám.

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ě.

https://www.root.cz/clanky/stavime-vlastni-e-mailovy-server-zakladni-nastaveni-systemu/
tail -f /var/log/audit/audit.log

Základní server je tedy dle seriálu a i mého názoru OK. Jdeme na druhý díl.

Zdroje informací

Leave a Reply