Hlavní navigace

Stavíme vlastní e-mailový server: webmail RainLoop

Michal Pastrňák

Jako webmail použijeme RainLoop. Po dlouhé nadvládě RoundCube je to první systém, který se dostal do slušně použitelného stavu, i když má ještě nedostatky. Pro rodinu mi ale přijde velmi vhodný.

Začínáme s RainLoop

Nevýhody RainLoop, které jsem objevil:

  • Systémové složky jsou vždy nahoře, ostatní pod čarou. Pokud má systémová složka i podsložku, ta se také zobrazí až dole, je to zvláštní, ale dá se na to zvyknout.
  • Plugin pro změnu hesla v SQL existuje, rozchodil jsem ho, ale je problematická kontrola složitosti hesla. Je to hardcoded v RainLoopu a je potřeba to ručně přepsat tak, aby to odpovídalo postfixadminu. Pokud by byl zájem, vykuchám to a zveřejním, ale je potřeba počítat s tím, že při případné aktualizaci se to přepíše.
  • Nekonfigurovatený interval zjišťování zpráv, 2 minuty doručená pošta a nějakých 5–7 minut ostatní složky.
  • V kontaktech nelze vytvářet skupiny.

Pustíme se tedy do instalace:

# yum install -y unzip
# mkdir /var/www/mail.testemail.cz/rainloop
# cd /var/www/mail.testemail.cz/rainloop
# curl -O https://www.rainloop.net/repository/webmail/rainloop-community-latest.zip
# unzip rainloop-community-latest.zip
# chown -R apache:apache .
# find . -type d -exec chmod 750 {} \;
# find . -type f -exec chmod 640 {} \;
# cd ~

Tím je RainLoop stažený a má nastavena potřebná oprávnění. V konfiguraci/etc/httpd/conf.d/mail.testemail.cz.conf změníme:

DocumentRoot /var/www/mail.testemail.cz/rainloop

a obnovíme nastavení

systemctl reload httpd

V dalším kroku by nás opět pozlobil SELinux, nastavíme oprávnění na složku data

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

Nyní přejdeme v prohlížeči na adresu https://mail.testemail.cz/?admin a přihlásíme se výchozím jménem admin a heslem 12345. V horní čísti máme odkaz na změnu hesla, tak jej použijeme. Pod odkazem General můžeme nastavit jazyk. Dále uvedu postup pro českou verzi, ale určitě není problém nastavit to stejné i v angličtině.

Nastavení

Přejdeme do nastavení Domény a smažeme pomocí ikonek košů předdefinované záznamy (pokud nechceme nějaký použít). Můžeme Přidat sedoménu a nastavit následujícím způsobem:

Název:        testemail.cz
IMAP
Server:       mail.testemail.cz
Zabezpečení:  STARTTLS
Port:         993
SMTP
Server:       mail.testemail.cz
Zabezpečení:  STARTTLS
Port:         587
Zatrhnout:    Použivat authentikaci

Nyní klikneme na SIEVE konfigurace a nastavíme následovně

Zatrhnout:    Povolit SIEVE skripty
Zatrhnout:    Povolit vlastní uživatelské skripty
Server:       mail.testemail.cz
Port:         4190
Zabezpečení:  STARTTLS

Pokud nyní vyzkoušíme test, tak zjistíme, že nic nefunguje. Nebudu vás zbytečně trápit a rovnou vám prozradím, že se ozval SELinux, který blokuje připojení Apache na porty poštovních služeb, takže si nastavení upravíme. Nejdříve si v terminálu zapneme výpis auditu

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

a vyzkoušíme znovu test ve webovém rozhraní – dostaneme několik řádků výpisu, z nichž ty zajímavé vypadají takto:

type=AVC msg=audit(1495350178.443:3579): avc:  denied  { name_connect } for  pid=15074 comm="httpd" dest=143 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:pop_port_t:s0 tclass=tcp_socket

chce to trochu zkušenosti, ale není zase takový problém dohledat, co nás zajímá. Zkusíme si z logu vyfiltrovat vše, co nás zajímá, tedy porty 993, 587 a 4190:

# egrep "comm=\"httpd\" dest=(143|587|4190)" /var/log/audit/audit.log

a pokud vypadá výpis dobře (skládá se pouze z výše uvedených řádků, s různými porty), pošleme výstup do utility audit2allow

# egrep "comm=\"httpd\" dest=(143|587|4190)" /var/log/audit/audit.log | audit2allow -a
#============= httpd_t ==============

#!!!! This avc can be allowed using one of the these booleans:
#     httpd_can_network_connect, httpd_can_sendmail, nis_enabled
allow httpd_t pop_port_t:tcp_socket name_connect;

#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
allow httpd_t sieve_port_t:tcp_socket name_connect;

#!!!! This avc can be allowed using one of the these booleans:
#     httpd_can_network_connect, httpd_can_sendmail, nis_enabled
allow httpd_t smtp_port_t:tcp_socket name_connect;

Utilita nám radí, kterou volbu (boolean) můžeme nastavit, aby komunikace fungovala, ale my si vytvoříme vlastní politiku, už proto, že jedinou možností, jak pomocí booleanu povolit sieve, je povolit ‚ httpd_can_network_connect ‘, což by povolilo připojení apache k čemukoliv.

Vytvoříme si tedy novou politiku s názvem httpd_email

# egrep "comm=\"httpd\" dest=(143|587|4190)" /var/log/audit/audit.log | audit2allow -a -M httpd_email

což nám v aktuálním adresáři vytvoří dva soubory – httpd_email.te , což je čitelný zápis a httpd_email.pp , což je zkompilované pravidlo, které hned nainstalujeme:

# semodule -i httpd_email.pp

Po drobné komplikaci vyzkoušíme opět test a tentokrát by již mělo být vše v pořádku a konfiguraci můžeme uložit.

Další funkce

Rainloop nám nabízí také možnost správy kontaktů, která se může hodit, ale k tomu potřebuje databázi, kterou si vytvoříme

# mysql -u root -p
SQL> create database rainloop;
SQL>grant all privileges on rainloop.* to "rainloop"@"localhost" identified by 'tajne_heslo';
CTRL+D

a v nastavení kontaktů je povolíme a úložiště nastavíme následovně:

Typ:       MySQL
Dsn:       mysql:host=localhost;port=3306;dbname=rainloop
Uživatel:  rainloop
Heslo:     tajne_heslo

Ještě jedna poznámka k přílohám přes webmail. Výchozí velikost souborů posílaných přes PHP je 2M, můžeme upravit volbou v souboru /etc/php.ini , například na

upload_max_filesize = 10M

a poté reloadujeme nastavení apache

# systemctl reload httpd

Na stránce https://mail.testemail.cz/ se můžeme přihlásit na našeho uživatele (login je celá e-mailová adresa, pokud jste si to nenastavili jinak) a otestovat dle libosti.

Ještě upozorním, že výchozí maximální velikost e-mailu je v postfixu nastavena na 10M, tato hodnota lze změnit volbou message_size_limit .U této volby je potřeba počítat s tím, že přílohy se většinou posílají kódované jako base64, což znamená, že z každého byte je použito pouze 6 bitů, takže výsledná velikost přílohy je v tomto zápisu zhruba o třetinu větší (ještě se přidávají konce řádků).

Co dál?

Tím už máme server opravdu kompletní, ale stále je co zlepšovat. Vzhledem k blížícím se prázdninám a rodinným povinnostem si nejsem zcela jistý, jestli další část stihnu dokončit do týdne, ale určitě budeme pokračovat.

Mám spoustu poznámek a námětů z diskuzí, určitě si popíšeme něco ohledně dalšího zabezpečení, například fail2ban, základní úlohy při správě serveru, hledání potíží, řekneme si něco o metrikách, které je možné (a vhodné) monitorovat a také něco málo o zálohování.

Našli jste v článku chybu?