Autohébergement d’un serveur nextcloud sur raspberry pi de scratch

1 Introduction

J’autohéberge un serveur owncloud depuis quelques années maintenant sur un vieux nettop. Et puis owncloud périclite, son fork nextcloud devient la nouvelle référence, les raspberry pi se démocratisent avec un consommation encore plus faible (~5W) que les nettop (~20W), et bien d’autres avantages (taille, bruit, coût).

J’ai donc récemment sauté le pas pour me mettre au goût du jour et comme je suis content du résultat, je partage. J’ai personnellement opté pour le raspberry pi 2B parce qu’il consomme un petit peu moins que le 3 et que je n’avais aucune utilité ni du wifi ni du bluetooth.

Comme je me suis allègrement servi, je rends à César ce qui appartient à César en citant mes sources principales :

Cet article s’adresse à des personnes qui ont un minimum de connaissance de linux.

NB : Dans cet article j’utilise des dénominations du type “myuser” ainsi que des mots de passes d’exemple. Je ne saurais que vous recommander de personnaliser ces dénominations génériques et d’éviter des noms évidents ! Il va de soit que les mots de passes doivent aussi être personnalisés et sécurisés.

2 Préliminaires

2.1 Préparation de la carte SD

Télécharger la distribution raspbian lite (https://www.raspberrypi.org/downloads/raspbian/) et suivre les instructions pour écrire l’image téléchargée sur la carte SD (https://www.raspberrypi.org/documentation/installation/installing-images/README.md).

Après avoir créé un fichier vide nommé ssh dans la partition boot de la carte SD pour activer le ssh au premier démarrage, il faut démonter la carte SD, même si

La vie est trop courte pour retirer le périphérique USB en toute sécurité

et la mettre dans le raspberry pi avant de brancher ce dernier sur le réseau et au secteur.

2.2 Se connecter en SSH

Pour trouver l’IP attribuée par le DHCP au raspberry pi ainsi que adresse MAC, scanner le réseau :

Pour cet exemple l’IP est 192.168.0.100. Se connecter en SSH avec l’utilisateur pi et le mot de passe raspberry :

2.3 Utilitaire de configuration

On commence doucement avec l’utilitaire de configuration développé pour le raspberry pi :

qui ouvre une interface semi-graphique dans laquelle on règles les paramètres suivants :

  • Choisir Internationalisation Options puis Change Locale.
    • Sélectionner fr_FR.UTF-8 UTF-8 puis OK.
    • Choisir fr_FR.UTF-8 UTF-8.
  • Choisir Internationalisation Options puis Change Timezone.
    • Choisir Europe, puis Paris.
  • Choisir Advanced Options puis Hostname.
    • Taper le nom de la machine, myserver dans le cadre de cet exemple.
  • Choisir Advanced Options puis Memory Split.
    • Taper 16.
  • Choisir Advanced Options puis SSH puis yes.
  • Choisir <Finish> puis yes pour redémarrer.

Une fois redémarré, on se reconnecte en ssh (le mot de passe est toujours raspberry) :

2.4 Mens sana in corpore sano

Une petite mise à jour le système pour partir sur de bons rails :

Se reconnecter au SSH.

3 Sortez couverts

3.1 Préserver la carte SD

Pour mettre les fichiers temporaires en mémoire vive, on rajoute les deux lignes suivantes dans /etc/fstab :

L’utilitaire log2ram permet de placer les logs en mémoire vive et de ne les sauvegarder que toutes les heures :

Pour indiquer au serveur apache de démarrer après log2ram, éditer le fichier /etc/systemd/system/log2ram.service :

Vérifier que toutes les modifications ont été prises en compte en vérifiant que vous avez bien les quatre dernières lignes après avoir redémarré :

Pour corriger un bug de raspbian qui envoie des erreurs du fait qu’il n’y a pas de console graphique, éditer le fichier /etc/rsyslog.conf et commenter les lignes suivantes (à la fin du fichier) :

3.2 Sécuriser le serveur

Ajouter l’utilisateur personnalisé, dans cet exemple sera myuser, avec les droits sudo, définir un M0t#2Pass3_Compl1quE! :

On peut maintenant se déconnecter de la session de l’utilisateur pi et se reconnecter avec notre utilisateur myuser fraichement créé :

Et c’est avec un petit plaisir sadique qu’on supprime l’utilisateur par défaut pi et ses fichiers :

Peaufinons maintenant la configuration du server ssh en éditant le fichier /etc/ssh/sshd_config et en modifiant les paramètres suivants :

On restreindre le service SSH à l’IPv4 et on redémarre le service ssh en vérifiant son statu :

Pour que notre serveur puisse nous envoyer de gentils petits courriels, nous installons nullmailer :

Pendant l’installation renseigner le nom de la boite mail (qui doit être une boite mail existante) :

Puis fournir les paramètres SMTP de la boite mail en question :

En cas de problème, ces informations peuvent être modifiées dans les fichiers situés dans le dossier /etc/nullmailer/.

Appliquer le fix suivant pour corriger le header des emails et le forcer l’expéditeur à webmaster@mydomain.com et ainsi éviter de se faire bouler par le serveur smtp :

Créer un fichier /usr/sbin/sendmail dans lequel mettre :

Que l’on rend exécutable :

Pour tester l’envoie de mail :

L’utilitaire fail2ban va nous permettre d’ajouter une couche de sécurité au serveur :

Éditer la première ligne du fichier /etc/hosts :

Créer un fichier de configuration pour fail2ban :

Puis éditer le fichier créé /etc/fail2ban/jail.local comme suit :

Relancer le service fail2ban et vérifier que tout c’est bien passé :

3.3 Configurer le réseau

Ci-après, c’est votre box internet que vous devez configurer. Comme il y a autant de cas que de fournisseurs d’accès et d’offres, je vous propose de vous reporter sur ce lien si vous n’arrivez pas à trouver comment faire les actions suivantes.

  1. Commencez par configurer un bail DHCP pour que l’adresse MAC du raspberry pi (XX:XX:XX:XX:XX:XX) – obtenue avec la commande nmap (souvenez-vous c’était ici) – ait une IP fixe (192.168.0.100 dans ce cas).
  2. Rediriger ensuite les ports entrant 80 (HTTP) et 443 (HTTPS) en TCP vers les mêmes ports de l’IP 192.168.0.100.
  3. Rediriger enfin le port entrant de votre choix (1234 par exemple) en TCP vers le port 22 (SSH) de l’IP 192.168.0.100. Ça permet de brouiller un peu – pas beaucoup – les pistes pour un éventuel pirate, la connexion en SSH depuis l’extérieur se faisant avec l’IP de la box que vous pouvez facilement trouver sur ce lien (exemple ou 123.456.789.12) :

Maintenant il s’agit de configurer le DNS sur votre nom de domaine. Rajoutez un sous domaine (mycloud par exemple) qui pointe vers votre box internet :

4 Le gros œuvre

4.1 Base de données

Installer le gestionnaire de bases de données mariadb, définir un m0t-DeuX!p4sse pour le root, et appliquer les paramètres sécurisés proposés par la seconde commande (sauf le changement du mot de passe root car celui que vous venez de définir est évidemment brillamment sécurisé) :

Créer la base de données et l’utilisateur pour nextcloud :

Où la base de donnée pour nextcloud est myclouddb, l’utilisateur myclouduser et son mot de passe d’accès S3cUr1tY_firST.

Décommenter les lignes suivantes du fichier /etc/mysql/conf.d/mariadb.cnf :

Et redémarrer le service puis vérifier que tout s’est bien passé :

4.2 Server web

Pour l’heure votre serveur ne sait toujours pas afficher une page web. Pour y remédier, installer apache et php puis relancer le service apache :

Testez que tout est bien installé en créant un fichier de test /var/www/html/info.php contenant :

Puis ouvrir dans votre navigateur successivement les deux liens qui doivent ouvrir la même page :

  • http://192.168.0.100/info.php
  • http://mycloud.mydomain.com/info.php

Une fois cette vérification faite supprimer le fichier :

Modifier les paramètres suivants du fichier /etc/apache2/conf-available/security.conf :

Modifier les paramètres suivants du fichier /etc/php5/apache2/php.ini :

Éditer le fichier /etc/apache2/apache2.conf et ajouter à la fin :

Puis relancer le service apache et vérifier que cela c’est bien passé :

4.3 Configurer HTTPS

Installer certbot et créer un certificat pour le sous-domaine :

Vérifier que le certificat est créé :

Ajouter ou modifier les paramètres suivants dans /etc/apache2/sites-available/default-ssl.conf :

Puis ouvrir dans votre navigateur le lien pour vérifier que HTTPS fonctionne :

  • https://mycloud.mydomain.com/

Désactiver les virtualhost apache par défaut puis relancer le service :

4.4 Fichiers Nextcloud

Télécharger les fichiers et vérifier leur intégrité :

Si une erreur apparaît lors du checksum, il faudra peut-être renommer le fichier latest.zip par celui rechercé par latest.zip.sha256.

Décompresser le zip et mettre les fichiers au bon endroit avec les bons droits :

4.5 Hôte Apache pour Nextcloud

Modifier le fichier /etc/apache2/apache2.conf :

Créer le fichier /etc/apache2/sites-available/nextcloud.conf contenant :

Activer ce nouvel l’hôte virtuel :

5 Les finitions

5.1 Initialisation de Nextcloud

Avec votre navigateur aller sur : http://mycloud.mydomain.com.

Vérifiez que vous êtes bien redirigés sur le HTTPS et que la page d’initialisation de nextcloud s’affiche. Configurer comme suit :

  • Définissez un compte administrateur (toujours en les personnalisant) myadminnextcloud avec un MoT_dE_pAsSe_SeCuRiSe.
  • Définir le répertoire des données : /var/www/data.
  • Configurer la base de données définie plus haut.

Cliquer sur Terminer la configuration, est une fois arrivé sur l’écran de login – ça prend un peu de temps – nextcloud peut commencer à être utilisé. Peaufinez l’installation en modifiant ou ajoutant les paramètres suivants dans le fichier /var/www/nextcloud/config/config.php :

5.2 Configurer Nextcloud

Voici comment j’ai personnellement configuré mon instance nextcloud.

J’ai installé les applications :

  • Calenda
  • Contacts
  • Default encryption module
  • Notes

Dans le menu d’administration j’ai modifié les onglets suivants.

5.2.1 Onglet paramètres serveur

Vérifier qu’il n’y a pas d’avertissement sécurité & configuration. Sélectionner cron pour les tâches cron. Ajouter une tâche cron pour nextcloud en éditant via la commande :

Choisir l’éditeur parmi ceux proposés et ajouter les lignes :

5.2.2 Onglet chiffrement

Activer le chiffrement.

5.2.3 Onglet paramètres supplémentaires

Utiliser sendmail pour le mode d’envoie des emails avec l’adresse source : webmaster@mydomain.com. Envoyer un email pour tester que la configuration fonctionne.

Vérifier la politique de mots de passe et la modifier en fonction de ses souhaits de sécurité.

5.3 Restons up-to-date

Commençons par un petit peu de ménage avant d’installer cron-apt qui va permettre de maintenir le système à jour :

Éditer le fichier /etc/cron-apt/config (vide) en ajoutant :

Éditer /etc/cron-apt/action.d/3-download et supprimer le -d :

Éditer /etc/cron.d/cron-apt et ajouter l’exécution de la tache tous les lundis à 1h du matin :

Pour tester l’exécution de la tache :

Ensuite on programme une tache cron pour redémarrer le raspberry tous les lundis à 2h du matin et envoyer un mail à chaque démarrage :

Ajouter au début et à la fin :

5.4 Tester le serveur

J’ai testé cette installation avec ces outils :

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *