introduzione
In questa esercitazione viene illustrato un server di posta elettronica completo in esecuzione su OpenBSD utilizzando OpenSMTPD, Dovecot, Rspamd e RainLoop. OpenSMTPD è il server di posta predefinito per OpenBSD. Scegli un'istanza di Vultr Compute Cloud con molto spazio di archiviazione per il numero previsto di utenti.
Fasi preliminari
Imposta il tuo account utente per eseguire le attività come root.
su -
usermod -G wheel <username>
echo "permit nopass keepenv :wheel" > /etc/doas.conf
exit
Imposta il repository di pacchetti per OpenBSD.
doas su
echo "https://cdn.openbsd.org/pub/OpenBSD" > /etc/installurl
exit
Aggiungi i pacchetti richiesti.
doas pkg_add opensmtpd-extras opensmtpd-filter-rspamd dovecot dovecot-pigeonhole rspamd redis
Per impostazione predefinita, OpenSMTPD è in ascolto solo su localhost. Deve essere esplicitamente configurato per l'ascolto su interfacce esterne. Dovrebbe essere configurato per utilizzare gli utenti virtuali anziché gli utenti di sistema per motivi di sicurezza.
Eseguire il backup del /etc/smtpd.conf
file predefinito e crearne uno nuovo da zero.
cd /etc/mail
mv smtpd.conf smtpd.conf.default
Creane uno nuovo smtpd.conf
come mostrato di seguito. Sostituisci example.com
con il tuo dominio. Questa configurazione iniziale non attiva il filtro rspamd durante il test di OpenSMTP. Il filtro antispam verrà attivato in seguito.
pki "mail" cert "/etc/ssl/mail.crt"
pki "mail" key "/etc/ssl/private/mail.key"
table aliases file:/etc/mail/aliases
table credentials passwd:/etc/mail/credentials
table virtuals file:/etc/mail/virtuals
filter "rspamd" proc-exec "/usr/local/libexec/smtpd/filter-rspamd"
# To accept external mail, replace with: listen on all
# listen on all tls pki "mail" hostname "mail.example.com"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
auth <credentials>
action "local_mail" mbox alias <aliases>
action "domain_mail" maildir "/var/vmail/example.com/%{dest.user}" \
virtual <virtuals>
action "outbound" relay
# Uncomment the following to accept external mail for domain "example.org"
# match from any for domain "example.com" action "domain_mail"
match from local for local action "local_mail"
match from local for any action "outbound"
match auth from any for any action "outbound"
Crea il file / etc / credentials
OpenSMTPD e Dovecot possono condividere un database di autenticazione. Questo database ricorda il file della password di sistema in formato, con due campi extra per Dovecot. I due campi speciali definiscono la home directory virtuale e la posizione della posta. Le password sono in formato Blowfish. Questo tutorial crea tre utenti di esempio.
Generare le password e concatenarle nel /etc/mail/credentials
file.
doas su
smtpctl encrypt example_password1 >> /etc/mail/credentials
smtpctl encrypt example_password2 >> /etc/mail/credentials
smtpctl encrypt example_password3 >> /etc/mail/credentials
exit
L'output è simile al seguente:
$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6
$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e
$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq
Modifica /etc/mail/credentials
per aggiungere i campi richiesti. Ogni riga è mappata a un account di sistema, vmail , con UID e GID del 2000 . Sostituisci example.com con il tuo dominio. Il nome utente virtuale è l'indirizzo e-mail completo.
[email protected]:$2b$10$agmNBPvFm1zqCjbbZC3JbO4Ns2jJNZQfTS45MAnKi.IPrkKITyTa6:vmail:2000:2000:/var/vmail/example.com/john::userdb_mail=maildir:/var/vmail/example.com/john
[email protected]:$2b$10$LwkcKVVnwG8hDxu2W4YKD.K0kQ2oylOmQ9SBUb0hIopBsmNxYPb4e:vmail:2000:2000:/var/vmail/example.com/adam::userdb_mail=maildir:/var/vmail/example.com/adam
[email protected]:$2b$10$bgLW/GMZyRXKbROgRQIvRu4xbeOqOJJXlgEAKuS5sIrBvfdPvEzeq:vmail:2000:2000:/var/vmail/example.com/natalie::userdb_mail=maildir:/var/vmail/example.com/natalie
Crea un account di posta virtuale e imposta la sicurezza
Creare la mappatura utente virtuale
Crea /etc/mail/virtuals
per definire gli indirizzi email validi.
Crea chiavi pubbliche / private per OpenSMTPD
Questo esempio utilizza un certificato autofirmato. Usa un certificato firmato valido se ne hai uno. Quando viene richiesto il nome comune, assicurarsi che corrisponda al nome di dominio completo (FQDN) del server. Questo esempio utilizza mail.example.com.
doas su
cd /etc/ssl
openssl genrsa -out private/mail.key 4096
openssl req -x509 -new -nodes -key private/mail.key -out mail.crt -days 3650 -sha256
chmod 0400 /etc/ssl/private/mail.key
exit
Prova il server
Utilizzare il correttore di sintassi di configurazione OpenSMTPD. Se non si riscontrano problemi, riavviare il demone smtpd.
doas smtpd -n
doas rcctl restart smtpd
Da un account di posta esterno, inviare un'e-mail di prova a uno degli utenti.
- OpenSMTPD creerà la struttura delle cartelle maildir di seguito
/var/vmail
e consegnerà la posta a /var/vmail/example.com/<username>/new
.
- Come utente root, passare a questa posizione e verifiy si dispone di un file di nome simile a questo:
1576339842.4d64757b.example.com:2,
.
-
Rivedi il contenuto del file, comprese tutte le intestazioni della posta, per verificare che la consegna della posta funzioni correttamente.
Return-Path: <n0244e80da3-54b1ed125c5342fc-adam===example.org@bounce.example.org>
Delivered-To: [email protected]
Received: from spruce-goose-ba.twitter.com (spruce-goose-ba.twitter.com [199.59.150.96])
by mail.example.com (OpenSMTPD) with ESMTPS id 75b514d3 (TLSv1.2:ECDHE-RSA-AES256-GCM- SHA384:256:NO)
for <[email protected]>;
Sat, 14 Dec 2019 11:10:40 -0500 (EST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=twitter.com;
s=dkim-201406; t=1576339839;
bh=jhKB5/w9v87GaXSuizT576ntJ/72gvLRDhsqmGQQrCE=;
h=Date:From:To:Subject:MIME-Version:Content-Type:List-Unsubscribe:
Message-ID;
b=TWn/QVUJ1VDlWiweWoanwHLABCL1nqmm0+TBzh3PjmYNm0quRMXB7QL2ykzHGME5A
DTz/JFHa0cOvQsrdhxxbjOLFKimK0nF+Ou5kI+2HzTzfVNZS0qGnTVP/tZyaIsWjjl
an5EiR6HFOHG4iClOOEOJW4oLDEZfPTefrlW+378bmHGIRUNDvVKrbXKunL9fJFAb3
JSrhWQNwbrF/aARFzw4nKfb1I7vTRSrN1eXE5JxzGwI2XAjqDIWdR5ExwUNbJH5ZPs
wQ85j8KLZEEgQkbH9CypgeUMJWsVK95FqOCCaqKMS10M7intGMb3aeiiFcB7yDHi9t
u7rVESm4eGp/g==
X-MSFBL: DM7pSZns+YDRgNEmGNre9aPjZTtc1tDlN97w5rQDBts=|eyJ1IjoibWF0dEBnb2J
sYWNrY2F0LmNvbUBpaWQjIzU0YjFlZDEyNWM1MzQyZmNiNThiMzVmNzI0NDZlMGF
mQHVzYiMjNkAyNDRAMTA4MjgwNTAxMDYzNzk1MDk3NkAwQDA4MjY5ZWI4OTI3YzR
kNTFiNTZkMjY3YzY2OGRmN2IwY2Y4M2ExZGIiLCJyIjoibWF0dEBnb2JsYWNrY2F
0LmNvbSIsImciOiJCdWxrIiwiYiI6InNtZjEtYmd4LTM0LXNyMS1CdWxrLjE4NiJ
9
Date: Sat, 14 Dec 2019 16:10:39 +0000
...
Imposta la Classe di accesso
Dovecot richiede la possibilità di avere un numero maggiore di file aperti per la lettura e la scrittura rispetto a quanto consentito dalla classe predefinita. In caso contrario, si verificheranno errori difficili da risolvere.
Definire una classe di accesso per il demone Dovecot. Nella parte inferiore di /etc/login.conf
aggiungere le seguenti righe.
dovecot:\
:openfiles-cur=1024:\
:openfiles-max=2048:\
:tc=daemon:
Crea il file di configurazione Dovecot
Crea /etc/dovecot/local.conf
.
auth_mechanisms = plain
first_valid_uid = 2000
first_valid_gid = 2000
mail_location = maildir:/var/vmail/%d/%n
mail_plugin_dir = /usr/local/lib/dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mbox_write_locks = fcntl
mmap_disable = yes
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = subscribe
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
prefix =
}
passdb {
args = scheme=CRYPT username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
plugin {
imapsieve_mailbox1_before = file:/usr/local/lib/dovecot/sieve/report-spam.sieve
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_name = Junk
imapsieve_mailbox2_before = file:/usr/local/lib/dovecot/sieve/report-ham.sieve
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_from = Junk
imapsieve_mailbox2_name = *
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
sieve_pipe_bin_dir = /usr/local/lib/dovecot/sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
}
protocols = imap sieve
service imap-login {
inet_listener imaps {
port = 0
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
inet_listener sieve_deprecated {
port = 2000
}
}
ssl_cert = </etc/ssl/mail.crt
ssl_key = </etc/ssl/private/mail.key
userdb {
args = username_format=%u /etc/mail/credentials
driver = passwd-file
name =
}
protocol imap {
mail_plugins = " imap_sieve"
}
Correzione bug Dovecot
C'è un bug in Dovecot in cui le impostazioni ssl_cert
e ssl_key
non vengono sovrascritte nel local.conf
file, quindi dobbiamo commentarle. Se perdi questo passaggio, Dovecot non si avvierà correttamente.
Modifica /etc/dovecot/conf.d/10-ssl.conf
come mostrato.
...
# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/dovecotcert.pem
#ssl_key = </etc/ssl/private/dovecot.pem
...
Crea gli script Sieve
Gli script Sieve addestrano Rspamd su spam e ham . Lo spostamento di e-mail all'interno e all'esterno della cartella spazzatura attiva un evento per addestrare Rspamd.
Questi file si trovano in /usr/local/lib/dovecot/sieve
.
Crea il report-ham.sieve
file.
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if environment :matches "imap.mailbox" "*" {
set "mailbox" "${1}";
}
if string "${mailbox}" "Trash" {
stop;
}
if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-ham.sh" [ "${username}" ];
Crea il report-spam.sieve
file.
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
if environment :matches "imap.user" "*" {
set "username" "${1}";
}
pipe :copy "sa-learn-spam.sh" [ "${username}" ];
Compila i file.
sievec report-ham.sieve
sievec report-spam.sieve
Creare i seguenti due script di shell in /usr/local/lib/dovecot/sieve
Aggiungi quanto segue a sa-learn-ham.sh
#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_ham
Aggiungi quanto segue a sa-learn-spam.sh
#!/bin/sh
exec /usr/local/bin/rspamc -d "${1}" learn_spam
Rendi i file eseguibili.
chmod 0755 sa-learn-ham.sh
chmod 0755 sa-learn-spam.sh
Abilita e avvia Dovecot.
rcctl enable dovecot
rcctl start dovecot
Verifica che Dovecot sia stato avviato correttamente.
ps ax | grep dovecot
88005 ?? I 0:00.11 /usr/local/sbin/dovecot
69640 ?? I 0:00.03 dovecot/anvil
91207 ?? I 0:00.03 dovecot/log
98178 ?? I 0:00.19 dovecot/config
34712 ?? I 0:00.06 dovecot/stats
96674 ?? I 0:00.03 dovecot/imap-login
8891 ?? S 0:00.02 dovecot/imap
Verifica che Dovecot possa leggere correttamente /etc/mail/credentials
doveadm user [email protected]
field value
uid 2000
gid 2000
home /var/vmail/example.com/john
mail maildir:/var/vmail/example.com/john
Verifica che un utente di posta elettronica possa accedere.
doveadm auth login [email protected]
Password: ********
passdb: [email protected] auth succeeded
extra fields:
[email protected]
userdb extra fields:
[email protected]
mail=maildir:/var/vmail/example.com/john
uid=2000
gid=2000
home=/var/vmail/example.com/john
auth_mech=PLAIN
Imposta Rspamd
Questa è una configurazione base di Rspamd, fare riferimento alla documentazione ufficiale per maggiori dettagli. Questo esempio crea una definizione per il nostro dominio per abilitare la firma DKIM.
Creare una coppia di chiavi pubblica / privata /etc/mail/dkim
e impostare le autorizzazioni corrette.
doas su
mkdir /etc/mail/dkim
cd /etc/mail/dkim
openssl genrsa -out private.key 1024
openssl rsa -in private.key -pubout -out public.key
chmod 0440 private.key
chown root:_rspamd private.key
Creare un record DNS per DKIM contenente la chiave pubblica. Fare riferimento al proprio provider DNS per i dettagli su come creare un record DKIM. Copia il contenuto /etc/mail/dkim/public.key
e incollalo dopo la p=
parte del record DKIM come mostrato di seguito. Nota questo esempio crea anche un record SPF.
default._domainkey.example.com. IN TXT "v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClcuK3FV3Ug64li8iFsuJ2ykgb7FMZsujk9uG79ppPUp57vCfjzO7F+HBfx5qIwvlGxv2IJXK86FZwhpUX+HFCDUtfB2z0ZNGerWcZfNzM1w1Bru/fdMd2tCYkiHEa5RWIkLfs/Fm+neXxRZfAG2UDWmAghNbgzYv7xViwgufDIQIDAQAB"
example.com. IN TXT "v=spf1 a ip4:192.0.2.1 mx ~all"
Creare un record DMARC.
_dmarc.example.com. IN TXT "v=DMARC1;p=none;pct=100;rua=mailto:[email protected]"
Crea il /etc/rspamd/local.d/dkim_signing.conf
file di configurazione.
-
La selector="default";
riga deriva dalla prima parte del record DNS DKIM ( default._domainkey....
) creato sopra.
domain {
example.com {
path = "/etc/mail/dkim/example.com.key";
selector = "default";
}
}
Abilita e avvia Rspamd.
doas rcctl enable redis rspamd
doas rcctl start redis rspamd
Cambia le righe sottostanti in /etc/mail/smtpd.conf
e riavvia OpenSMTPD per abilitare Rspamd.
...
listen on all tls pki "mail" hostname "mail.example.com" filter "rspamd"
listen on egress port submission tls-require pki "mail" hostname "mail.example.com" \
auth <credentials> filter "rspamd"
...
rcctl restart smtpd
Testare il server di posta con client di posta elettronica POP3 o IMAP. Se non hai bisogno di webmail, fermati qui.
Installa pacchetti prerequisiti
Quando richiesto, selezionare la versione più recente di PHP.
pkg_add php php-curl php-pdo_sqlite php-zip pecl73-mcrypt zip unzip wget curl
Scarica il tarball di webmail RainLoop ed estrailo in /var/www/htdocs/
.
Utilizzare la Standard Edition che include un aggiornamento automatico.
cd /tmp
wget https://www.rainloop.net/repository/webmail/rainloop-latest.zip
unzip rainloop-latest.zip -d /var/www/htdocs/rainloop
chown -R www:www /var/www/htdocs
Crea Let's Encrypt SSL Certificate
- Copia
/etc/examples/acme-client.conf
in/etc
-
Aggiungi le seguenti righe nella parte inferiore del file:
domain webmail.example.com {
domain key "/etc/ssl/private/webmail.example.com.key"
domain full chain certificate "/etc/ssl/webmail.example.com.crt"
sign with letsencrypt
}
Configura httpd
- Crea una voce DNS (CNAME o A record) per il sottodominio
webmail.example.com
-
Modifica /etc/httpd.conf
seguendo l'esempio di seguito.
prefork 3
types { include "/usr/share/misc/mime.types" }
server "default" {
listen on egress port 80
root "/htdocs"
directory index index.html
location "/.well-known/acme-challenge/*" {
root "/acme"
request strip 2
}
}
Esegui il controllo della sintassi httpd.
httpd -n
Abilita e avvia httpd.
rcctl enable httpd
rcctl start httpd
Richiedi il certificato Let's Encrypt.
acme-client -v webmail.example.com
Aggiungere le definizioni del server per RainLoop a /etc/httpd.conf
server "webmail.example.com" {
listen on egress port 80
block return 302 "https://$SERVER_NAME$REQUEST_URI"
}
server "webmail.example.com" {
listen on egress tls port 443
root "/htdocs/rainloop"
directory index "index.php"
tcp { nodelay, backlog 10 }
tls {
certificate "/etc/ssl/webmail.example.com.crt"
key "/etc/ssl/private/webmail.example.com.key"
}
hsts {
max-age 31556952
preload
}
# Value below is 25MB in bytes. 1MB = 1048576 bytes
connection max request body 26214400
location "/data*" {
block return 403
}
location "*.php*" {
fastcgi socket "/run/php-fpm.sock"
}
}
Configura PHP per consentire allegati fino a 25 megabyte. Apporta le seguenti modifiche in /etc/php-7.3.ini
:
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 25M
...
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 29M
Abilita i moduli PHP necessari copiando i loro file di configurazione in /etc/php-7.3/
cp /etc/php-7.3.sample/* /etc/php-7.3/.
Controlla la sintassi di /etc/httpd.conf
httpd -n
Abilita e avvia httpd e php-fpm.
rcctl reload httpd
rcctl enable php73_fpm
rcctl start php73_fpm
Test finale
Sfoglia per https://webmail.example.com/?admin
.
Il nome utente predefinito è: admin
La password predefinita è: 12345 .
Passare a ciascuna delle sezioni di configurazione e apportare le modifiche desiderate. Una volta terminata la configurazione, accedi a webmail all'indirizzohttps://webmail.example.com