rss logo

Comment sécuriser le webmail Roundcube

Le logo de Rouncube

Voici un nouvel article sur Roundcube, je vais aborder ici la question de la sécurité. Je vais montrer comment configurer fail2ban pour bloquer les attaques par force brute. De plus, nous explorerons l'intégration d'un plugin pour activer le 2FA (authentification à deux facteurs), créé par alexandregz, afin d'améliorer la sécurité de l'authentification.

MĂȘme si j'ai dĂ©jĂ  traitĂ© du sujet de l'activation du protocole HTTPS de Roundcube ici, je montrerai de nouveau comment activer HTTPS afin de chiffrer les communications entre les clients et Roundcube.

  • Configuration:
    • debian: 12 bookworm
    • php: 8.2
    • roundcube: 1.6.5

Activer fail2ban

Fail2ban est un logiciel puissant conçu pour surveiller les erreurs d'authentification dans les fichiers journaux et bloquer temporairement les adresses distantes responsables de tentatives rĂ©pĂ©tĂ©es infructueuses. C'est un outil applicable Ă  divers services tels que sshd, apache, dovecot, etc.…

Installation et Configuration

  • Installer fail2ban :
root@host:~# apt update && apt install fail2ban
  • DĂ©marrer et activer le service nftables :
root@host:~# systemctl start nftables root@host:~# systemctl enable nftables
  • Éditer le fichier /etc/fail2ban/jail.conf :
banaction = nftables-multiport banaction_allports = nftables-allports
  • Éditer le fichier /etc/fail2ban/jail.d/defaults-debian.conf :
[sshd] enabled = true backend = systemd [roundcube-auth] enabled = true logpath = /var/log/roundcube/errors.log
  • RedĂ©marrer le service fail2ban pour que les changements soient pris en compte :
root@host:~# systemctl restart fail2ban

DĂ©bloquer une adresse IP

  • Lister les adresses IP bloquĂ©es :
root@host:~# nft -a list ruleset table inet filter { # handle 1 chain input { # handle 1 type filter hook input priority filter; policy accept; } chain forward { # handle 2 type filter hook forward priority filter; policy accept; } chain output { # handle 3 type filter hook output priority filter; policy accept; } } table inet f2b-table { # handle 2 set addr-set-roundcube-auth { # handle 2 type ipv4_addr elements = { 192.168.10.36 } } chain f2b-chain { # handle 1 type filter hook input priority filter - 1; policy accept; tcp dport { 80, 443 } ip saddr @addr-set-roundcube-auth reject with icmp port-unreachable # handle 6 } }
  • Si nĂ©cessaire, on pourra temporairement dĂ©bloquer une addresse ip :
root@host:~# fail2ban-client set roundcube-auth unbanip 192.168.10.36
  • Ou de façon permanante an ajoutant l'addresse IP dans le fichier de configuration /etc/fail2ban/jail.conf :
ignoreip = 127.0.0.1/8 ::1 192.168.10.36
  • On redĂ©marre le service fail2ban :
root@host:~# systemctl restart fail2ban

Ajouter le plugin twofactor_gauthenticator

Nous devrions utiliser une application compatible avec Google Authenticator sur un smartphone. Personnellement, j'utilise l'application andOTP, qui n'est plus maintenue : https://github.com/andOTP/andOTP, mais qui fonctionne toujours. Et je n'ai pas testé l'application FreeOTP.

Le projet GitHub officiel peut ĂȘtre trouvĂ© ici : https://github.com/alexandregz/twofactor_gauthenticator

Activer le plugin 2FA

  • Installer git pour tĂ©lĂ©charger le plugin :
root@host:~# apt update && apt install git root@host:~# git clone https://github.com/alexandregz/twofactor_gauthenticator.git
  • DĂ©placer le dossier twofactor_gauthenticator dans le rĂ©pertoire des plugins Roundcube :
root@host:~# mv twofactor_gauthenticator /var/lib/roundcube/plugins/
  • Éditer le fichier /etc/roundcube/config.inc.php afin d'activer le plugin :
$config['plugins'] = [ 'twofactor_gauthenticator', ];
  • Depuis l'interface web de Roundcube, aller dans ParamĂštres > 2-Factor Authentication :
Menu des paramÚtres de l'interface web de Rouncube avec authentification à 2 facteurs à l'entrée
  • Cocher la case Activate et cliquer sur Fill all fields :
ParamĂštres de l'interface web de Rouncube pour le plugin d'authentification Ă  2 facteurs
  • Une fenĂȘtre devrait apparaitre, cliquer sur OK :
FenĂȘtre d'avertissement du plugin 2FA roundcube pour la lecture des codes QR
  • Conserver les Ă©lements secret et recovery codes qui pourront ĂȘtre utiles en cas de perte du pĂ©riphĂ©rique 2FA, puis scanner le QR Code depuis l'application 2FA de son smartphone :
Interface Roundcube plugin 2FA avec QR Code et codes de récupération
  • Depuis son tĂ©lĂ©phone, rĂ©cupĂ©rer le mot de passe Ă  usage unique et le renseigner dans le champ prĂ©vu Ă  cet effet, puis cliquer sur Check code pour valider que tout fonctionne :
Test du code Ă  usage unique dans le plugin 2FA roundcube fenĂȘtre de validation du code
  • Enfin, cliquer sur Save:
interface de paramétrage du plugin 2FA de roundcube
  • AprĂšs la prochaine authentification, la phase d'authentification 2FA devrait appraitre :
page d'auhentification 2FA de roundcube

RĂ©initialiser l'authentification 2FA pour un utilisateur

En cas de perte de son appareil 2FA, on ne pourra plus accéder à Roundcube. Pour accéder au code de récupération 2FA d'un utilisateur ou désactiver l'application 2FA, nous devrons effectuer quelques actions sur le serveur Roundcube. Cette procédure est orientée pour fonctionner avec SQLite mais devrait marcher avec d'autres bases de données.

  • Se connecter Ă  la base de donnĂ©es SQLite :
root@host:~# sqlite3 /var/lib/dbconfig-common/sqlite3/roundcube/roundcube
  • Identifier l'id du compte utilisateur et rĂ©cupĂ©rer les informations 2FA :
SELECT * FROM users ; 1|john@std.rocks|std.rocks||2024-02-09 15:02:30|2024-02-24 12:31:00|2024-02-24 11:43:03|1|en_US|a:2:{s:11:"client_hash";s:16:"Tzl9oKiP5cifLfVO";s:24:"twofactor_gauthenticator";a:3:{s:6:"secret";s:16:"VTAPZI2PZVUIR45Q";s:8:"activate";b:1;s:14:"recovery_codes";a:4:{i:0;s:10:"B2FDEYC5J7";i:1;s:10:"A6TY7H5XD6";i:2;s:10:"CYYNSZ22UB";i:3;s:10:"SWISSDWBZ7N";}}}
  • Ou rĂ©initialiser les prĂ©fĂ©rences :
UPDATE users SET preferences = NULL WHERE user_id = 1;

Activer HTTPS

Pour amĂ©liorer la sĂ©curitĂ©, il est conseillĂ© d'activer les connexions HTTPS vers Roundcube. Cela peut ĂȘtre rĂ©alisĂ© en utilisant des certificats Let's Encrypt ou des certificats auto-signĂ©s. Voyons comment mettre en Ɠuvre l'une ou l'autre de ces solutions.

  • PremiĂšrement, activer le module Apache ssl :
root@host:~# a2enmod ssl

Let's Encrypt

Nous pouvons demander un certificat Let's Encrypt, dont l'avantage est qu'il sera reconnu par les navigateurs web et ne générera donc pas d'avertissement lors de la connexion.

  • Installer l'utilitaire certbot :
root@host:~# apt update && apt install certbot
  • ArrĂ©ter le service apache2 :
root@host:~# systemctl stop apache2
  • Lancer l'outil certbot (les ports 80 et 443 doivent ĂȘtre redirigĂ©s vers le serveur Roundcube, et ici l'entrĂ©e DNS roundcube.std.rocks doit pointer sur le mĂȘme serveur) :
root@host:~# certbot certonly --email letsencrypt@std.rocks --standalone -d roundcube.std.rocks
  • Modifier le fichier de configuration /etc/apache2/sites-available/default-ssl.conf et ajouter :
SSLCertificateFile /etc/letsencrypt/roundcube.std.rocks/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/roundcube.std.rocks/privkey.pem SSLCertificateChainFile /etc/letsencrypt/roundcube.std.rocks/chain.pem
  • Activer et dĂ©marrer le service apache2 :
root@host:~# a2ensite default-ssl root@host:~# systemctl start apache2

Certificats Auto-Signés

  • On peut aussi crĂ©er un certificat auto-signĂ©:
root@host:~# mkdir /etc/apache2/ssl/ root@host:~# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/apache2/ssl/selfsigned.key -out /etc/apache2/ssl/selsigned.crt ----- 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) [AU]:FR State or Province Name (full name) [Some-State]:STD Locality Name (eg, city) []:stdcity Organization Name (eg, company) [Internet Widgits Pty Ltd]:std Organizational Unit Name (eg, section) []:std Common Name (e.g. server FQDN or YOUR name) []:roundcube.std.rocks Email Address []:email@std.rocks root@host:~# cat /etc/apache2/ssl/selfsigned.key /etc/apache2/ssl/selsigned.crt > /etc/apache2/ssl/cert.pem
  • Éditer le fichier /etc/apache2/sites-available/default-ssl.conf :
DocumentRoot /var/lib/roundcube/public_html/ #AUTOGENERATE CERTIFICATES SSLCertificateFile /etc/apache2/ssl/cert.pem SSLCertificateKeyFile /etc/apache2/ssl/selfsigned.key
  • Éditer le fichier /etc/apache2/ports.conf et dĂ©sactiver http:
#Listen 80
  • Activer et dĂ©marrer le service apache2 :
root@host:~# a2ensite default-ssl root@host:~# systemctl restart apache2