Serveur cloud Raspberry Pi


Informatique - 30-07-2017

Dans ce tutoriel, je vais présenter étape par étape la solution de stockage cloud que j'ai déployée sur mon Raspberry Pi, principalement pour un usage multimédia.

Il ne s'agit pas d'une solution particulièrement performante en terme de vitesse de transfert à cause des limitations physiques du matériel, mais elle a tout de même l'avantage d'être peu chère, flexible, sûre et intégralement libre. De surcroît, il y a beaucoup à apprendre sur GNU/Linux dans le processus d'installation et d'utilisation de ce service!

Matériel

L'aspect hardware est très simple. Seuls les éléments suivants sont requis:

  • Une carte Raspberry Pi, sa carte SD (classe 10 de préférence) et son alimentation 5V (2A minimum)
  • Deux disques durs externes de capacité identique en 3,5". On peut utiliser des 2,5" mais il faudra alors avoir un hub USB auto-alimenté pour prendre en charge l'alimentation des disques, sans quoi le Raspberry pi ne fonctionnera pas!
  • Un câble Ethernet
  • Une box internet ou un routeur

Il est tout a fait possible de n'utiliser qu'un seul disque mais ce serait risqué pour vos données, la probabilité de plantage physique d'un disque dur tournant 24h/24h étant loin d'être négligeable!

Logiciel

Ces notes partent du principe qu'une distribution GNU/Linux est déjà en place sur la carte SD; de préférence Raspbian Lite. Si ce n'est pas le cas, veuillez regarder directement sur le site officiel.

On se connecte au Raspberry Pi en SSH en utilisant la commande ssh pi@<adresse_IP_pi> sous Linux, ou le logiciel PuTTY sous Windows.

Avant de commander quoi que ce soit, il est primordial de mettre les paquets à jour:

sudo apt-get update && sudo apt-get upgrade -y

La gestion du stockage

Je recommande de préalablement formater les disques dur en ext4, en utilisant GParted par exemple (logiciel Linux libre). L'ext4 est un système de fichier qui offrira des performances bien plus satisfaisantes que le NTFS (format propriétaire Microsoft).

Pour préparer nos disques dur, on commence par automatiser leur montage au démarrage du serveur. On a besoin de trouver le chemin d'accès à nos disques, qui se présentera sous la forme "/dev/sdXY" avec X une lettre correspondant au lecteur USB et Y un chiffre correspondant au numéro de la partition. La commande suivante permet de lister les périphériques branchés sur notre Raspberry pi.

sudo fdisk -l

On trouve le nom des disques sous “Device”. Pour moi:

Résultat de commande fstab.

Les chemins des disques sont donc "/dev/sdb2" et "/dev/sda1" ici.

Une fois tous les disques identifiés, on peut configurer le fichier /etc/fstab pour qu'ils soient automatiquement montés au démarrage de Raspbian dans un répertoire de notre choix.

# Création des points de montage (dossiers)
sudo mkdir /media/NAS 
sudo mkdir /media/NAS0

# Ouverture du fichier /etc/fstab
sudo nano /etc/fstab

A la fin de ce fichier, on ajoute les lignes suivantes (pensez à adapter pour vos chemins):

/dev/sdb2 /media/NAS  auto noatime,nofail 0 0
/dev/sda1 /media/NAS0 auto noatime,nofail 0 0

Ctrl+X pour quitter nano, puis Y et entrer pour sauvegarder les modifications. Voila, les disques sont configurés ! En redémarrant le Raspberry Pi, on devrait voir nos disques montés sur "/media/NAS" et "/media/NAS0". On peut le vérifier avec la commande mount.

Protection contre la perte des données avec Rsync (facultatif)

Avoir deux disques qui contiennent rigoureusement les mêmes fichiers nous permettra de récupérer les données en cas de panne de l'un d'entre eux. Cette étape est facultative, mais je la conseille fortement.

On utilise rsync, qui effectue dans les faits un simple "copier/coller intelligent" entre le disque utilisé et le disque de copie, en ne copiant que ce qui diffère. On vérifie qu'il est bien installé en entrant la commande suivante:

sudo apt-get install rsync

On va maintenant ajouter rsync à la crontab (chrono table qui signifie « table de planification ») pour lancer une sauvegarde journalière à 3h30:

crontab -e

A la fin du fichier, on ajoute :

30 03 * * * rsync -av --delete /media/NAS /media/NAS0

Dans le cas où vous souhaiteriez paramétrer la fréquence de sauvegarde, voici le format de la commande :

m    h    j    M    J    rsync...
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- jour de la semaine (1 - 7)
|    |    |    +------- mois (1 à 12)
|    |    +--------- jour du mois (1 à 31)
|    +----------- heure (0 à 23)
+------------- minute (0 à 59)
  * = à chaque unité (0, 1, 2, 3, 4...)

Gestion des utilisateurs

Les étapes de préparation des disques étant derrière nous, on va passer dans le vif du sujet: le paramétrage du serveur SFTP, notre accès sécurisé au NAS. D'abord, définissons les groupes d'utilisateurs que l'on souhaite avoir.

Groupes d'utilisateurs du NAS.

L'idée est d'accorder un accès complet à l'administrateur. Les utilisateurs standards feront partie du groupe nas_users, ce qui leur donnera un accès en lecture et écriture, mais seulement sur le disque dur NAS. Les utilisateur invités n'auront qu'un accès en lecture. On commence par créer les groupes:

sudo groupadd nas_admins
sudo groupadd nas_users
sudo groupadd nas_guests

Pour ajouter un utilisateur, puis l'ajouter à un groupe (à répéter autant de fois que nécessaire):

adduser <un_nom_d_utilisateur>
sudo usermod -a -G <nas_admins/nas_users/nas_guests> <un_nom_d_utilisateur>

D'ailleurs, il faut directement ajouter l'utilisateur "pi" au groupe "nas_admins" pour ne pas s'enfermer dehors!

sudo usermod -a -G nas_admins pi

On va ensuite créer les dossiers du NAS et les permissions associées à chacun. Voici la hiérarchie que j'ai définie.

Architecture du NAS et permissions.

Une permission est écrite sous la forme "user:groupe (UGO)" avec :

  • user : le propriétaire du fichier/dossier
  • groupe : le groupe associé au fichier/dossier
  • U : un chiffre octal qui défini les permissions du propriétaire.
  • G : un chiffre octal qui défini les permissions du groupe.
  • O : un chiffre octal qui défini les permissions des autres.

Les chiffres découlent d'un calcul simple : read = 4, write = 2 et execute = 1. On fait l'addition pour choisir la permission qu'on offre à chacun. Par exemple, la permission 775 associée aux dossier du NAS signifie que pi et les membres du groupe "nas_users" ont tous les droits, tandis que les autres (qui seront "nas_guests") n'auront que le droit de lecture et d'exécution (5 = 4 + 1 ).

On créé donc les dossiers que l'on souhaite avoir:

sudo mkdir /media/NAS/Films
sudo mkdir /media/NAS/Musique
...

On défini le propriétaire et les permissions:

sudo chown -R pi:nas_users /media/NAS/
sudo chmod -R 775 /media/NAS/

On limite ensuite l'accès au NAS en passant par la configuration du serveur SSH. On ouvre le fichier de paramétrage en édition:

sudo nano /etc/ssh/sshd_config

Puis on ajoute les lignes suivantes à la fin du fichier.

AllowGroups nas_admins nas_users nas_guests
PermitRootLogin no
Match Group nas_users nas_guests
        ChrootDirectory /media/NAS
        ForceCommand internal-sftp
        AllowTcpForwarding no
        X11Forwarding no

L'effet est le suivant : seuls les groupes nas_admins, nas_users et nas_guests ont accès au serveur. Les utilisateurs de nas_users et nas_guests sont chrootés dans le dossier /media/NAS, c'est à dire que c'est le seul dossier du serveur qu'ils peuvent voir, et en SFTP uniquement. Pour finaliser notre chroot, il est absolument obligatoire que le root soit le propriétaire du dossier NAS!

sudo chown root:root /media/NAS
sudo chmod 755 /media/NAS

Voila ! On redémarrant le serveur SSH (sudo systemctl restart sshd.service), on fera les observations suivantes (en utilisant FileZilla par exemple comme client SFTP):

  • Les utilisateurs appartenant au groupe "nas_admins" ont tous les droits (attention à la sécurité de leur mot de passe);
  • Les utilisateurs appartenant au groupe "nas_users" peuvent se connecter en SFTP et lire/ajouter/supprimer des fichiers du NAS;
  • Les utilisateurs appartenant au groupe "nas_guest" peuvent se connecter en SFTP et lire des fichiers su NAS.

Remarque: telles que les permissions sont définies, seuls les admins peuvent ajouter des dossier et des fichiers à la racine (/media/NAS) du serveur. C'est de toute manière généralement souhaitable.

Réseau : l'accès depuis l'extérieur (facultatif)

Il est possible de s'arrêter à cette étape et de profiter de son serveur sur votre réseau local. Cependant, si vous souhaiter accéder à votre contenu à l'extérieur de la maison, il va falloir passer par une phase de configuration réseau de votre routeur.

Pour que les clients puissent trouver le serveur, on va créer une redirection de port sur le port 22. Concrètement, on demande à notre box/routeur de rediriger le flux internet SSH vers notre Raspberry Pi.

Topologie du réseau.

Cette configuration dépend de l'interface d'administration de votre box, mais voici la démarche à suivre pour une Freebox. On commence par se connecter à l'interface d'administration FreeBox OS à l'adresse 192.168.1.254. Ensuite, on appuie sur les boutons Paramètres de la Freebox > Mode avancé > Gestion des ports.

Gestion des ports sur Freebox OS.

On clique ensuite sur Ajouter une redirection et on entre les informations correspondant à notre cas. Par exemple, pour moi :

Ajout d'une redirection de port sur Freebox OS.

Ensuite, on peut ajouter un bail DHCP statique à la Raspberry Pi pour être sûr que son adresse IP ne change jamais (et reste toujours à 192.168.1.253 dans mon cas). On fait cela depuis le menu DHCP > Baux Statiques > Ajouter un bail DHCP Statique.

Bail DHCP statique.

Pour se connecter à votre serveur depuis l'extérieur, il suffit de connaître votre IP publique. Si vous possédez un nom de domaine (comme moi), la tâche est aisée. Si vous n'en avez pas, vous pouvez utiliser un service comme no-ip ou tout simplement mémoriser votre IP (si elle est statique).

Un peu plus de sécurité avec Fail2ban (facultatif)

Cette étape facultative mais très rapide donnera un bon coup de pouce en terme de sécurité: il s'agit d'empêcher les attaques par brute-force sur vos mots de passe. Pour cela, on va installer le paquet Fail2ban qui bannira les adresses IP pendant un certain temps après un 5 tentatives de connexion:

sudo apt-get install fail2ban

On pourrait s'arrêter là, mais on va jeter un coup d'œil dans le fichier de configuration:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Et on va changer, sous le tag "[DEFAULT]":

  • bantime = 604800 : le temps de punition (ban), en secondes. Ici, je met une semaine.
  • findtime = 86400 : le temps que l'on considère dans les logs pour retrouver le nombre de tentatives d'une adresse IP. Ici, une journée.
  • ignoreip = 127.0.0.1 192.168.0.0/16 : les adresses IP que l'on ne bannira jamais. J'y ai ajouté les adresses IP locales pour éviter de se bloquer en cas de maladresse!

C'est tout! La configuration s'appliquera au prochain démarrage. Après 5 essais infructueux sur une période d'une journée, l'IP sera bannie pendant une semaine... une sécurité qui ne fonctionne évidemment que si les mots de passe des utilisateurs respectent les critères de sécurité basiques (au moins 8 caractères avec majuscules, minuscules, chiffres et ponctuation)!

Utilisation du NAS

Voilà, la configuration du serveur est terminée! On peut passer à l'utilisation du NAS.

Pour accéder aux fichiers, il suffit d'utiliser un client SFTP comme FileZilla (libre, toutes plateformes). Pour une utilisation encore plus intuitive sous Windows, on peut installer le logiciel Swish (propriétaire, gratuit) qui intègre le client directement dans l'explorateur de fichier. Sous Linux, les explorateurs de fichiers (PCmanFM, nautilus, etc.) intègrent bien souvent directement cette fonctionnalité!

Pour utiliser le serveur dans un aspect multimédia, on peut utiliser Kodi (libre, toutes plateformes y compris Android). Avec son interface élégante, il est agréable d'y parcourir ses films, séries, musiques et photos. Pour ajouter notre serveur sur Kodi, il suffit d'ajouter un nouveau serveur SFTP.

Kodi sur smartphone.

D'un point de vue performances, si l'on est loin d'un NAS dédié, la vitesse de lecture en réseau local (10 Mo/s) est amplement suffisante pour profiter de nos fichiers: environ 2 minutes pour télécharger un film en UltraHD; ou sans délai en stream direct avec Kodi. Coté écriture (7 Mo/s), c'est également amplement acceptable. Notons la forte différence en le Raspberry Pi 1 et le 3:

Comparaison de performances entre Pi 1 et Pi 3.

Depuis l'extérieur, la vitesse dépend alors de votre débit montant. Dans mon cas, avec la fibre, ce n'est pas un problème, et j'ai mes 10 Mo/s de débit potentiel!

Pour aller plus loin et profiter encore plus de ce serveur, il est parfaitement possible d'héberger un site web sur la même carte, en installant apache2, php, etc.

Auteur : Charles Grassin


What is on your mind?

  • No comments yet!

  Retour aux projets

Projets connexes