Un Raspberry pi comme serveur

Un Raspberry Pi en serveur. Le Raspberry Pi, offre des possibilités étonnantes. Parmi ses nombreuses applications, il en est une que je voudrais pouvoir utiliser, mon serveur actuel c’est une gros PC tour dans mon garage qui me sert de serveur de fichiers Netxcloud, serveur web WordPress, transfert de fichiers Jirafeau, serveur mail PostfixAdmin et même à condition d’avoir un des derniers modèle tout ça en même temps, le tout depuis un appareil compact et économe en énergie. J’ai décidé de remettre en route une carte Raspberry pi 4 qui ne sert plus depuis quelques temps. Je vais voir ici les étapes nécessaires pour transformer mon Raspberry Pi en un puissant serveur web domestique et plus si affinité.

Avant de déployer des outils complexes, il est impératif de solidifier les bases. Une configuration initiale rigoureuse prévient 80% des problèmes de sécurité courants.

Préparation du Raspberry Pi

Avant de plonger dans la configuration du serveur web, il est primordial de préparer correctement votre Raspberry Pi. Une configuration initiale rigoureuse prévient 80% des problèmes de sécurité.

Partir sur une installation minimale saine

J’ai déjà fait un article sur une installation de l’OS sur un Raspberry Pi, vous pourrez lire ça ici.

Si vous avez suivi cet article, vous devriez être connectés en SSH sur le Raspberry Pi et il va falloir pour commencer, mettre à jour le système d’exploitation.

sudo apt update && sudo apt upgrade -y

On va finir la configuration en utilisant l’utilitaire raspi-config

sudo raspi-config

Pour commencer on va paramétrer la localisation du Raspberry en Sélectionnant la ligne Localisation Options

Sélectionnez la première ligne pour configurer la langue et les paramètres régionaux

Moi je choisi « fr_FR.UTF-8 UTF-8 » mais vous faites comme vous voulez.

Retour sur Localisation Options

Sélectionnez la deuxième ligne pour configurer le format de l’heure et de la date choisissez en fonction de votre région

On va ensuite paramétrer le clavier en fonction de votre configuration matérielle, toujours avec Localisation Options

Un raspberry pi comme serveur

Pour finir Advanced Options, on va partitionner la carte SD pour étendre la partition « root » à la totalité de la place disponible.

Un raspberry pi comme serveur

Sélectionnez la ligne A1 pour étendre la partition root à la taille totale de la carte SD

Un raspberry pi comme serveur

Pour finir sélectionnez Finish et acceptez de redémarrer le Raspberry.

Un raspberry pi comme serveur

Accepter le redémarrage du Raspberry Pi.

Sécurisation et protection du Raspberry Pi

1 – Les mots de Passe

On estime, en moyenne, qu’un internaute possède une centaine de comptes professionnels et personnels. Comme il est impossible de les retenir tous, les utilisateurs ont tendance à :

  • choisir des mots de passe très basiques : en France, le mot de passe le plus répandu est « 123456 » (source Nordpass),
  • réutiliser le même mot de passe pour accéder à plusieurs services,
  • noter leurs mots de passe sur un pense-bête facilement accessible, dans un fichier non protégé de l’ordinateur ou de son téléphone mobile, sauvegardés dans la messagerie ou même sur un bout de papier.

Apprenez à utiliser un gestionnaire de mot de passe sécurisé qui mémorisera tous vos mots de passe, pour ne plus avoir à retenir qu’un seul, celui qui permet d’en ouvrir l’accès.

Parmi les gestionnaires de mot de passe il existe Bitwarden, NordPass, Proton Pass etc etc …

2 – Utilisez des clés SSH au lieu de mots de passe

Par défaut, la connexion SSH s’effectue avec un mot de passe.

Pour plus de sécurité. On va utiliser l’authentification par échange de clés SSH.

L’authentification par clés se fait donc via une paire de clés, le client va donc générer une paire de clés, une publique et une privée. Il va bien entendu garder sa clé privée pour lui et envoyer la clé publique au serveur SSH (le Raspberry Pi) qui la stockera dans un endroit prévu cet effet.

Nous allons voir comment générer une paire de clés SSH sur Raspberry Pi et comment configurer l’authentification par clés SSH afin de vous connecter, sans avoir besoin d’un mot de passe, à un serveur via SSH.

Création des clés

Voyons tout d’abord comment générer une paire de clés sous Linux en ligne de commande. Pour cela, nous allons utiliser la commande « ssh-keygen » :

ssh-keygen

Par defaut une clé RSA de 2048 bits sera créée. Si vous souhaitez spécifier une autre taille de clé, par exemple 4096 bits, vous pouvez utiliser l’option « -b » :

ssh-keygen -b 4096

Le plus simple ensuite est d’appuyer sur Entrée pour chaque question posée.

La clé va être stockée dans le répertoire .ssh/ de l’utilisateur courant (Exemple : /home/webmaster/.ssh pour l’utilisateur webmaster).

Transfert de la clé publique

Il reste maintenant à faire l’opération consistant à envoyer notre clé publique sur le serveur afin de pouvoir s’y authentifier. Pour ça on utilise

ssh-copy-id utilisateur@ip_serveur

On devra saisir le mot de passe SSH de l’utilisateur sur le serveur SSH.

Un dernier test pour tout verifier, on se connecte en SSH sur le serveur 
ssh utilisateur@ip_serveur

Maintenant plus besoin de mot de passe on est connecté de suite. Pour maintenant n’autoriser que les utilisateurs avec des clés, il suffit de modifier la configuration du service SSH.

sudo nano /etc/ssh/sshd_config

Il faut dé-commenter la ligne PasswordAuthentication et la passer à No

On enregistre tout ça avec Ctrl+x suivi de O puis Entrée et on redémarre le service SSH avec

sudo systemctl restart ssh

Voila on a déjà bloqué la plupart des script kiddies qui lancent d’importantes attaques sur n’importe quelle adresse IP répondant.

3 – Installer un pare-feu

Un pare-feu vous permet de bloquer tous les ports de votre Raspberry Pi, sauf ceux dont vous avez besoin. Par exemple, vous pouvez bloquer tous les accès, et autoriser seulement l’accès SSH depuis l’adresse IP de votre ordinateur spécifique.

Bien que la distribution soit fournie par défaut avec iptables, il peut être compliqué de le configurer et de l’utiliser.

Pour contourner ce problème, je vais installer une interface de pare-feu beaucoup plus simple appelée UFW sur le Raspberry Pi.

Comme d’habitude il faut commencer par vérifier que l’OS et à jour. Sinon il faut télécharger les mises à jour avant d’installer UFW.

sudo apt update && sudo apt upgrade -y
sudo apt install ufw

UFW est installé sur votre Raspberry mais, n’est pas encore actif, il va falloir un peu de paramétrage. Il faut noter que UFW bloque par défaut tout le trafic entrant, en revanche, il autorise tout le trafic sortant.

Il faut donc au minimum autoriser le port 22 en entrée et en sortie, pour cela entrer cette commande

sudo ufw allow 22

Maintenant on peut activer UFW. Si vous ne faites pas cette commande avant de lancer UFW vous pourriez perdre votre connexion SSH et ne plus pouvoir vous reconnecter.

sudo ufw enable

Un message va vous indiquer le danger qu’il y a en activant UFW, mais comme on a déjà fait le nécessaire vous pouvez répondre Y.

Command may disrupt existing ssh connections. Proceed with operation (y|n)? Y
Firewall is active and enabled on system startup

Pour afficher les règles actuelles une fois UFW activé, utilisez cette commande :

sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere                  
80                         ALLOW IN    Anywhere                  
443                        ALLOW IN    Anywhere                  
22 (v6)                    ALLOW IN    Anywhere (v6)             
80 (v6)                    ALLOW IN    Anywhere (v6)             
443 (v6)                   ALLOW IN    Anywhere (v6)

Pour des configurations plus complexes, consultez sa page de manuel.

4 – Fail2ban

Installation

Fail2ban est un IPS (logiciel de prévention d’intrusion) gratuit et open-source qui aide les administrateurs à sécuriser les serveurs Linux contre les connexions malveillantes et les attaques par force brute. Fail2ban est écrit en Python et il est livré avec des filtres pour divers services tels qu’Apache2, SSH, FTP, etc. Il réduit les tentatives de connexion malveillantes en bloquant les adresses IP responsables des attaques.

Fail2ban fonctionne en scannant les fichiers journaux des services (par exemple, /var/log/auth.log) et en interdisant les adresses IP qui montrent des tentatives de connexion malveillantes telles que trop de mots de passe incorrects, la recherche d’exploits, etc. Il prend également en charge plusieurs backends de pare-feu tels que iptables, ufw et firewalld. De plus, il vous permet de configurer une notification par e-mail pour chaque tentative de connexion bloquée.

Avant tout, exécutez la commande ci-dessous pour mettre à jour l’index des paquets.

sudo apt update && sudo apt upgrade -y

Deuxièmement, installez le paquet fail2ban avec la commande apt suivante.

sudo apt install fail2ban -y

Enfin, exécutez la commande systemctl ci-dessous pour démarrer, activer et vérifier le service fail2ban.

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

Vous pouvez voir ci-dessous que fail2ban est actif (en cours d’exécution) et activé.

sudo systemctl status fail2ban
[sudo] Mot de passe de webmaster : 
 fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
     Active: active (running) since Wed 2025-10-22 15:41:20 CEST; 1 week 6 days ago
       Docs: man:fail2ban(1)
   Main PID: 568 (fail2ban-server)
      Tasks: 21 (limit: 9454)
     Memory: 136.0M
        CPU: 2h 20min 37.877s
     CGroup: /system.slice/fail2ban.service
             └─568 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

oct. 22 15:41:20 serveuramoi.com systemd[1]: Started fail2ban.service - Fail2Ban Service.

Configuration

Pour commencer, copiez la configuration par défaut de fail2ban dans /etc/fail2ban/jail.local avec ce qui suit :

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

On va modifier le fichier jail.local, de cette façon en cas de mise à jour, la configuration reste intacte.

sudo nano /etc/fail2ban/jail.local

Avant tout, on ajoute mon réseau local à l’option ignoreip. Les sous-réseau dans cette option ne seront pas bloqué par fail2ban.

ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24

Ajustez la configuration par défaut pour:
bantime = le temps pendant lequel l’IP sera bannie
findtime = la durée entre le nombre d’échecs avant l’action de bannissement
maxretry = le nombre d’échecs avant l’action de bannissement

bantime = 24h
findtime = 10m
maxretry = 5

Changez l’option par défaut action en %(action_mw)s pour interdire les adresses IP et envoyer une notification à l’administrateur par e-mail. Assurez-vous également de modifier les options destemail et sender.

action = %(action_mw)s
destemail = { email destinataire }
sender = { email expediteur } 

Puisqu’on à installé ufw on va l’utiliser pour interdire les IP bannis.

banaction = ufw

On enregistre et on quitte Ctrl+x O Entrée

Pour vous assurer que fail2ban fonctionne, exécutez la commande fail2ban-client ci-dessous.

sudo fail2ban-client ping

Réponse du serveur si il fonctionne normalement:

Server replied: pong

Afin de paramétrer les services surveillés par fail2ban, par exemple le service SSH, je vais créer dans le répertoire /etc/fail2ban/jail.d.

sudo nano /etc/fail2ban/jail.d/sshd.conf

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Enregistrer et quitter, et on redémarre Fail2ban.

sudo fail2ban-client restart

Shutdown successful
Server ready

Une petite vérification pour voir !

sudo fail2ban-client status sshd

Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- Journal matches:	_SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

N’oubliez pas de créer un fichier .conf pour chaque nouveau service dans le répertoire /etc/fail2ban/jail.d/