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
- Afficher l'Ă©tat de la prison roundcube-auth :
root@host:~# fail2ban-client status roundcube-auth
Status for the jail: roundcube-auth
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/roundcube/errors.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
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 :
- Cocher la case Activate et cliquer sur Fill all fields :
- Une fenĂȘtre devrait apparaitre, cliquer sur OK :
- 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 :
- 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 :
- Enfin, cliquer sur Save:
- AprĂšs la prochaine authentification, la phase d'authentification 2FA devrait appraitre :
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