Ora possiamo proseguire con l' installazione di postfix e deovecot ed anche la parte piu' pallosa , la creazione di tanti piccoli file ...
ricordiamoci di cambiare la password da "your_secret_passwor" a quella che abbiamo scelto!!!
apt install postfix postfix-mysql dovecot-imapd dovecot-lmtpd dovecot-pop3d dovecot-mysql
iniziamo a creare la configurazione , anzi la dir dove metter la configurazione
mkdir -p /etc/postfix/sql
creiamo il file /etc/postfix/sql/mysql_virtual_domains_maps.cf
con dentro (e ricordiamoci di metter la nostra password):
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = '1'
creiamo il file /etc/postfix/sql/mysql_virtual_alias_maps.cf
:
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'
creiamo il file /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
:
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
creiamo il file /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
:
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
creiamo il file /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
:
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'
creiamo il file /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
:
user = postfixadmin
password = your_secret_password
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '%d' and mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
una volta creati questi file aggiorniamo la configurazione di postfix tramite i comandi postconf per utilizzare questi file (se vogliamo vedere la configurazione basat dare il comando postconf senza argomenti):
postconf -e "virtual_mailbox_domains = mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf"
postconf -e "virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf"
postconf -e "virtual_mailbox_maps = mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf, mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf"
la consegna locale dei messaggi viene fatta tramite lmtp(local mail transport protocol) , il quale prende la posta dall' MTA (Postfix) e la mette nelle caselle di posta dell' utente locale (vmail)
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
ora indichiamo a postfix di utilizzare i certificati che abbiamo fatto generare a certbot e che usiamo per nginx (aggiustiamo il pat al certificato reale!!!)
postconf -e 'smtp_tls_security_level = may'
postconf -e 'smtpd_tls_security_level = may'
postconf -e 'smtp_tls_note_starttls_offer = yes'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem'
postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem'
Configuriamo SMTP per usare sasl:
postconf -e 'smtpd_sasl_type = dovecot'
postconf -e 'smtpd_sasl_path = private/auth'
postconf -e 'smtpd_sasl_local_domain ='
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
abilitia,o il supporto a TLS/SSL e le porte relativenel file di configurazione di Postfix . modifichiamo il file /etc/postfix/master.cf
, leviamo il # (commento dalle righe) il file è diviso in ude parti, una per la parte normale e una per la parte secured (s)
nel mio file ho trovato
-o smtpd_client_restrictions=$mua_client_restrictions
$mua_client_restrictions
indica una variabile che non è definita, possiamo crearla noi, o diretamente sotituirla con la parte sotto!
se vogliamo che postfix ascolti su di una porta diversa dalla 465 (smtps) al posto di
smtps inet n - y - - smtpd
scriviamo
567 inet n - y - - smtpd
per farlo ascoltare sulla porta 567
dobbiamo comunque prestar attenzione affinche davanti a -o
ci sia uno spazio:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
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
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
ora passiamo al file /etc/postfix/main.cf
e modifichiamo le riga
myhostname=ilmioservermail.ilmiodominio.it inet_interfaces = ip_mia_interfaccia_di_rete,127.0.0.1 mydestination = localhost.$mydomain, localhost mynetworks = 127.0.0.0/8,10.0.0.0/8,192.168.0.0/16
la prima riga serve a indicare a postfix come ci presenteremo al mondo esterno, se non la mettiamo , se il nostro hostname è ilmioservermail
il mondo esterno ci vedra come ilmioservermail.localdomain
la seconda riga serve per far si che postfix sia in ascolto oltre che sulla loopback anche sulla nostra interfaccia di rete e quindi raggiungibile anche da altre macchine!!
la terza riga abbiamo eliminato $myhostname
perchè risulta duplicato
la quarta riga indica le subnet autorizzate ad usare il server di posta , siccome io lo utilizzero su di una rete privata ho indicato le reti interessate
riavviamo postfix
service postfix restart
modificate il file /etc/dovecot/dovecot-sql.conf.ext
(nel file è tutto commentato, potete decommentare e popolare le varie riche oppure potete aggiugnere tutto alla fine) :
driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
default_pass_scheme = MD5-CRYPT
iterate_query = SELECT username AS user FROM mailbox
user_query = SELECT CONCAT('/var/mail/vmail/',maildir) AS home, \
CONCAT('maildir:/var/mail/vmail/',maildir) AS mail, \
5000 AS uid, 5000 AS gid, CONCAT('*:bytes=',quota) AS quota_rule \
FROM mailbox WHERE username = '%u' AND active = 1
password_query = SELECT username AS user,password FROM mailbox \
WHERE username = '%u' AND active='1'
modifichiamo il file /etc/dovecot/conf.d/10-mail.conf
:
...
mail_location = maildir:/var/mail/vmail/%d/%n
...
mail_uid = vmail
mail_gid = vmail
...
first_valid_uid = 5000
last_valid_uid = 5000
...
mail_privileged_group = mail
...
mail_plugins = quota
...
modifichiamo il file /etc/dovecot/conf.d/10-auth.conf
:
...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...
modifichiamo il file /etc/dovecot/conf.d/10-master.conf
as following:
...
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
...
}
...
service auth {
...
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
...
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
...
}
...
service auth-worker {
user = vmail
}
...
service dict {
unix_listener dict {
mode = 0660
user = vmail
group = vmail
}
}
...
modifichiamo il file /etc/dovecot/conf.d/10-ssl.conf
:
...
ssl = yes
...
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
...
ssl_dh = </etc/letsencrypt/ssl-dhparams.pem
...
ssl_cipher_list = EECDH+AES:EDH+AES+aRSA
...
ssl_prefer_server_ciphers = yes
...
modifichiamo il file /etc/dovecot/conf.d/20-imap.conf
...
protocol imap {
...
mail_plugins = $mail_plugins imap_quota
...
}
...
modifichiamo il file /etc/dovecot/conf.d/20-lmtp.conf
non sono tanto sicuro che sia nel file giusto .... per ora l' ho messo nel file sopra:
...
protocol imap {
postmaster_address = Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
mail_plugins = $mail_plugins
}
...
aggiungiamo una cartella dove indirizzare lo spam nel file /etc/dovecot/conf.d/15-mailboxes.conf
:
...
mailbox Drafts {
special_use = \Drafts
}
mailbox Spam {
special_use = \Junk
auto = subscribe
}
mailbox Junk {
special_use = \Junk
}
...
ora configuriamo Dovecot pe connettersi al DB MySQL per gestire le quote disco, sia per dominio che per utente. in caso di superamento verranno mandate delle mail di notifica per ogni livello di riempimento
aggiungiamo nel file /etc/dovecot/conf.d/90-quota.conf
:
plugin {
quota = dict:User quota::proxy::sqlquota
quota_rule = *:storage=5GB
quota_rule2 = Trash:storage=+100M
quota_grace = 10%%
quota_exceeded_message = Quota exceeded, please contact your system administrator.
quota_warning = storage=100%% quota-warning 100 %u
quota_warning2 = storage=95%% quota-warning 95 %u
quota_warning3 = storage=90%% quota-warning 90 %u
quota_warning4 = storage=85%% quota-warning 85 %u
}
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail
unix_listener quota-warning {
group = vmail
mode = 0660
user = vmail
}
}
dict {
sqlquota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}
modifichiamo il file /etc/dovecot/dovecot-dict-sql.conf.ext
aggiungendo le righe sotto , assicuriamoci di inserire le credenziali mysql corrette
...
connect = host=127.0.0.1 dbname=postfixadmin user=postfixadmin password=your_secret_password
...
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
...
# map {
# pattern = shared/expire/$user/$mailbox
# table = expires
# value_field = expire_stamp
#
# fields {
# username = $user
# mailbox = $mailbox
# }
# }
...
creiamo lo script che inviera il messaggio di avviso superamento quota
/usr/local/bin/quota-warning.sh
:
#!/bin/sh
PERCENT=$1
USER=$2
cat << EOF | /usr/lib/dovecot/dovecot-lda -d $USER -o "plugin/quota=dict:User quota::noenforcing:proxy::sqlquota"
From: Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.
Subject: Quota warning
Your mailbox is $PERCENT% full. Don't forget to make a backup of old messages to remain able to receive mails.
EOF
rendiamolo eseguibile:
chmod +x /usr/local/bin/quota-warning.sh
riavviamo dovecot, se tutto è andato bene non avremo nessun messaggio d' errore:
service dovecot restart
ora il nostro mail server è pronto per esser usato o quasi, dobbiamo creare gli utenti e da allora possiamo mandare e ricevere posta sicuramente tra i nostri utenti, forse verso qualcuno all' esterno (saremo considerati spam ...)
ps. ogni 3 mesi dovremo rinnovare i certificati!!!!
step precedenti:
postfixadmin, let's encrypt e nginx
step successivi :
rspamd dkim dovecot dns