Auto-héberger ses données personnelles avec NextCloud

Nicolas Mesnier

Mis à jour le 14/06/2024.

Motivation

L’auto-hébergement est une pratique qui consiste à héberger ses services Internet personnels sur ses propres machines, chez soi. Il permet d’avoir le contrôle et la responsabilité de ses propres données, par exemple :

Il s’oppose à l’utilisation de services d’hébergements chez un prestataire et garantit donc votre indépendance, surtout si l’offre est gratuite (et que vos données sont donc le produit…).

En pratique, il s’agit d’installer et de configurer un ordinateur (serveur) chez soi, que l’on branche sur sa box Internet et que l’on laisse allumé en permanence.

Son petit nuage à soi avec NextCloud

NextCloud est une solution complète permettant de faire avant tout de l’hébergement de fichiers. Vous pouvez ainsi sauvegarder et synchroniser des fichiers depuis vos différents appareils (ordinateur de bureau, smartphone ou tablette). Il est également possible d’installer des applications, étendant ses fonctionnalités, comme :

On trouve sur cette page quelques éléments permettant d’auto-héberger un serveur de fichiers NextCloud, c’est-à-dire :

Avant de poursuivre, il est important de rappeler que la gestion de ces services demande quelques compétences techniques et peut vite devenir chronophage.

Dans tout le guide, on préfixe par $ les commandes exécutées par un utilisateur lambda et par # celles exécutées par un administrateur (compte root). On essaie autant que possible de préciser la machine sur laquelle sont exécutées les commandes s’il peut y avoir une ambigüité.

Pour la suite, on utilise les variables :

${PUBLIC_IP}    # votre IP publique, celle de votre box
${MONDOMAINE}   # votre nom de domaine
${PRIVATE_IP}   # l'IP privée de votre serveur
${ADMIN}        # le nom de l'administrateur

Pré-requis

Nom de domaine

Pour utiliser Nextcloud, possiblement à côté d’autres services personnels, il est recommandé de disposer d’un nom de domaine, idéalement court et mémorable. Pour cela, vous pouvez :

Le registraire est responsable de la maintenance de la base de données des noms de domaine réservés auprès de lui dont dépend le fonctionnement du DNS (Domain Name System pour « système des noms de domaine ») qui résout chaque nom de domaine en adresse IP.

Système 64 bits

Pour installer Nextcloud, il est nécessaire d’avoir une machine 64 bits, avec une distributions récente avec notamment :

Pour le détail des configurations matérielles et logicielles, voir la page.

La dernière version de Nextcloud est la 29.0.2 du 06/06/2024.

La dernière version compatible avec un système 32 bits était la 24.0.12 et elle n’est plus maintenue depuis mai 2023 (EOL 32 bits nextcloud).

Installation du serveur

Système d’exploitation

Je suis un adepte de Debian/GNU Linux depuis des années, tant pour serveur que pour desktop. On choisira donc comme système d’exploitation pour le serveur la dernière version stable, Debian 12 bookworm à la date de rédaction.

Configuration

Pour toute question d’administration, voir le debian handbook.

Gestion des mises à jour

Il peut être utile de créer une commande maintenance avec

# cd ~
# echo "apt update && apt full-upgrade -y && apt clean \
  && apt autoclean && apt autoremove" > maintenance

où l’option -y de apt full-upgrade répond automatiquement « oui » à la demande d’application des mises à jour. On peut ensuite lancer cette succession de commandes une fois connecté en root

$ su -

avec

# ./maintenance

Désactiver la mise en veille

# systemctl mask sleep.target suspend.target \
                 hibernate.target hybrid-sleep.target
# systemctl daemon-reload

Notez que pour restaurer la mise en veille, il suffit d’enlever ce masque :

# systemctl unmask sleep.target suspend.target \
                hibernate.target hybrid-sleep.target
# systemctl daemon-reload

Gestion des utilisateurs

Logiciels fondamentaux

Sur votre box Internet

Configuration du serveur

Voir les recommandations de l’ANSII relatives à la mise en œuvre d’un site Web.

Connexion SSH

Une connexion SSH permet d’accéder à distance au serveur en garantissant l’identité (authentification) des deux parties ainsi que la confidentialité de la communication (chiffrement asymétrique). Si j’ai l’habitude de suivre les recommandations de l’ANSSI, celles-ci datent de 2015 et il est supputé que ECDSA soit backdooré par la NSA. On privilégiera donc Ed25519 pour la génération des clés.

Voir le guide Mozilla pour une configuration « moderne », en particulier :

Pour ce faire :

Avec ce paramétrage par clés SSH, il n’est pas nécessaire d’utiliser de mot de passe. La sécurité est simplement basée sur un jeu de clés en cryptographie asymétrique pour chiffrer de façon robuste la connexion.

Les connexions SSH « connues » sont stockées dans le fichier /home/$(whoami)/.ssh/known_hosts. Pour connaitre la ligne associée à un serveur d’adresse IP <IP>, il faut exécuter la commande :

$ ssh-keygen -F <IP>

Si besoin, éditer le fichier pour supprimer la ligne en cas de changement de clé du serveur.

Pare-feu (firewall)

Un pare-feu, est un système permettant de protéger un ordinateur ou un réseau d’ordinateurs des intrusions provenant d’un réseau tiers (notamment Internet). Il permet de filtrer les paquets de données échangés avec le réseau. On utilise UFW, acronyme de Uncomplicated FireWall, qui est une interface pour iptables permettant de simplifier le processus de configuration d’un pare-feu.

Reverse proxy

On parle de reverse-proxy pour désigner une application placée en frontal (directement en contact avec les utilisateurs du web) et qui joue le rôle d’intermédiaire avec des applications placées en backend (sans contact direct avec les utilisateurs web).

Dans un contexte d’auto-hébergement, le reverse proxy va vous permettre d’héberger autant de services que vous voulez sur autant de machines que vous voulez sur une seule adresse IP publique. C’est le proxy qui va décider en fonction de l’URL que le visiteur veut joindre vers quel service il va le rediriger. Par exemple, on peut envisager que si vos utilisateurs arrivent sur ${MONDOMAINE}, ils seront redirigés sur le serveur web situé à l’adresse 192.168.1.X mais s’ils tapent cloud.${MONDOMAINE}, ils seront redirigés vers le serveur qui gère le cloud, par exemple :

https://${PRIVATE_IP}:7868

Pour le reverse proxy, on utilise ici NGINX.

Configuration TLS

Afin de sécuriser le protocole HTTP avec une couche de chiffrement SSL/TLS et garder privées les communications entre les utilisateurs et le serveur, on utilisera par défaut le HTTPS, en écoute du port TCP 443.

On se réfère aux recommandations de la fondation mozilla qui ne sont pas en contradiction avec celles de l’ANSSI. On utilise en particulier le générateur sur lequel on renseigne la version de NGINX, obtenue avec :

$ nginx -v

et celle de openssl

$ openssl version

Pour intégrer ces recommandations, il faut :

Durcissement des réponses HTTP

On se base sur les recommandations de l’ANSII et sur l’article pour durcir les réponses HTTP du serveur, notamment :

Pour cela, éditer le fichier de configuration :

# vim /etc/nginx/nginx.conf

en ajoutant les lignes :

 server{
    ...
    add_header Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'" always;
    add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()";
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Xss-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header 'Referrer-Policy' 'origin';
    add_header X-Robots-Tag "noindex, nofollow" always;
    ...
 }

puis relancer NGINX :

# service nginx restart

Vérifier ensuite votre configuration en faisant analyser votre site.

Monitoring

Installation de Nextcloud

On utilise le travail d’Antonio Russo, et en particulier son tutoriel.

Créer un lien symbolique avec le fichier de configuration créé :

# ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/.

Cette suite de commandes à permis d’installer le serveur Nextcloud et notamment la commande nextcloud-server. Il s’agit maintenant de configurer le serveur :

# nextcloud-server preconfigure
# nextcloud-server start

Configuration

Cache mémoire

Le système de cache permet de stocker en mémoire RAM (ou en SWAP si trop de RAM utilisée) certaines informations régulièrement sollicitées, évitant ainsi de passer par la base de données et donc en augmentant significativement les performances. On s’appuie sur la documentation de Nextcloud pour l’optimiser. Pour cela :

Utilisateurs

Les données des utilisateurs sont stockées dans le répertoire /var/lib/nextcloud-server/data.

Il est possible de créer les utilisateurs et les groupes depuis l’interface Web, connecté en admin ou avec les commandes :

$ nextcloud-server occ group:add <group>
$ nextcloud-server occ user:add <user>

Voir toutes les commandes occ.

Configuration des postes clients

Mobile Android

Pour les contacts et l’agenda, il est nécessaire :

Pour les tâches, installez OpenTasks, qui se synchronise directement avec DAVx5.

Pour les comptes partagés, installez MoneyBuster, qui permet d’interagir avec le plugin Cospend de NextCloud.

On trouve librement dans F-Droid. Bref, tout est fait pour vous simplifier la vie !

Ordinateur Debian GNU/Linux

Si vous êtes fan des applications graphiques, ajoutez votre compte NextCloud à Gnome, section « Online accounts ». Contacts et agenda seront immédiatement intégrés à ceux de Gnome. Sinon :

Administration

Mises à jour du serveur

Le plus simple pour tenir à jour son serveur est d’avoir sur sa machine d’administration un script du genre :

#!/usr/bin/env bash
ping -q -w 1 -c 1 ${PRIVATE_IP} > /dev/null \
&& ssh -t ${ADMIN}@${PRIVATE_IP} "( \
    sudo apt update &&  \
    sudo apt full-upgrade &&  \
    sudo apt clean &&  \
    sudo apt autoclean &&  \
    sudo apt autoremove \
    )" \
&& echo -e "\n *** Server up to date. *** \n" \
|| return 1

que l’on doit exécuter idéalement tous les jours. L’avantage par rapport à une tâche automatique est la présence et donc la veille de l’administrateur en cas de casse d’un paquet, voire du système.

Mise à jour et maintenance de NextCloud

Les mises à jour de NextCloud ne peuvent pas se faire directement par l’interface Web mais doivent être faites depuis le serveur. Il est toujours nécessaire de monter graduellement de version. En cas de doute, utilisez la version renseignée sur l’interface. Exemple de montée de versions :

# nextcloud-server upgrade 28.0.3
# nextcloud-server upgrade 29.0.1
# nextcloud-server upgrade 29.0.2

La dernière version de Nextcloud est la 29.0.3 du 06/06/2024.

Vous pouvez vérifier l’état de mise à jour et la sécurisation de votre instance nextcloud à partir de l’interface de gestion, section Vue d'ensemble ou en utilisant le test de sécurité de nextcloud pour lequel vous devez avoir un résultat A+.

Maintenance

Voir cette page pour les commandes de gestion ou de maintenance, par exemple :

Certificats HTTPS

Lors de l’installation de NextCloud, les certificats HTTPS sont générés avec Let’s Encrypt et son application certbot que l’on peut installer comme :

# apt install certbot

Pour générer des certificats SSL, il faut :

Les certificats pour votre sous-domaine cloud.${MONDOMAINE} sont générés à l’installation de NextCloud. Comme tous les certificats Let’s Encrypt, la question de leur renouvellement se pose tous les trois mois. Pour voir les certificats :

# certbot certificates

Pour renouveler les certificats en fin de vie, il faut :

# service nginx stop
# certbot renew
# service nginx start

Changement d’IP publique

Pour vérifier tout changement de l’IP publique, on peut comparer l’adresse précédente de l’actuelle trouvée avec

curl -s https://ipecho.net/plain;echo

Pour gérer les changements intempestifs d’adresses IP de certains FAI, vous pouvez vous inspirer de mon tuto.

Sauvegardes

La documentation de NextCloud n’étant pas des plus claires sur ce point, notamment lorsque la base de données MariaDB tourne dans un socket, on préfère aller librement. On s’inspire toutefois un peu de ce script, mais d’assez loin tant les différences sont nombreuses.

Pour réaliser les sauvegardes, on utilise un script « maison » nextcloud_backup.sh. Le principe est de réaliser successivement :

  1. une sauvegarde de la base de données utilisée par NextCloud, avec la commande :

    # mysqldump --single-transaction --default-character-set=utf8mb4 \
        -h localhost --protocol=socket --socket ${DB_HOST} \
        -u root -p${DB_PASSWORD} ${DB_NAME} > ${DUMP_DIR}/${DUMP_FILE}
  2. de créer le backup incrémental dédupliqué avec borgbackup :

    # borg create --verbose --filter AME --list --stats --show-rc \
        --compression lz4 \
        --exclude-caches --exclude 'home/*/.cache/*' --exclude 'var/tmp/*' \
        ${BACKUPS_HD}/${BACKUPS_DIR}::${ARCHIVE} \
        /etc /home /opt /root /srv /usr /var

Comme on sauvegarde sur un disque dur externe, on s’assure évidemment au début de toute exécution qu’il soit monté et sinon on encourage l’administrateur à le brancher au serveur et à relancer la commande.

Installation et configuration

Utilisation

Il est possible de réaliser une sauvegarde manuellement avec la commande :

# ./nextcloud_backup.sh

qui démontera automatiquement votre disque dur externe de sauvegarde une fois cette dernière effectuée.

Ressources