Sécurisation du Pi

Nextcloud 12 et Raspberry Pi

Sécurisation de Raspbian

 

Ce guide concerne l'ancienne version pour Raspbian Jessie Lite

Se reporter à la nouvelle version avec Raspbian Stretch sortie en août 2017

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 useradd -m lambda_user -G sudo
pi@myweb:~ $ sudo passwd lambda_user
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
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 891M 55G 2% /
devtmpfs 483M 0 483M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 6,5M 481M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 487M 0 487M 0% /sys/fs/cgroup
tmpfs 30M 0 30M 0% /var/tmp
tmpfs 100M 0 100M 0% /tmp
/dev/mmcblk0p1 41M 21M 21M 51% /boot

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: 141, done.
remote: Total 141 (delta 0), reused 0 (delta 0), pack-reused 141
Réception d'objets: 100% (141/141), 19.29 KiB | 0 bytes/s, fait.
Résolution des deltas: 100% (74/74), fait.
Vérification de la connectivité... 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 from /etc/systemd/system/multi-user.target.wants/log2ram.service to /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 914M 55G 2% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6,2M 457M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
tmpfs 30M 0 30M 0% /var/tmp
tmpfs 100M 0 100M 0% /tmp
/dev/mmcblk0p1 63M 21M 42M 33% /boot
log2ram 40M 1,2M 39M 3% /var/log

La dernière ligne indique que log2ram fonctionne.

Correction d'un bug de Raspbian Jessie Lite

Le démon rsyslog qui gère les journaux de log tente d'envoyer des messages sur une console graphique (xconsole) qui n'existe pas en version headless. Cela provoque des messages d'erreur et donc de nombreuses écritures.

Pour corriger cela :

lambda_user@myweb:~ $ sudo nano /etc/rsyslog.conf

 

et on commente les 4 dernières lignes du fichier

#daemon.*;mail.*;\
#        news.err;\
#        *.=debug;*.=info;\
#        *.=notice;*.=warn     |/dev/xconsole

 

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
(…)
# Logging
SyslogFacility AUTH
LogLevel VERBOSE

# Authentication:
LoginGraceTime 20
PermitRootLogin no
StrictModes yes
(…)
#UseLogin no

MaxStartups 10:30:60 #retirer le # en début de ligne
#Banner /etc/issue.net
(…)
# 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
lambda_user@myweb:~ $ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
lambda_user@myweb:~ $ sudo nano /etc/fail2ban/jail.local

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

# Fail2Ban configuration file.
#
# This file was composed for Debian systems from the original one
# provided now under /usr/share/doc/fail2ban/examples/jail.conf
# for additional examples.
(…)
ignoreip = 127.0.0.1/8 192.168.0.0/24
(…)
# "bantime" is the number of seconds that a host is banned.
Bantime  = 1812
(…)

# Choose default action. To change, just override value of 'action' with the
# interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in $
# globally (section [DEFAULT]) or per specific section
action = %(action_mwl)s
(…)
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[...]
[pam-generic]
enabled = true
# pam-generic filter can be customized to monitor specific subset of 'tty's
filter = pam-generic
port = all
banaction = iptables-allports
port = anyport
logpath = /var/log/auth.log
maxretry = 3
[...]

 

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