Wirtualne konta w oparciu o postfixa i dovecota bez uzycia baz danych

W dobie wszechobecnych systemów pocztowych działających w oparciu o bazy danych, co ma swoje ogromne zalety ale też ma jedną wadę - złożoność takiego system a to powoduje potrzebę zrezygnowania w niektórych przypadkach z używania serwera baz. Jako wadę można również uznać obciążenie dodatkowych zasobów serwera. Oczywiście rozwiązania oparte na bazie danych najlepiej sprawdzają się przy sporej ilości kont oraz gdy mamy potrzebę redundancji czy równoważenia obciążenia na wiele serwerów. No tak, ale niektórzy klienci obawiają się nowości i wolą sprawdzone (stare) rozwiązania i o tym m.in. będzie ten post.

Problem: Stworzenie systemu poczty elektronicznej z wykorzystującego wirtualne konta bez potrzeby tworzenia kont systemowych.

Rozwiązanie: pogodzenie postfiksa i dovecota

Przepis:
1. Instalujemy wymagane pakiety:
apt-get install postfix dovecot-common dovecot-imapd dovecot-pop3d
2. Konfigurujemy postfiksa:
smtpd_banner = $myhostname ESMTP
biff = no
append_dot_mydomain = no
smtp_use_tls=yes
smtpd_use_tls=yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_cert_file = /etc/ssl/certs/mycert.crt
smtpd_tls_key_file = /etc/ssl/certs/mycert.key
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
myhostname = mx.serwer.pl
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = mx.serwer.pl, serwer.pl, localhost
relayhost =
mynetworks = 127.0.0.0/8
mailbox_command = procmail -a "$EXTENSION"
recipient_delimiter = +
inet_interfaces = all
smtp_helo_name = $myhostname
mailbox_size_limit = 0
message_size_limit = 0
readme_directory = no
unknown_local_recipient_reject_code = 550
smtp_helo_timeout = 240s
smtp_connect_timeout = 60s
smtpd_recipient_limit = 16
smtpd_error_sleep_time = 3
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12
delay_warning_time = 12h
bounce_queue_lifetime = 2d
maximal_queue_lifetime = 3d
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
queue_run_delay = 15m
inet_protocols = ipv4
home_mailbox=Maildir/
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = $myhostname
smtpd_helo_required = yes
unknown_hostname_reject_code = 550
unknown_address_reject_code = 550
unknown_local_recipient_reject_code = 550
unknown_client_reject_code = 550
smtpd_helo_restrictions = reject_unauth_pipelining,
reject_invalid_helo_hostname,
permit
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_client_access hash:/etc/postfix/whitelist,
reject_non_fqdn_hostname,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
reject_unknown_hostname,
reject_unverified_sender,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client cbl.abuseat.org,
permit
smtpd_sender_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_unknown_address,
reject_unauth_pipelining,
warn_if_reject reject_unverified_sender,
permit
smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_pipelining,
permit
virtual_mailbox_domains = /etc/postfix/vhosts
virtual_mailbox_base = /var/spool/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_uid_maps = static:108
virtual_gid_maps = static:8
virtual_alias_maps = hash:/etc/postfix/valias
virtual_mailbox_limit = 0


Dodajemy systemowego usera vmail w grupie mail:
adduser --system --group mail --home /var/spool/vmail vmal
Teraz trzeba wyedytować trzy pliki: vmaps - gdzie mapujemy użytkownika na dany katalog, valias - gdzie tworzymy aliasy oraz vhosts - gdzie wpisujemy wirtualne domeny. Dodatkowo w pliku whitelist możemy umieszczać domeny, z których chcemy, aby na pewno poczta docodziła bez poddawania testom na poprawność domeny itd.
vmaps:
user@domena.pl domena.pl/user/
valias:
alias@domena.pl user@domena.pl vhosts:
domena.pl OK
3. Konfigurujemy dovecota:
protocols = imap imaps pop3 pop3s
listen = *
log_path = /var/log/dovecot
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl_listen =
ssl_disable = no
ssl_cert_file = /etc/ssl/certs/mycert.crt
ssl_key_file= /etc/ssl/certs/mycert.key
ssl_parameters_regenerate = 24
verbose_ssl = yes
login_dir = /var/run/dovecot/login
login_chroot = yes
login_user = dovecot
mail_privileged_group = mail
valid_chroot_dirs = /var/spool/vmail
default_mail_env = maildir:/var/spool/vmail/%d/%n
first_valid_uid = 108
last_valid_uid = 108
auth_verbose = yes
auth_debug = yes
disable_plaintext_auth = no
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
mechanisms = plain login
passdb passwd-file {
args = /etc/dovecot/passwd
}
userdb passwd-file {
args = /etc/dovecot/user
}
user = root
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
dict {
}
plugin {
}

Tworzymy dwa pliki w katalogu /etc/dovecot: user oraz passwd, są one odpowiednikami systemowych passwd i shadow:
passwd:
user@domena.pl:tutaj_wstaw_hash_md5
user:
user@domena.pl::108:8::/var/spool/vmail/domena.pl/user/:/bin/false::
5. Jeżeli wszystko zrobiliśmy poprawnie wszystko powinno działać bez problemów. Podaną konfigurację można rozszerzyć o system antyspamowy i antywirusowy.