Sécurisation du Pi

Nextcloud 12 et Raspberry Pi

Sécurisation de Raspbian

Avant d'installer le serveur web, il est nécessaire d'effectuer une première sécurisation du Pi et de le paramétrer afin de protéger la carte SD.

cadenas

Sécurisation du Pi

Changement de l’utilisateur principal

Pour le moment, l’utilisateur principal est ‘pi’ comme des milliers de rapsberry pi. Les serveurs étant continuellement soumis à des tentatives d’intrusion par des bots en utilisant ce nom d’utilisateur, il est conseillé de le changer.

L’autre fragilité est que l’utilisateur pi est configuré pour ne pas avoir à donner de mot de passe lors des commandes administrateurs (commandes démarrant par ‘sudo’).

On va donc ajouter un nouvel utilisateur (dans cet exemple : lamba_user) qui devra donner un mot de passe pour avoir les droits administrateurs.

$ ssh pi@192.168.0.10
pi@192.168.0.10's password:

pi@myweb:~ $ sudo adduser lambda_user
Ajout de l'utilisateur « lambda_user » ...
Ajout du nouveau groupe « lambda_user » (1001) ...
Ajout du nouvel utilisateur « lambda_user » (1001) avec le groupe « lambda_user » ...
Création du répertoire personnel « /home/lambda_user »...
Copie des fichiers depuis « /etc/skel »...
Entrez le nouveau mot de passe UNIX : entrer un mot de passe
Retapez le nouveau mot de passe UNIX : retaper le mot de passe
passwd: password updated successfully
Changing the user information for lambda_user
Enter the new value, or press ENTER for the default
 Full Name []: 
 Room Number []: 
 Work Phone []: 
 Home Phone []: 
 Other []: 
Cette information est-elle correcte ? [O/n]O
pi@myweb:~ $ sudo adduser lambda_user sudo
Ajout de l'utilisateur « lambda_user » au groupe « sudo »...
Adding user lambda_user to group sudo
Fait.

pi@myweb:~ $ logout
Connection to 192.168.0.10 closed.

Maintenant, on va se connecter avec le nouvel utilisateur (ssh lambda-user@192.168.0.10) et enlever l’utilisateur pi et ses fichiers :

$ ssh lambda_user@192.168.0.10
lambda_user@192.168.0.10's password:

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

lambda_user@myweb:~ $ sudo deluser --remove-all-files pi

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

[sudo] password for lambda_user :
Recherche des fichiers à sauvegarder ou à supprimer...
/usr/sbin/deluser : Impossible de traiter le fichier spécial /lib/systemd/system/umountfs.service.
(…)
/usr/sbin/deluser : Impossible de traiter le fichier spécial /dev/raw/rawctl.
Suppression des fichiers...
Suppression de l'utilisateur « pi »...
Attention ! Le groupe « pi » ne contient plus aucun membre.
Fait.

Préservation de la carte SD

Les cartes SD s’usent très vite lors d’écritures multiples. Pour préserver celle du pi, on va placer certains répertoires en mémoire vive (ram). Ils seront effacés à chaque redémarrage.
De ce fait, les répertoires de log seront placés eux aussi en mémoire vive mais écrits toutes les heures sur la carte SD car essentiels pour le bon fonctionnement du serveur mais aussi pour repérer ou se défendre contre des intrusions.

Mise en mémoire vive des fichiers temporaires

lambda_user@myweb:~ $ sudo nano /etc/fstab

Une fenêtre d’édition s’ouvre avec les lignes suivantes :

proc            /proc           proc    defaults          0       0
PARTUUID=9ab057a5-01  /boot           vfat    defaults          0       2
PARTUUID=9ab057a5-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

On rajoute deux lignes à la fin du fichier pour qu’il ressemble à ceci :

proc            /proc           proc    defaults          0       0
PARTUUID=9ab057a5-01  /boot           vfat    defaults          0       2
PARTUUID=9ab057a5-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0

Ctrl-o pour enregistrer
Ctrl-x pour quitter

On vérifie :

lambda_user@myweb:~ $ sudo reboot
$ ssh lambda_user@192.168.0.10
lambda_user@192.168.0.10's password: 

lambda_user@myweb:~ $ df -h 

Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/root 58G 1.2G 55G 2% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6,5M 483M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 489M 0 489M 0% /sys/fs/cgroup
tmpfs 30M 0 30M 0% /var/tmp
tmpfs 100M 0 100M 0% /tmp
/dev/mmcblk0p1 41M 21M 21M 51% /boot
tmpfs 98M 0 98M 0% /run/user/1001

Les deux lignes surlignés ici en gras confirment que les répertoires temporaires sont maintenant en mémoire vive.

Installation des logs en mémoire vive avec sauvegarde régulière sur la carte SD

Le système d'exploitation Raspbian produit de nombreux logs continuellement. Pour préserver la carte SD, il est recommandé d'écrire ces logs en mémoire vive. L'utilitaire log2ram, écrit par Azlux disponible sur GitHub, permet de placer ces logs en mémoire vive et de les sauvegarder en dur toutes les heures.

 

lambda_user@myweb:~ $ cd
lambda_user@myweb:~ $ mkdir download
lambda_user@myweb:~ $ cd download
lambda_user@myweb:~/download $ sudo apt install git
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
git-man liberror-perl rsync
(...)
Souhaitez-vous continuer ? [O/n] O

lambda_user@myweb:~/download $ git clone https://github.com/azlux/log2ram.git
Clonage dans 'log2ram'...
remote: Counting objects: 219, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 219 (delta 6), reused 16 (delta 4), pack-reused 199
Réception d'objets: 100% (219/219), 34.88 KiB | 0 bytes/s, fait.
Résolution des deltas: 100% (113/113), fait.

lambda_user@myweb:~/download $ cd log2ram

lambda_user@myweb:~/download/log2ram $ chmod +x install.sh

lambda_user@myweb:~/download/log2ram $ sudo ./install.sh
Created symlink /etc/systemd/system/sysinit.target.wants/
log2ram.service → /etc/systemd/system/log2ram.service. 
##### Reboot to activate log2ram #####

 

On vérifie :

lambda_user@myweb:~/download/log2ram $ sudo reboot
$ ssh lamba_user@192.168.0.10
lamba_user@192.168.0.10's password:

lambda_user@myweb:~ $ df -h
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/root 58G 1.2G 55G 2% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6,5M 457M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 489M 0 489M 0% /sys/fs/cgroup
tmpfs 30M 0 30M 0% /var/tmp
tmpfs 100M 0 100M 0% /tmp
/dev/mmcblk0p1 42M 21M 21M 51% /boot
log2ram 40M 656K 40M 2% /var/log
tmpfs 98M 0 98M 0% /run/user/1001

La dernière ligne indique que log2ram fonctionne.

 

Sécuriser SSH

Routeur, Box et Ports

Avant d'aller plus loin, il faut penser à configurer le routeur sur la box qui permet d'accéder à internet.

Selon votre fournisseur d'accès et votre modèle de box, la manoeuvre sera différente.

Pour que Nextcloud fonctionne en dehors du réseau interne, il est nécessaire d'ouvrir certains accès : les ports.

Il sera également utile d'assigner une adresse IP interne fixe au Raspberry Pi.

Un tutoriel sur le site craym.eu donne les explications pour 15 box différentes.

Les protocoles à ouvrir sont :

  • HTTP, protocole TCP, port entrant 80, port sortant 80, adresse ip locale du Pi (192.168.0.10 ici).
  • HTTPS, protocole TCP, port entrant 443, port sortant 443, adresse IP locale du Pi (192.168.0.10 ici).

Le port SSH peut être sécurisé en changeant le port externe.

 

Changer le port ssh sur le routeur

Rediriger sur le routeur (port externe 2807, protocole TCP, Ip destination 192.168.0.10 port interne 22)
Ensuite pour se connecter au pi :

Depuis un ordinateur sur le réseau interne =

$ ssh lamba_user@192.168.0.10

(à adapter selon l’adresse IP interne)

Depuis un réseau externe =

$ ssh lamba_user@88.180.180.180 – p 2807

(à adapter selon l’adresse IP externe)

Sécuriser la configuration de SSH

lambda_user@myweb:~ $ sudo nano /etc/ssh/sshd_config
# Package generated configuration file
# See the sshd_config(5) manpage for details

# What ports, IPs and protocols we listen for
Port 22
(…)
#LogLevel INFO
LogLevel VERBOSE

(...)

#LoginGraceTime 2m
LoginGraceTime 20 
#PermitRootLogin prohibit-password
PermitRootLogin no
(…)

# Mettre à la fin :
AllowUsers lambda_user
AddressFamily inet

Ctrl-o Ctrl-x

lamba_user@myweb:~ $ sudo systemctl restart ssh
lamba_user@myweb:~ $ sudo systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since (...)

Installer fail2ban

L’objectif est de bannir les auteurs de tentatives de connexion SSH infructueuses.

Pour préparer l’installation de fail2ban, il faut installer un serveur de mail (sendmail) et configurer le nom d’hôte.

lambda_user@myweb:~ $ sudo apt install sendmail
lambda_user@myweb:~ $ sudo nano /etc/hosts

On modifie la première ligne du fichier /etc/hosts pour y ajouter localhost.localdomain et notre nom de serveur.

127.0.0.1 localhost.localdomain localhost myweb
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.1.1 myweb

lambda_user@myweb:~ $ sudo apt install fail2ban

On va exclure des adresses à bannir notre réseau local, modifier la configuration globale de fail2ban, de la protection ssh et pam.

lambda_user@myweb:~ $ sudo nano /etc/fail2ban/jail.local

 

[DEFAULT]
bantime = 1812
ignoreip = 127.0.0.1/8 192.168.0.0/24
action = %(action_mwl)s

[sshd]
enabled = true

[pam-generic]
enabled = true

Ctrl-o

Ctrl-x

Redémarrage et vérification de fail2ban

lambda_user@myweb:~ $ sudo systemctl restart fail2ban
lambda_user@myweb:~ $ sudo systemctl status fail2ban