Installation d’un RaspberryPi

Introduction

Je vais vous montrer comment j’installe mon/mes RaspberryPi. Rien de bien original, cela a été traité dans de nombreux tutoriels. C’est une manière pour moi d’établir un protocole d’installation, en assurant une sécurité correcte de mon mini-serveur.

Je suis en possession de 2 raspis, un modèle 2B (que j’avais attendu 6 mois il y a des années lors du lancement) et un récent Raspi 3B avec wifi et bluetooth.

Je vais installer sur le premier “Home-assistant”, sans clavier ni écran ni souris et avec une IP fixe: il sera dans la baie informatique.

Le second équipé de l’écran 7" officiel, dans un boitier adéquat et esthétique servira comme console de commande de l’éclairage, et d’affichage météo (j’ai installé une station météo “Netamo” que j’ajouterai à Home-assistant.)

[picture]

Raspi 2

[picture]

Raspi 2

[picture]

Raspi 2

Oui, ils sont un peu «poussiéreux » …

En annexe, je présenterai une autre façon de préparer l’installation de notre Raspi qui permettra dès le départ d’avoir notre réseau configuré, ainsi que le hostname et l’autorisation de connexion SSH.

Résumé

Objectifs

Ce tutoriel va vous conduire tout le long de l’installation de la distribution RaspiOS, dérivée de Raspbian.

La fondation RasperryPi a changé le nom de la distribution, car elle commençait à différer de la Raspbian dont elle est issue. Ils ont ajouté des dépôts Microsoft, par exemple. Certainement pour des raisons valables (VSCode par exemple), mais cela a été fait «un peu en douce ».

Revenons à notre tutoriel : l’installation de base est à l’image d’une installation Debian classique. La configuration de ssh par exemple est faite pour assurer une compatibilité maximale. Une configuration plus fine permet d’augmenter la sécurité. C’est ce que nous ferons.

Nous installerons un résolveur DNS qui nous évitera de compter sur celui de notre FAI, souvent menteur. Le blocage de sites est souvent réalisé par les FAI au niveau DNS. Avoir notre propre résolveur résoudra ce problème.

Un programme de défense contre les attaques de «brute force », fail2ban sera installé avec surveillance des seuls services actifs : ssh et le mail.

Un service de courrier élémentaire sera installé avec postfix : le serveur pourra envoyer et recevoir des courriers, mais seulement pour les comptes user du serveur. Il sera utile pour que le logiciel de surveillance (monitoring) logwatch puisse envoyer ses rapports.

Pour protéger tout le serveur, un pare-feu sera installé. Il ne permettra que les entrées-sorties sur les ports que nous auront décidés d’ouvrir : tout le reste sera bloqué. Nous utiliserons iptables avec un «front end », firewalld.

Tout cela nous donnera une base saine sur laquelle nous pourrons installer d’autres services.

Table des matières

Présentation du matériel (mes 2 raspis)

Installation de base de la distribution RaspiOS lite

Premier démarrage (sans aucune sécurisation)

État des lieux

Sécurisation du serveur (ssh)

Configuration du réseau (ips fixes)

Installation d’un résolveur DNS (knot-resolver)

Installation d’un pare-feu (iptables et firewalld)

Contrer les attaques de force brute avec fail2ban

Surveillance du serveur (logwatch)

Installation d’un serveur de courriers basique (postfix)

Exemple d’utilisation : serveur Web

Annexe

Installation de base

Copie de l’image sur la carte SD

Je vais utiliser la distribution “Raspbian”, dérivée d’un système Debian classique.

Elle a changé récemment de nom … j’espère qu’ils ne vont pas abandonner le système de paquetage de Debian.

Vous pouvez récupérer l’image directement sur RaspberryPi.org.

Repérez ensuite la référence à votre carte microSD avec la commande suivante (dans un terminal) ; voilà un exemple de sortie terminal (la carte microSD a été placée dans un adaptateur usb) :

eric@aldebaran:~$ lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda       8:0    0   1,8T  0 disk
├─sda1    8:1    0   1,4T  0 part  /mnt/Busterhome
└─sda2    8:2    0   466G  0 part  /home
sdb       8:16   0 223,6G  0 disk
├─sdb1    8:17   0   500M  0 part  /boot/efi
├─sdb2    8:18   0  1000M  0 part  /boot
├─sdb3    8:19   0  97,7G  0 part  /mnt/Busterroot
├─sdb4    8:20   0  97,7G  0 part  /
└─sdb5    8:21   0  26,8G  0 part  [SWAP]
sdc       8:32   0   3,6T  0 disk
└─sdc1    8:33   0   3,6T  0 part
└─md0     9:0    0   3,6T  0 raid1 /mnt/Raid
sdd       8:48   0   3,6T  0 disk
└─sdd1    8:49   0   3,6T  0 part
└─md0     9:0    0   3,6T  0 raid1 /mnt/Raid
sde       8:64   1   1,8G  0 disk  /media/eric/9E40-CF6B
eric@aldebaran:~$

La carte microSD est référencée à la dernière ligne : sde

Un autre exemple avec la carte microSD placée dans directement dans un adaptateur intégré dans un portable.

[picture]

Image des interfaces bloc

La commande pour copier l’image Raspbian sur la carte microSD est la suivante :

eric@aldebaran:~$ dd if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/sde bs=4096

C’est une commande que j’utilise systématiquement avec le paramètre bs mis à 4096. Je ne me souviens plus pourquoi il m’avait fallu mettre ce paramètre, mais cela fonctionne bien avec (et moins bien sans.)

Une autre version de cette commande découverte avec (FreedomBox)[https://www.freedombox.org] est la suivante : (test avec la dernière version de RaspiOS … changement de nom par rapport à Raspbian, car contient des “trucs” pas vraiment libres comme les dépôts de Microsoft (VsCode) :( )

$ sudo dd bs=1M if=2021-01-11-raspios-buster-armhf-lite.img of=/dev/sdd conv=fdatasync status=progress
1816133632 octets (1,8 GB, 1,7 GiB) copiés, 1 s, 1,8 GB/s
1776+0 enregistrements lus
1776+0 enregistrements écrits
1862270976 octets (1,9 GB, 1,7 GiB) copiés, 167,27 s, 11,1 MB/s
eric@aldebaran:~$

Une autre commande possible est (trouvée également sur le site de FreedomBox):

$ cat 2021-01-11-raspios-buster-armhf-lite.img > /dev/sdd ; sync

Bien sûr, changez le périphérique suivant votre cas particulier : le mien, ici, est /dev/sdd. Voyez avec la commande lsblk pour découvrir la votre: elle change avec les périphériques déjà branchés sur votre ordinateur. (chez moi, la première fois, c’était /dev/sde, puis aujourd’hui, /dev/sdd)

Autorisation de l’accès en ssh

Pour pouvoir se connecter en ssh, il faut créer un fichier vide de nom ssh dans le répertoire /boot.

voici la liste des commandes nécessaires :

cd /media/eric/9E40-CF6B/boot
touch ssh

/media/eric/9E40-CF6B/boot est le point de montage de la carte microsd sur le desktop.

Une fois cela fait, vous pouvez démonter votre carte microSD et la placer dans votre raspi.

État des lieux

Maintenant que notre raspi est installé, la liaison ssh active, nous allons faire le tour des lieux, voir comment le réseau se configure, vérifier la qualité des algorithmes SSH etc.

Audit SSH

Nous allons procéder à un audit SSH. Pour cela, nous allons utiliser un service en ligne de tests de notre configuration.

L’adresse du site est la suivante : AuditSSH.

Notre adresse est une adresse domestique, réservée au réseau local, non routable sur Internet. Heureusement, nous avons IPV6 et nous allons pouvoir tester notre petit raspi sans encore le configurer dans le serveur DNS.

Pour obtenir l’adresse IPV6 de notre raspi, entrez la commande suivante :

pi@raspberrypi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:3a:0b:38 brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.170/24 brd 192.168.111.255 scope global noprefixroute eth0
    valid_lft forever preferred_lft forever
    inet6 2a01:e0a:d0:3c20:a23:93ca:de95:e15b/64 scope global dynamic mngtmpaddr noprefixroute
    valid_lft 86388sec preferred_lft 86388sec
    inet6 2a01:e0a:d0:3c20::170/64 scope global noprefixroute
    valid_lft forever preferred_lft forever
    inet6 fe80::74c8:34d:25f2:3b43/64 scope link
    valid_lft forever preferred_lft forever
pi@raspberrypi:~ $

Nous avons notre adresse IPV6 qui est la suivante : (après configuration du réseau)

inet6 2a01:e0a:d0:3c20::170/64 scope global dynamic mngtmpaddr

L’adresse commençant par fe80 est réservée au trafic sur le réseau local.

Renseignons ensuite notre adresse ipv6 dans le formulaire du site SSH-Audit (les captures d’écran utilisent une autre adresse IPV6):

[picture]

résultat

[picture]

résultat

[picture]

résultat

Nous obtenons une note de “F” … il y a du travail en perspective pour obtenir une note correcte.

2 choses sont à configurer :

le daemon sshd

le client ssh

Le daemon se configure dans /etc/sshd Le client dans le répertoire ~/.ssh (dans son home sur la machine cliente)

Nous ferons ça dans le chapitre suivant.

Le réseau

Le réseau est entièrement géré par dhcp. Nous voulons une adresse IPV4 et IPV6 fixe. Il va falloir configurer le réseau à la main.

Il y a plusieurs façons de le faire : soit on rajoute une adresse fixe à la configuration de dhcp (c’est la méthode préconisée par tous les sites avec tutoriels sur la façon d’imposer une adresse fixe), soit en éditant /etc/network/interfaces. J’ai l’impression qu’il y a eu des changements suivant les versions … il va falloir tester tout ça !

Le pare-feu (firewall)

Aucun pare-feu n’est défini par défaut. Nous installerons nftables qui remplace iptables dans les versions buster et bullseye de Debian.

Installation de programmes utilitaires

J’installe toujours vim et mc sur mes machines pour l’édition des fichiers de configuration et me déplacer dans l’arborescence, visionner les fichiers de configuration/textes.

pi@raspberrypi:~ $ sudo apt install vim mc
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 :
mc-data vim-runtime
...
Paramétrage de vim (2:8.1.0875-5) ...
...
Paramétrage de mc (3:4.8.22-1) ...
Traitement des actions différées (« triggers ») pour mime-support (3.62) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
pi@raspberrypi:~ $

Sécurisation SSH

Je vais baser cette partie sur plusieurs tutoriels auxquels vous voudrez bien vous référer pour avoir des explications plus poussées que celles que je vais donner.

Références

Sécuriser OpenSSH

SSH - Comment tester et sécuriser son serveur ?

OpenSSH Config File Examples

Vous pouvez trouver plein d’autres références en français ou anglais en utilisant votre moteur de recherche préféré.

Création d’une clef personnalisée

Nous allons créer une clef spécifique à notre mini serveur.

Auparavant, nous allons vérifier le hostname de notre machine. Si vous l’avez configuré avec raspi-config, il y a de grandes chances que le résultat ne soit pas bon.

Sous Debian, le hostname est composé de 2 parties situées dans 2 fichiers différents.

/etc/hosts (contient le nom complet, FQDN)

/etc/hostname (ne contient que le petit nom de la machine, sans le domaine)

Test du hostname (sur notre raspi)

pi@piras:~ $ hostname -f
piras.yojik.net
pi@piras:~ $ hostname
piras
pi@piras:~ $

Le fichier /etc/hostname ne doit contenir que le nom de la machine, pas le domaine : ici, piras, et c’est ce que renvoie la commande hostname.

pi@piras:~ $ cat /etc/hostname
piras
pi@piras:~ $

hostname -f renvoie le “fqdn”, ou nom complet de la machine, ici, piras.yojik.net.

La référence complète du nom se trouve dans le fichier /etc/hosts.

pi@piras:~ $ cat /etc/hosts
127.0.0.1    localhost
::1          localhost ip6-localhost ip6-loopback
ff02::1      ip6-allnodes
ff02::2      ip6-allrouters

127.0.1.1    piras.yojik.net piras
pi@piras:~ $

Pour l’instant, c’est l’adresse 127.0.1.1 qui est utilisée comme référence du nom, mais nous changerons ça dès que nous aurons configuré une adresse IPV4 et IPV6 fixe.

Création de notre clef personnalisée (sur le desktop, pas sur le raspi!)

Nous utiliserons la commande :

sh-keygen -o -a 100 -t ed25519 -f ~/.ssh/piras_ed25519 -C "clef SSH de l'utilisateur pi du Raspi"

-o : Sauvegarde votre clé dans le nouveau format openssh au lieu de l’ancien format PEM

-C : insertion d’un commentaire (ce que vous voulez, votre adresse émail …).

-f : nom du fichier à produire

-a : le nombre de tours de la clef de dérivation (plus il est élevé, plus il est difficile de la craquer en force brute, mais aussi plus c’est lent)

  eric@aldebaran:~$ ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/piras_ed25519 -C "eric@yojik.eu"
  Generating public/private ed25519 key pair.
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /home/eric/.ssh/piras_ed25519
  Your public key has been saved in /home/eric/.ssh/piras_ed25519.pub
  The key fingerprint is:
  SHA256:yyDsyczL9W1QTTn9d5o0hwZ5A0bdMnCJgK9cniCeR0c eric@yojik.eu
  The key's randomart image is:
  +--[ED25519 256]--+
  |         ..o=O.o |
  |        . E.B.O .|
  |         o o + * |
  |   .  . o = . = =|
  |    o..=SB . o =o|
  |   = ooo=.o   o  |
  |    * ..o.       |
  |   . o . ..      |
  |    o   ...      |
  +----[SHA256]-----+

Si vous allez dans ./.ssh, vous trouverez ceci :

eric@aldebaran:~/.ssh$ ls -l
total 44
-rw------- 1 eric eric  751  7 avril  2011 id_dsa
-rw-r--r-- 1 eric eric  604  7 avril  2011 id_dsa.pub
-rw------- 1 eric eric 1766  1 avril  2013 id_rsa
-rw-r--r-- 1 eric eric  396  1 avril  2013 id_rsa.pub
-rw-r--r-- 1 eric eric 3728 29 nov.  12:20 known_hosts
-rw------- 1 eric eric  444 11 déc.  18:17 piras_ed25519
-rw-r--r-- 1 eric eric   95 11 déc.  18:17 piras_ed25519.pub
eric@aldebaran:~/.ssh$

Nous voyons les clefs privées et publiques que nous avons créées. (ainsi que d’anciennes clefs …) Vérifiez les permissions, mais normalement les commandes ci-dessus les attribuent comme attendu (voir plus bas).

Copie de la clef sur le serveur

Nous utiliserons la commande : ssh-copy-id

eric@aldebaran:~$ ssh-copy-id -i ~/.ssh/piras_ed25519.pub pi@192.168.111.32
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/eric/.ssh/piras_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
pi@192.168.111.32's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'pi@192.168.111.32'"
and check to make sure that only the key(s) you wanted were added.

eric@aldebaran:~$

Vérifions la présence de notre clef sur notre raspi, dans le fichier authorized_keys :

pi@piras:~/.ssh $ cat authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAdDDO3ni4DHIxqfRaNZ4SBudrSlRoQjLm/fd2SSjxtM eric@yojik.eu
pi@piras:~/.ssh $

C’est bon, elle est là !

Essai de connexion avec notre nouvelle clef

eric@aldebaran:~$ ssh -i ~/.ssh/piras_ed25519 'pi@192.168.111.32'
Linux piras 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 armv6l

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.
Last login: Fri Dec 11 18:46:55 2020 from 192.168.111.150
pi@piras:~ $

ça marche … j’ai précisé la clef SSH à utiliser avec l’option -i nom_de_la_clef.

Configuration de ssh sur la machine de travail

Je possède plusieurs clefs qui sont spécifiques à certains serveurs (ceux dans ma cave, et ceux sur internet). Nous allons rajouter une configuration pour permettre la sélection automatique de la bonne clef pour chaque serveur.

Cela se fait dans le fichier ~/.ssh/config

Le schéma à utiliser est le suivant :

eric@aldebaran:~$ cat ./.ssh/config
Host piras piras.yojik.net
    HostName 192.168.111.32
    IdentityFile ~/.ssh/piras_ed25519
    User pi

Host adara adara.yojik.eu
    HostName adara.yojik.eu
    IdentityFile ~/.ssh/id_rsa
    User ericadmin

eric@aldebaran:~$

Cela me permet de me connecter avec la commande :

ssh piras

Voilà à quoi ressemble mon répertoire ~/.ssh :

eric@aldebaran:~$ tree .ssh
.ssh
├── adara
│   ├── adara_ed25519
│   └── adara_ed25519.pub
├── aijan
│   ├── aijan_ed25519
│   └── aijan_ed25519.pub
├── alya
│   ├── alya_ed25519
│   └── alya_ed25519.pub
├── atom
│   ├── atom_ed25519
│   └── atom_ed25519.pub
├── config
├── id_dsa
├── id_dsa.pub
├── id_ed25519
├── id_ed25519.pub
├── id_rsa
├── id_rsa.pub
├── known_hosts
├── mynas2
│   ├── mynas2_ed25519
│   └── mynas2_ed25519.pub
├── mynas3
│   ├── mynas3_ed25519
│   └── mynas3_ed25519.pub
├── ns1
│   ├── ns1_ed25519
│   └── ns1_ed25519.pub
├── ns2
│   ├── ns2_ed25519
│   └── ns2_ed25519.pub
├── piras
│   ├── piras_ed25519
│   └── piras_ed25519.pub
└── polis
    ├── polis_ed25519
    └── polis_ed25519.pub

J’ai mis l’adresse IP ; j’aurai pu mettre le nom FQDN du serveur, mais je le ferai une fois les adresses IP fixées.

Modifions les permissions pour qu’elles soient conformes à ce que demande SSH. (en fait, les bonnes permissions étaient déjà appliquées par la commande ssh-keygen). Si vous organisez votre structure de répertoires comme ci-dessus, ajustez les permissions comme ceci :

Si vous créez un répertoire nommé ~/.ssh/piras ajustez les droits du répertoire comme suit :

chmod 700 ~/.ssh/piras

Et pour les clefs privées/publiques :

chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/piras/piras_ed25519
chmod 600 ~/.ssh/piras/piras_ed25519.pub

Test de connexion

eric@aldebaran:~$ ssh piras
Linux piras 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 armv6l

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.
Last login: Fri Dec 11 18:49:37 2020 from 192.168.111.150
pi@piras:~ $

Ça marche ;)

Amélioration

Nous allons modifier temporairement (et le re-modifierons une fois les adresses fixées) notre fichier /etc/hosts sur notre machine de travail pour pouvoir utiliser la méthode par nom plutôt que par adresse IP. Ajoutons la référence à notre raspi :

eric@aldebaran:~$ cat /etc/hosts
127.0.0.1    localhost
127.0.1.1    aldebaran.yojik.net    aldebaran

192.168.111.32  piras.yojik.net piras

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
eric@aldebaran:~$

Modification de ./.ssh/config :

eric@aldebaran:~$ cat ./.ssh/config
Host piras piras.yojik.net
    HostName piras.yojik.net
    IdentityFile ~/.ssh/piras_ed25519
    User pi

Host adara adara.yojik.eu
    HostName adara.yojik.eu
    IdentityFile ~/.ssh/id_rsa
    User ericadmin

eric@aldebaran:~$

Test :

eric@aldebaran:~$ ssh piras
The authenticity of host 'piras.yojik.net (192.168.111.32)' can't be established.
ECDSA key fingerprint is SHA256:DjB1teyxsYAZzGBV8BIXiG5+UAb3JU5SHp7vu/xArG8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'piras.yojik.net' (ECDSA) to the list of known hosts.
Linux piras 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 armv6l

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.
Last login: Fri Dec 11 19:17:50 2020 from 192.168.111.150
pi@piras:~ $

L’adresse de notre raspi a été ajoutée au fichier ./.ssh/known_hosts

Modification du fichier /etc/ssh/sshd_config

Nous allons modifier ce fichier pour plus de sécurité :

pas de connexion de l’utilisateur root

connexion uniquement par clef (pas par login/mot de passe)

suppression du support des protocoles non sûrs

autorisation de connexion sur liste blanche

connexion en IPV4 et IPV6

Tout d’abord, sauvegarde du répertoire /etc/ssh :

pi@raspberrypi:/etc $ sudo cp -R ssh ssh.orig
pi@raspberrypi:/etc $

Ensuite, création du nouveau fichier (après installation de vim, mais vous pouvez prendre l’éditeur de votre choix, nano par exemple qui est installé par défaut):

Pour installer vim, tapez : sudo apt install vim

Voilà une copie du fichier de conf du site troxyworld dont j’ai déjà donné les références :

# Interface & Port
Port 61022
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

HostKey /etc/ssh/ssh_host_ed25519_key

Protocol 2

SyslogFacility AUTHPRIV
LogLevel VERBOSE

# Authentication restriction
LoginGraceTime 30s
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5

PubkeyAuthentication yes
AllowUsers hmichael
AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

HostbasedAuthentication no
IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PermitEmptyPasswords no
PasswordAuthentication no

# Change to no to disable s/key passwords
ChallengeResponseAuthentication no

UsePAM yes

AllowAgentForwarding no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
PermitTTY yes
PermitUserEnvironment no
PrintMotd no
PrintLastLog no

#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
UseDNS yes
PidFile /var/run/sshd.pid
MaxStartups 10:30:100
PermitTunnel no
#ChrootDirectory none
VersionAddendum none

# no default banner path
Banner none

# Accept locale-related environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp   /usr/libexec/openssh/sftp-server

Et voici une version par Synthic:

# Utilisation de la version 2 du protocole SSH
Protocol 2
# Utilisation du port 22. Il est possible de le modifier
Port 22
# Interdit à root de s'identifier
PermitRootLogin no
PermitEmptyPasswords no
# On indique ici la liste des utilisateurs ayant la permission d'utiliser SSH
AllowUsers utilisateur
# Nombre d'essais avant fermeture de la connexion
MaxAuthTries 3
UsePAM no
# Authentification par clés
PubkeyAuthentication yes
# Lieux où sont stockées les clés publiques --> /home/user/.ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
ChallengeResponseAuthentication yes
# Désactivation de l'authentification par mot de passe
PasswordAuthentication no
IgnoreRhosts yes
HostbasedAuthentication no
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server
PrintMotd no
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
X11Forwarding no

Voilà mon fichier de configuration, à adapter suivant vos préférences (surtout n’oubliez pas d’ajuster le user dans l’option AllowUsers à votre cas particulier)

Pour ma part, je vais garder le port 22 ; je le changerai peut-être plus tard.

Protocol 2
Port 22

Blocage de root

PermitRootLogin no

Pas de mot de passe vide

PermitEmptyPasswords no

Seul l’utilisateur pi est autorisé

AllowUsers pi

Connexion uniquement pas clef

PubkeyAuthentication yes

Modification et limite des tentatives de connexion

LoginGraceTime 30s
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5

Les fichiers de clef autorisés

AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2

Voici la copie du fichier complet :

pi@raspberrypi:~ $ cat /etc/ssh/sshd_config
#   $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

Port 22
#AddressFamily any
# A décommenter après test sur sur site d'audit, car nos réglages ne permettent
# que de se connecter à partir de notre réseau local
# Si vous voulez que votre serveur soit accessible à partir de l'extérieur
# gardez les valeurs par défaut (ou les options commentées)
#ListenAddress 0.0.0.0
#ListenAddress ::
# Nouveaux réglages
# ListenAddress 192.168.111.0
# ListenAddress 2a01:e0a:d0:3c20::0

# On ne permet que la connexion avec une clef forte
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
# Modification du niveau de logging pour plus de détails
#SyslogFacility AUTH
SysLogFacility AUTHPRIV
#LogLevel INFO
LogLevel VERBOSE

# Authentication:

# C'est ici que l'on va ne permettre que l'accès par clef partagée
# et interdire l'accès par mot de passe
# De plus on configure le nombre d'essais et le délai de connexion
# à des valeurs plus courtes
LoginGraceTime 30s
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5

PubkeyAuthentication yes

# Ajout d'une liste blanche d'utilisateurs autorisés à se connecter
# ici, seulement l'utilisateur pi
AllowUsers pi

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
# Interdiction de connexion pas login/mot de passe
PasswordAuthentication yes
# Interdiction de mot de passe vides
PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes

# On va interdire le forwarding
AllowAgentForwarding no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
# Pas de message d'acceuil de SSHD
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
# Utilisation du DNS
UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp    /usr/lib/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#   X11Forwarding no
#   AllowTcpForwarding no
#   PermitTTY no
#   ForceCommand cvs server
pi@raspberrypi:~ $

On redémarre sshd

sudo systemctl restart sshd.service

On teste si le service a bien redémarré sans erreurs :

pi@raspberrypi:~ $ sudo systemctl status sshd.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-02-14 14:59:47 CET; 7s ago
    Docs: man:sshd(8)
        man:sshd_config(5)
Process: 523 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 524 (sshd)
    Tasks: 1 (limit: 269)
CGroup: /system.slice/ssh.service
        └─524 /usr/sbin/sshd -D

févr. 14 14:59:46 raspberrypi systemd[1]: Starting OpenBSD Secure Shell server...
févr. 14 14:59:46 raspberrypi sshd[524]: Server listening on 0.0.0.0 port 22.
févr. 14 14:59:47 raspberrypi sshd[524]: Server listening on :: port 22.
févr. 14 14:59:47 raspberrypi systemd[1]: Started OpenBSD Secure Shell server.
pi@raspberrypi:~ $

C’est bon.

Essai de connexion :

eric@aldebaran:~$ ssh piras
The authenticity of host 'piras.yojik.net (192.168.111.170)' can't be established.
ED25519 key fingerprint is SHA256:NW70QB3uNQ1cnrTQyfXG1Lu1iTDubEv6Oak4PK+DR1k.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'piras.yojik.net,192.168.111.170' (ED25519) to the list of known hosts.
Enter passphrase for key '/home/eric/.ssh/piras/piras_ed25519':
Linux raspberrypi 5.10.11+ #1399 Thu Jan 28 12:02:28 GMT 2021 armv6l

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.
Last login: Sun Feb 14 15:02:55 2021 from 192.168.111.150
pi@raspberrypi:~ $

C’est bon.

Test sur le site d’audit :

Bien, après avoir effacé toutes les données personnelles de mon navigateur (données qui entraînent une erreur «The csrf token is invalid »), le test revient toujours avec une mauvaise note. D’où la suite. Les instructions pour améliorer sont également sur le site SSH-Audit.com recommendations

On va sécuriser les échanges en jouant sur 3 options supplémentaires :

Ciphers : Le chiffrement utilisé.

KexAlgorithms : Les algorithmes utilisés pour l’échange de clés.

MACs : Message Authentication code, c’est le code qui accompagnent les données échangées dans le but d’assurer leur intégrité pour être certain qu’elles n’ont subies aucune altération pendant/après la transmission.

Voilà les étapes à suivre (reprises quasi texto des sites déjà cités) :

Régénération de la clé ED25519 du serveur :

  sudo rm -f /etc/ssh/ssh_host_*
  sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

Retrait des moduli Diffie-Hellman faible :

  sudo awk '$5 >= 3071' /etc/ssh/moduli > /home/pi/moduli.safe
  sudo mv -f /home/pi/moduli.safe /etc/ssh/moduli

Désactivation des clés DSA/ECDSA & RSA si ce n’est pas déjà fait :

  sudo sed -i 's/^HostKey \/etc\/ssh\/ssh_host_\(dsa\|ecdsa\|rsa\)_key$/\#HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config

Restriction des ciphers, clés d’échange et des codes d’authentification :

Ajoutez ceci à la fin du fichier /etc/sshd_config:

  KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
  Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
  MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

Redémarrage de sshd

 sudo systemctl restart sshd.service

Test sur le site ssh audit

Tout est OK … nous sommes passés d’une note F à A+.

[picture]

résultat

[picture]

résultat

[picture]

résultat

[picture]

résultat

[picture]

résultat

[picture]

résultat

[picture]

résultat

Réseau

Dans cette partie, nous allons donner à notre raspi une adresse IP fixe, en IPV4 et IPV6.

Nous allons utiliser ce qui est indiqué dans de nombreux tutoriels : modification du fichier /etc/dhcpcd.conf

# Example static IP configuration:
interface eth0
static ip_address=192.168.111.170/24
static ip6_address=2a01:e0a:d0:3c20::170/64
static routers=192.168.111.254
#static domain_name_servers=192.168.1.1

Les lignes à modifier sont celles ci-dessus : enlever le # au début des lignes (sauf la première et la dernière) et renseigner en fonction des adresses IP voulues : ipv4 et ipv6.

Il restera les serveurs DNS à configurer (dernière ligne), ce que nous ferons après avoir installé knot-resolver.

Une fois les modifications dans le fichier /etc/dhcpcd.conf faites, vous pouvez re-démarrer votre raspi.

Test :

pi@raspberrypi:~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:3a:0b:38 brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.170/24 brd 192.168.111.255 scope global noprefixroute eth0
    valid_lft forever preferred_lft forever
    inet6 2a01:e0a:d0:3c20:a23:93ca:de95:e15b/64 scope global dynamic mngtmpaddr noprefixroute
    valid_lft 86388sec preferred_lft 86388sec
    inet6 2a01:e0a:d0:3c20::170/64 scope global noprefixroute
    valid_lft forever preferred_lft forever
    inet6 fe80::74c8:34d:25f2:3b43/64 scope link
    valid_lft forever preferred_lft forever
pi@raspberrypi:~ $

Les adresses IP de votre serveur doivent correspondre à ce que vous avez entré dans le fichier. On a bien :

inet 192.168.111.170/24

inet6 2a01:e0a:d0:3c20::170/64

C’est tout bon !

Installation de knot-resolver

Nous allons suivre la documentation officielle située ici : knot-resolver

Installation

Installation du resolver et des programmes utilitaires

pi@piras:~ $ sudo apt install knot-resolver  knot-dnsutils

Configuration

Voilà le contenu de mon fichier de configuration /etc/knot-resolver/kresd.conf :

pi@piras:~ $ cat /etc/knot-resolver/kresd.conf
-- Default empty Knot DNS Resolver configuration in -*- lua -*-
-- Bind ports as privileged user (root) --
net = { '127.0.0.1', '::1' }
-- Switch to unprivileged user --
user('knot-resolver','knot-resolver')
-- Unprivileged
-- cache.size = 100*MB
pi@piras:~ $

J’ai dé-commenté les interfaces d’écoute.

Lancement et mise en service automatique

On démarre le service

sudo systemctl start kresd@1.service

On rend le démarrage automatique

sudo systemctl enable --now kresd@1.service

On vérifie que le service est en route

sudo systemctl status kresd@1.service

pi@piras:~ $ sudo systemctl status kresd@1.service
● kresd@1.service - Knot Resolver daemon
Loaded: loaded (/lib/systemd/system/kresd@.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-12-12 12:24:29 CET; 15min ago
    Docs: man:kresd.systemd(7)
        man:kresd(8)
Main PID: 1905 (kresd)
CGroup: /system.slice/system-kresd.slice/kresd@1.service
        └─1905 /usr/sbin/kresd --config=/etc/knot-resolver/kresd.conf

déc. 12 12:24:28 piras systemd[1]: Starting Knot Resolver daemon...
déc. 12 12:24:29 piras systemd[1]: Started Knot Resolver daemon.
pi@piras:~ $

Il est actif (active (running))

On teste le fonctionnement

pi@piras:~ $ kdig +short @localhost . NS
a.root-servers.net.
b.root-servers.net.
c.root-servers.net.
d.root-servers.net.
e.root-servers.net.
f.root-servers.net.
g.root-servers.net.
h.root-servers.net.
i.root-servers.net.
j.root-servers.net.
k.root-servers.net.
l.root-servers.net.
m.root-servers.net.
pi@piras:~ $

Tout fonctionne :D le résolveur écoute sur les ports 127.0.0.1 et ::1.

Modification de /etc/dhcpcd.conf

Nous allons pouvoir maintenant modifier la ligne :

#static domain_name_servers=192.168.1.1

pour obtenir ceci :

static domain_name_servers=127.0.0.1 ::1

Notre raspi fera appel dorénavant à son propre résolveur DNS (et non à celui de votre box !)

Le pare-feu

Il nous faut installer un pare-feu sur notre raspi pour éviter les intrusions.

Nous allons limiter les machines susceptibles de se connecter à celles de notre réseau local, et également limiter les ports accessibles sur notre réseau.

Nous allons utiliser IPtables et Firewalld.

J’aurai préféré utiliser nftables qui est le successeur de iptables, mais j’ai eu quelques soucis à l’utilisation. Peut-être est-ce pour ça que la distribution RaspiOS a configuré firewalld avec IPtables… ## Installation de IPtables

IPtables est installé par défaut : rien à faire ici.

Test

Si on tape :

pi@raspberrypi:~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
pi@raspberrypi:~ $

On voit que c’est iptables qui a été chosi par RaspiOS.

D’abord, il faut comprendre comment fonctionne Firewalld. Je me suis basé sur les sites suivant :

lw.net

How to get started with Firewalld

tutorial points

la documentation officielle

introduction-to-firewalld

La documentation de Fedora

it connect

La documentation de Fedora est la plus compréhensible.

La notion de zones

Firewalld définit 9 zones qui sont en fait des règles de pare-feux par défaut. Une zone va par exemple bloquer toute entrée sauf SSH, une autre permettre l’accès en HTTP et HTTPS. Ces zones correspondent à des utilisations types, comme un serveur dans une DMZ, ou un serveur chez soi, un serveur public, etc.

On peut imaginer une zone émail qui ne laisserait passer que les ports spécifiques à l’émail et DNS bien sûr.

Il est possible de créer des zones personnelles.

Un certain nombre de zones sont prédéfinies. Voyons leur contenu.

Les différentes zones

Les différentes zones sont :

trusted: non modifiable

home: modifiable

work: modifiable

internal: modifiable

dmz: modifiable

public: modifiable

external: modifiable

block: non modifiable

drop: non modifiable

Une très bonne présentation des zones est ici : it connect

Les fichiers de configuration

Ils sont situés à 2 endroits :

/usr/lib/firewalld/ : il ne faut pas toucher au contenu de ce répertoire

/etc/firewalld/ : c’est là que nous mettrons notre configuration, en copiant les fichiers de /usr/lib/firewalld si besoin est.

Dans le répertoire /etc/firewalld, le fichier firewalld.conf permet de configurer la zone par défaut, ainsi que le backend (iptables, nftables et autre).

La zone par défaut est public : pas de confiance, mais possibilité d’ajuster au cas par cas les règles. Le seul accès autorisé est l’accès ssh et dhcp.

Quelques commandes

Démarrer Firewalld:$ sudo systemctl start firewalld

Stopper Fireawalld:$ sudo systemctl stop firewalld

Tester le fonctionnement de Firewalld:$ sudo firewall-cmd –state

Connaître les zones prédéfinies : $ sudo firewall-cmd –get-zones

Connaître la zone par défaut :$ sudo firewall-cmd –get-default-zone

Connaître la zone active :$ sudo firewall-cmd –get-active-zones

Exemples :

pi@piras:~ $ sudo firewall-cmd --state
running
pi@piras:~ $

Le service tourne.

pi@piras:~ $ sudo firewall-cmd --get-default-zone
public
pi@piras:~ $

La zone par défaut est : public

pi@piras:~ $ sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work
pi@piras:~ $

Les zones prédéfinies sont : block dmz drop external home internal public trusted work

Quelle est la zone active : aucune !

pi@piras:~ $ sudo firewall-cmd --get-active-zones
pi@piras:~ $

Nous pouvons vérifier la zone en fonctionnement et l’interface réseau qui y est attachée :

pi@piras:~ $ sudo firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

pi@piras:~ $

Aucune interface n’est attachée. Les seuls services autorisé sont : dhcp et ssh.

Première étape de configuration

Nous allons utiliser les commandes en ligne de commande pour configurer Firewalld, mais il existe une GUI pour le faire graphiquement. Référez-vous aux liens que j’ai indiqués au-dessus.

Définition de la zone par défaut : (public)

  pi@piras:~ $ sudo firewall-cmd --set-default-zone=public
  Warning: ZONE_ALREADY_SET: public
  success
  pi@piras:~ $

Attribution de l’interface réseau à cette zone :

  pi@piras:~ $ sudo firewall-cmd --zone=public --change-interface=eth0
  success
  pi@piras:~ $

Attention, ce changement n’est pas permanent ! (voir ci-dessous)

Test :

  pi@piras:~ $ sudo firewall-cmd --list-all
  public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

  pi@piras:~ $

Nous voyons que l’interface eth0 a bien été attribuée à la zone public.

Les services

Il est possible de configurer les services accessibles (ou pas) attribués à la zone active.

Pour connaître les différents services disponibles, tapez la commande suivante :

pi@piras:~ $ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph
ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client
etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps
ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network
llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn
ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio
puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps
snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client
tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local
xmpp-server zabbix-agent zabbix-server
pi@piras:~ $

Chaque détail des services est détaillé dans un fichier xml dans /usr/lib/firewalld.

Voyons quels services sont actuellement activés sur notre raspi :

pi@piras:~ $ ss -t -u -l -a
Netid          State           Recv-Q          Send-Q                     Local Address:Port                          Peer Address:Port
udp            UNCONN          0               0                                0.0.0.0:55853                              0.0.0.0:*
udp            UNCONN          0               0                              127.0.0.1:domain                             0.0.0.0:*
udp            UNCONN          0               0                                0.0.0.0:bootpc                             0.0.0.0:*
udp            UNCONN          0               0                                0.0.0.0:mdns                               0.0.0.0:*
udp            UNCONN          0               0                                  [::1]:domain                                   *:*
udp            UNCONN          0               0                                      *:59578                                    *:*
udp            UNCONN          0               0                                      *:mdns                                     *:*
tcp            LISTEN          0               511                            127.0.0.1:domain-s                           0.0.0.0:*
tcp            LISTEN          0               511                            127.0.0.1:domain                             0.0.0.0:*
tcp            LISTEN          0               128                              0.0.0.0:ssh                                0.0.0.0:*
tcp            ESTAB           0               0                        192.168.111.170:ssh                        192.168.111.150:59092
tcp            LISTEN          0               511                                [::1]:domain-s                              [::]:*
tcp            LISTEN          0               511                                [::1]:domain                                [::]:*
tcp            LISTEN          0               128                                 [::]:ssh                                   [::]:*
pi@piras:~ $

Nous voyons notre connexion ssh établie entre ma machine de travail en ip 192.168.111.150 et piras 192.168.111.170.

Notre raspi écoute également le port 22 sur toutes les interfaces présentes.

Liste des ports en écoute (TCP) :

pi@piras:~ $ ss -ltn
State              Recv-Q             Send-Q                           Local Address:Port                           Peer Address:Port
LISTEN             0                  511                                  127.0.0.1:853                                 0.0.0.0:*
LISTEN             0                  511                                  127.0.0.1:53                                  0.0.0.0:*
LISTEN             0                  128                                    0.0.0.0:22                                  0.0.0.0:*
LISTEN             0                  511                                      [::1]:853                                    [::]:*
LISTEN             0                  511                                      [::1]:53                                     [::]:*
LISTEN             0                  128                                       [::]:22                                     [::]:*
pi@piras:~ $

Les ports 22 (ssh), 53 (dns), 853 (dns) sont à l’écoute en IPV4 et IPV6.

Liste des ports en écoute (UDP) :

pi@piras:~ $ ss -lun
State              Recv-Q             Send-Q                          Local Address:Port                            Peer Address:Port
UNCONN             0                  0                                   127.0.0.1:53                                   0.0.0.0:*
UNCONN             0                  0                                     0.0.0.0:68                                   0.0.0.0:*
UNCONN             0                  0                                     0.0.0.0:5353                                 0.0.0.0:*
UNCONN             0                  0                                       [::1]:53                                         *:*
UNCONN             0                  0                                           *:59578                                      *:*
UNCONN             0                  0                                           *:5353                                       *:*
pi@piras:~ $

État des lieux

Vérifions le fonctionnement de Firewalld. Souvenez-vous qu’il était configuré pour fonctionner avec Iptables.

Vérifions les règles établies :

pi@piras:~ $ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
INPUT_direct  all  --  anywhere             anywhere
INPUT_ZONES_SOURCE  all  --  anywhere             anywhere
INPUT_ZONES  all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
FORWARD_direct  all  --  anywhere             anywhere
FORWARD_IN_ZONES_SOURCE  all  --  anywhere             anywhere
FORWARD_IN_ZONES  all  --  anywhere             anywhere
FORWARD_OUT_ZONES_SOURCE  all  --  anywhere             anywhere
FORWARD_OUT_ZONES  all  --  anywhere             anywhere
DROP       all  --  anywhere             anywhere             ctstate INVALID
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
OUTPUT_direct  all  --  anywhere             anywhere

Chain INPUT_direct (1 references)
target     prot opt source               destination

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_public  all  --  anywhere             anywhere            [goto]
IN_public  all  --  anywhere             anywhere            [goto]

Chain FORWARD_direct (1 references)
target     prot opt source               destination

Chain FORWARD_IN_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_IN_ZONES (1 references)
target     prot opt source               destination
FWDI_public  all  --  anywhere             anywhere            [goto]
FWDI_public  all  --  anywhere             anywhere            [goto]

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
target     prot opt source               destination

Chain FORWARD_OUT_ZONES (1 references)
target     prot opt source               destination
FWDO_public  all  --  anywhere             anywhere            [goto]
FWDO_public  all  --  anywhere             anywhere            [goto]

Chain OUTPUT_direct (1 references)
target     prot opt source               destination

Chain IN_public (2 references)
target     prot opt source               destination
IN_public_log  all  --  anywhere             anywhere
IN_public_deny  all  --  anywhere             anywhere
IN_public_allow  all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere

Chain IN_public_log (1 references)
target     prot opt source               destination

Chain IN_public_deny (1 references)
target     prot opt source               destination

Chain IN_public_allow (1 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,UNTRACKED

Chain FWDI_public (2 references)
target     prot opt source               destination
FWDI_public_log  all  --  anywhere             anywhere
FWDI_public_deny  all  --  anywhere             anywhere
FWDI_public_allow  all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere

Chain FWDI_public_log (1 references)
target     prot opt source               destination

Chain FWDI_public_deny (1 references)
target     prot opt source               destination

Chain FWDI_public_allow (1 references)
target     prot opt source               destination

Chain FWDO_public (2 references)
target     prot opt source               destination
FWDO_public_log  all  --  anywhere             anywhere
FWDO_public_deny  all  --  anywhere             anywhere
FWDO_public_allow  all  --  anywhere             anywhere

Chain FWDO_public_log (1 references)
target     prot opt source               destination

Chain FWDO_public_deny (1 references)
target     prot opt source               destination

Chain FWDO_public_allow (1 references)
target     prot opt source               destination
pi@piras:~ $

Les règles Iptables ont bien été configurées par Firewalld.

Après reboot, nous voyons que rien n’a été conservé !

Il va falloir investiguer …

Bien : voilà la procédure à suivre :

sudo firewall-cmd –permanent –zone=public –change-interface=eth0

Permet de changer de façon permanente l’interface associée à la zone public.

Test :
pi@piras:~ $ sudo firewall-cmd --permanent --zone=public --change-interface=eth0
success

pi@piras:~ $ sudo cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<interface name="eth0"/>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
pi@piras:~ $

Nous voyons que firewalld a créé des répertoires et un fichier dans le répertoire **zones** dont le contenu correspond à ce que nous avons demandé.

pi@piras:~ $ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

pi@piras:~ $

Test après redémarrage :

Cette fois-ci, ça marche ! (Yes !)

pi@piras:~ $ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

pi@piras:~ $

Nous verrons ensuite comment ajouter des règles suivant les services que nous voudrons déployer.

Installation de fail2ban

Fail2ban nous permet de contrer les attaques de «brute force. »

Il met automatique en quarantaine les IPs attaquantes en analysant les fichiers de log.

Installation

pi@raspberrypi:~ $ sudo apt install fail2ban && sudo apt clean
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 :
python3-pyinotify python3-systemd whois
Paquets suggérés :
mailx monit sqlite3 python-pyinotify-doc
Les NOUVEAUX paquets suivants seront installés :
fail2ban python3-pyinotify python3-systemd whois
0 mis à jour, 4 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 514 ko dans les archives.
Après cette opération, 2 410 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
Réception de :2 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf fail2ban all 0.10.2-2.1 [385 kB]
Réception de :1 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf whois armhf 5.4.3 [68,6 kB]
Réception de :3 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf python3-pyinotify all 0.9.6-1 [26,9 kB]
Réception de :4 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf python3-systemd armhf 234-2+b1 [34,1 kB]
514 ko réceptionnés en 2s (330 ko/s)
Sélection du paquet whois précédemment désélectionné.
(Lecture de la base de données... 43868 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../archives/whois_5.4.3_armhf.deb ...
Dépaquetage de whois (5.4.3) ...
Sélection du paquet fail2ban précédemment désélectionné.
Préparation du dépaquetage de .../fail2ban_0.10.2-2.1_all.deb ...
Dépaquetage de fail2ban (0.10.2-2.1) ...
Sélection du paquet python3-pyinotify précédemment désélectionné.
Préparation du dépaquetage de .../python3-pyinotify_0.9.6-1_all.deb ...
Dépaquetage de python3-pyinotify (0.9.6-1) ...
Sélection du paquet python3-systemd précédemment désélectionné.
Préparation du dépaquetage de .../python3-systemd_234-2+b1_armhf.deb ...
Dépaquetage de python3-systemd (234-2+b1) ...
Paramétrage de whois (5.4.3) ...
Paramétrage de fail2ban (0.10.2-2.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.
[fail2ban-tmpfiles.conf:1] Line references path below legacy directory /var/run/, updating /var/run/fail2ban → /run/fail2ban; please update the tm
pfiles.d/ drop-in file accordingly.
Paramétrage de python3-pyinotify (0.9.6-1) ...
Paramétrage de python3-systemd (234-2+b1) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u6+rpi1) ...
pi@raspberrypi:~ $

Paramétrage de fail2ban

Dans un premier temps, rien n’est à configurer. L’installation de base configure la surveillance de ssh par défaut.

Le fichier qui contrôle ce fonctionnement est /etc/fail2ban/jail.d/defaults-debian.conf.

Par défaut, il contient :

pi@raspberrypi:~ $ sudo cat /etc/fail2ban/jail.d/defaults-debian.conf
[sshd]
enabled = true
pi@raspberrypi:~ $

Nous rajouterons des ports à surveiller selon les services que nous installerons.

Installation de logwatch

Nous allons installer logwatch qui nous enverra chaque jour un rapport de surveillance des services surveillés.

La configuration se fait dans /usr/share/logwatch/default.conf/logwatch.conf

Installation

pi@raspberrypi:~ $ sudo apt install logwatch
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 :
exim4-base exim4-config exim4-daemon-light guile-2.2-libs libdate-manip-perl libgnutls-dane0 libgsasl7 libkyotocabinet16v5 libltdl7 liblzo2-2
libmailutils5 libmariadb3 libntlm0 libpython2.7 libsys-cpu-perl libsys-meminfo-perl libunbound8 mailutils mailutils-common mariadb-common
mysql-common
Paquets suggérés :
exim4-doc-html | exim4-doc-info eximon4 spf-tools-perl swaks mailutils-mh mailutils-doc
Les NOUVEAUX paquets suivants seront installés :
exim4-base exim4-config exim4-daemon-light guile-2.2-libs libdate-manip-perl libgnutls-dane0 libgsasl7 libkyotocabinet16v5 libltdl7 liblzo2-2
libmailutils5 libmariadb3 libntlm0 libpython2.7 libsys-cpu-perl libsys-meminfo-perl libunbound8 logwatch mailutils mailutils-common
mariadb-common mysql-common
0 mis à jour, 22 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 13,0 Mo dans les archives.
Après cette opération, 72,1 Mo d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
Réception de :1 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf exim4-config all 4.92-8+deb10u4 [323 kB]
Réception de :4 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf libgnutls-dane0 armhf 3.6.7-4+deb10u6 [315 kB]
Réception de :2 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf exim4-base armhf 4.92-8+deb10u4 [1 132 kB]
Réception de :3 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libunbound8 armhf 1.9.0-2+deb10u2 [403 kB]
Réception de :7 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf guile-2.2-libs armhf 2.2.4+1-2+deb10u1 [4 918 kB]
Réception de :5 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf exim4-daemon-light armhf 4.92-8+deb10u4 [492 kB]
Réception de :6 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libltdl7 armhf 2.4.6-9 [387 kB]
Réception de :20 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf libsys-meminfo-perl armhf 0.99-1+b2 [9 564 B]
Réception de :8 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libdate-manip-perl all 6.76-1 [930 kB]
Réception de :21 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf logwatch all 7.5.0-1 [380 kB]
Réception de :22 http://distrib-coffee.ipsl.jussieu.fr/pub/linux/raspbian/raspbian buster/main armhf mailutils armhf 1:3.5-4 [566 kB]
Réception de :9 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libntlm0 armhf 1.5-1+deb10u1 [21,6 kB]
Réception de :10 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libgsasl7 armhf 1.8.0-8+b1 [196 kB]
Réception de :11 http://ftp.crifo.org/raspbian/raspbian buster/main armhf liblzo2-2 armhf 2.10-0.1 [48,4 kB]
Réception de :14 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf mysql-common all 5.8+1.0.5 [7 324 B]
Réception de :15 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf mariadb-common all 1:10.3.27-0+deb10u1 [32,2 kB]
Réception de :16 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libmariadb3 armhf 1:10.3.27-0+deb10u1 [158 kB]
Réception de :17 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libpython2.7 armhf 2.7.16-2+deb10u1 [873 kB]
Réception de :19 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libsys-cpu-perl armhf 0.61-2+b3 [9 332 B]
Réception de :12 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf libkyotocabinet16v5 armhf 1.2.76-4.2+rpi1 [280 kB]
Réception de :13 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf mailutils-common all 1:3.5-4 [689 kB]
Réception de :18 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf libmailutils5 armhf 1:3.5-4 [809 kB]
13,0 Mo réceptionnés en 11s (1 139 ko/s)
Préconfiguration des paquets...
Sélection du paquet exim4-config précédemment désélectionné.
(Lecture de la base de données... 44347 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../00-exim4-config_4.92-8+deb10u4_all.deb ...
Dépaquetage de exim4-config (4.92-8+deb10u4) ...
Sélection du paquet exim4-base précédemment désélectionné.
Préparation du dépaquetage de .../01-exim4-base_4.92-8+deb10u4_armhf.deb ...
Dépaquetage de exim4-base (4.92-8+deb10u4) ...
Sélection du paquet libunbound8:armhf précédemment désélectionné.
Préparation du dépaquetage de .../02-libunbound8_1.9.0-2+deb10u2_armhf.deb ...
Dépaquetage de libunbound8:armhf (1.9.0-2+deb10u2) ...
Sélection du paquet libgnutls-dane0:armhf précédemment désélectionné.
Préparation du dépaquetage de .../03-libgnutls-dane0_3.6.7-4+deb10u6_armhf.deb ...
Dépaquetage de libgnutls-dane0:armhf (3.6.7-4+deb10u6) ...
Sélection du paquet exim4-daemon-light précédemment désélectionné.
Préparation du dépaquetage de .../04-exim4-daemon-light_4.92-8+deb10u4_armhf.deb ...
Dépaquetage de exim4-daemon-light (4.92-8+deb10u4) ...
Sélection du paquet libltdl7:armhf précédemment désélectionné.
Préparation du dépaquetage de .../05-libltdl7_2.4.6-9_armhf.deb ...
Dépaquetage de libltdl7:armhf (2.4.6-9) ...
Sélection du paquet guile-2.2-libs:armhf précédemment désélectionné.
Préparation du dépaquetage de .../06-guile-2.2-libs_2.2.4+1-2+deb10u1_armhf.deb ...
Dépaquetage de guile-2.2-libs:armhf (2.2.4+1-2+deb10u1) ...
Sélection du paquet libdate-manip-perl précédemment désélectionné.
Préparation du dépaquetage de .../07-libdate-manip-perl_6.76-1_all.deb ...
Dépaquetage de libdate-manip-perl (6.76-1) ...
Sélection du paquet libntlm0:armhf précédemment désélectionné.
Préparation du dépaquetage de .../08-libntlm0_1.5-1+deb10u1_armhf.deb ...
Dépaquetage de libntlm0:armhf (1.5-1+deb10u1) ...
Sélection du paquet libgsasl7 précédemment désélectionné.
Préparation du dépaquetage de .../09-libgsasl7_1.8.0-8+b1_armhf.deb ...
Dépaquetage de libgsasl7 (1.8.0-8+b1) ...
Sélection du paquet liblzo2-2:armhf précédemment désélectionné.
Préparation du dépaquetage de .../10-liblzo2-2_2.10-0.1_armhf.deb ...
Dépaquetage de liblzo2-2:armhf (2.10-0.1) ...
Sélection du paquet libkyotocabinet16v5:armhf précédemment désélectionné.
Préparation du dépaquetage de .../11-libkyotocabinet16v5_1.2.76-4.2+rpi1_armhf.deb ...
Dépaquetage de libkyotocabinet16v5:armhf (1.2.76-4.2+rpi1) ...
Sélection du paquet mailutils-common précédemment désélectionné.
Préparation du dépaquetage de .../12-mailutils-common_1%3a3.5-4_all.deb ...
Dépaquetage de mailutils-common (1:3.5-4) ...
Sélection du paquet mysql-common précédemment désélectionné.
Préparation du dépaquetage de .../13-mysql-common_5.8+1.0.5_all.deb ...
Dépaquetage de mysql-common (5.8+1.0.5) ...
Sélection du paquet mariadb-common précédemment désélectionné.
Préparation du dépaquetage de .../14-mariadb-common_1%3a10.3.27-0+deb10u1_all.deb ...
Dépaquetage de mariadb-common (1:10.3.27-0+deb10u1) ...
Sélection du paquet libmariadb3:armhf précédemment désélectionné.
Préparation du dépaquetage de .../15-libmariadb3_1%3a10.3.27-0+deb10u1_armhf.deb ...
Dépaquetage de libmariadb3:armhf (1:10.3.27-0+deb10u1) ...
Sélection du paquet libpython2.7:armhf précédemment désélectionné.
Préparation du dépaquetage de .../16-libpython2.7_2.7.16-2+deb10u1_armhf.deb ...
Dépaquetage de libpython2.7:armhf (2.7.16-2+deb10u1) ...
Sélection du paquet libmailutils5:armhf précédemment désélectionné.
Préparation du dépaquetage de .../17-libmailutils5_1%3a3.5-4_armhf.deb ...
Dépaquetage de libmailutils5:armhf (1:3.5-4) ...
Sélection du paquet libsys-cpu-perl précédemment désélectionné.
Préparation du dépaquetage de .../18-libsys-cpu-perl_0.61-2+b3_armhf.deb ...
Dépaquetage de libsys-cpu-perl (0.61-2+b3) ...
Sélection du paquet libsys-meminfo-perl précédemment désélectionné.
Préparation du dépaquetage de .../19-libsys-meminfo-perl_0.99-1+b2_armhf.deb ...
Dépaquetage de libsys-meminfo-perl (0.99-1+b2) ...
Sélection du paquet logwatch précédemment désélectionné.
Préparation du dépaquetage de .../20-logwatch_7.5.0-1_all.deb ...
Dépaquetage de logwatch (7.5.0-1) ...
Sélection du paquet mailutils précédemment désélectionné.
Préparation du dépaquetage de .../21-mailutils_1%3a3.5-4_armhf.deb ...
Dépaquetage de mailutils (1:3.5-4) ...
Paramétrage de mysql-common (5.8+1.0.5) ...
update-alternatives: utilisation de « /etc/mysql/my.cnf.fallback » pour fournir « /etc/mysql/my.cnf » (my.cnf) en mode automatique
Paramétrage de libpython2.7:armhf (2.7.16-2+deb10u1) ...
Paramétrage de libsys-cpu-perl (0.61-2+b3) ...
Paramétrage de liblzo2-2:armhf (2.10-0.1) ...
Paramétrage de mariadb-common (1:10.3.27-0+deb10u1) ...
update-alternatives: utilisation de « /etc/mysql/mariadb.cnf » pour fournir « /etc/mysql/my.cnf » (my.cnf) en mode automatique
Paramétrage de libunbound8:armhf (1.9.0-2+deb10u2) ...
Paramétrage de libntlm0:armhf (1.5-1+deb10u1) ...
Paramétrage de mailutils-common (1:3.5-4) ...
Paramétrage de libmariadb3:armhf (1:10.3.27-0+deb10u1) ...
Paramétrage de libltdl7:armhf (2.4.6-9) ...
Paramétrage de exim4-config (4.92-8+deb10u4) ...
Adding system-user for exim (v4)
Paramétrage de libsys-meminfo-perl (0.99-1+b2) ...
Paramétrage de guile-2.2-libs:armhf (2.2.4+1-2+deb10u1) ...
Paramétrage de libdate-manip-perl (6.76-1) ...
Paramétrage de libgnutls-dane0:armhf (3.6.7-4+deb10u6) ...
Paramétrage de exim4-base (4.92-8+deb10u4) ...
exim: DB upgrade, deleting hints-db
Paramétrage de libkyotocabinet16v5:armhf (1.2.76-4.2+rpi1) ...
Paramétrage de libgsasl7 (1.8.0-8+b1) ...
Paramétrage de exim4-daemon-light (4.92-8+deb10u4) ...
Initializing GnuTLS DH parameter file
Paramétrage de libmailutils5:armhf (1:3.5-4) ...
Paramétrage de logwatch (7.5.0-1) ...
Paramétrage de mailutils (1:3.5-4) ...
update-alternatives: utilisation de « /usr/bin/frm.mailutils » pour fournir « /usr/bin/frm » (frm) en mode automatique
update-alternatives: utilisation de « /usr/bin/from.mailutils » pour fournir « /usr/bin/from » (from) en mode automatique
update-alternatives: utilisation de « /usr/bin/messages.mailutils » pour fournir « /usr/bin/messages » (messages) en mode automatique
update-alternatives: utilisation de « /usr/bin/movemail.mailutils » pour fournir « /usr/bin/movemail » (movemail) en mode automatique
update-alternatives: utilisation de « /usr/bin/readmsg.mailutils » pour fournir « /usr/bin/readmsg » (readmsg) en mode automatique
update-alternatives: utilisation de « /usr/bin/dotlock.mailutils » pour fournir « /usr/bin/dotlock » (dotlock) en mode automatique
update-alternatives: utilisation de « /usr/bin/mail.mailutils » pour fournir « /usr/bin/mailx » (mailx) en mode automatique
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u6+rpi1) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.28-10+rpi1) ...
pi@raspberrypi:~ $

Premières configurations

Il faut modifier les lignes suivantes :

MailTo = root -> Mailto = pi Range = yesterday -> Range = all

J’ai laissé la deuxième ligne à yesterday pour limiter la taille du rapport.

Premiers tests

Nous utiliserons l’utilisateur local destinataire pi. Le logiciel de courrier installé n’est pas configuré pour envoyer des mails à l’extérieur.

logwatch –detail Low –mailto pi –service All –range today

Pour lire les courriers, nous installerons mutt.

Installation de mutt

pi@raspberrypi:~ $ sudo apt install mutt
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 :
libgpgme11 libsasl2-modules libtokyocabinet9
Paquets suggérés :
libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql urlview aspell
| ispell mixmaster
Les NOUVEAUX paquets suivants seront installés :
libgpgme11 libsasl2-modules libtokyocabinet9 mutt
0 mis à jour, 4 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 2 121 ko dans les archives.
Après cette opération, 7 626 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
Réception de :1 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libgpgme11 armhf 1.12.0-6 [230 kB]
Réception de :3 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf libtokyocabinet9 armhf 1.4.48-12 [311 kB]
Réception de :2 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf libsasl2-modules armhf 2.1.27+dfsg-1+deb10u1 [96,3 kB]
Réception de :4 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf mutt armhf 1.10.1-2.1+deb10u5 [1 484 kB]
2 121 ko réceptionnés en 3s (803 ko/s)
Sélection du paquet libgpgme11:armhf précédemment désélectionné.
(Lecture de la base de données... 46838 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../libgpgme11_1.12.0-6_armhf.deb ...
Dépaquetage de libgpgme11:armhf (1.12.0-6) ...
Sélection du paquet libsasl2-modules:armhf précédemment désélectionné.
Préparation du dépaquetage de .../libsasl2-modules_2.1.27+dfsg-1+deb10u1_armhf.deb ...
Dépaquetage de libsasl2-modules:armhf (2.1.27+dfsg-1+deb10u1) ...
Sélection du paquet libtokyocabinet9:armhf précédemment désélectionné.
Préparation du dépaquetage de .../libtokyocabinet9_1.4.48-12_armhf.deb ...
Dépaquetage de libtokyocabinet9:armhf (1.4.48-12) ...
Sélection du paquet mutt précédemment désélectionné.
Préparation du dépaquetage de .../mutt_1.10.1-2.1+deb10u5_armhf.deb ...
Dépaquetage de mutt (1.10.1-2.1+deb10u5) ...
Paramétrage de libtokyocabinet9:armhf (1.4.48-12) ...
Paramétrage de libsasl2-modules:armhf (2.1.27+dfsg-1+deb10u1) ...
Paramétrage de libgpgme11:armhf (1.12.0-6) ...
Paramétrage de mutt (1.10.1-2.1+deb10u5) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour mime-support (3.62) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.28-10+rpi1) ...
pi@raspberrypi:~ $

Test de lecture du courrier

[picture]

Mutt en fonctionnement

Nous voyons le premier courrier qui indique que exim4 n’a pas pu envoyer un message à l’extérieur (j’avais mis mon adresse courriel normale dans la ligne de commande), et le second qui est bien le rapport de logwatch.

[picture]

Mutt en fonctionnement

Installation d’un serveur de courrier basique

Debian installe par défaut exim4. Nous allons le remplacer par postfix (que nous étendrons par la suite pour obtenir un serveur de mail complet)

Il faut penser à ouvrir les ports 25 en IPV4 et IPV6 avec firewalld.

Installation

pi@raspberrypi:~ $ sudo apt install postfix
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
libgnutls-dane0 libunbound8
Veuillez utiliser « sudo apt autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés :
ssl-cert
Paquets suggérés :
procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre postfix-lmdb postfix-sqlite sasl2-bin | dovecot-common postfix-cdb ufw
postfix-doc openssl-blacklist
Les paquets suivants seront ENLEVÉS :
exim4-base exim4-config exim4-daemon-light
Les NOUVEAUX paquets suivants seront installés :
postfix ssl-cert
0 mis à jour, 2 nouvellement installés, 3 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 1 423 ko dans les archives.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
Réception de :1 http://ftp.igh.cnrs.fr/pub/os/linux/raspbian/raspbian buster/main armhf postfix armhf 3.4.14-0+deb10u1 [1 402 kB]
Réception de :2 http://mirrors.ircam.fr/pub/raspbian/raspbian buster/main armhf ssl-cert all 1.0.39 [20,8 kB]
1 423 ko réceptionnés en 3s (524 ko/s)
Préconfiguration des paquets...
dpkg: exim4-daemon-light : problème de dépendance, mais suppression comme demandé :
logwatch dépend de default-mta | mail-transport-agent ; cependant :
Le paquet default-mta n'est pas installé.
Le paquet exim4-daemon-light qui fournit default-mta doit être supprimé.
Le paquet mail-transport-agent n'est pas installé.
Le paquet exim4-daemon-light qui fournit mail-transport-agent doit être supprimé.
logwatch dépend de default-mta | mail-transport-agent ; cependant :
Le paquet default-mta n'est pas installé.
Le paquet exim4-daemon-light qui fournit default-mta doit être supprimé.
Le paquet mail-transport-agent n'est pas installé.
Le paquet exim4-daemon-light qui fournit mail-transport-agent doit être supprimé.

(Lecture de la base de données... 46982 fichiers et répertoires déjà installés.)
Suppression de exim4-daemon-light (4.92-8+deb10u4) ...
dpkg: exim4-config : problème de dépendance, mais suppression comme demandé :
exim4-base dépend de exim4-config (>= 4.82) | exim4-config-2 ; cependant :
Le paquet exim4-config doit être supprimé.
Le paquet exim4-config-2 n'est pas installé.
Le paquet exim4-config qui fournit exim4-config-2 doit être supprimé.
exim4-base dépend de exim4-config (>= 4.82) | exim4-config-2 ; cependant :
Le paquet exim4-config doit être supprimé.
Le paquet exim4-config-2 n'est pas installé.
Le paquet exim4-config qui fournit exim4-config-2 doit être supprimé.

Suppression de exim4-config (4.92-8+deb10u4) ...
Sélection du paquet postfix précédemment désélectionné.
(Lecture de la base de données... 46922 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../postfix_3.4.14-0+deb10u1_armhf.deb ...
Dépaquetage de postfix (3.4.14-0+deb10u1) ...
(Lecture de la base de données... 47112 fichiers et répertoires déjà installés.)
Suppression de exim4-base (4.92-8+deb10u4) ...
Sélection du paquet ssl-cert précédemment désélectionné.
(Lecture de la base de données... 47038 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../ssl-cert_1.0.39_all.deb ...
Dépaquetage de ssl-cert (1.0.39) ...
Paramétrage de ssl-cert (1.0.39) ...
Paramétrage de postfix (3.4.14-0+deb10u1) ...
Ajout du groupe « postfix » (GID 118)...
Fait.
Ajout de l'utilisateur système « postfix » (UID 112) ...
Ajout du nouvel utilisateur « postfix » (UID 112) avec pour groupe d'appartenance « postfix » ...
Le répertoire personnel « /var/spool/postfix » n'a pas été créé.
Creating /etc/postfix/dynamicmaps.cf
Ajout du groupe « postdrop » (GID 119)...
Fait.
setting myhostname: raspberrypi
setting alias maps
setting alias database
changing /etc/mailname to yojik.net
setting myorigin
setting destinations: $myhostname, yojik.net, raspberrypi, localhost.localdomain, localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
setting inet_protocols: all
WARNING: /etc/aliases exists, but does not have a root alias.

Postfix (main.cf) is now set up with a default configuration.  If you need to
make changes, edit /etc/postfix/main.cf (and others) as needed.  To view
Postfix configuration values, see postconf(1).

After modifying main.cf, be sure to run 'service postfix reload'.

Running newaliases
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /lib/systemd/system/postfix.service.
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u6+rpi1) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour rsyslog (8.1901.0-1) ...
pi@raspberrypi:~ $

Suppression complète de exim4

On supprime complètement exim4, fichiers de configuration inclus.

pi@raspberrypi:~ $ sudo apt remove --purge exim4*
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Note : sélection de exim4-base pour l'expression rationnelle « exim4* »
Note : sélection de exim4-config-2 pour l'expression rationnelle « exim4* »
Note : sélection de exim4-doc-info pour l'expression rationnelle « exim4* »
Note : sélection de exim4-daemon-light pour l'expression rationnelle « exim4* »
Note : sélection de exim4-daemon-heavy pour l'expression rationnelle « exim4* »
Note : sélection de exim4-daemon-custom pour l'expression rationnelle « exim4* »
Note : sélection de exim4-config pour l'expression rationnelle « exim4* »
Note : sélection de exim4-doc-html pour l'expression rationnelle « exim4* »
Note : sélection de exim4-localscanapi-2.0 pour l'expression rationnelle « exim4* »
Note : sélection de exim4-dev pour l'expression rationnelle « exim4* »
Note : sélection de exim4 pour l'expression rationnelle « exim4* »
Le paquet « exim4-daemon-custom » n'est pas installé, et ne peut donc être supprimé
Note : sélection de « exim4-config » au lieu de « exim4-config-2 »
Le paquet « exim4 » n'est pas installé, et ne peut donc être supprimé
Le paquet « exim4-daemon-heavy » n'est pas installé, et ne peut donc être supprimé
Le paquet « exim4-dev » n'est pas installé, et ne peut donc être supprimé
Le paquet « exim4-doc-html » n'est pas installé, et ne peut donc être supprimé
Le paquet « exim4-doc-info » n'est pas installé, et ne peut donc être supprimé
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
libgnutls-dane0 libunbound8
Veuillez utiliser « sudo apt autoremove » pour les supprimer.
Les paquets suivants seront ENLEVÉS :
exim4-base* exim4-config* exim4-daemon-light*
0 mis à jour, 0 nouvellement installés, 3 à enlever et 0 non mis à jour.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
(Lecture de la base de données... 47047 fichiers et répertoires déjà installés.)
Purge des fichiers de configuration de exim4-base (4.92-8+deb10u4) ...
Purge des fichiers de configuration de exim4-config (4.92-8+deb10u4) ...
dpkg-statoverride: avertissement: pas de dérogation (« override ») présente
Purge des fichiers de configuration de exim4-daemon-light (4.92-8+deb10u4) ...
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u6+rpi1) ...
pi@raspberrypi:~ $

Ouverture des ports 25

Ajout du protocole smtp à notre zone.

Liste des services disponibles

pi@piras:~ $ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula
bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc
ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6
dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync
elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps
freeipa-replication freeipa-trust ftp ganglia-client ganglia-master
git gre high-availability http https imap imaps ipp ipp-client
ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin
kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network
llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls
ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn
ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy
pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp
pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd
rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp
smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh
steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls
telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm
vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client
xmpp-local xmpp-server zabbix-agent zabbix-server
pi@piras:~ $

Le protocole qui nous intéresse est : smtp

Ajout du service smtp

pi@piras:~ $ sudo firewall-cmd --permanent --zone=public --add-service=smtp
success
pi@piras:~ $

Il faut recharger firewalld pour que ce soit pris en compte.

pi@piras:~ $ sudo systemctl restart firewalld
pi@piras:~ $

Vérification

pi@piras:~ $ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client smtp ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

pi@piras:~ $

Installation des utilitaire courriers

pi@raspberrypi:~ $ sudo apt install mailutils
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
mailutils est déjà la version la plus récente (1:3.5-4).
mailutils passé en « installé manuellement ».
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
libgnutls-dane0 libunbound8
Veuillez utiliser « sudo apt autoremove » pour les supprimer.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
pi@raspberrypi:~ $

Ils étaient déjà installés.

Test d’envoi de courriers entre comptes internes.

pi-> root

Les commandes suivantes permettent de :

envoyer un message à root(Essai 1)

  pi@raspberrypi:~ $ mail root
  Cc:
  Subject: Essai1
  Essai 1
  .
  pi@raspberrypi:~ $

passer root

  pi@raspberrypi:~ $ sudo /bin/bash
  root@raspberrypi:/home/pi#

lancer mutt

  root@raspberrypi:/home/pi# mutt
  1 gardé(s), 0 effacé(s).
  root@raspberrypi:/home/pi#

[picture]

image de mutt

root -> pi

  root@raspberrypi:/home/pi# mail pi
  Cc:
  Subject: Essai 2
  .
  root@raspberrypi:/home/pi# exit
  Vous avez du nouveau courrier dans /var/mail/pi
  pi@raspberrypi:~ $ mutt
  3 gardé(s), 0 effacé(s).
  pi@raspberrypi:~ $

Nous avions 2 messages avant: le nouveau message est bien arrivé !

Configuration de postfix

Il nous faut configurer postfix pour permettre l’envoi de courriers à l’extérieur et en recevoir de l’extérieur.

Pour cela, il nous faut modifier le fichier /etc/postfix/main.cf

Modifiez la ligne mydestination pour qu’elle ressemble à ce qui suit :

mydestination = $myhostname, yojik.net, atom.yojik.net, localhost.yojik.net, localhost

et relancez postfix avec la commande suivante :

sudo service postfix restart

Courriers sortants

Envoi d’un message sur mon compte de messagerie gmail (oui, un envoi sur mon compte normal ne fonctionne pas dû à sa configuration):

pi@piras:~$ echo "Et voilà un petit message" | mail -s "test du courrier sortant" ericounet26200@gmail.com

Le message est bien reçu et dans les courriers indésirables, bien entendu (pas de dkim, spf, dnnssec, etc.)

Courriers entrants

Envoi d’un message à partir de mon adresse de courrier normale :

Message bien reçu (après mise à jour de mon serveur DNS).

[picture]

Mutt

Amélioration de la gestion du courrier

Nous allons transférer les mails destinés à root vers l’utilisateur pi. Ainsi que d’autres adresses de courrier standards. Pour cela, nous allons modifier le fichier /etc/aliases, le compiler pour être digeste par postfix et relancer postfix.

Ce fichier sert à rediriger toutes les adresses émail comme abuse, webmaster, root vers un utilisateur administrateur de la machine, root puis vers moi ericadmin.

# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: pi

Il faut lancer la commande newaliases pour générer le fichier.db utile à Postfix et on demande à Postfix de recharger ses fichiers.

pi@piras:~ $ sudo newaliases
pi@piras:~ $

On relance postfix :

pi@piras:~ $ sudo systemctl restart postfix
pi@piras:~ $

Et on teste (envoi d’un courrier à root@piras.yojik.net)

[picture]

Transfert

Et voilà, notre serveur de courrier est fonctionnel.

Protection par Fail2ban

Nous devons ajouter la surveillance du mail par fail2ban.

Editons le fichier /etc/fail2ban/jail.d/defaults-debian.conf pour y ajouter la surveillance de postfix (port smtp : 25.)

Nous prenons l’exemple fourni dans /etc/fail2ban/jail.conf et ne gardons que le port 25.

Voilà la partie modifiée à ajouter :

[postfix]
mode    = more
port    = smtp
logpath = %(postfix_log)s
backend = %(postfix_backend)s

Relançons le service pour que nos modifications soient prises en compte:

pi@piras:~ $ sudo systemctl reload fail2ban
pi@piras:~ $

Exemple d’utilisation de notre tout nouveau Raspi

Nous allons installer un serveur Web, apache.

Ce n’est qu’un exemple : choisissez le logiciel que vous voulez, mais gardez à l’esprit la sécurisation.

Installation du programme

Installation

pi@piras:~ $ sudo apt install apache2
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 :
apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libbrotli1 liblua5.2-0
Paquets suggérés :
apache2-doc apache2-suexec-pristine | apache2-suexec-custom
Les NOUVEAUX paquets suivants seront installés :
apache2 apache2-bin apache2-data apache2-utils libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libbrotli1
liblua5.2-0
0 mis à jour, 10 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 2 309 ko dans les archives.
Après cette opération, 7 253 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
...
Enabling site 000-default.
Created symlink /etc/systemd/system/multi-user.target.wants/apache2.service → /lib/systemd/system/apache2.service.
Created symlink /etc/systemd/system/multi-user.target.wants/apache-htcacheclean.service → /lib/systemd/system/apache-htcacheclean.
service.
Traitement des actions différées (« triggers ») pour systemd (241-7~deb10u6+rpi1) ...
Traitement des actions différées (« triggers ») pour man-db (2.8.5-2) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.28-10+rpi1) ...
pi@piras:~ $

Ouverture des ports

Il nous faut ajouter les services http et https.

Règles en cours

 pi@piras:~ $ sudo firewall-cmd --state
 running
 pi@piras:~ $ sudo firewall-cmd --get-default-zone
 public
 pi@piras:~ $ sudo firewall-cmd --get-active-zones
 public
 interfaces: eth0
 pi@piras:~ $ sudo firewall-cmd --list-all
 public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client smtp ssh
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

Ajout des services

 pi@piras:~ $ sudo firewall-cmd --permanent --zone=public --add-service={http,https}
 success
 pi@piras:~ $

Test de nos services actifs

J’ai relancé le raspi car j’avais des erreurs de zones.

Après redémarrage, tout est bon :

 pi@piras:~ $ sudo firewall-cmd --list-all
 public (active)
 target: default
 icmp-block-inversion: no
 interfaces: eth0
 sources:
 services: dhcpv6-client http https smtp ssh
 ports:
 protocols:
 masquerade: no
 forward-ports:
 source-ports:
 icmp-blocks:
 rich rules:

 pi@piras:~ $

Nos services http et https ont bien été pris en compte.

Test

Nous allons faire un test de connexion :

[picture]

Page d’accueil de Debian

Tout fonctionne comme il faut.

Création de la page d’accueil

La page d’accueil

Nous allons créer un petit fichier .html pour personnaliser notre page d’acceuil. Le fichier s’appellera index.html et est situé dans /var/www/html/.

pi@piras:~ $ cd /var/www/html/
pi@piras:/var/www/html $ ls
index.html
pi@piras:/var/www/html $

Avec votre éditeur favori, supprimez le fichier :

pi@piras:/var/www/html $ sudo rm index.html
pi@piras:/var/www/html $

et créez un nouveau fichier dont le contenu est le suivant :

<!DOCTYPE html>
<html>
    <head>
        <title>Page d'accueil du Piras</title>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>Page d'acceuil du Piras</h1>
        <p>Vous voilà sur la page principale de notre tout nouveau serveur Web.</p>
        <p>Merci de votre visite!</p>
    </body>
</html>

pi@piras:/var/www/html $ sudo vim index.html
pi@piras:/var/www/html $

Changez le propriétaire du fichier :

pi@piras:/var/www/html $ sudo chown www-data: index.html
pi@piras:/var/www/html $

Création du virtualhost correspondant

pi@piras:/etc/apache2/sites-available $ cat piras.conf
<VirtualHost *:80>

    ServerName piras.yojik.net
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
pi@piras:/etc/apache2/sites-available $

On désactive les anciens sites par défaut, et on active le nouveau :

pi@piras:/etc/apache2/sites-available $ sudo a2dissite default-ssl
Site default-ssl disabled.
To activate the new configuration, you need to run:
systemctl reload apache2
pi@piras:/etc/apache2/sites-available $ sudo a2dissite 000-default
Site 000-default disabled.
To activate the new configuration, you need to run:
systemctl reload apache2
pi@piras:/etc/apache2/sites-available $

pi@piras:/etc/apache2/sites-available $ sudo a2ensite piras
Enabling site piras.
To activate the new configuration, you need to run:
systemctl reload apache2
pi@piras:/etc/apache2/sites-available $

On recharge apache2 pour qu’il prenne en compte nos modifications :

pi@piras:/etc/apache2/sites-available $ sudo systemctl reload apache2
pi@piras:/etc/apache2/sites-available $

Test de notre page d’accueil

[picture]

Page d’accueil du Piras

Et voilà! :D

Sécurisation de notre serveur

État des lieux

Rendez-vous sur la page suivante : Test Mozilla. Nos résultats ne sont pas terribles …

[picture]

Résultat 1

[picture]

Résultat 2

[picture]

Résultat 3

Nous allons suivre les recommandations de la fondation Mozilla en ce qui concerne les algorithmes utilisés pour le chiffrement.

Page de configuration d’un serveur Apache par la fondation Mozilla : Configurateur

Nous alons donc éditer notre fichier piras.conf situé dans /etc/apache2/sites-available/ ainsi que le fichier général de configuration d’apache, situé dans pi@piras:/etc/apache2, apache2.conf :

Sauvegarde des fichiers existants

pi@piras:/etc/apache2 $ sudo cp apache2.conf apache2.conf.orig pi@piras:/etc/apache2 $

Création de certificats let’encrypt

Il existe plusieurs clients letsencrypt pour la gestion des certificats. Nous utiliserons certbot, le client officiel de letsencrypt.

 pi@piras:~ $ sudo apt install certbot python-certbot-apache
 ...
 pi@piras:~ $

Nous stoppons le service apache

 pi@piras:~ $ sudo systemctl stop apache2
 pi@piras:~ $

Lançons certbot

 pi@piras:~ $ sudo certbot
 Saving debug log to /var/log/letsencrypt/letsencrypt.log
 Plugins selected: Authenticator apache, Installer apache
 Enter email address (used for urgent renewal and security notices) (Enter 'c' to
 cancel): eric@yojik.eu

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Please read the Terms of Service at
 https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
 agree in order to register with the ACME server at
 https://acme-v02.api.letsencrypt.org/directory
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 (A)gree/(C)ancel: A

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Would you be willing to share your email address with the Electronic Frontier
 Foundation, a founding partner of the Let's Encrypt project and the non-profit
 organization that develops Certbot? We'd like to send you email about our work
 encrypting the web, EFF news, campaigns, and ways to support digital freedom.
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 (Y)es/(N)o: Y

 Which names would you like to activate HTTPS for?
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 1: piras.yojik.net
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Select the appropriate numbers separated by commas and/or spaces, or leave input
 blank to select all options shown (Enter 'c' to cancel): 1
 Obtaining a new certificate
 Performing the following challenges:
 http-01 challenge for piras.yojik.net
 Waiting for verification...
 Cleaning up challenges
 Created an SSL vhost at /etc/apache2/sites-available/piras-le-ssl.conf
 Deploying Certificate to VirtualHost /etc/apache2/sites-available/piras-le-ssl.conf
 Enabling available site: /etc/apache2/sites-available/piras-le-ssl.conf

 Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 1: No redirect - Make no further changes to the webserver configuration.
 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
 new sites, or if you're confident your site works on HTTPS. You can undo this
 change by editing your web server's configuration.
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
 Redirecting vhost in /etc/apache2/sites-enabled/piras.conf to ssl vhost in /etc/apache2/sites-available/piras-le-ssl.conf

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Congratulations! You have successfully enabled https://piras.yojik.net

 You should test your configuration at:
 https://www.ssllabs.com/ssltest/analyze.html?d=piras.yojik.net
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
 /etc/letsencrypt/live/piras.yojik.net/fullchain.pem
 Your key file has been saved at:
 /etc/letsencrypt/live/piras.yojik.net/privkey.pem
 Your cert will expire on 2021-06-05. To obtain a new or tweaked
 version of this certificate in the future, simply run certbot again
 with the "certonly" option. To non-interactively renew *all* of
 your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
 configuration directory at /etc/letsencrypt. You should make a
 secure backup of this folder now. This configuration directory will
 also contain certificates and private keys obtained by Certbot so
 making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

 Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 Donating to EFF:                    https://eff.org/donate-le

 pi@piras:~ $

Relançons apache

 pi@piras:~ $ sudo systemctl start apache2
 pi@piras:~ $

Premier test

[picture]

Test avec SSL

C’est bon.

Sécurisation du serveur apache

Strict-Transport-Security

Ajouter la ligne suivante à piras.conf :

  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

Content-Security-Policy

Ajouter la ligne suivante à piras.conf :

  Header set Content-Security-Policy "default-src 'self';"

X-Content-Type-Options

Ajouter la ligne suivante à piras.conf :

  <IfModule mod_headers.c>
      Header set X-Content-Type-Options "nosniff"
  </IfModule>

Il faut activer aussi le module headers (déjà activé chez moi) :

  pi@piras:~ $ sudo a2enmod headers
  Module headers already enabled
  pi@piras:~ $

X-Frame-Options

Ajouter la ligne suivante à piras.conf :

  <IfModule mod_headers.c>
      Header set X-Content-Type-Options "nosniff"
  </IfModule>

X-XSS-Protection

Ajouter la ligne suivante à piras.conf :

  Header set X-Frame-Options: "SAMEORIGIN"

Voilà le contenu du fichier après modifications :

 pi@piras:~ $ cat /etc/apache2/sites-available/piras-le-ssl.conf

 <IfModule mod_ssl.c>
 <VirtualHost *:443>
     Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
     Header set Content-Security-Policy "default-src 'self';"

     <IfModule mod_headers.c>
             Header set X-Content-Type-Options "nosniff"
     </IfModule>

     Header set X-Frame-Options: "SAMEORIGIN"

     ServerName piras.yojik.net
     ServerAdmin webmaster@localhost
     DocumentRoot /var/www/html

     ErrorLog ${APACHE_LOG_DIR}/error.log
         CustomLog ${APACHE_LOG_DIR}/access.log combined

 SSLCertificateFile /etc/letsencrypt/live/piras.yojik.net/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/piras.yojik.net/privkey.pem
 Include /etc/letsencrypt/options-ssl-apache.conf
 </VirtualHost>
 </IfModule>

 pi@piras:~ $

Test de notre nouvelle configuration

Cette fois-ci, nous obtenons la note maximale A+ :

[picture]

Test avec SSL

[picture]

Test avec SSL

[picture]

Test avec SSL

Nous sommes passés d’une note F à A+!

Petites améliorations supplémentaires

cacher les données du serveur

Cela se configure dans le fichier /etc/apache2/conf-available/security.conf

J’ai modifié les lignes suivantes :

  ServerSignature         Off
  ServerTokens            Prod

Sauvegarde du fichier et relance du serveur apache.

[picture]

Avant

[picture]

Après

On peut constater que notre serveur ne divulgue plus d’informations sur son type, ni sur l’OS utilisé.

le parcours des répertoires

Nous allons interdire le parcours des répertoires/sous-répertoires, de telle façon que le visiteur ne puisse plus voir les fichiers/répertoires.

Procédure de test :

Nous allons créer un répertoire test avec 2 fichiers (vides) dans l’arboresence de notre site Web.

  pi@piras:/etc/apache2/conf-available $ cd /var/www/html/
  pi@piras:/var/www/html $ sudo mkdir test
  pi@piras:/var/www/html $ cd test
  pi@piras:/var/www/html/test $ sudo touch fichier1 fichier2
  pi@piras:/var/www/html/test $

Le résultat est le suivant :

[picture]

Avant

Retournons dans notre fichier précédent et modifions-le pour avoir ceci :

  <Directory /var/www/html>
  #   AllowOverride None
  #   Require all denied
      Options None
  </Directory>

Relançons apache et voyons le résultat :

[picture]

Après

Le visiteur n’a plus accès au listage des répertoires.

protection contre les informations données par l’entête (header) Etag

Il nous faut rajouter la directive suivante au fichier de configuration :

  FileEtag None

limitation des requêtes possibles :

les méthodes supportées sont nombreuses et peuvent être configurées site par site. Mais en général, pour un site statique comme celui-là, seules les méthodes GET, Head, et POST sont nécessaires.

Modification du fichier précédent

  <Directory /var/www/html>
  #   AllowOverride None
  #   Require all denied
          Options None
          <LimitExcept GET POST OPTIONS>
                  Require all denied
          </LimitExcept>
  </Directory>S

interdire la requête Trace

C’est déjà mis en place par défaut dans la configuration Debian.

Voilà pour quelques améliorations de la sécurité de notre serveur Web.

Annexe

Au fur et à mesure de mes pérégrinations autour du Raspi, j’ai découvert une façon plus rapide pré-configurer l’installation.

Une fois l’étape de copie de l’image effectuée, montez votre carte SD sur votre machine de travail.

Il y aura 2 partitions :

rootfs

boot

Dans la partition boot, créez un fichier ssh vide avec la commande suivante :

touch ssh

Ensuite, déplacez-vous dans la partition rootfs. Vous y trouverez toute l’arborescence de votre future installation. Allez dans le répertoire etc. Ici, vous allez pouvoir configurer :

le hostname

Comme déjà indiqué, le hostname sur Debian est partagé entre 2 fichiers :

/etc/hostname Il ne contient que le petit nom de votre machine, piras dans mon cas.

/etc/hosts Il contient la configuration complète du hostname. En voici le contenu modifié :

  pi@piras:~$ cat /etc/hosts
  127.0.0.1    localhost

  192.168.111.170  piras.yojik.net piras

  # The following lines are desirable for IPv6 capable hosts
  ::1     localhost ip6-localhost ip6-loopback
  ff02::1 ip6-allnodes
  ff02::2 ip6-allrouters
  pi@piras:~$

170 est l’adresse définitive de mon serveur (IPV4)

le réseau

Pour attribuer une adresse IPV4 fixe à notre raspi, dès le premier lancement, nous pouvons éditer le fichier /etc/dhcpcd.conf avant de démonter notre carte SD.

Voilà la partie à modifier :

  # Example static IP configuration:
  interface eth0
  static ip_address=192.168.111.170/24
  static ip6_address=2a01:e0a:d0:3c20::170/64
  static routers=192.168.111.254
  #static domain_name_servers=192.168.1.1

Nous gardons la partie domain_name_servers commentée en attendant d’avoir configuré le resolveur DNS ** knot-resolver**.

Une fois cela fait, nous pouvons démonter notre carte SD et l’insérer dans le raspi. Le réseau et le hostname seront reconfigurés. Ce sera également plus simple car cela nous évitera de devoir modifier le fichier /etc/hosts de notre machine de travail, ainsi que le fichier .ssh/config dans le répertoire home de notre machine de travail.