Każdy z nas wie czym jest poczta e-mail, czym jest serwer poczty elektronicznej i pewnie większość wie, jak wygląda proces od wysłania wiadomości do jej przesłanie i odebrania. W większości ludzie korzystają z darmowych skrzynek portalowych, takich jak wp, onet, interia czy gmail. Mają one niewątpliwie ogromną zaletę. Są darmowe i z reguły niezawodne. Na tym jednak niestety zalety się kończą, no może poza tym, że nie musimy się o nic martwić. Ilość reklam w portalowych skrzynkach potrafi nabawić bólu głowy nawet największych entuzjastów darmowych skrzynek. Na tym polu gmail, yahoo i inni zagraniczni dostawcy, jak choćby protonmail, daleko o lata świetlne wyprzedzają polskie firmy.

Jeśli jednak chcemy mieć pocztę własną, w naszej firmowej domenie to już tak “darmowo” i prosto nie jest. Zarówno w Polskich, jak i zagranicznych portalach istnieje możliwość wykupienia płatnej skrzynki, pozbawionej reklam, we własnej firmowej domenie, ale jest to już jakiś koszt. Kiedy więc o koszty chodzi, czasem warto zastanowić się czy nie lepiej mieć własną pocztę, we własnej domenie, na własnych serwerach. Z pewnością dla jednej czy dwóch skrzynek koszt dobrego serwera będzie przewyższał koszt skrzynki w portalu z firmową domeną, ale dla kilkunastu skrzynek lub kilkudziesięciu własne rozwiązanie często okaże się znacznie bardziej korzystne cenowo.

W dzisiejszym poradniku pokażę wam, jak w prosty sposób uruchomić własny serwer poczty e-mail, we własnej domenie. To nie będzie oczywiście kompendium wiedzy o tym co można zrobić, bo temat jest bardzo obszerny, ale mam nadzieję zarysować i pomóc rozwiać wątpliwości związane z tematem.

Rozeznanie i przygotowania

Mamy na rynku kilka serwerów poczty e-mail. Najbardziej popularne są dwa: postfix oraz exim. Istnieje jeszcze kilka mniejszych silników jak qmail, ale nie jest on już rozwijany od wielu wielu lat, przez co nie warto się nim zajmować.

W dzisiejszym poradniku uruchomimy serwer e-mail na przykładzie Postfix’a. Dorzucimy do niego panel do zarządzania serwerem przez www. Tutaj także mamy dwa najbardziej znane i używane rozwiązania: doskonale wszystkim znany postfixadmin oraz vimbadmin, równie proste, użyteczne i nieco ładniejsze rozwiązanie, które z powodzeniem spotykałem w wielu dużych firmach i to właśnie na przykładzie ViMbAdmin’a powstaje dzisiejszy tekst i rozwiązanie kompleksowego zarządzania serwerem e-mail.

Niezbędne:

  • serwer z systemem Linux
  • przynajmniej 2x vCPU, 4GB RAM, 40GB dysk (najlepiej SSD lub NVMe)
  • domena, którą ustawimy w poczcie
  • aplikacja pocztowa – np. darmowy Thunderbird

Przygotowanie serwera

Przygotowanie serwera powinno zacząć się od tego, że system powinien być czysty. Tak jest najlepiej, instalujemy niezbędne pakiety, unikamy konfliktów i problemów z wersjonowaniem. Instalujemy zatem czysty system operacyjny. Na potrzeby niniejszego poradnika będzie to najnowszy Debian 10 Buster.

Instalacja serwera e-mail, pop3, imap

Na początek musimy zainstalować niezbędne pakiety serwera pocztowego:

apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mariadb-server dovecot-sieve dovecot-managesieved

Podczas instalacji konfigurator pakietu zapyta nas o kilka ważnych informacji. Można je także potem zmienić.

Po zainstalowaniu wszystkich pakietów niezbędne będzie wykonanie przynajmniej podstawowej konfiguracji.

Koniecznym jest włączenie w dzisiejszych czasach szyfrowania komunikacji. W innym przypadku portale, głównie te zagraniczne mogą blokować, odrzucać lub przynajmniej oznaczać takie e-maile jako podejrzane. Z pewnością warto wykonać kilka kroków konfiguracyjnych nie tylko dla wpuszczania takich wiadomości, ale też z oczywistych powodów bezpieczeństwa komunikacji.

nano /etc/postfix/master.cf

Aby włączyć komunikację na porcie 587 oraz 465 konieczne będzie ustawienie jak poniżej opcji:

submission inet n                –              y             –              –              smtpd

  -o syslog_name=postfix/submission

  -o smtpd_tls_security_level=encrypt

  -o smtpd_sasl_auth_enable=yes

  -o smtpd_tls_auth_only=yes

  -o smtpd_reject_unlisted_recipient=no

smtps     inet  n   –              y             –              –              smtpd

  -o syslog_name=postfix/smtps

  -o smtpd_tls_wrappermode=yes

  -o smtpd_sasl_auth_enable=yes

  -o smtpd_reject_unlisted_recipient=no

Zapisujemy konfigurację.

Tworzymy niezbędne pliki do obsługi poczty w MySQL przez serwer postfix:

cd /etc/postfix

virtual_alias_maps.cf

user = vimbadmin

password = password

hosts = 127.0.0.1

dbname = vimbadmin

query = SELECT goto FROM alias WHERE address = '%s’ AND active = '1′

virtual_domains_maps.cf

user = vimbadmin

password = password

hosts = 127.0.0.1

dbname = vimbadmin

query = SELECT domain FROM domain WHERE domain = '%s’ AND backupmx = '0′ AND active = '1′

virtual_mailbox_maps.cf

user = vimbadmin

password = password

hosts = 127.0.0.1

dbname = vimbadmin

table = mailbox

select_field = maildir

where_field = username

virtual_transport_maps.cf

user = vimbadmin

password = password

hosts = 127.0.0.1

dbname = vimbadmin

table = domain

select_field = transport

where_field = domain

additional_conditions = and backupmx = '0′ and active = '1′

Konfigurujemy dovecot’a do działania z MySQL:

cd /etc/dovecot

dovecot-sql.conf.ext

driver = mysql

connect = host=localhost user=vimbadmin password=password dbname=vimbadmin

default_pass_scheme = MD5

password_query = SELECT username as user, password as password, \

               homedir AS userdb_home, maildir AS userdb_mail, \

               concat(’*:bytes=’, quota) as userdb_quota_rule, uid AS userdb_uid, gid AS userdb_gid \

                FROM mailbox \

               WHERE username = '%Lu’ AND active = '1′ \

               AND ( access_restriction = 'ALL’ OR LOCATE( '%Us’, access_restriction ) > 0 )

user_query = SELECT homedir AS home, maildir AS mail, \

               concat(’*:bytes=’, quota) as quota_rule, uid, gid \

                FROM mailbox WHERE username = '%u’

dovecot-auth-sql.conf.ext

passdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql.conf.ext

}

userdb {

  driver = prefetch

}

userdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql.conf.ext

}

Konfiguracja Dovecot

nano /etc/dovecot/conf.d/10-logging.conf

auth_verbose = no

auth_debug = no

auth_debug_passwords = no

mail_debug = no

verbose_ssl = no

Pozostałe pliki konfiguracyjne:

/etc/dovecot/conf.d/10-auth.conf                                                                                                                                                                               

auth_mechanisms = plain login

!include auth-sql.conf.ext

—-

/etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:/srv/vmail/%d/%n

namespace inbox {

  inbox = yes

}

mail_uid = 2000

mail_gid = 2000

mail_privileged_group = vmail

first_valid_uid = 2000

last_valid_uid = 2000

maildir_copy_with_hardlinks = yes

/etc/dovecot/conf.d/20-pop3.conf

protocol pop3 {

  mail_plugins = $mail_plugins quota

}

/etc/dovecot/conf.d/20-managesieve.conf

service managesieve-login {

  inet_listener sieve {

                port = 4190

  }

  service_count = 1

}

service managesieve {

}

protocol sieve {

}

/etc/dovecot/conf.d/20-lmtp.conf

protocol lmtp {

                postmaster_address = postmaster@example.com

                mail_plugins = quota sieve

}

/etc/dovecot/conf.d/20-imap.conf

protocol imap {

  mail_plugins = $mail_plugins quota imap_quota

}

/etc/dovecot/conf.d/15-lda.conf

postmaster_address = postmaster@example.com

hostname = mail.mojapoczta.hosterion.pl

quota_full_tempfail = yes

recipient_delimiter = +

lda_mailbox_autocreate = yes

lda_mailbox_autosubscribe = yes

protocol lda {

  mail_plugins = $mail_plugins sieve quota

}

/etc/dovecot/conf.d/10-ssl.conf

ssl = yes

ssl_cert = </etc/postfix/ssl/mojapoczta.hosterion.pl.pem

ssl_key  = </etc/postfix/ssl/mojapoczta.hosterion.pl.pem

ssl_require_crl = no

/etc/dovecot/conf.d/10-master.conf

service imap-login {

  inet_listener imap {

                port = 143

  }

  inet_listener imaps {

                port = 993

                ssl = yes

  }

  service_count = 0

}

service pop3-login {

  inet_listener pop3 {

                port = 110

  }

  inet_listener pop3s {

                port = 995

                ssl = yes

  }

}

service lmtp {

  unix_listener /var/spool/postfix/private/dovecot-lmtp {

                group = postfix

                mode = 0666

                user = postfix

  }

}

service imap {

}

service pop3 {

}

service auth {

  unix_listener auth-userdb {

                mode = 0666

                user = vmail

                group = vmail

  }

  # Postfix smtp-auth

  unix_listener /var/spool/postfix/private/auth {

                mode = 0660

                user = postfix

                group = postfix

  }

}

service auth-worker {

}

service dict {

  unix_listener dict {

  }

}

Konfiguracja systemu

Aplikacja serwera pocztowego powinna być uruchomiona z użytkownikiem o niższych uprawnieniach, niż administrator root. W tym celu utworzymy dedykowaną grupę i dedykowanego użytkownika.

groupadd -g 2000 vmail

useradd -c 'Serwer poczty’ -d /srv/vmail -g 2000 -u 2000 -s /usr/sbin/nologin -m vmail

Generujemy certyfikat SSL dla Postfixa, Dovecota

mkdir -p /etc/postfix/ssl

openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/ssl/mojapoczta.hosterion.pl.pem -keyout /etc/postfix/ssl/mojapoczta.hosterion.pl.pem

chmod 0600 /etc/postfix/ssl/mojapoczta.hosterion.pl.pem

Aby dodatkowo wzmocnić bezpieczeństwo, skorzystamy z protokołu Diffiego Hellmana:

for len in 512 1024; do

    openssl genpkey -genparam -algorithm DH -out /etc/postfix/dh_${len}.pem \

        -pkeyopt dh_paramgen_prime_len:${len}

done

Dodatkowo wstawiamy do konfiguracji postfixa do pliku main.cnf w sekcji # TLS parameters zamiast tego, co tam jest:

smtpd_tls_cert_file = /etc/postfix/ssl/mojapoczta.hosterion.pl.pem

smtpd_tls_key_file = /etc/postfix/ssl/mojapoczta.hosterion.pl.pem

smtpd_use_tls = yes

smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_scache

smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache

smtpd_tls_loglevel = 1

smtpd_tls_auth_only = yes

smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem

smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem

smtpd_tls_eecdh_grade = strong

UWAGA! Pamiętajmy, że powyższe czynności to tak na dobrą sprawę początek. Samopodpisane certyfikaty są dobre do testów, środowisk stagingowych, ale nie powinny być używane w środowiskach produkcyjnych.

Zapisujemy wszystkie zmiany i testujemy, restartujemy serwisy.

systemctl restart dovecot.service

cd /etc/postfix

postmap main.cf

Jeśli komenda nie zwróciła błędów to znaczy, że postfix jest poprawnie skonfigurowany.

Dodajemy informację do postfixa, aby korzystał z użytkowników i ustawień z bazy danych.

virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cf

virtual_gid_maps = static:2000

virtual_mailbox_base = /srv/vmail

virtual_mailbox_domains = mysql:/etc/postfix/virtual_domains_maps.cf

virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf

virtual_minimum_uid = 2000

virtual_uid_maps = static:2000

#dovecot_destination_recipient_limit = 1

virtual_transport = lmtp:unix:private/dovecot-lmtp

systemctl restart postfix.service

Baza danych

Informacje o użytkownikach, domenach, aliasach itd. będziemy trzymać w bazie danych MySQL, dlatego musimy utworzyć niezbędną bazę i użytkownika dla naszej aplikacji.

CREATE DATABASE `vimbadmin`;

GRANT ALL ON `vimbadmin`.* TO `vimbadmin`@`localhost` IDENTIFIED BY 'password’;

FLUSH PRIVILEGES;

Instalacja PHP 7

Panel administracyjny ViMbAdmin według dokumentacji poprawnie pracuje aż do wersji PHP 7.4. My decydujemy się na PHP7.3 wyłącznie ze względu na to, że wersja ta jest dostępna bez dodatkowych repozytoriów już w Debianie 10.

apt-get install php7.3-cgi php-memcache php7.3-json php7.3-mysql php-gettext libapache2-mod-php7.3 apache2 php-zip zip unzip

Instalacja panelu administracyjnego serwerem pocztowym

export INSTALL_PATH=/srv/vimbadmin

Według mnie najlepszą metodą instalacji i późniejszej aktualizacji panelu jest skorzystanie z repozytorium gita, ale sam panel oferuje jeszcze instalację za pomocą composer’a, tar’a.

git clone https://github.com/opensolutions/ViMbAdmin.git $INSTALL_PATH

cd $INSTALL_PATH

composer install –prefer-dist –no-dev

Ustawiamy niezbędne uprawnienia:

chown -R www-data: $INSTALL_PATH/var

Konfiguracja aplikacji:

cp $INSTALL_PATH/application/configs/application.ini.dist $INSTALL_PATH/application/configs/application.ini

nano $INSTALL_PATH/application/configs/application.ini

resources.doctrine2.connection.options.driver   = 'pdo_mysql’

resources.doctrine2.connection.options.dbname   = 'vimbadmin’

resources.doctrine2.connection.options.user     = 'vimbadmin’

resources.doctrine2.connection.options.password = 'password’

resources.doctrine2.connection.options.host     = 'localhost’

cp $INSTALL_PATH/public/.htaccess.dist $INSTALL_PATH/public/.htaccess

Tworzymy tabele w bazie danych dla naszej aplikacji:

cd $INSTALL_PATH

./bin/doctrine2-cli.php orm:schema-tool:create

Konfiguracja vhost’a Apache2

Na początek upewniamy się, że mod_rewrite jest włączony. Jest on niezbędny.

a2enmod rewrite

nano /etc/apache2/conf-available/vimbadmin.conf

Alias /vimbadmin /srv/vimbadmin/public

<Directory /srv/vimbadmin/public>

    Options FollowSymLinks

    AllowOverride FileInfo

    Require all granted   

</Directory>

Zapisujemy konfigurację i aktywujemy:

a2enconf vimbadmin

Restartujemy apache2:

systemctl restart apache2

Przechodzimy do naszej strony, na której będzie pracował panel administracyjny. W naszym przypadku będzie to: http://mojapoczta.hosterion.pl/vimbadmin

Powinien pokazać się panel instalatora web.

Zgodnie z informacją, na początku podmieniamy ustawienia w pliku na te, które zostały wygenerowane w trakcie instalacji.

/srv/vimbadmin/application/configs/application.ini

Tworzymy nowego użytkownika:

Jeżeli wszystko zrobiliśmy poprawnie, powinniśmy otrzymać komunikat o poprawnym utworzeniu konta.

Musimy jeszcze wyedytować plik konfiguracyjny, aby wstawić odpowiedni algorytm haszowania haseł w bazie, taki sam, jak ustawimy w Dovecot. Na potrzeby niniejszego artykułu wykorzystamy MD5, ale są mocniejsze i warto z nich skorzystać. Aplikacja obsługuje wiele innych (dużo bezpieczniejszych) sposobów haszowania haseł.

Tworzenie domeny i kont

Ten końcowy etap nie powinien nikomu już sprawić problemów, ale na wszelki wypadek przejdźmy przez niego wspólnie.

Klikamy na górze w “Domain” oraz po prawej stronie na znaczek plusa, aby dodać nową domenę.

Dodajemy nowe konto poczty e-mail:

Sprawdzamy konto przy pomocy programu pocztowego, np. Thunderbird.

Nasz podstawowy serwer jest gotowy.

Podsumowanie

Umówmy się, że jest to wstępniak do prawdziwego systemu pocztowego na własnej infrastrukturze, we własnej domenie i na własnych serwerach. Niniejszy artykuł nie wyczerpuje całkowicie tematu związanego z systemem pocztowym, nie powinien być używany produkcyjnie. To jedynie zajawka do tego co można zrobić i jak to zrobić.

Przed przyszłym administratorem serwera pocztowego jest jeszcze masa pracy do wykonania, aby poprawnie skonfigurować serwer pocztowy, który będzie w pełni bezpieczny, niezawodny i funkcjonalny.