[TUTO] Sécuriser son SSH pour un accès depuis l'extérieur

Vous venez de déballer votre Raspberry Pi et vous vous posez des questions ? C'est ici que ça se passe !

Modérateur : Francois

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

[TUTO] Sécuriser son SSH pour un accès depuis l'extérieur

Message par maxty01 » dim. 23 nov. 2014 16:27

Bonjour à tous,

Admin/Modo : J'ai placé cet article ici car c'est sans doute la section la plus visitée par les débutants, mais également car je n'ai pas vu de section concernant la sécurité de nos RPI.

Je me permets de faire une piqûre de rappel à tous ceux qui souhaitent accéder à leur RPI depuis l’extérieur de leur réseau.
Je ne parlerai pas ici des différentes possibilités pour y accéder depuis le web.
Je me concentrerai principalement sur la sécurité du SSH et les bonnes pratiques s'y référant.

Avec cet article, mon but :
n'est pas de vous effrayer avec mes propos
n'est pas de partir à la chasse aux sorcières
n'est pas de chercher à stigmatiser les systèmes trop peu voir non sécurisé
n'est pas de polémiquer sur la sécurité informatique.
est de vous conscientiser sur l'importance de la sécurité informatique
est de vous apporter des "best pratice" pour diminuer le risque d'intrusion sur votre RPI via SSH


Un utilisateur avancé aura sans doute déjà remarqué que, si vous ouvrez votre port 22 (SSH) vers l'extérieur, il ne faut pas très longtemps pour que ce dernier soit attaqué (brute force, dictionnaire et autres Script-kiddies).

Vous pouvez facilement l'observer dans le fichier de log /var/log/auth.log de votre Debian ou Raspbian.


Voici certaines des bonnes pratiques actuelles (mais pas obligatoire) pour sécuriser votre SSH :
  1. Interdire à root de se connecter en SSH. Dans le fichier /etc/ssh/sshd_config, mettre l'option "PermitRootLogin yes" à "no".

    Code : Tout sélectionner

    # Authentication:
    LoginGraceTime 120
    PermitRootLogin no
    StrictModes yes
    Le premier utilisateur testé durant une attaque en SSH, c'est root, viens ensuite les utilisateurs admin, a, test, ... (sur base de mes propres statistiques).
    Lui interdire l'accès en SSH réduit considérablement le risque d'intrusion.
    Cette option n'interdit pas de se connecter en root avec son password en local.

    Si vous, ou vos applications, avez besoin d’accéder à votre RPI en root en SSH, utilisez des clés SSH public/privé pour root en mettant dans le fichier /etc/ssh/sshd_config, l'option "PermitRootLogin yes" à "without-password".

    Code : Tout sélectionner

    # Authentication:
    LoginGraceTime 120
    PermitRootLogin without-password
    StrictModes yes
    Cette option interdit à root de se connecter en SSH avec un mot de passe, mais autorise l'accès grâce aux "clés SSH" (voir le point 2).
  2. Essayer, dans la mesure du possible, d'utiliser des clés public/privée pour vous connecter en SSH avec tous vos utilisateurs.

    L'utilisation de clés à plusieurs effets positifs :
    1. plus besoin de taper son password
    2. possibilité d'automatiser des actions tel que des backup
      par exemple : rsync
    3. exécution de commande à distance:
      par exemple la mise à jour : "aptitude update && aptitude upgrade"
    L'utilisation de clés à également plusieurs défauts:
    1. oubli du son password
      Nous voilà obligé de forcer notre propre système.
    2. possibilité de se tromper de serveur/RPI
      Très ennuyeux si on arrête un serveur en production en pleine journée.
    3. perte des clés SSH
      Suite à un crash disque par exemple.
      Nous voilà obligez de nous remémorer notre password, sinon retour au point A.
    4. vol des clés SSH
      Le plus ennuyeux, car presque invisible :
      nous somme toujours capable de nous connecter sur notre serveur SSH, mais quelqu'un d'autre aussi.
      Heureusement, il y a des solutions pour palier à ce risque.
    En effet, il est possible de verrouiller votre clé SSH avec un password, en cas de vol de vos clés, ces dernières ne peuvent être utilisées sans votre password (voir le point 5).
    Voici un tuto très succinct pour créer vos clé SSH.
    Voici un tuto plus complet pour les utilisateurs confirmés.
    Pour transférer facilement vos clé sur votre serveur/RPI, il existe la commande ssh-copy-id
  3. Installer fail2ban.

    Ce soft banni une adresse IP pendant 10 minutes après 3 tentatives erronées.
    Ce soft est utilisable sur le SSH par défaut mais aussi sur l'HTTP (et un htpwd) en configurant le fail2ban.
    Ce soft réduit considérablement le risque d'intrusion en SSH, mais le ramène pas à ZÉRO.

    Pour vous donner un exemple, avec fail2ban installé sur un de mes serveurs, j'ai eu un total de 12'442 tentatives (+/- 34 tentatives par jour) en SSH en 2013.
    Mais sans se soft, vous pouvez avoir jusqu'à 600 tentatives par jour (sur base de mes propres statistiques), voir plus, ce qui ferai un total de 219'000 tentatives en 1 an.

    Il est peu gourmand et très efficace, il est pré-configuré pour SSH et fonctionne avec iptables (site en anglais).
  4. Changer le password de l'utilisateur pi de votre RPI.

    Ce dernier étant déjà inclus dans les différents dictionnaires et script-kiddies disponibles sur le web, le risque que votre RPI/réseau soit "compromis" est de proche 100%.
  5. Utiliser un password complexe, avec des lettres minuscules, majuscules, des chiffres, des caractères spéciaux et de longueur suffisante.

    Inventons et analysons un nouveau password pour l'occasion avec uniquement des minuscules (26 possibilités), majuscules (26 possibilités), des chiffres (10 possibilités) et un longueur de 10 caractères : r45Pb3Ryp1.
    Ce dernier aura une probabilité d'être découvert en brute force de 1 sur ((26*26*10)^10) = 1,99281489×10³⁸ (pour les matheux). Autrement dis : Bonne chance les coco.
    Ce nouveau password n'étant probablement pas dans un dictionnaire disponible sur le web, le risque d'une intrusion sur votre RPI/réseaux est faible.

    Analysons maintenant le password par défaut de l'utilisateur Pi : raspberry
    Ce password par défaut aura une probabilité d'être découvert en brute force de 1 sur ((26)^9) = 5,429503679×10¹² (pour les matheux). Autrement dis : Bonne chance les coco.
    Cependant, n'oublions pas que ce password est déjà inclus dans les différents dictionnaires et script-kiddies disponibles sur le web, ce qui augmente le risque que votre RPI/réseau soit "compromis".
  6. Changer le port du SSH.

    Il est possible de changer le port du serveur SSH du RPI en modifiant dans le fichier /etc/ssh/sshd_config, l’option "Port 22" avec un port compris entre 1024 et 65535.
    Ou en configurant son modem/routeur/firewall à rediriger un port externe compris entre 1024 et 65535 sur le port 22 du serveur/RPI.
    Cependant, il faut savoir que d'autres ports se rapprochant du port 22, tel que le 2022 ou encore le 2222, sont aussi attaqués en SSH, car ils sont fortement utilisé sur le net.
Il n'est pas utile d'appliquer l'entièreté des best practice présentées ci-dessus dans le cadre d'un projet personnel, il suffit de choisir celle qui est la plus appropriée à notre projet.
Pour vous donner un exemple, dans ma configuration : j'ai interdis l'accès à root sauf avec une clé SSH, j'utilise un password complexe (c'est le minimum), mais mes clés SSH personnelles n'ont pas de password (sauf au travail) et je n'ai pas changé le port par défaut de SSH, celui-ci est accessible depuis l'extérieur de mon réseau sur le port 22.

Il est, par contre, recommandé d'en appliquer un maximum sur un serveur/RPI hébergeant des données confidentielles/personnelles ou sur un serveur/RPI considéré comme critique/vitale.

Voilà, j'espère que cet article vous aura aidé à sécuriser votre serveur SSH.

Si vous avez des questions, n'hésitez pas.

Je vous souhaites à toutes et à tous une bonne journée.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par domi » dim. 23 nov. 2014 20:05

Bonsoir,

Et merci pour ce rappel qui sera certainement très utile à plusieurs visiteurs qui débutent avec le Raspberry, et principalement en Linux avec une machine ayant une visibilité sur le Net.

Je met ce message dans la section "tutoriels"

Manque juste une petite info concernant le port SSH (22 par défaut) vite soumis aux attaques de Brute Force, donc soit changer le port du SSH pour un autre, soit changer le port d'entrée Internet avec une redirection vers le 22 du RPi depuis le routeur.

Cdt,
Domi
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

Avatar du membre
vague nerd
Modérateur
Messages : 1473
Enregistré le : mar. 14 oct. 2014 11:42
Localisation : France !

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par vague nerd » dim. 23 nov. 2014 20:52

Si, si domi ! -1 !
Ou en configurant son modem/routeur/firewall à rediriger un port externe compris entre 1024 et 65535 sur le port 22 du serveur/RPI.
:D
Bonsoir aussi, sinon !
Cordialement,

Vague Nerd

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par maxty01 » dim. 23 nov. 2014 22:48

Bonsoir à vous Deux,

Merci pour l’accueil et merci pour le post-it, je n'ai pas osé le demander.

Comme le signale vague nerd, c'est bien expliqué dans le point n°6 :
maxty01 a écrit :Changer le port du SSH.

Il est possible de changer le port du serveur SSH du RPI en modifiant dans le fichier /etc/ssh/sshd_config, l’option "Port 22" avec un port compris entre 1024 et 65535.
Ou en configurant son modem/routeur/firewall à rediriger un port externe compris entre 1024 et 65535 sur le port 22 du serveur/RPI.
Cependant, il faut savoir que d'autres ports se rapprochant du port 22, tel que le 2022 ou encore le 2222, sont aussi attaqués en SSH, car ils sont fortement utilisé sur le net.
Si j'ai d'autres informations au sujet de SSH, je n’hésiterai pas à le compléter.
J'ai plein d'autres informations à transmettre Debian/Raspbian et je me ferai un plaisir de les retranscrire sur ce forum.

Je vous souhaites à toutes et à tous une très bonne lecture,
Ainsi qu'une [bonne soirée - bonne nuit - bonne journée]*,
Et surtout un bon amusement.

Si vous avez des questions, n'hésitez pas.

*Biffer les mentions inutiles.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par maxty01 » mar. 25 nov. 2014 23:25

Bonsoir à tous,

Petit ajout concernant le sujet :

La création et l'utilisation de clés SSH, tel que présentés dans le sujet, ne sont accessibles qu'à partir d'un OS ayant en natif un client SSH (Linux, Unix et Mac OS).

Avis aux utilisateurs de Unix et Mac OS :
La commande ssh-copy-id, présentée ci-dessus, est probablement inexistante sur vos systèmes.
Il vous faudra inscrire votre clé publique sur votre serveur/RPI dans le fichier /home/pi/.ssh/authorized_keys ou dans le fichier /root/.ssh/authorized_keys pour l'utilisateur root.
Si le fichier n'existe pas encore, crée le avec la commande "touch authorized_keys", sans oublier de mettre les droits corrects sur le fichier avec un "chmod 0600 authorized_keys".

Pour les utilisateurs de Windows, il est possible d'utiliser des clés SSH avec putty, malheureusement, je n'ai pas suffisamment d'expérience à ce niveau là que pour pouvoir vous aider.
Mais je suis certain qu'une recherche sur internet vous aidera plus que moi.

Je vous souhaites à toutes et à tous une [bonne journée - bonne soirée - bonne nuit]*

*Biffer les mentions inutiles.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par domi » mer. 26 nov. 2014 06:33

maxty01 a écrit : Pour les utilisateurs de Windows, il est possible d'utiliser des clés SSH avec putty, malheureusement, je n'ai pas suffisamment d'expérience à ce niveau là que pour pouvoir vous aider.
Mais je suis certain qu'une recherche sur internet vous aidera plus que moi.
Pourquoi chercher si loin, on devrait trouver sur le forum ;-) viewtopic.php?f=63&t=43
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

EVOTk

Re: Sécuriser son SSH pour un accès depuis l'extérieur

Message par EVOTk » dim. 30 nov. 2014 13:11

Hello,
Bon a savoir pour les utilisateur de Freebox V6, il est possible d'autoriser la redirection d'un port uniquement pour une/des adresse ip externe données.

Par exemple, le connexion ssh vers mon raspberry heberger chez ma mere n'est possible que depuis l'IP fixe de chez moi. Bien sur cela n’empêche pas les "bonnes pratiques" cité au dessus mais cela apporte une sécurité non négligeable !

domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: [TUTO] Sécuriser son SSH pour un accès depuis l'extérieu

Message par domi » dim. 30 nov. 2014 16:55

@Maxty01,
Afin que ce Tuto garde son caractère, j'ai déplacé nos discussions d'organisation vers ce sujet : viewtopic.php?f=68&t=334
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: [TUTO] Sécuriser son SSH pour un accès depuis l'extérieur

Message par Artemus24 » dim. 1 oct. 2017 18:10

Salut à tous.
maxty01 a écrit :Inventons et analysons un nouveau password pour l'occasion avec uniquement des minuscules (26 possibilités), majuscules (26 possibilités), des chiffres (10 possibilités) et un longueur de 10 caractères : r45Pb3Ryp1.
Ce dernier aura une probabilité d'être découvert en brute force de 1 sur ((26*26*10)^10) = 1,99281489×10³8 (pour les matheux). Autrement dis : Bonne chance les coco.
Votre calcul est faux ! Pour 1 unique caractère, vous avez : 26 + 26 + 10 soit 62 posibilités.
Donc pour 10 caractères, c'est 62 à la puissance = 839.299.365.868.340.224.
Soit 0,839 trillions ou encore 0,839 10^18.
maxty01 a écrit :Changer le port du SSH.

Il est possible de changer le port du serveur SSH du RPI en modifiant dans le fichier /etc/ssh/sshd_config, l’option "Port 22" avec un port compris entre 1024 et 65535.
Ou en configurant son modem/routeur/firewall à rediriger un port externe compris entre 1024 et 65535 sur le port 22 du serveur/RPI.
Cependant, il faut savoir que d'autres ports se rapprochant du port 22, tel que le 2022 ou encore le 2222, sont aussi attaqués en SSH, car ils sont fortement utilisé sur le net.
Il n'y a aucun intérêt à changer le port 22 sur votre raspberry.
Par contre, pour éviter des attaques, il faut mieux changer le port 22 quand vous utilisez SSH depuis l'extérieur.
C'est dans la NAT de la box/routeur qu'il faut rediriger le port extérieur (autre que 22) servant au SSH vers celui de votre Raspberry qui peut lui, rester en 22.
maxty01 a écrit :Pour les utilisateurs de Windows, il est possible d'utiliser des clés SSH avec putty, malheureusement, je n'ai pas suffisamment d'expérience à ce niveau là que pour pouvoir vous aider.
Pour ma part, j'utilise Putty sous windows, aussi bien pour configurer mon terminal qui accède en SSH à ma raspberry, que pour faire des transfert en ligne de commande (pscp.exe).
J'utilise aussi PuttyGen pour créer la clef publique et la clef privée pour sécuriser le SSH. C'est très facile à faire.
J'ai utilisé comme paramètre : "SSH-2-RSA" et "Numbers of bits in a generated key = 4096".
Il suffit ensuite de faire un transfert du fichier "authorized_keys" de windows vers la Raspberry, en placant ce fichier dans "/home/pi/ssh" (en minuscule).
Si c'est la première fois, il faudra utiliser votre mot de passe pour vous connecter.
Ne pas oublier de modifier la sécurité de ce fichier en faisant "chmod 0400 authorized_keys".

Pour complexifier l'accès à votre raspberry en SSH, vous pouvez utiliser une adresse IPv6.
Normalement, les 16 premiers digits concerne l'identification de votre box/routeur sur internet. Elles sont donc fixes.
Par contre, vous pouvez mettre ce que vous voulez sur les 16 derniers digits.
Un digit = 1 caractère hexadécimal, soit 16 bits allant de 0 à F.
Si quelqu'un cherche à identifier l'adresse IPv6 que vous utilisez pour vous connecter en SSH, il devra tester :
16^16 = 18.446.744.073.709.551.616
Soit 18 trillions de possibilités. C'est 22 fois plus important que le mot de passe de 10 caractères ci-dessus.
Bon courage pour ceux qui veulent tenter leur chance.

@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [TUTO] Sécuriser son SSH pour un accès depuis l'extérieur

Message par maxty01 » dim. 1 oct. 2017 18:57

Artemus24 a écrit :Votre calcul est faux ! Pour 1 unique caractère, vous avez : 26 + 26 + 10 soit 62 possibilités.
Donc pour 10 caractères, c'est 62 à la puissance = 839.299.365.868.340.224.
Soit 0,839 trillions ou encore 0,839 10^18.
Bien que mon calcul soit effectivement faux, le message reste le même : Bonne chance.
Artemus24 a écrit :Il n'y a aucun intérêt à changer le port 22 sur votre raspberry.
Par contre, pour éviter des attaques, il faut mieux changer le port 22 quand vous utilisez SSH depuis l'extérieur.
C'est dans la NAT de la box/routeur qu'il faut rediriger le port extérieur (autre que 22) servant au SSH vers celui de votre Raspberry qui peut lui, rester en 22.
Je suis entièrement d'accord, mais ici le message est double :
1. « Il est possible de changer le port du serveur SSH ».
Ce n'est en aucun cas une obligation, juste une possibilité.
2. Éviter les ports 2022, 2222, 22022, 22222, ... qui sont fortement utilisés sur le net.
Ce message est en complément du votre, en incitant à choisir un port aléatoire.

Dernier point : Il est plus facile de mettre les mêmes port (src et dst) dans un DNAT pour une personne lambda..
Artemus24 a écrit :Pour ma part, j'utilise Putty sous windows, aussi bien pour configurer mon terminal qui accède en SSH à ma raspberry, que pour faire des transfert en ligne de commande (pscp.exe).
J'utilise aussi PuttyGen pour créer la clef publique et la clef privée pour sécuriser le SSH. C'est très facile à faire.
J'ai utilisé comme paramètre : "SSH-2-RSA" et "Numbers of bits in a generated key = 4096".
Il suffit ensuite de faire un transfert du fichier "authorized_keys" de windows vers la Raspberry, en placant ce fichier dans "/home/pi/ssh" (en minuscule).
Si c'est la première fois, il faudra utiliser votre mot de passe pour vous connecter.
Ne pas oublier de modifier la sécurité de ce fichier en faisant "chmod 0400 authorized_keys".
J'ajouterai que l'utilisation de pagent.exe permet de gérer les différentes clés d'un utilisateur.
Ce programme, s'installant en même temps que putty, permet également de partager la/les clé(s) à d'autres programmes tel que filezilla.
Avec pagent, filezilla pourra se connecter, en sftp, sur le RPI sans avoir besoin du password.
Artemus24 a écrit :Pour complexifier l'accès à votre raspberry en SSH, vous pouvez utiliser une adresse IPv6.
Normalement, les 16 premiers digits concerne l'identification de votre box/routeur sur internet. Elles sont donc fixes.
Par contre, vous pouvez mettre ce que vous voulez sur les 16 derniers digits.
Un digit = 1 caractère hexadécimal, soit 16 bits allant de 0 à F.
Si quelqu'un cherche à identifier l'adresse IPv6 que vous utilisez pour vous connecter en SSH, il devra tester :
16^16 = 18.446.744.073.709.551.616
Soit 18 trillions de possibilités. C'est 22 fois plus important que le mot de passe de 10 caractères ci-dessus.
Bon courage pour ceux qui veulent tenter leur chance.
Oui et Non !
L'utilisation de l'IPv6 est une bonne idée, mais malheureusement et je le déplore, l'usage de l'IPv6 est encore faible par rapport à l'IPv4.
De plus, la mémorisation d'une IPv6 est encore plus complexe qu'une IPv4, l'utilisation d'un DNS dynamique sera obligatoire.
Ensuite, les attaques en SSH ne sont pas spécifiques aux RPI, elle sont générées aléatoirement.
Les attaquants n'ont que faire que c'est un RPI qui répond en SSH, leur but est d'abord de trouver le password pour ensuite se demander ce qu'ils vont faire de la machine hackée.
Artemus24 a écrit :@+
@+
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Répondre

Retourner vers « Débutants »