Przejdź do treści

Serwer poczty na FreeBSD 13 (cz. 5): Dovecot — POP3, IMAP i skrzynki

Baza danych gotowa (część 4). Zanim postawimy SMTP (Postfix), instalujemy Dovecot — serwer POP3/IMAP, żeby najpierw zorganizować obsługę skrzynek. Skonfigurujemy Maildir, SSL/TLS, Sieve, quotę oraz uwierzytelnianie kont z bazy MySQL.

📅 Wersje z epoki (2021). To najbardziej „konfiguracyjna" część serii — ścieżki i opcje pochodzą z projektu z 2021 r. (Dovecot 2.x). Sprawdź składnię w dokumentacji swojej wersji.

Instalacja Dovecot (z obsługą MySQL)

Dovecota kompilujemy z portów, włączając opcję MYSQL:

make config -C /usr/ports/mail/dovecot
portmaster -dG mail/dovecot
portmaster -dG mail/dovecot-pigeonhole

dovecot-pigeonhole dodaje obsługę języka Sieve (RFC 5228) i protokołu ManageSieve (RFC 5804) — interpreter Sieve filtruje przychodzące wiadomości wg skryptu (dostarczanie do folderów, przekazywanie, odrzucanie itd.).

Konfiguracja Dovecot z obsługą MySQL.

Informacje poinstalacyjne Dovecota.

Dodajemy Dovecota do uruchamianych przy starcie systemu i kopiujemy przykładowe pliki konfiguracyjne.

Dodanie Dovecota do startu systemu i skopiowanie plików konfiguracyjnych.

Konfiguracja plików Dovecot

/usr/local/etc/dovecot/conf.d/10-auth.conf:

disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-sql.conf.ext

/usr/local/etc/dovecot/conf.d/10-mail.conf:

# miejsce przechowywania skrzynek
mail_location = maildir:/usr/local/virtual/%d/%n
# organizacja folderów w skrzynce
namespace inbox {
  type = private
  separator = /
  mailbox Sent  { auto = subscribe  special_use = \Sent }
  mailbox Drafts{ auto = subscribe  special_use = \Drafts }
  mailbox Trash { auto = subscribe  special_use = \Trash }
  mailbox Junk  { auto = subscribe  special_use = \Junk }
}
# ustawienie uid i gid na vscan
first_valid_uid = 110
last_valid_uid = 110
first_valid_gid = 110
last_valid_gid = 110
# dodatkowe wtyczki
mail_plugins = mail_log notify

/usr/local/etc/dovecot/conf.d/10-master.conf:

unix_listener auth-userdb {
  mode = 0666
  user = vscan
  group = vscan
}
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  mode = 0666
  user = postfix
  group = postfix
}

Ustawienia w pliku 10-master.conf.

/usr/local/etc/dovecot/conf.d/10-ssl.conf:

ssl = yes
ssl_cert = </usr/local/etc/ssl/dovecot/cert.pem
ssl_key  = </usr/local/etc/ssl/dovecot/key.pem
ssl_ca   = </usr/local/etc/ssl/dovecot/cert.pem
ssl_verify_client_cert = yes
ssl_dh = </usr/local/etc/ssl/dovecot/dh.pem
ssl_min_protocol = TLSv1.2

Ustawienia w pliku 10-ssl.conf.

/usr/local/etc/dovecot/conf.d/15-lda.conf:

postmaster_address = bartosz@bryniarski.pl
hostname = projekt.brylka.net
sendmail_path = /usr/local/sbin/sendmail
lda_mailbox_autocreate = yes
protocol lda {
  mail_plugins = $mail_plugins sieve
}

Ustawienia w pliku 15-lda.conf.

/usr/local/etc/dovecot/conf.d/20-imap.conf:

protocol imap {
  mail_plugins = $mail_plugins quota imap_quota zlib
}

Ustawienia w pliku 20-imap.conf.

/usr/local/etc/dovecot/conf.d/20-pop3.conf:

pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
protocol pop3 {
  mail_plugins = $mail_plugins
}

Ustawienia w pliku 20-pop3.conf.

/usr/local/etc/dovecot/conf.d/90-plugin.conf:

plugin {
  expire = Trash
  mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
  mail_log_fields = uid box msgid size
}
plugin {
  sieve = /var/mail/vhosts/%d/%n/.dovecot.sieve
  sieve_dir = /var/mail/vhosts/home/%d/%n/sieve
  sieve_global_path = /var/mail/vhosts/default.sieve
  mail_home = /var/mail/vhosts/%d/%n
}

Ustawienia w pliku 90-plugin.conf.

/usr/local/etc/dovecot/conf.d/90-quota.conf — usługa ostrzegania o przepełnieniu + reguły quoty:

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = dovecot
  unix_listener quota-warning {
    user = vscan
  }
}
plugin {
  quota = maildir:User quota
  quota_rule  = *:storage=1G
  quota_rule2 = Trash:storage=+30%%
  quota_rule3 = Sent:storage=+30%%
  quota_warning  = storage=90%% quota-warning 90 %u
  quota_warning2 = storage=75%% quota-warning 75 %u
  quota_exceeded_message = Storage quota for this account has been exceeded, please try again later.
}

Ustawienia w pliku 90-quota.conf.

Tworzymy skrypt /usr/local/bin/quota-warning.sh wysyłający informację o przepełnionej skrzynce:

Skrypt wysyłający informacje o przepełnionej skrzynce.

Maildir, Sieve i Maia

Tworzymy katalog na skrzynki oraz domyślny skrypt Sieve, a następnie go kompilujemy:

mkdir -p /var/mail/vhosts
# utwórz /var/mail/vhosts/default.sieve (reguły antyspamowe)
sievec /var/mail/vhosts/default.sieve

Plik default.sieve.

Instalujemy Maia‑Mailguard (webowy interfejs do amavisd‑new i SpamAssassin). Włączamy opcje APACHE, DOVECOT2, PFA, POSTFIX, WEBHOST:

make config -C /usr/ports/security/maia
portmaster -dG --no-confirm security/maia

Razem z Maią doinstalują się m.in. Postfix, PostfixAdmin, SpamAssassin — ich konfigurację omówimy w kolejnych częściach.

Informacje poinstalacyjne Maia (wpisy do rc.conf).

Zmieniamy hasło użytkownika vscan i nadajemy prawa do katalogu skrzynek:

passwd vscan

Nadanie praw do katalogu /var/mail/vhost.

Uwierzytelnianie z bazy MySQL

/usr/local/etc/dovecot/dovecot-sql.conf.ext — łączymy Dovecota z bazą postfix (skrzynki + quota):

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix_sql_password
default_pass_scheme = MD5
password_query = SELECT password, CONCAT('*:bytes=', quota) AS userdb_quota_rule \
  FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT CONCAT('/usr/local/virtual/', maildir) as home, 110 AS uid, \
  110 AS gid, CONCAT('*:bytes=', quota) AS quota_rule \
  FROM mailbox WHERE username = '%u' AND active = '1'

Edycja pliku dovecot-sql.conf.ext.

Ustawienia w pliku dovecot.conf.

Dodajemy użytkownika dovecot do grupy vscan i tworzymy certyfikaty oraz klucze:

pw usermod dovecot -G vscan

Tworzenie certyfikatów i kluczy.

Zabezpieczenie plików kluczy przed odczytem przez niepowołanych użytkowników.

Co dalej

W części 6 instalujemy i konfigurujemy Postfix (SMTP) oraz PostfixAdmin — serce wysyłki poczty i zarządzanie domenami/skrzynkami z poziomu WWW.