Gestire il proprio server di posta elettronica può essere abbastanza gratificante. Sei responsabile dei tuoi dati. Ti consente anche una maggiore flessibilità con le tue opzioni di consegna. Tuttavia, ci sono alcune sfide. Corri il rischio di aprire il tuo server alle vulnerabilità, oltre a rendere il tuo server un potenziale relay che gli spammer possono usare.
Detto questo, andiamo avanti con il nostro server di posta.
Panoramica
Ci sono tre software necessari da installare che non sono inclusi nel sistema di base di FreeBSD:
OpenSMTPd è un agente di trasferimento posta (MTA) e agente di consegna posta (MDA). Ciò significa che può comunicare con altri server di posta tramite il SMTP
protocollo e gestisce anche il recapito della posta alle caselle di posta dei singoli utenti. Configureremo OpenSMTPd in modo che possa comunicare con server esterni (filtrati tramite spamd) e consegnare posta agli utenti locali, oltre a consegnare la posta locale da un utente all'altro.
Dovecot è un MDA che legge le cassette postali locali e le offre agli utenti tramite IMAP o POP3. Utilizzerà le cassette postali degli utenti locali per pubblicare questo contenuto.
Spamd è un servizio di filtro della posta. Siamo in grado di inoltrare la posta tramite spamd e filtrerà la posta in base a una varietà di liste nere, whitelist e greylist.
L'idea generale per questo server di posta richiede alcuni percorsi diversi:
Outside world -> Firewall -> spamd -> OpenSMTPD -> User mail boxes
Outside world -> Firewall (spamd-whitelist) -> OpenSMTPD -> User mailboxes
Outside world -> Firewall (IMAP/POP3) -> Dovecot
Outside world -> Firewall (SMTPD submission)
Per questo tutorial, useremo la versione FreeBSD del PF di OpenBSD per il nostro firewall. Puoi anche usare ipfw
, dove la configurazione è molto simile.
Nota: Vultr, per impostazione predefinita, blocca la porta 25, utilizzata dai server SMTP ovunque. Se si desidera eseguire un server di posta elettronica completamente funzionale, sarà necessario aprire quella porta.
Configurazione iniziale
Innanzitutto, dobbiamo installare i programmi richiesti.
Supponendo che tu sia in esecuzione come utente con accesso sudo impostato, possiamo eseguire i seguenti comandi. Varia a seconda che tu stia usando port o pacchetti.
Pacchetti (consigliati)
A meno che non siano necessarie funzionalità specifiche integrate in queste utilità, si consiglia l'installazione tramite pacchetti. È più semplice, richiede meno tempo e risorse del server e fornisce un'interfaccia intuitiva e intuitiva.
sudo pkg install opensmtpd dovecot spamd
I seguenti make
comandi ti daranno molte opzioni di compilazione, le impostazioni predefinite funzioneranno bene. Non cambiarli se non sai esattamente cosa stai facendo.
sudo portsnap fetch update # or run portsnap fetch extract if using ports for the first time
cd /usr/ports/mail/opensmtpd
make install # Installs openSMTPd
make clean
cd /usr/ports/mail/dovecot
make install # Installs dovecot
make clean
cd /usr/ports/mail/spamd
make install # Installs spamd
make clean
Dovremo aggiungere le seguenti righe a /etc/rc.conf
:
pf_enable="YES"
pf_rules="/usr/local/etc/pf.conf"
pflog_enable="YES"
pflog_logfile="/var/log/pflog"
obspamd_enable="YES"
obspamd_flags="-v"
obspamlogd_enable="YES"
dovecot_enable="YES"
Configurazione del firewall
Per configurare PF, possiamo creare il nostro /usr/local/etc/pf.conf
:
## Set public interface ##
ext_if="vtnet0"
## set and drop IP ranges on the public interface ##
martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4 }"
table <spamd> persist
table <spamd-white> persist
# Whitelisted webmail services
table <webmail> persist file "/usr/local/etc/pf.webmail.ip.conf"
## Skip loop back interface - Skip all PF processing on interface ##
set skip on lo
## Sets the interface for which PF should gather statistics such as bytes in/out and packets passed/blocked ##
set loginterface $ext_if
# Deal with attacks based on incorrect handling of packet fragments
scrub in all
# Pass spamd whitelist
pass quick log on $ext_if inet proto tcp from <spamd-white> to $ext_if port smtp \
-> 127.0.0.1 port 25
# Pass webmail servers
rdr pass quick log on $ext_if inet proto tcp from <gmail> to $ext_if port smtp \
-> 127.0.0.1 port 25
# pass submission messages.
pass quick log on $ext_if inet proto tcp from any to $ext_if port submission modulate state
# Pass unknown mail to spamd
rdr pass log on $ext_if inet proto tcp from {!<spamd-white> <spamd>} to $ext_if port smtp \
-> 127.0.0.1 port 8025
## Blocking spoofed packets
antispoof quick for $ext_if
## Set default policy ##
block return in log all
block out all
# Drop all Non-Routable Addresses
block drop in quick on $ext_if from $martians to any
block drop out quick on $ext_if from any to $martians
pass in inet proto tcp to $ext_if port ssh
# Allow Ping-Pong stuff. Be a good sysadmin
pass inet proto icmp icmp-type echoreq
# Open up imap/pop3 support
pass quick on $ext_if proto tcp from any to any port {imap, imaps, pop3, pop3s} modulate state
# Allow outgoing traffic
pass out on $ext_if proto tcp from any to any modulate state
pass out on $ext_if proto udp from any to any keep state
Questa è una configurazione PF funzionante. È relativamente semplice, ma ci sono anche alcune stranezze da spiegare.
Innanzitutto, definiamo la nostra $ext_if
variabile che il nostro vtnet0
dispositivo potrà utilizzare in seguito. Definiamo anche indirizzi IP non validi che devono essere rilasciati sull'interfaccia esterna.
Definiamo anche due tabelle spamd
e spamd-white
- queste due tabelle sono create da spamd nella sua configurazione predefinita. Inoltre, definiamo una tabella denominata webmail
che utilizzeremo per consentire ad alcuni dei principali provider di webmail.
Per visualizzare una tabella, è possibile utilizzare il comando pfctl -t tablename -T show
per elencare gli elementi in una tabella.
Abbiamo impostato alcune regole PF: salta l'elaborazione sull'interfaccia locale, abilita le statistiche sull'interfaccia esterna e cancella i pacchetti in arrivo.
La prossima è una delle parti più importanti, in cui gestiamo l'invio del nostro traffico tramite spamd o OpenSMTPd.
Il primo è una regola di reindirizzamento (nota la sintassi qui, FreeBSD 11 usa la sintassi PF di vecchio stile (pre-OpenBSD 4.6) quindi la sintassi può sembrare strana. Se riceviamo qualcosa su smtp da un host elencato nella spamd
tabella o non elencato in nella spamd-white
tabella, reindirizziamo la connessione al demone spamd, che si occupa di queste connessioni. Le tre regole successive sono regole passthrough in modo che possiamo effettivamente ricevere posta. Passiamo attraverso i messaggi dagli IP elencati nella spamd-white
e le webmail
tabelle direttamente a OpenSMTPd. Inoltre, accettiamo messaggi sulla porta di invio ( 587
).
Quindi ci sono alcune regole di pulizia per impostare la nostra politica di default e accettare i messaggi SSH e ICMP.
Passiamo quindi IMAP e POP3 sulla nostra interfaccia esterna per accedere a Dovecot.
Infine, consentiamo tutto il traffico in uscita. Se si desidera aggiungere ulteriore sicurezza, è possibile limitare le porte che si passano, ma per un server monouso non è un problema passare tutto.
Avvia PF:
sudo service pf start
Ora che abbiamo impostato il nostro firewall, possiamo passare alla configurazione del nostro server di posta.
OpenSMTPd
OpenSMTPd ha una sintassi di configurazione molto semplice e di facile lettura. Un'intera configurazione di lavoro può essere inserita in 14 righe, come puoi vedere di seguito:
#This is the smtpd server system-wide configuration file.
# See smtpd.conf(5) for more information.
ext_if=vtnet0
# If you edit the file, you have to run "smtpctl update table aliases"
table aliases file:/etc/mail/aliases
table domains file:/etc/mail/domains
# Keys
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
# If you want to listen on multiple subdomains (e.g. mail.davidlenfesty) you have to add more lines
# of keys, and more lines of listeners
# Listen for local SMTP connections
listen on localhost hostname mail.example.com
# listen for filtered spamd connections
listen on lo0 port 10026
# Listen for submissions
listen on $ext_if port 587 tls-require auth pki mail.example.com tag SUBMITTED
# Accept mail from external sources.
accept from any for domain <domains> alias <aliases> deliver to maildir "~/mail"
accept for local alias <aliases> deliver to maildir "~/mail"
accept from local for any relay tls
accept tagged SUBMITTED for any relay tls
Innanzitutto, definiamo nuovamente la nostra interfaccia esterna, nonché alcune tabelle, alias e domini. Passiamo quindi alla chiave SSL e al certificato per tutti i domini in cui vogliamo gestire la posta.
Nella sezione successiva, definiamo le interfacce e le porte su cui vogliamo ascoltare. Innanzitutto, ascoltiamo localhost per il nostro mail.example.com
dominio, per eventuali connessioni locali. Quindi ascoltiamo i nostri messaggi filtrati per spam e i messaggi inviati sull'interfaccia esterna. Infine, ascoltiamo gli invii, questi avvengono in porto 587
e stiamo richiedendo l'autenticazione, per motivi di sicurezza.
Infine sono le nostre accept
impostazioni. Accettiamo qualsiasi messaggio per uno qualsiasi dei nostri domini definiti nella nostra domains
tabella per gli alias nella nostra aliases
tabella, da consegnare alla loro home directory nel maildir
formato. Quindi accettiamo tutte le connessioni locali per le cassette postali locali e inoltriamo i nostri messaggi, in modo da poter inviare e-mail. Infine, accettiamo i nostri messaggi inviati per l'inoltro. Se non avessimo richiesto l'autenticazione per la nostra porta di invio, ciò costituirebbe un grosso rischio per la sicurezza. Ciò consentirebbe a chiunque di utilizzare il nostro server come relay di spam.
alias
FreeBSD viene spedito con un file alias predefinito /etc/mail/aliases
nel seguente formato:
vuser1: user1
vuser2: user1
vuser3: user1
vuser4: user2
Questo definisce le diverse caselle di posta e dove vogliamo inoltrare i messaggi inviati a queste caselle di posta definite. Possiamo definire i nostri utenti come utenti del sistema locale o cassette postali esterne a cui inoltrare. Il file predefinito di FreeBSD è abbastanza descrittivo, quindi puoi fare riferimento a quello per riferimento.
domini
FreeBSD non fornisce un file di domini predefinito, ma questo è incredibilmente semplice:
# Domains
example.com
mail.example.com
smtp.example.com
Questo è solo un file di testo semplice con ogni dominio che desideri ascoltare su una nuova riga. Puoi fare un commento usando il #
simbolo. Questo file esiste semplicemente in modo da poter utilizzare meno linee di configurazione.
Certificati SSL
Esistono due modi per proteggere le comunicazioni con il proprio server di posta, certificati autofirmati e firmati. È certamente possibile autofirmare i certificati, tuttavia servizi come Let's Encrypt forniscono firme gratuite e incredibilmente facili da usare.
Per prima cosa dobbiamo installare il programma certbot.
sudo pkg install py-certbot
In alternativa, può essere installato con porte:
cd /usr/ports/security/py-certbot
make install
make clean
Quindi, per ottenere il tuo certificato, devi assicurarti di aver aperto la porta 80
sulla tua interfaccia esterna. Aggiungi le seguenti righe da qualche parte nelle tue regole di filtro in /usr/local/etc/pf.conf
:
pass quick on $ext_if from any to any port http
Quindi eseguire pfctl -f /usr/local/etc/pf.conf
per ricaricare il set di regole.
Quindi puoi eseguire il comando per tutti i domini per i quali desideri ottenere un certificato:
certbot certonly --standalone -d mail.example.com
Si consiglia di impostare una voce crontab da eseguire certbot renew
una volta ogni 6 mesi per garantire che i certificati non scadano.
Quindi, per ogni dominio pertinente, è possibile modificare le righe in modo che puntino al file chiave corretto:
pki mail.example.com key "/usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem"
pki mail.example.com certificate "/usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem"
Modifica i titoli:
sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*
Nota: dovrai farlo per ogni file di chiavi originale, altrimenti OpenSMTPd non li aprirà.
Ora possiamo avviare il servizio:
sudo service smtpd start
Configurazione di spamd
Qui stiamo usando il demone spamd di OpenBSD per ridurre la quantità di spam che riceviamo da Internet. Fondamentalmente, questo filtra i messaggi dagli IP che sono noti come non validi da varie fonti di spam, nonché (in modo predefinito) connessioni in entrata "greylisting". Spamd tenta anche di sprecare il tempo dello spammer "balbettando" le connessioni nella lista nera e nella greylist, il che significa che distribuisce la sua risposta per diversi secondi, costringendo il client a rimanere aperto più a lungo del solito.
La greylisting di una connessione viene eseguita quando si connette un nuovo indirizzo IP che non si trova su alcuna blacklist o whitelist. Una volta connesso il nuovo indirizzo, spamd rilascia il messaggio con un messaggio di errore inopportuno, quindi lo aggiunge a un elenco temporaneo. Poiché gli spammer vengono pagati per i messaggi recapitati, non riproveranno su un errore, mentre un servizio legittimo riproverà relativamente presto.
Dovrai eseguire quanto segue per montare fdescfs
:
mount -t fdescfs null /dev/fd
Quindi dovrai aggiungere questa riga a /etc/fstab
:
fdescfs /dev/fd fdescfs rw 0 0
Il file di configurazione predefinito (trovato in /usr/local/etc/spamd/spamd.conf.sample
) funzionerà correttamente. Puoi modificarlo per aggiungere nuove fonti o cambiare le fonti che usi:
sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf
Possiamo iniziare il servizio con il seguente:
sudo service obspamd start
A questo punto è installato spamd.
Abilitazione dei servizi Webmail
Un problema con l'approccio greylisting è che i servizi di posta di grandi dimensioni inviano spesso posta attraverso uno di molti spool diversi e non è garantito che lo stesso server invii il messaggio ogni volta. Una soluzione a questo è di autorizzare gli intervalli IP utilizzati da vari servizi di webmail. Questo è ciò per cui viene utilizzata la tabella webmail nella configurazione PF. Questa strategia può ritorcersi contro se si include un indirizzo IP utilizzato da uno spammer, ma fintanto che si presta attenzione a quali intervalli si inseriscono nella tabella andrà bene.
Per aggiungere un intervallo di posta elettronica alla tabella webmail, è possibile eseguire il comando seguente:
pfctl -t webmail -T add 192.0.2.0/24
Dovecot
Se desideri che gli utenti accedano alla loro posta senza accedere tramite SSH, avrai bisogno di un MDA che supporti IMAP e / o POP3. Un programma molto popolare è Dovecot, con una configurazione abbastanza semplice e potenti funzionalità.
Possiamo copiare sulla configurazione predefinita:
cd /usr/local/etc/dovecot
cp -R example-config/* ./
La configurazione è composta da diversi file. Per vedere le differenze tra la tua configurazione e le impostazioni predefinite dovecot, esegui il comando seguente:
sudo doveconf -n
Quella che segue è una configurazione semplice e funzionante:
# 2.3.2.1 (0719df592): /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 11.2-RELEASE amd64
# Hostname: mail.example.com
hostname = mail.example.com
mail_location = maildir:~/mail
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = create
special_use = \Archive
}
mailbox Archives {
auto = create
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = create
autoexpunge = 60 days
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Mail" {
auto = no
special_use = \Sent
}
mailbox "Sent Messages" {
auto = no
special_use = \Sent
}
mailbox Spam {
auto = no
special_use = \Junk
}
mailbox Trash {
auto = no
autoexpunge = 90 days
special_use = \Trash
}
prefix =
separator = /
}
passdb {
args = imap
driver = pam
}
ssl = required
ssl_cert = </usr/local/etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_dh = </usr/local/etc/dovecot/dh.pem
ssl_key = </usr/local/etc/letsencrypt/live/mail.example.com/privkey.pem
userdb {
driver = passwd
}
La maggior parte dei file di configurazione saranno presenti conf.d
Quelli importanti sono 10-auth.conf
, 10-mail.conf
e 10-ssl.conf
.
È possibile configurare le diverse cassette postali utilizzate 15-mailboxes.conf
. Quello che vedi sopra è una buona configurazione per molti sistemi, ma il tuo chilometraggio può variare. Si consiglia di giocare con questo con il maggior numero possibile di clienti diversi.
Autenticazione
La maggior parte delle impostazioni predefinite sarà corretta. Se si desidera utilizzare gli utenti del sistema per l'autenticazione, sarà necessario modificarli 10-auth.conf
.
Rimuovi dal commento la seguente riga:
! include auth-system.conf.ext
crittografia
Dobbiamo generare i parametri Diffie-Hellman:
sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem
Nota: questa operazione richiederà molto tempo. Molto più a lungo di quanto ci si possa aspettare.
Ora possiamo avviare Dovecot:
sudo service dovecot start
Conclusione
A questo punto, abbiamo un server di posta funzionale, sicuro e relativamente privo di spam.
Alcune altre cose da esaminare da qui sono l'utilizzo di SpamAssassin per eliminare in modo euristico lo spam, oltre a trovare altre liste nere di spam pubblicate da fonti di cui ti fidi.