L'exécution de votre propre serveur de messagerie peut être très enrichissante. Vous êtes en charge de vos données. Il vous permet également plus de flexibilité avec vos options de livraison. Cependant, il y a quelques défis. Vous courez le risque d'ouvrir votre serveur aux vulnérabilités et de faire de votre serveur un relais potentiel pour les spammeurs.
Avec cela à l'écart, passons à l'exécution de notre propre serveur de messagerie.
Aperçu
Il y a trois logiciels requis à installer qui ne sont pas inclus dans le système de base FreeBSD:
- OpenSMTPd
- Pigeonnier
- spamd
OpenSMTPd est un agent de transfert de courrier (MTA) et un agent de distribution de courrier (MDA). Cela signifie qu'il peut communiquer avec d'autres serveurs de messagerie via le SMTP
protocole et qu'il gère également la livraison du courrier dans les boîtes aux lettres des utilisateurs individuels. Nous allons configurer OpenSMTPd afin qu'il puisse communiquer avec des serveurs externes (filtré via spamd) et livrer du courrier aux utilisateurs locaux, ainsi que la livraison du courrier local d'un utilisateur à l'autre.
Dovecot est un MDA qui lit les boîtes aux lettres locales et les sert via IMAP ou POP3 aux utilisateurs. Il utilisera les boîtes aux lettres des utilisateurs locaux pour diffuser ce contenu.
Spamd est un service de filtrage du courrier. Nous pouvons transférer le courrier via spamd, et il filtrera le courrier en fonction d'une variété de listes noires, de listes blanches et d'une liste grise.
L'idée générale de ce serveur de messagerie nécessite plusieurs chemins différents:
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)
Pour ce tutoriel, nous utiliserons la version FreeBSD du PF d'OpenBSD pour notre pare-feu. Vous pouvez également utiliser ipfw
, où la configuration est très similaire.
Remarque: Vultr, par défaut, bloque le port 25, qui est utilisé par les serveurs SMTP partout. Si vous souhaitez exécuter un serveur de messagerie entièrement fonctionnel, vous devrez ouvrir ce port.
La configuration initiale
Tout d'abord, nous devons installer les programmes requis.
En supposant que vous exécutez en tant qu'utilisateur avec un accès sudo configuré, nous pouvons exécuter les commandes suivantes. Ils varient selon que vous utilisez des ports ou des packages.
Forfaits (recommandé)
Sauf si vous avez besoin de fonctionnalités spécifiques intégrées à ces utilitaires, il est recommandé d'installer via des packages. Il est plus facile, prend moins de temps et de ressources pour le serveur et offre une interface intuitive et conviviale.
sudo pkg install opensmtpd dovecot spamd
Les make
commandes suivantes vous donneront de nombreuses options de compilation, les valeurs par défaut fonctionneront bien. Ne les modifiez pas à moins de savoir exactement ce que vous faites.
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
Nous devrons ajouter les lignes suivantes à /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"
Configuration du pare-feu
Pour configurer PF, nous pouvons créer nos /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
Il s'agit d'une configuration PF fonctionnelle. C'est relativement simple, mais il y a aussi quelques bizarreries à expliquer.
Tout d'abord, nous définissons notre $ext_if
variable pour que notre vtnet0
appareil l'utilise ultérieurement. Nous définissons également des adresses IP non valides qui doivent être supprimées sur l'interface externe.
Nous définissons également deux tables, spamd
et spamd-white
- ces deux tables sont créées par spamd dans sa configuration par défaut. De plus, nous définissons une table nommée webmail
que nous utiliserons pour permettre à certains des principaux fournisseurs de messagerie Web de passer.
Pour afficher un tableau, vous pouvez utiliser la commande pfctl -t tablename -T show
pour répertorier les éléments d'un tableau.
Nous avons défini quelques règles PF: ignorer le traitement sur l'interface locale, activer les statistiques sur l'interface externe et nettoyer les paquets entrants.
Vient ensuite l'une des parties les plus importantes, où nous gérons l'envoi de notre trafic vers spamd ou OpenSMTPd.
La première est une règle de redirection (notez la syntaxe ici, FreeBSD 11 utilise l'ancienne syntaxe PF (pré-OpenBSD 4.6), donc la syntaxe peut sembler étrange. Si nous recevons quelque chose sur smtp d'un hôte répertorié dans le spamd
tableau ou non répertorié dans dans le spamd-white
tableau, nous redirigeons la connexion vers le démon spamd, qui traite ces connexions. Les trois règles suivantes sont des règles d'intercommunication afin que nous puissions réellement recevoir du courrier. Nous transmettons les messages des adresses IP répertoriées dans le spamd-white
et les webmail
tableaux directement à OpenSMTPd. De plus, nous acceptons les messages sur le port de soumission ( 587
).
Ensuite, il existe quelques règles internes pour définir notre stratégie par défaut et accepter les messages SSH et ICMP.
Nous passons ensuite IMAP et POP3 sur notre interface externe afin d'accéder à Dovecot.
Enfin, nous autorisons tout le trafic sortant. Si vous vouliez ajouter une sécurité supplémentaire, vous pourriez limiter les ports que vous passez, mais pour un serveur à usage unique, ce n'est pas un problème de tout passer.
Démarrer PF:
sudo service pf start
Maintenant que nous avons notre configuration de pare-feu, nous pouvons passer à la configuration de notre serveur de messagerie.
OpenSMTPd
OpenSMTPd a une syntaxe de configuration très simple et facile à lire. Une configuration de travail entière peut tenir sur 14 lignes, comme vous pouvez le voir ci-dessous:
#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
Tout d'abord, nous définissons à nouveau notre interface externe, ainsi que quelques tables, alias et domaines. Ensuite, nous passons à la clé SSL et au certificat pour tous les domaines sous lesquels nous voulons gérer le courrier.
Dans la section suivante, nous définissons les interfaces et les ports sur lesquels nous voulons écouter. Tout d'abord, nous écoutons sur localhost pour notre mail.example.com
domaine, pour toutes les connexions locales. Ensuite, nous écoutons nos messages filtrés par spam et les messages soumis sur l'interface externe. Enfin, nous écoutons les soumissions, celles-ci se produisent sur le port 587
et nous exigeons qu'elles s'authentifient, pour des raisons de sécurité.
Enfin, nos accept
paramètres. Nous acceptons tout message pour l'un de nos domaines définis dans notre domains
table pour les alias de notre aliases
table, à livrer à leur répertoire personnel au maildir
format. Ensuite, nous acceptons toutes les connexions locales pour les boîtes aux lettres locales et relayons nos messages, afin que nous puissions envoyer des e-mails. Enfin, nous acceptons nos messages soumis à relayer. Si nous n'avions pas besoin d'authentification pour notre port de soumissions, ce serait un gros danger pour la sécurité. Cela permettrait à quiconque d'utiliser notre serveur comme relais de spam.
Alias
FreeBSD est livré avec un fichier d'alias par défaut /etc/mail/aliases
au format suivant:
vuser1: user1
vuser2: user1
vuser3: user1
vuser4: user2
Cela définit les différentes boîtes aux lettres et où nous voulons transférer les messages envoyés à ces boîtes aux lettres définies. Nous pouvons définir nos utilisateurs en tant qu'utilisateurs du système local ou boîtes aux lettres externes vers lesquelles transférer. Le fichier FreeBSD par défaut est assez descriptif, vous pouvez donc vous y référer pour référence.
Domaines
FreeBSD ne fournit pas de fichier de domaines par défaut, mais c'est incroyablement simple:
# Domains
example.com
mail.example.com
smtp.example.com
Il s'agit simplement d'un fichier texte brut avec chaque domaine que vous souhaitez écouter sur une nouvelle ligne. Vous pouvez faire un commentaire en utilisant le #
symbole. Ce fichier existe simplement pour que vous puissiez utiliser moins de lignes de configuration.
Certificats SSL
Il existe deux façons de sécuriser vos communications avec votre serveur de messagerie, les certificats auto-signés et signés. Il est certainement possible d'auto-signer vos certificats, mais des services comme Let's Encrypt fournissent une signature gratuite et incroyablement facile à utiliser.
Nous devons d'abord installer le programme certbot.
sudo pkg install py-certbot
Alternativement, il peut être installé avec des ports:
cd /usr/ports/security/py-certbot
make install
make clean
Ensuite, pour obtenir votre certificat, vous devez vous assurer d'avoir ouvert le port 80
sur votre interface externe. Ajoutez les lignes suivantes quelque part dans vos règles de filtrage dans /usr/local/etc/pf.conf
:
pass quick on $ext_if from any to any port http
Exécutez ensuite pfctl -f /usr/local/etc/pf.conf
pour recharger l'ensemble de règles.
Ensuite, vous pouvez exécuter la commande pour tous les domaines pour lesquels vous souhaitez obtenir un certificat:
certbot certonly --standalone -d mail.example.com
Il est recommandé de configurer une entrée crontab à exécuter certbot renew
une fois tous les 6 mois pour garantir que vos certificats n'expirent pas.
Ensuite, pour chaque domaine pertinent, vous pouvez modifier les lignes pour pointer vers le fichier de clé correct:
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"
Modifier les titres:
sudo chmod 700 /usr/local/etc/letsencrypt/archive/mail.example.com/*
Remarque: Vous devrez le faire pour chaque fichier de clés d'origine, sinon OpenSMTPd ne les ouvrira pas.
Nous pouvons maintenant démarrer le service:
sudo service smtpd start
Configuration de spamd
Ici, nous utilisons le démon spamd d'OpenBSD pour réduire la quantité de spam que nous recevons d'Internet. Essentiellement, cela filtre les messages provenant d'IP qui sont connus comme mauvais à partir de diverses sources de spam, ainsi que (par défaut) les connexions entrantes de "liste grise". Spamd essaie également de gâcher le temps du spammeur en "bégayant" les connexions sur liste noire et sur liste grise, ce qui signifie qu'il répartit sa réponse sur plusieurs secondes, ce qui oblige le client à rester ouvert plus longtemps que d'habitude.
La mise en liste grise d'une connexion est effectuée lorsqu'une nouvelle adresse IP se connecte qui ne figure sur aucune liste noire ou liste blanche. Une fois la nouvelle adresse connectée, spamd supprime le message avec un message d'erreur inoculé, puis l'ajoute à une liste temporaire. Étant donné que les spammeurs sont payés pour les messages remis, ils ne réessayeront pas en cas d'erreur, tandis qu'un service légitime réessayera relativement rapidement.
Vous devrez exécuter ce qui suit pour monter fdescfs
:
mount -t fdescfs null /dev/fd
Ensuite, vous devrez ajouter cette ligne à /etc/fstab
:
fdescfs /dev/fd fdescfs rw 0 0
Le fichier de configuration par défaut (trouvé dans /usr/local/etc/spamd/spamd.conf.sample
) fonctionnera correctement. Vous pouvez le modifier pour ajouter de nouvelles sources ou changer les sources que vous utilisez:
sudo cp /usr/local/etc/spamd/spamd.conf.sample /usr/local/etc/spamd/spamd.conf
Nous pouvons démarrer le service avec les éléments suivants:
sudo service obspamd start
À ce stade, spamd est configuré.
Activation des services de messagerie Web
Un problème avec l'approche de la liste grise est que les grands services de messagerie envoient souvent du courrier via l'un des nombreux spools différents, et vous n'êtes pas assuré d'obtenir le même serveur envoyant le message à chaque fois. Une solution à cela consiste à ajouter à la liste blanche les plages d'adresses IP utilisées par divers services de messagerie Web. C'est à cela que sert la table de messagerie Web dans la configuration PF. Cette stratégie peut se retourner contre vous si vous incluez une adresse IP utilisée par un spammeur, mais tant que vous faites attention aux plages que vous mettez dans le tableau, tout ira bien.
Pour ajouter une plage d'e-mails à la table de messagerie Web, vous pouvez exécuter la commande suivante:
pfctl -t webmail -T add 192.0.2.0/24
Pigeonnier
Si vous souhaitez que les utilisateurs accèdent à leur messagerie sans se connecter via SSH, vous aurez besoin d'un MDA qui prend en charge IMAP et / ou POP3. Un programme très populaire est Dovecot, avec une configuration assez simple et des fonctionnalités puissantes.
Nous pouvons copier sur la configuration par défaut:
cd /usr/local/etc/dovecot
cp -R example-config/* ./
La configuration est composée de plusieurs fichiers différents. Pour voir les différences entre votre configuration et les valeurs par défaut de pigeonnier, exécutez la commande ci-dessous:
sudo doveconf -n
Voici une configuration simple et fonctionnelle:
# 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 plupart des fichiers de configuration seront dans conf.d
Les plus importants sont 10-auth.conf
, 10-mail.conf
et 10-ssl.conf
.
Vous pouvez configurer les différentes boîtes aux lettres que vous utilisez dans 15-mailboxes.conf
. Ce que vous voyez ci-dessus est une bonne configuration pour de nombreux systèmes, mais votre kilométrage peut varier. Il est recommandé de jouer avec autant de clients différents que possible.
Authentification
La plupart des paramètres par défaut seront corrects. Si vous souhaitez utiliser les utilisateurs du système pour vous authentifier, vous devrez les modifier 10-auth.conf
.
Décommentez la ligne suivante:
! inclure auth-system.conf.ext
Chiffrement
Nous devons générer des paramètres Diffie-Hellman:
sudo nohup openssl dhparam -out /usr/local/etc/dovecot/dh.pem
Remarque: cette opération prendra beaucoup de temps. Beaucoup plus longtemps que vous ne le pensez.
Nous pouvons maintenant démarrer Dovecot:
sudo service dovecot start
Conclusion
À ce stade, nous avons un serveur de messagerie fonctionnel, sécurisé et relativement sans spam.
D'autres éléments à examiner à partir d'ici utilisent SpamAssassin pour se débarrasser heuristement du spam, ainsi que pour trouver plus de listes noires de spamd publiées par des sources de confiance.