/ OpenBSD

OpenSMTPD sous OpenBSD 6.0 avec SSL/VirtualUsers/Dovecot

This article is in French and is available in English here !


Lors de l’AsiaBSDCon 2013, l’équipe d’OpenBSD a pu présenter sa solution de serveur mail nommée OpenSMTPD.

S’agissant d’une solution développée par l’équipe d’OpenBSD, nous retrouvons la philosophie tant appréciée mettant en évidence sécurité, simplicité/clarté et fonctionnalités avancées.

Sécurité :

Le service fonctionne sans privilèges et dans un chroot : /var/empty en l’occurence. La prise en charge du SSL, la déconnexion automatique des clients établissant un lien de longue durée sans effectuer de requêtes, la limitation du nombre de connexions entrantes, etc.

Simplicité :

La syntaxe de configuration utilisée est semblable à celle de PacketFilter et se trouve être orientée « user-friendly ». Vous pourrez le constater dans quelques minutes.

**Fonctionnalités avancées : **

  • Gestion des différents type de transport de courier : - mbox
  • maildir
  • mda
  • lmtp (on va le tester !)
  • statistiques via smtpctl
  • gestion d’utilisateurs virtuels
  • gestion SQL
  • scheduler
  • relay
  • etc.

Lançons nous !

Configuration de base :

OpenSMTPD étant installé par défaut nous allons pouvoir directement nous lancer dans une configuration basique pour commencer.

# vi /etc/mail/smtpd.conf 

listen on lo0 
listen on em0 

table aliases file:/etc/mail/aliases 

accept from any for domain "cagedmonster.net" alias <aliases> deliver to mbox 
accept for local alias <aliases> deliver to mbox 

accept from local for any relay

On écoute sur nos interfaces, on spécifie l’adresse de notre fichier aliases afin d’effectuer des redirections à notre guise.

On va offrir à tous la possibilité de délivrer des mails sur le domaine cagedmonster.net dans mbox (la boîte mail locale de l’user), idem pour les alias.

Enfin, on accepte de relayer les mails envoyés seulement en local.

Tant qu’on y est, on active le service au lancement du système et démarre le service idoine.

# rcctl enable smtpd && rcctl start smtpd

Passons à une configuration un peu plus précise avec l’intégration du TLS :

Il y deux méthodes visant à obtenir un certificat SSL.

  1. Auto-générer son certificat (qui ne sera pas validé par une autorité reconnue).
  2. Passer par une autorité telle que LetsEncrypt utilisant Certbot pour générer votre certificat. Auquel cas je vous laisserai le soin de consulter cette page.

Nous allons nous concentrer sur la première.

Génération du certificat :

# openssl genrsa -out /etc/ssl/private/server.key 

Generating RSA private key, 2048 bit long modulus
...............................................................+++
..........+++
e is 65537 (0x10001)

# openssl req -new -x509 -key /etc/ssl/private/server.key -out /etc/ssl/server.crt -days 3650
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:FR
State or Province Name (full name) []:SomeWhere
Locality Name (eg, city) []:Deauville
Organization Name (eg, company) []:CagedMonster
Organizational Unit Name (eg, section) []:CGM
Common Name (eg, fully qualified host name) []:mail.cagedmonster.net
Email Address []:lina@cagedmonster.net

On fixe les permissions :

# chmod 600 /etc/ssl/server.crt && chmod 600 /etc/ssl/private/server.key

On modifie notre fichier de configuration :

# vi /etc/mail/smtpd.conf 

pki mail.cagedmonster.net certificate "/etc/ssl/server.crt"
pki mail.cagedmonster.net key "/etc/ssl/private/server.key"

listen on lo0 
listen on em0 port 25 tls pki mail.cagedmonster.net

table aliases file:/etc/mail/aliases 

accept from any for domain "cagedmonster.net" alias <aliases> deliver to mbox 
accept for local alias <aliases> deliver to mbox 

accept from local for any relay 

# rcctl restart smtpd

Nous voici avec un serveur mail gérant le SSL, passons à présent à la mise en place de notre serveur IMAP, Dovecot, ainsi qu’à la création des utilisateurs cette fois-ci virtuels.

Déploiement de Dovecot, configuration et création de comptes virtuels :

Nous allons passer par le système de packages d’OpenBSD, vérifiez que les informations contenues dans /etc/pkg.conf soient exactes.

Installation :

# pkg_add dovecot

Activation au démarrage du système :

# rcctl enable dovecot

Création de la structure dédiée aux comptes virtuels :

# useradd -g =uid -c "Comptes Virtuels" -d /var/virtmail -s /sbin/nologin virtmail 
# mkdir /var/virtmail 
# chown virtmail:virtmail /var/virtmail

Ajout de la prise en charge des tables passwd (merci à bsdsx@freenode pour la précision) :

# pkg_add opensmtpd-extras

Modification de la configuration d’OpenSMTPD :

# vi /etc/mail/smtpd.conf 

pki mail.cagedmonster.net certificate "/etc/ssl/server.crt" 
pki mail.cagedmonster.net key "/etc/ssl/private/server.key" 

table aliases file:/etc/mail/aliases 
table passwd passwd:/etc/mail/passwd
table virtuals file:/etc/mail/virtuals

listen on lo0 listen on em0 port 25 tls pki mail.cagedmonster.net 
listen on em0 port 587 tls-require pki mail.cagedmonster.net auth <passwd>

accept from local for local alias <aliases> deliver to lmtp "/var/dovecot/lmtp" rcpt-to
accept from any for domain "cagedmonster.net" virtual <virtuals> deliver to lmtp "/var/dovecot/lmtp" rcpt-to
accept from local for any relay

Ici l’objectif est de déclarer les fichiers définissant nos comptes virtuels, permettre une authentification SSL pour les utilisateurs et délivrer directement les courriers dans Dovecot via le socket lmtp.

Voyons maintenant à quoi ressemblent nos fichiers :

# vi /etc/mail/aliases

    virtmail: /dev/null www: lina webmaster: lina root: lina abuse: lina lina: lina@cagedmonster.net

# vi /etc/mail/passwd

Nous allons créer notre utilisateur lina@cagedmonster.net et lui intégrer un mot de passe.

# smtpctl encrypt mon-mot-de-passe-personnel $2b$10$MYDvA2r8ws1IAOJS9eZLXOYni2RH5QNKXyG8blOpmqHke6pASBlh2

Voici la nomenclature à respecter dans votre fichier avec un quota de 10G :

lina@cagedmonster.net:$2b$10$MYDvA2r8ws1IAOJS9eZLXOYni2RH5QNKXyG8blOpmqHke6pASBlh2::::::userdb_quota_rule=*:storage=10G

# vi /etc/mail/virtuals

lina@cagedmonster.net          virtmail

Configuration de Dovecot :

SSL :

# vi /etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/ssl/server.crt ssl_key = </etc/ssl/private/server.key

DOVECOT .CONF :

# vi /etc/dovecot/dovecot.conf 

protocols = lmtp imap 

passdb { 
        args = scheme=blf-crypt /etc/mail/passwd 
        driver = passwd-file 
       } 
       userdb { 
               args = uid=virtmail 
               gid=virtmail 
               home=/var/virtmail/%d/%n 
               driver = static 
              }

10-MAIL.CONF :

# vi /etc/dovecot/conf.d/10-mail.conf

mail_location = mbox:/var/virtmail/%d/%n

LOGIN.CONF :

Assurez-vous que /etc/login.conf contienne une valeur égale ou supérieure à 1000 pour openfiles-cur

daemon:\ :openfiles-cur=1000:\ # cap_mkdb /etc/login.conf

Sinon vous risquez d’avoir des défaillances au lancement de Dovecot.

Lancement de dovecot :

# rcctl start dovecot

Aller plus loin :

L’article suivant : https://blog.cagedmonster.net/opensmtpd-dovecot-openbsd-mysql-spamd/ vous apprendra à faire reposer OpenSMTPD sur une base MySQL et intégrer une solution anti-spam nommée SPAMD.

Besoin d’aide ?

CagedMonster

CagedMonster

« I know everyone I've been everywhere I know everything Because I'm everybody » Ether - Nothingface

Read More