Tutoriels gratuits et ouverts à toutes et à tous · mis à jour régulièrementÀ propos

Nextcloud : mettre en place une plateforme collaborative sécurisée

Installer Nextcloud sur un serveur LAMP Debian 12, protéger SSH avec Fail2ban, connecter les clients, automatiser la sauvegarde (PCA / PRA), puis aller plus loin : restauration, clés SSH, HTTPS, audit Nmap.

Systèmes✎ B. Jousseaume📅 21 octobre 2026 · mis à jour le 21 octobre 2026📶 Intermédiaire

Nextcloud en bref

Nextcloud a besoin d’un serveur web (Apache, Nginx…) et d’une base de données relationnelle (MySQL/MariaDB, PostgreSQL, SQLite), que l’on peut héberger sur la même machine. On y accède depuis un navigateur, un client de synchronisation ou une application pour smartphone.

Installation de Nextcloud

Installation d’un serveur LAMP

Nextcloud nécessite un serveur LAMP (Linux, Apache, MariaDB/MySQL, PHP) ainsi que plusieurs modules PHP. Nous partons d’une Debian 12 (Bookworm) fraîchement installée, sans environnement de bureau. Elle fournit PHP 8.2 et MariaDB 10.11, ce qui détermine la version de Nextcloud installable (voir plus bas).

apt update && apt upgrade -y
apt install -y curl unzip apache2 libapache2-mod-php mariadb-server \
  php php-mysql php-mbstring php-gd php-curl php-intl php-imagick \
  php-xml php-zip php-ldap php-bcmath php-gmp

Installez également le serveur SSH et Fail2ban :

apt install -y openssh-server fail2ban python3-systemd

Téléchargement et décompression

Pour récupérer Nextcloud 34 (dernière version corrective de la branche 34) directement depuis le serveur :

cd /tmp
wget https://download.nextcloud.com/server/releases/latest-34.zip
unzip latest-34.zip
mv nextcloud /var/www/html/
chown -R www-data:www-data /var/www/html/nextcloud/

Remarque sur l’adressage IP

Choisissez pour le serveur Nextcloud une adresse IP cohérente avec votre environnement : s’il est opérationnel, le serveur doit être joignable par son adresse IP. Les accès par nom DNS seront abordés plus tard dans l’année.

Préparation de la base de données

1. Sécurisez le serveur MariaDB :

mysql_secure_installation

Cette commande permet notamment de protéger le compte root de MariaDB, de supprimer les utilisateurs anonymes et la base de test. Répondez Oui à toutes les questions.

2. Connectez-vous au serveur de base de données (en tant que root du système) :

mysql

3. Créez la base, l’utilisateur propriétaire et ses droits :

CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
QUIT;

L’utilisateur propriétaire de la base est donc nextcloud, avec le mot de passe password.

Finalisation de l’installation depuis le navigateur

Depuis le navigateur du poste client, rendez-vous à l’adresse du serveur : http://<adresse-ip-du-serveur>/nextcloud.

  1. Créez le compte administrateur : identifiant admin, mot de passe password (pour les besoins de l’activité).
  2. Dans la partie basse du formulaire, saisissez les informations de connexion à la base : utilisateur nextcloud, mot de passe password, base nextcloud, hôte localhost.
  3. Cliquez enfin sur Installer : la page d’accueil de Nextcloud s’affiche, connecté en administrateur.

NB : l’espace de stockage des fichiers est configuré automatiquement dans /var/www/html/nextcloud/data.

Prise en main de l’interface

  • L’application Fichiers donne accès à la liste des fichiers, aux fichiers récents, aux favoris, aux partages et aux étiquettes. Ce menu s’enrichit selon les applications installées.
  • Le menu de l’avatar, en haut à droite, permet de configurer son espace (langue, notifications, mot de passe…) et, pour un administrateur, de gérer Nextcloud, ses applications et ses utilisateurs.

Ces menus s’adaptent selon que la personne connectée est administrateur ou simple utilisateur.

Contre-mesure Fail2ban

Fail2ban analyse les journaux (logs) de différents services (SSH, Apache…) à la recherche de motifs définis dans ses filtres. Lorsqu’une correspondance est trouvée, une ou plusieurs actions sont exécutées : typiquement, après plusieurs connexions échouées, l’adresse IP source est bannie par une règle ajoutée au pare-feu (fonctionnement de type IDS/IPS).

Nextcloud intègre déjà une protection contre les attaques par force brute sur sa page de connexion (ralentissement progressif des tentatives) : aucun réglage n’est nécessaire. Ce n’est pas le cas des autres services qui demandent une authentification, comme SSH. SSH est robuste, mais on peut renforcer sa protection avec Fail2ban.

Administrer le serveur en SSH

Pour administrer le serveur à distance de manière sécurisée, nous utilisons SSH. Un client SSH est intégré à Linux, macOS et Windows (« Terminal » ou « Invite de commandes ») ; des outils graphiques comme PuTTY ou WinSCP existent aussi. SSH permet la prise de contrôle à distance et le transfert de fichiers chiffré.

UsageCommandeEffet
Connexion à distancessh administrateur@192.168.1.7Ouvre une session sur le serveur 192.168.1.7 avec l’utilisateur « administrateur »
Copie de fichier chiffréescp toto.txt cedric@192.168.10.15:/home/cedric/docCopie toto.txt dans /home/cedric/doc de la machine 192.168.10.15, en tant que « cedric »

Principe de configuration

Le fichier /etc/fail2ban/jail.conf contient les réglages par défaut de tous les services (les « jails »). Ne le modifiez pas : il est écrasé lors des mises à jour. Les personnalisations se placent dans des fichiers .conf du répertoire /etc/fail2ban/jail.d/, qui viennent compléter et remplacer les valeurs par défaut. Soyez curieux : ouvrez jail.conf pour y repérer la section [sshd] et les valeurs de maxretry, findtime et bantime.

Configuration de la surveillance SSH

Créez le fichier /etc/fail2ban/jail.d/monsshd.conf avec le contenu suivant (remplacez 192.168.1.50 par l’adresse de votre poste d’administration) :

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 192.168.1.50
findtime = 10m
bantime = 1h

[sshd]
enabled = true
backend = systemd
maxretry = 3
DirectiveRôle
ignoreipAdresses jamais bannies (liste blanche), séparées par des espaces
findtimeFenêtre de temps pendant laquelle les échecs sont comptés
bantimeDurée du bannissement (-1 = définitif)
enabledActive la surveillance du service par Fail2ban
maxretryNombre d’échecs tolérés : 3 ici, contre 5 par défaut

Démarrage et vérification

systemctl restart fail2ban
systemctl status fail2ban
fail2ban-client status

La commande fail2ban-client status doit afficher la jail sshd.

Avant le test des 3 échecs, vérifiez que Fail2ban sait reconnaître une erreur d’authentification. Ratez volontairement une connexion SSH depuis une machine quelconque, puis lancez sur le serveur :

fail2ban-regex systemd-journal sshd

Cette commande applique le filtre sshd au journal systemd. En fin d’affichage, la ligne Failregex: doit indiquer au moins 1 « matched » : le backend, la sélection des journaux et le filtre fonctionnent. Si elle affiche 0 matched, inutile de lancer le test : Fail2ban ne bannira jamais personne (vérifiez backend et l’installation de python3-systemd).

Les bannissements sont ensuite tracés dans le journal de Fail2ban :

tail -f /var/log/fail2ban.log

Exemple de trace après trois échecs depuis le poste 192.168.1.60 :

2026-10-05 14:02:11,512 fail2ban.jail    [812]: INFO    Jail 'sshd' started
2026-10-05 14:09:37,204 fail2ban.filter  [812]: INFO    [sshd] Found 192.168.1.60
2026-10-05 14:09:41,876 fail2ban.filter  [812]: INFO    [sshd] Found 192.168.1.60
2026-10-05 14:09:45,033 fail2ban.filter  [812]: INFO    [sshd] Found 192.168.1.60
2026-10-05 14:09:45,301 fail2ban.actions [812]: NOTICE  [sshd] Ban 192.168.1.60

Pour voir la règle ajoutée au pare-feu : nft list ruleset.

Commandes importantes

BesoinCommande
Lister les jails activesfail2ban-client status
Détail d’une jail : échecs, nombre de bannis, IP banniesfail2ban-client status sshd
Débannir une IP (erreur de manipulation, fin de test)fail2ban-client set sshd unbanip 192.168.1.60
Bannir manuellement une IPfail2ban-client set sshd banip 203.0.113.70
Recharger la configurationfail2ban-client reload

Clients Nextcloud : poste de travail et smartphone

Client Windows ou Linux (Nextcloud Desktop)

  1. Téléchargez et installez le client Nextcloud Desktop depuis nextcloud.com/install.
  2. Paramétrez-le avec l’adresse du serveur et un compte utilisateur créé précédemment.
  3. Testez la synchronisation dans les deux sens (dépôt depuis le poste, dépôt depuis l’interface web).

Smartphone

  1. Vérifiez que le smartphone est connecté au réseau Wi-Fi.
  2. Installez l’application Nextcloud depuis le magasin d’applications.
  3. Paramétrez-la avec l’adresse du serveur et un compte utilisateur.
  4. Testez (consultation, dépôt d’une photo…).

Sauvegarde et automatisation

En informatique, on met en place des PCA et PRA pour se prémunir contre toute panne ou attaque pouvant interrompre les services ou entraîner la perte de données sensibles (fichiers de configuration, contenu des bases de données…).

PlanDéfinition
PCA — Plan de Continuité d’ActivitéGarantit une haute disponibilité de la production : procédures, moyens, équipements et architectures permettant la continuité de l’activité quels que soient les sinistres.
PRA — Plan de Reprise d’ActivitéComplément (ou palliatif en l’absence) du PCA : processus mis en œuvre après un incident pour reprendre l’activité normale, directement ou progressivement.

Compresser et décompresser des fichiers

ActionCommande
Compresser un répertoire et ses sous-répertoires (-r = récursif)zip -r nom_du_fichier.zip repertoire_ou_fichier
Décompresser une archive zipunzip nom_du_fichier.zip
Alternative Linux : archive tar compresséetar -czf nom.tar.gz repertoire_ou_fichier
Extraire une archive tar compresséetar -xzf nom.tar.gz

Planifier des tâches avec cron

Pour planifier des actions, éditez la table cron de l’utilisateur avec crontab -e. Chaque ligne correspond à une tâche :

# .---------------- minute (0 - 59)
# |  .------------- heure (0 - 23)
# |  |  .---------- jour du mois (1 - 31)
# |  |  |  .------- mois (1 - 12) OU jan,feb,mar,apr ...
# |  |  |  |  .---- jour de la semaine (0 - 7, 0 et 7 = dimanche) OU sun,mon,tue ...
# |  |  |  |  |
# *  *  *  *  *  commande à exécuter
ChampValeurs
mmminutes (0-59)
hhheures (0-23)
jjjour du mois (1-31)
MMMmois (1-12 ou abréviation anglaise : jan, feb, mar…)
JJJjour de la semaine (0-7, 0 et 7 = dimanche, ou mon, tue, wed…)
> logfacultatif : redirection de la sortie vers un fichier. Sans redirection, la sortie est envoyée par mail à l’utilisateur local.

Pour chaque champ : 1-5 = de 1 à 5 ; */6 = toutes les 6 unités ; 2,7 = les valeurs 2 et 7.

Exemples

PlanificationLigne crontab
Tous les jours à 22 h, avec journalisation0 22 * * * /root/scripts/sauvegarde.sh >> /var/log/sauvegarde.log 2>&1
Toutes les 6 heures0 */6 * * * /root/scripts/synchronisation.sh
Toutes les heures0 * * * * /root/scripts/verification.sh
Toutes les minutes, le lundi uniquement* * * * 1 /root/scripts/commandes-du-lundi.sh
Une fois par an (25 décembre à 0 h 15)15 0 25 12 * echo "Le père Noël est passé !"
Chaque jour à 2 h 1515 2 * * * /root/scripts/nettoyage.sh

Sauvegarder et restaurer une base de données

mysqldump exporte tout ou partie des bases d’un serveur MariaDB/MySQL sous forme de fichier SQL. Sur Debian, exécutée en tant que root du système, la commande n’a pas besoin de mot de passe (authentification par socket) :

### Une seule base de données
mysqldump --databases nextcloud > /sauvegarde/nextcloud.sql
### Toutes les bases
mysqldump --all-databases > /sauvegarde/toutes_bdd.sql
### Plusieurs bases
mysqldump --databases bdd1 bdd2 > /sauvegarde/dump.sql
### Une ou plusieurs tables d’une base
mysqldump nom_bdd table1 table2 > /sauvegarde/tables.sql
### Restauration
mysql < /sauvegarde/nextcloud.sql

Avec un autre compte, on indique l’utilisateur avec -u et on laisse -p sans valeur : le mot de passe est alors demandé de façon interactive.

mysqldump -u nextcloud -p --databases nextcloud > /sauvegarde/nextcloud.sql

Le mode maintenance et la commande occ

Nextcloud s’administre aussi en ligne de commande avec l’outil occ. Il doit être lancé avec le compte www-data, propriétaire des fichiers de Nextcloud :

runuser -u www-data -- php /var/www/html/nextcloud/occ status
runuser -u www-data -- php /var/www/html/nextcloud/occ maintenance:mode --on
runuser -u www-data -- php /var/www/html/nextcloud/occ maintenance:mode --off

En mode maintenance, Nextcloud refuse les connexions et les synchronisations : personne ne peut modifier un fichier pendant que l’on copie la base et le dossier data/. Connectez-vous depuis le navigateur pendant que le mode est actif pour voir ce qu’affichent les utilisateurs.

Assembler le script de sauvegarde

Créez le script /root/scripts/sauvegarde_nextcloud.sh à partir du squelette suivant, en remplaçant chaque ligne ... par la commande adaptée (voir les sections précédentes) :

#!/bin/bash
# Sauvegarde quotidienne de Nextcloud
DATE=$(date +%Y-%m-%d)
DEST=/sauvegarde
NC=/var/www/html/nextcloud
mkdir -p "$DEST"
# 1. Activer le mode maintenance
...
# 2. Exporter la base nextcloud, compressée avec gzip, dans "$DEST/nextcloud_bdd_$DATE.sql.gz"
...
# 3. Archiver et compresser le répertoire "$NC" dans "$DEST/nextcloud_fichiers_$DATE.tar.gz"
...
# 4. Désactiver le mode maintenance
...
  1. Rendez le script exécutable : chmod 700 /root/scripts/sauvegarde_nextcloud.sh.
  2. Testez-le à la main, puis vérifiez le contenu de /sauvegarde (ls -lh, tar -tzf).
  3. Planifiez-le avec crontab -e pour une exécution tous les jours à 20 h, en journalisant sa sortie.

Conclusion : les mots de passe

La gestion des mots de passe reste un élément essentiel de la sécurité des systèmes d’information. C’est souvent la seule protection sur laquelle s’appuient les utilisateurs, dans presque tous les services du quotidien (messagerie, réseaux sociaux, cloud…). La CNIL publie des recommandations de sécurité et peut sanctionner les entreprises dont la politique de mots de passe est trop laxiste, au titre de la protection des données.

Recommandations de la CNIL : mots de passe, recommandations de sécurité minimales.

Nextcloud & moi

Il est tout à fait possible de reproduire cette activité chez vous pour remplacer des services comme Google Drive ou Dropbox. Ces services appartiennent à des entreprises américaines : même lorsque les données sont stockées en Europe, elles peuvent être soumises à des lois extraterritoriales comme le Cloud Act, ce qui pose question au regard du RGPD. Héberger son propre cloud, c’est garder la maîtrise de ses données.

RGPD : cnil.fr/fr/reglement-europeen-protection-donnees.

Nextcloud s’installe très bien sur un Raspberry Pi, pour un budget de quelques dizaines d’euros à une centaine selon le modèle et les accessoires. Des boîtiers en kit sont disponibles… mais on peut aussi en fabriquer un en briques de construction.

Missions bonus : pour aller plus loin

N°BonusDifficulté
1Restaurer Nextcloud sur un serveur vierge (PRA)★★★
2Configurer les tâches de fond de Nextcloud★
3Analyser les avertissements de sécurité★★
4Authentification SSH par clé★★
5Protéger la page de connexion avec Fail2ban★★★
6Passer en HTTPS et le prouver avec Wireshark★★
7Auditer son serveur avec Nmap★

Bonus 1 — Restaurer Nextcloud sur un serveur vierge (PRA)

Objectif : prouver que votre sauvegarde permet réellement de reconstruire le service après la perte du serveur.

  1. Créez une nouvelle VM Debian 12 et installez le socle LAMP.
  2. Recréez l’utilisateur MariaDB nextcloud et ses droits. La base elle-même sera recréée par la restauration.
  3. Copiez vos deux archives de /sauvegarde vers la nouvelle VM avec scp.
  4. Restaurez la base : zcat nextcloud_bdd_<date>.sql.gz | mysql.
  5. Restaurez les fichiers : tar -xzf nextcloud_fichiers_<date>.tar.gz -C /var/www/html/, puis chown -R www-data:www-data /var/www/html/nextcloud.
  6. L’archive a été prise en mode maintenance : désactivez-le avec occ. Si l’adresse IP a changé, mettez à jour trusted_domains.
  7. Connectez-vous avec vos deux utilisateurs : retrouvent-ils tous leurs fichiers ?

Bonus 2 — Configurer les tâches de fond

Nextcloud exécute régulièrement des tâches de fond (nettoyage, notifications…). Par défaut, elles ne se lancent que lorsqu’un utilisateur charge une page (mode AJAX), ce qui n’est pas fiable.

  1. Dans Paramètres d’administration → Paramètres de base → Tâches de fond, choisissez Cron.
  2. Éditez la table cron du compte www-data : crontab -u www-data -e.
  3. Ajoutez une ligne exécutant php -f /var/www/html/nextcloud/cron.php toutes les 5 minutes.
  4. Vérifiez, quelques minutes plus tard, l’heure de la dernière exécution affichée dans la page d’administration.

Bonus 3 — Analyser les avertissements de sécurité

La page Paramètres d’administration → Vue d’ensemble liste les avertissements de sécurité et de configuration de votre serveur. Relevez-les et, pour chacun, expliquez ce qu’il signifie puis s’il est corrigé, accepté ou hors périmètre, et pourquoi.

Bonus 4 — Authentification SSH par clé

Objectif : remplacer les mots de passe SSH par une paire de clés, bien plus résistante à la force brute.

  1. Sur le poste client, générez une paire de clés : ssh-keygen -t ed25519.
  2. Copiez la clé publique sur le serveur : ssh-copy-id utilisateur@<ip> (Linux). Sous Windows, ajoutez le contenu de id_ed25519.pub au fichier ~/.ssh/authorized_keys de l’utilisateur sur le serveur.
  3. Vérifiez que la connexion fonctionne sans mot de passe, sans fermer la session en cours.
  4. Sur le serveur, créez /etc/ssh/sshd_config.d/durcissement.conf contenant PasswordAuthentication no, puis systemctl reload ssh.
  5. Rejouez le test de Fail2ban : que constatez-vous ? Qu’en concluez-vous sur l’encadré « ce que Fail2ban fait… et ne fait pas » ?

Bonus 5 — Protéger la page de connexion Nextcloud avec Fail2ban

Nextcloud ralentit déjà les tentatives répétées, mais Fail2ban peut bannir l’adresse au niveau du pare-feu. Créez le filtre /etc/fail2ban/filter.d/nextcloud.conf (d’après la documentation officielle de Nextcloud) :

[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
            ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"

Puis ajoutez la jail correspondante dans /etc/fail2ban/jail.d/monsshd.conf :

[nextcloud]
enabled = true
backend = auto
port = 80,443
filter = nextcloud
maxretry = 3
logpath = /var/www/html/nextcloud/data/nextcloud.log

Redémarrez Fail2ban, échouez trois fois à vous connecter depuis le navigateur du poste client, puis vérifiez avec fail2ban-client status nextcloud.

Bonus 6 — Passer en HTTPS et le prouver avec Wireshark

  1. Sur le poste client, lancez une capture Wireshark et connectez-vous à Nextcloud en HTTP.
  2. Filtrez la capture avec http.request.method == "POST" : retrouvez-vous l’identifiant et le mot de passe ?
  3. Sur le serveur, activez le site HTTPS d’Apache avec son certificat auto-signé : a2enmod ssl, a2ensite default-ssl, puis systemctl reload apache2.
  4. Connectez-vous à https://<ip>/nextcloud (acceptez l’avertissement du navigateur) et refaites la capture : que voyez-vous désormais ?

Bonus 7 — Auditer son serveur avec Nmap

Depuis le poste client, lancez nmap -sV <ip-du-serveur> et justifiez chaque port ouvert : quel service est détecté, pourquoi il est ouvert, et s’il est vraiment nécessaire.

Question : le serveur héberge MariaDB, pourtant le port 3306 n’apparaît pas. Pourquoi est-ce une bonne chose ?

Documenter son serveur : la fiche serveur

Tout serveur mis en service se documente dans une fiche serveur, tenue à jour à chaque modification. Elle permet à un collègue de reprendre l’administration sans vous, et elle sert de point de départ en cas de panne ou de restauration (bonus 1). Elle indique au minimum :

  • l’identité du serveur : nom, rôle (« serveur Nextcloud de l’entreprise »), version de la fiche, auteur ;
  • les services : ceux qui sont actifs (web, SGBD, SSH, Fail2ban…) et ceux qui ont été volontairement désactivés, car tout service inutile est une surface d’attaque en moins ;
  • la configuration réseau : système d’exploitation et version, adresse IP, masque, passerelle, VLAN, DNS, NTP, proxy ;
  • les comptes d’administration : quels comptes existent et à quoi ils servent, mais pas leurs mots de passe (voir l’encadré ci-dessous) ;
  • le mode opératoire : installation, sauvegarde, restauration, mises à jour.

🧠 Testez vos connaissances

6 questions. Répondez puis cliquez sur « Corriger ». Rien n’est enregistré : c’est de l’auto-évaluation.

1. Pourquoi installe-t-on Nextcloud 34 et pas la toute dernière version sur Debian 12 ?

💬 Nextcloud 35 ne prend plus en charge PHP 8.2. Nextcloud 34 le prend encore en charge et reçoit des correctifs de sécurité jusqu’au 30 juin 2027.

2. Pourquoi ne modifie-t-on pas directement /etc/fail2ban/jail.conf ?

💬 Les personnalisations vont dans /etc/fail2ban/jail.d/, qui complète et remplace les valeurs par défaut sans être écrasé.

3. Sur Debian 12, pourquoi utilise-t-on backend = systemd pour la jail sshd ?

💬 Debian 12 n’installe plus rsyslog par défaut : les journaux SSH ne sont consultables qu’avec journalctl. Le paquet python3-systemd est nécessaire.

4. Une sauvegarde qui contient config.php et la base de données, mais pas le dossier data/…

💬 La base ne contient que la liste des fichiers. Les fichiers eux-mêmes sont dans data/ : sans lui, tous les documents disparaissent à la restauration.

5. Que signifie la règle 3-2-1 ?

💬 Une sauvegarde laissée sur le serveur qu’elle protège disparaît avec lui (panne, rançongiciel).

6. Pourquoi le port 3306 de MariaDB n’apparaît-il pas dans un scan Nmap du serveur ?

💬 Sur Debian, MariaDB n’écoute par défaut qu’en local. Seul Apache, sur la même machine, a besoin d’y accéder.

© 2026 Bruno Jousseaume. Ce cours est publié sous licence CC BY-NC-SA 4.0 : vous pouvez le partager et l’adapter en citant l’auteur et un lien vers cette page, sans usage commercial, et en partageant vos adaptations sous la même licence.

Pour aller plus loin