Costruisci il tuo server di posta con FreeBSD 11

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
  • Dovecot
  • spamd

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 SMTPprotocollo 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 makecomandi 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_ifvariabile che il nostro vtnet0dispositivo potrà utilizzare in seguito. Definiamo anche indirizzi IP non validi che devono essere rilasciati sull'interfaccia esterna.

Definiamo anche due tabelle spamde spamd-white- queste due tabelle sono create da spamd nella sua configurazione predefinita. Inoltre, definiamo una tabella denominata webmailche utilizzeremo per consentire ad alcuni dei principali provider di webmail.

Per visualizzare una tabella, è possibile utilizzare il comando pfctl -t tablename -T showper 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 spamdtabella o non elencato in nella spamd-whitetabella, 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-whitee le webmailtabelle 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.comdominio, 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 587e stiamo richiedendo l'autenticazione, per motivi di sicurezza.

Infine sono le nostre acceptimpostazioni. Accettiamo qualsiasi messaggio per uno qualsiasi dei nostri domini definiti nella nostra domainstabella per gli alias nella nostra aliasestabella, da consegnare alla loro home directory nel maildirformato. 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/aliasesnel 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 80sulla 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.confper 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 renewuna 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.confe 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.


Tags: #BSD #Email

Leave a Comment

Lintelligenza artificiale può combattere con un numero crescente di attacchi ransomware?

Lintelligenza artificiale può combattere con un numero crescente di attacchi ransomware?

Gli attacchi ransomware sono in aumento, ma l'intelligenza artificiale può aiutare ad affrontare l'ultimo virus informatico? L'intelligenza artificiale è la risposta? Leggi qui sai è AI boone o bane

ReactOS: è questo il futuro di Windows?

ReactOS: è questo il futuro di Windows?

ReactOS, un sistema operativo open source e gratuito è qui con l'ultima versione. Può essere sufficiente alle esigenze degli utenti Windows moderni e abbattere Microsoft? Scopriamo di più su questo vecchio stile, ma un'esperienza del sistema operativo più recente.

Rimani connesso tramite lapp desktop WhatsApp 24*7

Rimani connesso tramite lapp desktop WhatsApp 24*7

Whatsapp ha finalmente lanciato l'app desktop per utenti Mac e Windows. Ora puoi accedere facilmente a Whatsapp da Windows o Mac. Disponibile per Windows 8+ e Mac OS 10.9+

In che modo lintelligenza artificiale può portare lautomazione dei processi al livello successivo?

In che modo lintelligenza artificiale può portare lautomazione dei processi al livello successivo?

Leggi questo per sapere come l'intelligenza artificiale sta diventando popolare tra le aziende di piccole dimensioni e come sta aumentando le probabilità di farle crescere e dare un vantaggio ai loro concorrenti.

Laggiornamento del supplemento macOS Catalina 10.15.4 sta causando più problemi che risolverli

Laggiornamento del supplemento macOS Catalina 10.15.4 sta causando più problemi che risolverli

Recentemente Apple ha rilasciato macOS Catalina 10.15.4 un aggiornamento supplementare per risolvere i problemi, ma sembra che l'aggiornamento stia causando più problemi che portano al bricking delle macchine mac. Leggi questo articolo per saperne di più

13 strumenti commerciali per lestrazione dei dati dai Big Data

13 strumenti commerciali per lestrazione dei dati dai Big Data

13 strumenti commerciali per l'estrazione dei dati dai Big Data

Che cosè un file system di journaling e come funziona?

Che cosè un file system di journaling e come funziona?

Il nostro computer memorizza tutti i dati in un modo organizzato noto come file system di journaling. È un metodo efficiente che consente al computer di cercare e visualizzare i file non appena si preme search.https://wethegeek.com/?p=94116&preview=true

Singolarità tecnologica: un lontano futuro della civiltà umana?

Singolarità tecnologica: un lontano futuro della civiltà umana?

Man mano che la scienza si evolve a un ritmo rapido, assumendo gran parte dei nostri sforzi, aumentano anche i rischi di sottoporci a una singolarità inspiegabile. Leggi, cosa potrebbe significare per noi la singolarità.

Uno sguardo a 26 tecniche di analisi dei Big Data: Parte 1

Uno sguardo a 26 tecniche di analisi dei Big Data: Parte 1

Uno sguardo a 26 tecniche di analisi dei Big Data: Parte 1

Limpatto dellintelligenza artificiale nella sanità 2021

Limpatto dellintelligenza artificiale nella sanità 2021

L'intelligenza artificiale nell'assistenza sanitaria ha compiuto grandi passi avanti negli ultimi decenni. Pertanto, il futuro dell'IA in sanità continua a crescere giorno dopo giorno.