User Tools

Site Tools


tuto:1

This is an old revision of the document!


ssh

Rappels

Qu'est ce qu'un réseau informatique ?

Un réseau est un ensemble d'appareils connectés (ordi, telephone, frigo, camera etc…) parlant entre eux selon un ou plusieurs languages connus de chacun (protocoles).

Ces protocoles utilisent des couches (il y en a 7) et les données sont encapsulées dans un protocole de niveau x qui elle meme est encapsulee dans un protocole de niveau x+1 etc…

Par exemple, on met une banane dans un emballage qui contient plusieurs bananes, cet emballage, on le met dans une boite qui contient plusieurs emballages et on met cette boite dans un container qui contient plusieurs boites et ce container on le met dans un bateau qui contient plusieurs containers…

Qu'est ce qu'internet ?

Internet est un ensemble de réseaux reliés entre eux.

Ces réseaux utilisent le protocole IP (Internet Procotol).

Ces réseaux ont plusieurs choses en commun mais surtout :

  • les plages d'adresse IP
  • les noms de domaine (qui permettent de lier un nom à une adresse IP)

Ces deux fonctionnalités sont gérées par un organisme indépendant international qui se trouve aux états unis (ouais, flippant mais en meme temps, ce sont pas les pires) puis est subdivisé par pays.

Qu'est ce qu'une plage d'adresses IP ?

Chaque appareil relié au résal (oui, un resal, des réseaux comme un ridal, des rideaux) possède une adresse unique qui permet de l'identifier.

Cette adresse s'appelle une adresse IP et est composée de 4 nombres entre 0 et 255. (de 0.0.0.0 à 255.255.255.255)

Les adresses IP sont classées par “classe” mais nous n'allons pas détailler ce mecanisme et plein de sites en parlent déjà. En gros, concernant les classes, il y a des adresses selon la taille du réseau que l'on met en place.

Le protocole IP utilisé en est à la version 6 mais beaucoup de machines utilisent encore la version 4.

Le protocole IP V4 peut adresser une tres grande quantité d'appareils (plusieurs milliards) mais cela ne suffit plus maintenant donc la version 6 permet d'en adresser beaucoup plus.

Pour ne pas qu'il y ait deux adresses réseau identiques, un organisme centralise le tout et dit : tel pays, vous avez de 111.111.111.111 à 222.222.222.222 par exemple (je dis au hazard).

Ensuite, dans ce pays, il y a des fournisseurs de services comme des hebergeurs et des fournisseurs d'acces et chacun possède aussi une plage d'adresses.

Donc en regardant une adresse, on peut savoir dans quel pays et quel fournisseur se trouve l'appareil.

Qu'est ce qu'un ordinateur ?

Vous croyez vraiment que je vais vous expliquer cela ?

Qu'est ce qu'un systeme client / serveur ?

Pour communiquer entre appareils, il y a soit des systemes point à point (peer to peer), soit des systemes client / serveur.

Les systemes client / serveur fonctionnent comme le nom l'indique.

Quand vous etes dans un bistrot ou un restau, vous appellez le serveur qui vient vous voir et vous dit bonjour (oui, normalement ça se passe comme ça) et vous lui repondez bonjour.

Suite à cela, il sait déjà qu'il faudra parler en français.

Puis il vous demande ce que vous voulez alors vous lui demandez une boisson.

Le serveur va cherche la boisson et vous la ramène.

Vous lui dites merci et il s'en va car la requete est terminée avec succes.

Quand vous avez fini de boire, vous appellez le serveur et vous lui demandez l'addition et il vous la ramène puis vous payez et vous partez (oui, normalement ça se passe comme ça), etc…

Dans une communication client serveur avec un ordinateur, il y a un des deux ordinateurs qui possede un logiciel client et l'autre un logiciel serveur.

Le logiciel serveur attend qu'un logiciel client se connecte à lui pour lui demander quelque chose sinon il attend (ou essuie les verres en attendant).

Qu'est ce qu'un service ?

Un service est proposé par un serveur à un client.

Chaque service sur un réseau est caractérisé par un port (l'adresse IP définit la machine et le port définit le service).

Qu'est ce qu'un port ?

Un port est un nombre entre 1 et 65535 qui est unique par protocole utilisé.

Il y a une liste de ports définis par défaut pour les services standards mais on peut utiliser ce qu'on veut.

Chaque port est unique est lié à un seul service.

SSH utilise par défaut le port 22.

Par exemple, si vous choisissez le port 24 pour ssh et qu'un autre service utilise le port 24, il y aura une erreur lors du lancement.

Qu'est ce qu'un interpréteur de commandes ?

L'ordinateur parle en binaire. Nous, les humains (sauf toi google qui nous lis, oui, je sais. Sinon t'as pas d'autres pages à mater ?) utilisons des chiffres et des lettres ou des symboles. On pourrait parler binaire mais pas encore, il faut quelques dizaines d'années avant cela.

Pour qu'un humain puisse communiquer avec un ordinateur, il a besoin d'une Interface Homme Machine (clavier, souris, ecran etc..)

Pour qu'un ordinateur parle à un autre ordinateur, il n'a pas besoin d'interface homme machine.

Le procédé le plus simple que nous les humains avons trouvé pour communiquer avec les machines est le clavier et l'ecran.

Un interpréteur de commandes est un logiciel se trouvant sur un ordinateur permettant de recevoir des infos depuis un clavier et envoyer les reponses de l'ordinateur sur un ecran.

Nous appellons souvent ce programme un “terminal” ou “une ligne de commandes”.

Selon les systemes d'exploitation utilisés, il a un language différent et un aspect différent mais c'est toujours des lignes de commandes à exécuter.

Sous windows il s'appelle batch, sous osx, je sais plus et sous linux on peut choisir ce qu'on veut (oui grosse différence) et le plus utilisé s'appelle bash (mais on peut utiliser sh ou zsh etc…).

Quand on veut parler avec son ordinateur à coup de clavier, on ouvre une fenetre de terminal qui utilise le language bash et le transforme en binaire (en gros).

Quand on veut parler à un ordinateur qui se trouve à distance, on ouvre une fenetre de terminal sur son ordinateur qui convertit ce que l'on dit en language machine et l'envoie à l'ordinateur distant.

Il peut y avoir différents protocoles utilisés entre son ordinateur perso et l'ordinateur distant.

Le protocole le plus fiable reliant un émulateur de terminal avec un ordinateur distant est SSH.

Qu'est ce que SSH ?

SSH un protocole client / serveur qui permet de relier deux ordinateurs en ayant une liaison sécurisée entre les deux.

SSH est le plus souvent utilisé pour les interpréteurs de commandes mais Il est possible d'utiliser SSH pour encapsuler d'autres protocoles à l'intérieur afin faire transiter tout ce que l'on veut.

SSH serveur fonctionne sous linux ou unix (il existe une version windows aussi mais bon…hum… je vais pas en parler)

Il y a une version libre qui s'appelle OpenSSH (avec openssh-client et openssh-server)

Sous windows, le client ssh le plus connu est “putty”.

Sous mac ou linux, ssh client est en ligne de commande mais il existe d'autres emulateurs bien sûr.

Le cheminement global est :

  • le client demande à se connecter au serveur
  • le serveur répond qu'il est disponible et envoie une clef de chiffrement
  • le client envoie son nom d'utilisateur et mot de passe au serveur avec la clef de chiffrement du serveur
  • le serveur valide ou pas le client et si valide et renvoie sa reponse chiffree avec la clef du client
  • le client demande ce qu'il veut au serveur en chiffrant la question avec la clef du serveur
  • le serveur repond au client en chiffrant la connexion avec la clef du client

Se connecter par ssh

Comment se connecter par SSH avec la ligne de commandes ?

Pour se connecter, on utilise le format suivant : ssh utilisateur@machine puis il nous demande notre mot de passe.

Comment se connecter par SSH avec putty ?

On ouvre putty, on voit qu'il y a une colonne à gauche qui contient plusieurs onglets.

L'onglet par défaut est “session” (tout en haut) dans lequel on entre l'adresse du serveur sur lequel on souhaite se connecter.

On appuie ensuite sur le bouton “open” (ouvrir) et il nous demande notre nom d'utilisateur et mot de passe.

Les clefs de connexion

Qu'est ce qu'une clef de chiffrement ?

Une clef de chiffrement est une regle définie entre deux entités pour communiquer sans que d'autres entités puissent lire l'echange. Par exemple, vous pouvez envoyer un message écrit à un pote en lui disant avant qu'il devra decaler les lettres de 1 cran donc a devient b, b devient c et z devient a…

Vous parlez en français (ou en chteugleu) mais vous avez défini entre vous un standard de chiffrement.

En anglais, on dit “cryptage” mais en français on dit “chiffrement”.

Le systeme le plus utilisé en informatique est celui de la clef privée et publique.

Qu'est ce qu'un système de clef privée / publique ?

Quand on génère une clef sur un ordinateur, celui ci crée 2 clefs : la privée et la publique.

Comme leur nom l'indique, la privée est privée et la publique est publique et les deux vont ensemble et l'une ne sert à rien sans l'autre.

  • La clef PRIVEE ne doit être donnée à PERSONNE par contre la clef publique, on la donne à qui n'en veut.
  • La clef publique sert à chiffrer (encrypter, encoder, obfusquer…) un message et la clef privée sert à déchiffrer.

Le principe est simple :

Si je veux envoyer un message à quelqu'un, je lui demande SA clef PUBLIQUE et je chiffre le message avec cette clef et lui envoie. Une fois le message reçu, la personne utilise SA clef PRIVEE pour déchiffrer le message.

Si je lui ai donné MA clef PUBLIQUE, il peut chiffrer une réponse avec MA clef PUBLIQUE et me l'envoie et je déchiffrerai le message avec MA clef PRIVEE.

Etant donné que beaucoup de monde a du mal avec ce principe, je vais tenter de l'expliquer autrement.

  • toto envoie sa clef publique à titi
  • titi utilise la clef publique de toto pour ecrire une lettre
  • titi envoie la lettre chiffrée à toto
  • toto utilise sa clef privée pour déchiffrer la lettre
  • et vice versa

Quel est le lien entre ssh et les clefs de chiffrement ?

Nous avons vu qu'il faut un nom d'utilisateur et un mot de passe pour se connecter au serveur.

Si quelqu'un connait le mot de passe, il peut se connecter au serveur à votre place.

Le system de clefs permet de zapper les mots de passe donc personne peut se connecter au serveur si il n'a pas donné sa clef au serveur.

On génère une clef sur son ordi et on envoie la clef publique au serveur (ou on la donne à l'admin qui se debrouillera pour la mettre au bon endroit)

Quand on voudra se connecter par ssh, le serveur chiffrera les reponses avec la clef publique du client et enverra sa clef publique au client qui le client chiffrera la requete avec la clef publique du serveur, etc…

Comment générer une paire de clefs ?

Sous linux ou osx :

ssh-keygen -t rsa

Sous windows :

Putty est fourni avec un programme qui se nomme “puttygen” qui sert à générer des clefs.

Que ce soit sous un systeme ou un autre, on peut utiliser un mot de passe pour sa clef (encore plus sécurisé) comme ça, si on se fait tirer sa clef, il faut en plus connaitre le mot de passe de la clef.

Comment envoyer la clef au serveur ?

Sous linux ou osx :

ssh-copy-id -i ~/.ssh/id_rsa.pub nom_utilisateur@adresse_serveur

Sous windows :

Je ne sais pas

Ce systeme d'envoi necessite que le serveur autorise encore les mots de passe pour la connexion donc une fois la clef envoyée, il faut se connecter au serveur et changer son mot de passe sur le serveur (par precaution).

Les serveurs bien configurés interdisent la connexion par mot de passe donc il faut donner sa clef publique à un admin du serveur.

Où sont stockées les clefs ?

Sous linux ou osx, les clefs se trouvent dans le dossier .ssh qui est dans le home de l'utilisateur (voir un autre tuto sur les dossiers sous linux)

Côté client, elles sont dans le dossier ~/.ssh et la clef privée s'appelle id_dsa et la clef publique s'appelle id_dsa.pub (ou id_rsa et id_rsa.pub)

On peut posséder plusieurs couples de clefs qu'on peut renommer mais dans ce cas, il faudra dire à ssh lors de la connexion quelle clef on veut utiliser.

Côté serveur, il y a que la clef publique qui est dans le fichier “authorized_keys” qui est dans le dossier ~/.ssh (une clef par ligne)

Sous windows, vous les mettez où vous voulez en disant à putty à quel endroit elles se trouvent.

Ajouter la clef publique d'un utilisateur sur un serveur

Etapes :

  • creer un dossier .ssh dans le home de l'utilisateur (si pas existant)
  • creer un fichier authorized_keys dans le dossier .ssh (si pas existant)
  • ajouter la clef de l'utilisateur dans le fichier authorized_keys
  • changer les droits sur le dossier et le fichier
  • sudo mkdir /home/nom_user/.ssh
  • sudo nano /home/nom_user/.ssh/authorized_keys
  • sudo chown -R nom_user:nom_user /home/nom_user/.ssh
  • sudo chmod 700 /home/nom_user/.ssh
  • sudo chmod 600 /home/nom_user/.ssh/*

Remarque sur le format de la clef

Quand on genere une paire de clefs avec puttygen, elle ressemble à ceci :

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20140219"
AAAAB3NzaC1yc2EAAAABJQAAAQEAqDbFZB1upDPFv7/HXdGiX0F14EOyQEjbJlbs
aij1QKZSLELaUi7uAAJ9tNZi4NLmAH3oimMlmJaF3zoOXJ5sHrnI8l33jwpdaClH
Yhb3DkRzhJRRJ8IZA5toD2zOrioURsYuP1gJ87KkQy6/yNYxqyVJB+3RqdWnMwTJ
4yafg4kcpVrcm+NDwEYSqEpLVG/8ANRi0rCgLhmNA/Pfb2KRLYMx6WmPtazkt1qm
yZZsD6qiwkmyza+g4zojsopML/vLH0iRwZ6BWgx8IrksfjsbygLvw9C3CD5ZpO55
Awh8uNKSBcpOSKGdC2F3tPWaytIIeH3BM0ZpZH/0uxoJZcLlRQ==
---- END SSH2 PUBLIC KEY ----
or, dans le fichier ~/.ssh/authorized_keys il faut une ligne par clef et elle doit commencer par le format de la clef

donc on recupere la clef en elle meme :

AAAAB3NzaC1yc2EAAAABJQAAAQEAqDbFZB1upDPFv7/HXdGiX0F14EOyQEjbJlbs
aij1QKZSLELaUi7uAAJ9tNZi4NLmAH3oimMlmJaF3zoOXJ5sHrnI8l33jwpdaClH
Yhb3DkRzhJRRJ8IZA5toD2zOrioURsYuP1gJ87KkQy6/yNYxqyVJB+3RqdWnMwTJ
4yafg4kcpVrcm+NDwEYSqEpLVG/8ANRi0rCgLhmNA/Pfb2KRLYMx6WmPtazkt1qm
yZZsD6qiwkmyza+g4zojsopML/vLH0iRwZ6BWgx8IrksfjsbygLvw9C3CD5ZpO55
Awh8uNKSBcpOSKGdC2F3tPWaytIIeH3BM0ZpZH/0uxoJZcLlRQ==
ensuite on en fait une seule ligne :
AAAAB3NzaC1yc2EAAAABJQAAAQEAqDbFZB1upDPFv7/HXdGiX0F14EOyQEjbJlbsaij1QKZSLELaUi7uAAJ9tNZi4NLmAH3oimMlmJaF3zoOXJ5sHrnI8l33jwpdaClHYhb3DkRzhJRRJ8IZA5toD2zOrioURsYuP1gJ87KkQy6/yNYxqyVJB+3RqdWnMwTJ4yafg4kcpVrcm+NDwEYSqEpLVG/8ANRi0rCgLhmNA/Pfb2KRLYMx6WmPtazkt1qmyZZsD6qiwkmyza+g4zojsopML/vLH0iRwZ6BWgx8IrksfjsbygLvw9C3CD5ZpO55Awh8uNKSBcpOSKGdC2F3tPWaytIIeH3BM0ZpZH/0uxoJZcLlRQ==
puis on ajoute ssh-rsa au début :
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAqDbFZB1upDPFv7/HXdGiX0F14EOyQEjbJlbsaij1QKZSLELaUi7uAAJ9tNZi4NLmAH3oimMlmJaF3zoOXJ5sHrnI8l33jwpdaClHYhb3DkRzhJRRJ8IZA5toD2zOrioURsYuP1gJ87KkQy6/yNYxqyVJB+3RqdWnMwTJ4yafg4kcpVrcm+NDwEYSqEpLVG/8ANRi0rCgLhmNA/Pfb2KRLYMx6WmPtazkt1qmyZZsD6qiwkmyza+g4zojsopML/vLH0iRwZ6BWgx8IrksfjsbygLvw9C3CD5ZpO55Awh8uNKSBcpOSKGdC2F3tPWaytIIeH3BM0ZpZH/0uxoJZcLlRQ==
et on ajoute cela dans le fichier ~/.ssh/authorized_keys

Les aliases

Comment se faciliter la vie lors d'une connexion ssh ?

Sous linux ou osx, il est possible de créer un fichier “config” dans le dossier ~/.ssh

Ce fichier de configuration permet de créer des “aliases” contenant tous les parametres nécéssaires à la connexion puis d'utiliser les aliases pour se connecter.

Exemple de fichier ~/.ssh/config :

Host toto
  User titi
  HostName toto.monserveur.com
Ensuite pour se connecter, il y a deux solutions :

Soit on utilise la methode classique avec :

ssh titi@toto.monserveur.com

Soit on utilise les aliases avec :

ssh toto

On peut ajouter des parametres dans le fichier de config comme le port (si different) ou le chemin vers la clef utilisee (si differente).

Host toto
  User titi
  HostName toto.monserveur.com
  Port 1234
  IdentityFile ~/.ssh/ma_clef_privee_rsa

Avec la methode classique, ça donnerait :

ssh -p 1234 -i ~/.ssh/ma_clef_privee_rsa titi@toto.monserveur.com

Et avec les aliases grâce au fichier de config :

ssh toto

Sous windows (dans putty), il est possible de créer plusieurs “sessions” et les enregistrer puis les rappeller.

Les tunnels

ssh permet aussi de faire transiter n'importe quelle information entre le client et le serveur en créant un “tunnel” (on appelle cela le tunneling ssh)

On peut rediriger le port d'une machine cliente vers le port d'une machine serveur ce qui permet de faire transiter n'importe quoi en passant par le serveur ssh comme intermédiaire en ayant le tout chiffré entre les deux.

Deux exemples de tunneling

Premier exemple concret : se connecter au serveur mysql depuis son ordi local (redirection de ports).

Souvent, il y a un serveur mysql sur les serveurs web et pour s'y connecter, soit on y va par ssh avec la ligne de commande, soit on utilise un script permettant de s'y connecter par un navigateur web comme phpmyadmin mais la methode la plus pratique est d'utiliser un logiciel de gestion de bases de données sur son ordi en local et passer par un tunnel ssh pour se connecter au serveur comme si le serveur etait sur sa machine locale.

exemple par le fichier de config ssh :

Host toto
  User titi
  HostName toto.monserveur.com
  LocalForward 1234 127.0.0.1:3306

La ligne LocalForward dit qu'on redirige le port local 1234 vers le port distant 3306 (mysql utilise par defaut le port 3306)

donc pour se connecter au serveur mysql qui se trouve sur toto.monserveur.com, il suffit de se connecter en ssh puis dire à son logiciel de bases de données (comme dbeaver) que le serveur se trouve en local (localhost) mais sur le port 1234 (non pas 3306)

Deuxieme exemple concret : utiliser son serveur comme intermediaire pour faire transiter des infos (tunnelling) Vous etes dans un endroit qui bride internet et vous ne pouvez pas acceder à certaines machines ou services (par exemple un site web est bloqué par le firewall de la boite dans laquelle vous bossez)

avec une connexion classique, on lance :

ssh -N -D 1234 toto.monserveur.com

ensuite dans son navigateur web, on lui dit de passer par un “proxy” dont l'adresse est : 127.0.0.1 et le port 1234

et tout ce qu'on va demander au navigateur web passera par le serveur ssh.

Installer un serveur ssh

Sous linux (debian/ubuntu)

sudo apt-get install openssh-server

editer le fichier /etc/ssh/sshd_config

sudo nano /etc/ssh/sshd_config

si besoin, relancer ssh avec :

sudo service ssh restart

notes

tuto/1.1478769798.txt.gz · Last modified: (external edit)