Tour d'horizon sur SSH
SSH ou Secure Shell est l’outil de prédilection de tout administrateur système. Ces utilisations peuvent être très variées. L’objectif de cet article est comprendre le fonctionnement de SSH et de faire un tour d’horizon sur ce protocole.
I. Introduction
I.1. Historique
SSH ou Secure Shell est un protocole de la couche applicative (7) du modèle OSI permettant la prise de contrôle à distance, la connexion et l’échange de données entre deux machines de façon sécurisée. Celui-ci succède à son ancêtre, le protocole TELNET, pour rappel non sécurisé où les informations circulées en clair sur le réseau. C’est un des outils de prédilections pour tous les administrateurs systèmes et réseaux dignes de ce nom.
###I.1.1. Version 1
Seul la version Potato de Debian supporte cette version, les méthodes d’authentifications disponibles sont :
- RSAAuthentication : RSA identity key based user authentication
- RhostsAuthentication : .rhosts based host authentication (insecure, disabled)
- RhostsRSAAuthentication : .rhosts authentication combined with RSA host key (disabled)
- ChallengeResponseAuthentication : RSA challenge-response authentication
- PasswordAuthentication : password based authentication
###I.1.2. Version 2
Cette version est supportée par toutes les distributions Debian ayant suivies Woody, les méthodes d’authentifications disponibles sont :
- PubkeyAuthentication : public key based user authentication
- HostbasedAuthentication : .rhosts or /etc/hosts.equiv authentication combined with public key client host authentication (disabled)
- ChallengeResponseAuthentication : challenge-response authentication
- PasswordAuthentication : password based authentication
I.2. Fonctionnement
I.3. Installation
Les paquets openssh-server
pour le daemon SSH et le paquet openssh-client
initiant les connexions sur les machines serveurs font généralement partis des paquets de base installés sur les distributions Linux, UNIX et BSD. Si ce n’est pas le cas (sous Debian) lancer la commande :
root$ aptitude install ssh |
Les fichiers de configuration sont visibles dans :
ssh |
Le daemon se trouve dans :
/etc/init.d/ssh |
Le fichier de configuration standard de SSH est :
sshd_config |
Afin de tester si le serveur SSH est bien fonctionnel vous pouvez vérifier le status du daemon :
root# /etc/init.d/ssh status |
Ensuite initier une connexion en local :
root# ssh localhost |
Utilisation de la commande :
root# ssh [OPTIONS] user@hostname |
Une fois que le service fonctionne, nous allons voir de plus prêt le fichier de configuration de SSH et les façons de le sécuriser.
I.4. Sécurisation standard
Ouvrez votre fichier de configuration SSH afin de l’éditer :
root# vim /etc/ssh/sshd_config |
###I.4.1. Changer le port d’écoute
Il est très important afin d’éviter les attaques DoS (Deny of Service) ou DDoS (Distribued Deny of Service) de changer votre port d’écoute SSH, en effet certaines machines scrutent le net en scannant différents ports et en lançant des attaques si ces ports répondent. Vous devez choisir un port de préférence >1024
(ports non alloués à des protocoles). Si vous êtes sur un réseau avec un firewall un peu capricieux (bloquant différents ports), je vous conseille d’utiliser le port 443. Ce port est réservé à la couche sécurisée du protocole HTTP, soit HTTPS. Si l’administrateur réseau est vraiment pointilleux il peut laisser l’accès à 443 mais par une whitelist, en gros il n’autorise que certaines connexions sur le port 443. Si vous êtes dans ce cas là, il n’y pas grand chose à faire…
# What ports, IPs and protocols we listen for |
Dorénavant pour vous connectez il vous faudra préciser le port de SSH :
root# ssh -p 443 user@hostname |
Quoi ? Vous êtes faignant (et vous avez raison !), vous ne voulez pas spécifier le port ? Voici une solution !
Nous allons pour cela éditer le fichier ssh_config
à ne pas confondre avec sshd_config
:
root# vim /etc/ssh/ssh_config |
Placez-vous avant cette ligne :
Host * |
Et insérez la ligne suivante :
Host "ipServeur ou dnsServeur" |
###I.4.2. Interdire le login ROOT
Imaginez la catastrophe si une attaque sur SSH logant l’utilisateur ROOT réussie. L’attaquant aura l’accès complet et pourra corrompre votre machine. Il parait donc évident de supprimer la possibilité de login avec l’utilisateur ROOT.
# Authentication: |
###I.4.3. Autoriser certains utilisateurs et/ou groupes
Afin de gérer de façon plus précise les authentifications, il est possible de spécifier une liste d’utilisateurs ou de groupes ayant le droit de s’authentifier sur le serveur. C’est une whitelist. Rajouter ce paramètre n’importe où dans le fichier de configuration. Exemple pour l’utilisateur tata
:
# On autorise seulement cet utilisateur à se connecter |
À l’inverse on peut autoriser tout le monde et interdire certains groupes ou utilisateurs, c’est une backlist :
# On interdit cet utilisateur à se connecter |
###I.4.5. Vérification de quelque paramètres natifs
####I.4.5.1. Interdire le login avec mot de passe vide
Normalement ce paramètre est déjà activé. Encore une fois il paraît logique de ne loger aucun utilisateur sans mot de passe. Veillez que vous possédez bien cette ligne :
# To enable empty passwords, change to yes (NOT RECOMMENDED) |
####I.4.5.2. Forcer l’utilisation du protocole 2
La version 1 de SSH étant devenue obsolète (même si certains doivent encore l’utiliser pour quelques options), il est important d’utiliser la version 2 afin de garantir un bon niveau de sécurité. Comme pour le login sans mot de passe vérifiez que ce paramètre est activé par défaut.
|
Une fois tous les changements effectués n’oubliez pas de redémarrer le service SSH :
root# /etc/init.d/ssh restart |
I.5. Options intéressantes
Certaines options peuvent encore être ajoutées au fichier de configuration de SSH afin d’améliorer son utilisation.
I.5.1. Déconnexion automatique de l’utilisateur après inactivité Afin d’éviter le surcharge du réseau et du nombre de connexions entrantes on peut spécifier une durée (en seconde) après laquelle le serveur déconnecte l’utilisateur en cas d’inactivité.
|
###I.5.2. Mettre une bannière d’avertissement
Cela peut paraître bête comme idée mais non ! Il est important de notifier les utilisateurs se connectant qu’ils entrent dans une zone privée. Pour cela nous allons créer un fichier bannière dans le répertoire de SSH :
root# vim /etc/ssh/ssh-banner |
Ensuite on y colle ce genre de message d’avertissement :
|
Maintenant rendez-vous dans le fichier de configuration de SSH et décommentez la ligne suivante :
|
Vous pouvez faire un test de connexion rapide afin de vérifier le bon fonctionnement :
leseb@leseb-Studio-1557:~$ ssh 192.168.0.11 |
Comme précédemment une fois tous les changements effectués n’oubliez pas de redémarrer le service SSH :
root# /etc/init.d/ssh restart |
###I.5.3. Multiplexage du canal de communication
On est souvent tenté de faire de la multi-connexion sur un serveur SSH, simplement parce que nous avons besoin d’un second shell pour effectuer une action en parallèle d’une autre. Il existe un moyen d’unifier les connexions dans un seul tunnel afin de ne pas avoir à se ré-authentifier (saisie de mot de passe ou échange de clef). L’ouverture de la connexion avec la création du tunnel désigne la connexion mère, ensuite suivent des connexions filles. Elles restent actives tant que la connexion mère fonctionne. Nous allons utiliser le paramètre Control master.
Retour sur le fichier ssh_config
et pas sshd_config
!
Sur un Host précédement crée ou un nouveau ajouté les lignes suivantes :
ControlMaster auto |
Exemple de mon fichier avec les ajouts précédents :
Host "ipServeur ou dnsServeur"
Port 443
ControlMaster auto
ControlPath ~/.ssh/ssh-%r@%h:%p
Description des paramètres :
- %r : désigne le nom d’utilisateur
- %h : désigne l’hôte distant
- %p : désigne le port distant
Maintenant authentifiez-vous une fois et puis une deuxième fois, normalement vous devriez être logé automatiquement !
Pour en savoir plus sur les options du fichier sshd_config
n’hésitez pas à faire un man sshd_config
pour voir la liste complète des options disponibles.
II. Les usages possibles
II.1. Connexion distante
###II.1.1. Authentification par mot de passe
####II.1.1.1. Sous Linux
Nous l’avons vu un peu plus haut, SSH permet l’initialisation de connexion distante sur d’autres machines, re-voici la commande à employer :
root# ssh -p "port" user@hostname |
Renseignez votre mot de passe :
user@hostname's password: |
Exemple de message une fois logé :
Linux hostname 2.6.35-28-generic #50-Ubuntu SMP Fri Mar 18 18:42:20 UTC 2011 x86_64 GNU/Linux Ubuntu 10.10
Welcome to Ubuntu!
* Documentation: https://help.ubuntu.com/
Last login: Wed Apr 20 23:02:31 2011
Pour vous déconnecter et mettre fin à votre session lancez la commande exit :
user@hostname:~$ exit
logout
Connection to hostname closed.
####II.1.1.2. Sous Windows Sous Windows, le logiciel le plus employé pour se connecter en SSH est PuTTY. Celui-ci est téléchargeable sur cette page
Une fois installé, lancez-le :
La configuration de PuTTY est très simple, voyez plutôt :
- Host Name (or IP address) : renseignez l’ IP de votre serveur SSH
- Port : laissez 22, sinon remplacez par le port, dans mon cas 443
- Connection type : SSH
- Saved Sessions : enregistrer vos préférences de connexions, donnez un nom
- Cliquez sur Save
- Cliquez sur Open
Lors de votre première connexion, PuTTY vous demande une confirmation de connexion afin d’entrer le serveur joint dans sa liste de serveur connu :
Cliquez sur Oui.
Renseignez votre login et votre mot de passe. Appuyez sur Entrée !
###II.1.2. Authentification par clef publique / clef privé
Si l’on est souvent amener à se loger sur une machine, de même si l’on veut lancer des actions automatisées par script sur des serveurs il peut vite devenir fastidieux et compliqué de renseigner son mot de passe à chaque connexion. Il existe donc une méthode basée sur l’échange de clefs chiffrées vous permettant de vous loger sans mot de passe et également de façon sécurisé. Attention tout de même à ne pas égarer votre clef vous risqueriez de mettre en péril votre serveur.
####II.1.2.1. Côté serveur
Nous allons commencez par éditer une ligne du fichier sshd_config
:
root |
Nous allons modifier ce paramètre, changez le no
en yes
:
PasswordAuthentication yes |
####II.1.2.2. Côté client (Linux)
Sur le poste client qui va initier la connexion vérifier que le dossier .ssh existe bien sur votre machine, s’il n’existe pas créer-le :
root# mkdir ~/.ssh |
Lancer la génération de vos clefs :
root# ssh-keygen -t dsa |
Cela va générer 2 clefs dans le dossier ~/.ssh : id_dsa
et id_dsa.pub
On copie notre clef publique sur le serveur distant SSH dans le fichier ~/.ssh/authorized_keys :
root# ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 443 user@hostname" |
Renseignez votre password pour la dernière fois ! Maintenant essayez de vous loger :
root# ssh –p 443 user@hostname |
Magique !
Principe de fonctionnement :
Lors de la tentative de connexion le client va renseigner sa clef publique (celle dans ~/.ssh/
)
À la demande de connexion le serveur va vérifier dans son fichier authorized_keys
si celle-ci existe
Si c’est le cas la connexion est acceptée.
Bien évidemment le fichier authorized_keys
peut contenir plusieurs clefs à conditions que celle-ci façon l’objet d’un retour à la ligne à chaque ajout.
Protéger vos clefs privés, au risque de perdre l’avantage de l’authentification sans mot de passe… Vous pouvez utiliser un agent SSH qui va conserver votre clef de façon chiffrées, vous devrez renseigner une passphrase pour les déchiffrer et les utiliser. Il faut cependant être garant du trousseau utilisé, la façon dont ils stockent et protègent vos clefs, c’est donc un cercle vicieux.
####II.1.2.3. Côté client (Windows)
Sous Windows nous allons utiliser PuTTY pour initialiser nos connexions SSH. L’établissement d’authentification n’est pas plus compliquée sous Windows (tout est graphique après tout !). Dans le répertoire d’installation de PuTTY se trouve PuTTYgen, un générateur de clef.
Cliquez sur Generate et remuez votre souris dans la zone vide afin de générer des nombres aléatoires.
Une fois terminé, enregistrez vos clef privé (.ppk) et publique (.pub) sur votre poste client. Maintenant il faut copier la clef publique dans le fichier authorized_keys
de votre serveur, un simple ctrl + c
et ctrl + v
!
Maintenant il faut quelque peu modifier vos préférences dans PuTTY, tout d’abord sélectionnez le chemin votre clef privé :
Ensuite renseignez votre login :
Et enfin l’encode de caractère en UTF-8 :
Enregistrez votre configuration et faîte un essai.
II.2. Redirection de port
###II.2.1. Port local vers port distant
Parfois il peut être utilie d’avoir accès à des interfaces Web d’administration comme celle de Nagios pour le monitoring, utiliser le service Owncloud en mode local, ou accéder à votre serveur Web sur une votre machine serveur distante. Le principe ici est d’ouvrir un tunnel SSH entre votre machine cliente et votre machine serveur et d’accéder via un port local de votre machine client à un port distant sur la machine serveur.
####II.2.1.1. Sous Linux
Imaginons un test sur mon serveur Web distant de mon serveur SSH.
ssh user@hostname -p 443 -L 8080:localhost:80 |
Ici je demande de rediriger mon port local 8080 vers le port 80 de ma machine distante. Pas besoin de modifier vos paramètres proxy de votre navigateur, entrez simplement l’adresse : http://localhost:8080/
####II.2.1.2. Sous Windows
Toujours avec PuTTY
Même principe que sous Linux, on ne modifie pas les paramètres proxy du navigateur et on fait un test sur le port 8080 de votre localhost.
###II.2.2. Port distant vers port local
Ici on peut autoriser le serveur SSH à accéder à un port de notre machine locale.
####II.2.2.1. Sous Linux
Dans un terminal entrez la commande :
ssh user@hostname -p 443 -R 8080:localhost:80 |
####II.2.2.2. Sous Windows
Toujours à l’aide de PuTTY :
Il ne vous reste plus qu’à faire un test depuis votre serveur.
###II.2.3. Rebond SSH sous Linux
Si l’on veut traverser plusieurs serveur SSH.
Dans un terminal entrez la commande :
ssh -T user@passerelle ssh user2@hostnameFinal
###II.2.4. X11 forwarding
Même si vous êtes sur un serveur, vous pouvez un jour avoir d’un retour graphique ou d’utiliser une application graphique. Ici nous avons un serveur X11 tournant en local sur la machine cliente, SSH qu’en à lui va rediriger le flux d’affichage vers ce serveur local. Vous pouvez donc lancer une application graphique à distance à travers votre tunnel SSH. Le principe de fonctionnement est assez simple, on utilise les ressources du serveur distant et on exécute l’interface graphique en émulant un serveur X11 sur notre machine. Attention par contre au débit nécessaire, en local cela fonctionne très bien mais au travers d’Internet il faut une bonne bande passante. Pour exemple avec ma connexion et un débit montant d’environ 80/100Ko/sec, un simple éditeur de texte ou navigateur Web n’est pas fluide.
####II.2.4.1. Configuration serveur
Vérifiez que ce paramètre est à yes dans le fichier sshd_config
:
X11Forwarding yes
####II.2.4.2. Configuration client Windows
Nous allons commencer par paramétrer PuTTY en activant le X11 Forwarding :
Ensuite, téléchargez l’émulateur X11, installez-le et lancez-le.
Maintenant saisissez une commande dans le terminal de PuTTY par exemple :
root# iceweasel |
####II.2.4.3. Configuration client Linux
Ici le serveur X11 est natif, ouvrez simplement un terminal et entrez la commande suivante :
root# ssh -X -p 443 user@hostname |
Une fois connecté à la machine distante :
II.3. Proxy avec SSH ou HTTP Over SSH
###II.3.1. Pourquoi utiliser un proxy SSH ?
Concernant cette partie, je ne me tiens en aucun cas responsables des actions que vous pourriez effectuées après l’utilisation induite du protocole SSH.
Capture avec Wireshark d’une requête sur www.google.com
:
Ici en posant un filtre sur http, toutes les requêtes sont visibles en clair.
Capture d’une requête vers la version SSL de google :
En posant un filtre sur SSL, on observe bien un échange au travers de SSL mais les données étant encryptés rien n’est interprétable.
L’utilisation de SSL n’empĉhe pas les proxy réseaux de voir vers où sont initiées les connexions réseaux, par exemple ici on sait que l’adresse IP publique 209.85.227.139 correspond au serveur de Google. L’avantage du proxy SSH est la création du tunnel SSH, emprisonnant toutes vos requêtes de façon chiffrée. Ainsi une analyse réseau permet seulement de voir l’adresse de votre serveur SSH et rien d’autre :
###II.3.2. Proxy SOCKS
####II.3.2.1. Brève sur SOCKS
SOCKS est comme son abréviation l’indique un proxy pour socket, il ne se préoccupe en rien de la nature des protocoles employés lorsque l’on l’utilise. À l’inverse d’un proxy type qui lui est donné pour un protocole précis. Le gros avantage de SOCKS est donc de pouvoir faire transiter tout type de flux en sein et de ne pas se limiter à un protocole précis (POP, SMTP, HTTP).
####II.3.2.2. Mise en oeuvre avec SSH sous Linux
Le principe est identique à celui employé pour la redirection de port ave SSH, la commande que j’utilise pour mon proxy SOCK :
ssh user@hostname -Cp443 -ND3128 |
Détails des options utilisées :
- -C : compresser la connexion
- -p : on spécifie le port SSH
- -N : on interdit le contrôle à distance. Nous n’avons pas d’accès à un shell distant, en même temps nous n’en avons pas besoin !
- -D : redirection de port de dynamique en utilisant SOCKS, ici SSH agît comme un serveur SOCKS
On peut également observer les traces des connexions en ajoutant l’option verbeuse sur la commande SSH :
Initialisation de la connexion :
leseb@leseb-Studio-1557:~$ ssh user@hostname -Cp443 -ND3128 -v |
Exemple de requête sur google, ici le mot « test » renvoie :
debug1: channel 11: free: direct-tcpip: listening port 3128 for www.google.fr port 80, connect from 127.0.0.1 port 45024, nchannels 12 |
Puis lorsque je me rends sur le premier site délivré par la recherche :
debug1: channel 21: new [dynamic-tcpip] |
Paramétrage dans Chromium :
####II.3.2.3. Mise en oeuvre avec SSH sous Windows
On utilise toujours puTTY, on sélectionne D dans le forwarding :
Choisissez un port > 1024
par exemple 1111.
Renseignez les paramètres proxy dans votre navigateur, exemple avec Chrome/Chromium qui utilisent les paramètres système Windows :
Capture en local avec Wireshark, encore une fois on observe un trafic crypté (SSL) entre 2 noeuds du réseau :
###II.3.3. Proxy HTTP SQUID
####II.3.3.1. Brève sur SQUID
Pourquoi SQUID ? Parce que SQUID est un proxy et que l’on peut simplement tirer partie de sa mise en cache du contenu statique (image, html) afin d’accélérer notre navigation Internet.
####II.3.3.2. Configuration serveur
Il faut installer SQUID sur votre serveur :
root
Il n’y a pas réellement de paramètrage à effectuer, SQUID fonctionne un peu tout seul, vous pouvez à la rigueur modifier son port d’écoute.
Le fichier de configuration est dans /etc/squid/squid.conf
Après modification n’oubliez pas de relancer le daemon de SQUID :
root |
####II.3.3.3. Configuration client Windows
Nous utilisons toujours PuTTY, pour cela il faut créer une règle de forward local sur le port d’écoute natif de SQUID (3128) :
Enregistrer cette règle dans votre profil de connexion PuTTY.
Ensuite il faut paramétrer votre navigateur, exemple sous Chrome qui utilise les paramètres système d’Internet Explorer :
###II.3.4. Partager son proxy SSH
Une option de PuTTY permet aux machines du réseau d’utiliser votre tunnel :
Il suffit de cocher Local ports accepts connections from other hosts. Les utilisateurs du réseau devront renseigner dans leurs paramètres proxy votre adresse IP privé et le port d’écoute 3128.
II.4. Transfert de fichier
###II.4.1. Utilisation de SCP
SCP, Secure CoPy permet d’effectuer des copies distantes de façon chiffrées au travers un tunnel SSH.
####II.4.1.1. Sous Linux
Dans un terminal entrez le commande suivante :
root# scp –P 443 -i ~/.ssh/id_dsa « fichier » user@ip:/repertoireDestination |
####II.4.1.2. Sous Windows
Sous Windows on utilise WinSCP, une interface graphique reposant sur SSH et le protocole SCP. Télécharger WinSCP ici. Comme sous Linux, il est possible de synchroniser des données entre différents ordinateurs d’un réseau local ou distant.
Une fois installé, lancez-le, cliquez sur Editer pour créer un profil :
Une fois votre profil crée cliquez sur Sauver… :
Cliquez sur Connecter :
Entrez votre mot de passe et cliquez sur OK :
À l’image d’un outil de connexion FTP vous retrouvez du côté droit le contenu de votre serveur et du côté gauche le contenu de votre machine cliente. WinSCP permet l’utilisation du drag n drop entre les deux environnements. Il propose des options supplémentaires comme l’ouverture de terminal distant mais à vous de fouiller un petit peu car ce n’est pas l’objet de l’article.
###II.4.2. Utilisation de RSYNC over SSH
RSync est un outil de synchronisation de fichier très répandu dans le monde du libre. On l’utilise pour effectuer des backups, de la synchronisation de répertoire. Il supporte les fortes charges et les gros volume de données.
Pour l’installer :
root |
Une option de Rsync permet son utilisation en combinaison de SSH :
Serveur vers client :
rsync -avz -e "ssh -p 443 -i $HOME/.ssh/id_dsa" user@hostname:/home/user/"
Client vers serveur :
rsync -avz -e "ssh -o PreferredAuthentications=publickey -p 443 –i $HOME/.ssh/id_dsa" Scripts/ user@hostname:/home/user
II.5. Montage de répertoires distant
SSH propose le montage de FileSystem de façon distante via SSHFS.
Installer SSHFS :
root# aptitude install sshfs |
Fonctionnement :
root# sshfs user@hostname:/repertoireDistant /PointDeMontage |
Exemple :
root$ sshfs -p 443 user@hostname:/home/user/rép-à-monter/ /home/user/monPointDeMontage |
Pour démonter le répertoire :
root# umount /pointDeMontage |
Montage permanent dans le FSTAB, créer un répertoire de montage et éditez votre FSTAB :
root# mkdir /mnt/monPointDeMontage |
Ajouter cette ligne au FSTAB :
sshfs#user@hostname:/repertoireDistant /mnt/monPointDeMontage fuse port=votrePortSSH,user,noauto,noatime 0 0 |
Maintenant le répertoire distant sera automatiquement monté à chaque démarrage.
Comments