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…
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 :
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.
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.
Vous croyez vraiment que je vais vous expliquer cela ?
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).
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).
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.
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.
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 :
Pour se connecter, on utilise le format suivant : ssh utilisateur@machine puis il nous demande notre mot de passe.
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.
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.
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.
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.
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…
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.
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.
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.
Etapes :
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
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.comEnsuite 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.
Sftp est tres pratique car il permet de transferer des fichiers ou monter un dossier distant sans avoir à installer un serveur ftp tout en utilisant une connexion sécurisée.
Par défaut, sftp est déjà actif.
Voir la partie “Installation” pour voir comment le mettre en place.
Utiliser son client ftp préféré supportant sftp (comme filezilla bien qu'il soit relou concernant les clef ssh mais ça fonctionne quand même).
Beaucoup de navigateurs de fichiers sous linux ou mac permettent la connexion sftp donc entrer l'adresse sftp dans la barre d'adresse (souvent accessible par ctrl+l).
La ligne de connexion est souvent : sftp:utilisateur@serveur Bien sûr si vous utilisez le fichiers de config des aliases, le boulot est facilité avec : sftp:toto
Il existe sous linux un programme nommé “sshfs” qui permet de monter un volume sftp dans un répertoire local.
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.
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.
Sous linux (debian/ubuntu)
sudo apt-get install openssh-server
Le fichier de configuration est /etc/ssh/sshd_config
si besoin, relancer ssh avec :
sudo service ssh restart
Le fichier de logs des connexions est : /var/log/auth.log
Beaucoup de scanners martellent le port 22 qui est celui par defaut de ssh donc il est recommandé d'en utiliser un autre.
Pour cela, nous avons besoin d'un serveur sur lequel ssh est déjà installé, d'un clavier et de quelques doigts (ou le nez pour ceux qui n'ont pas de bras).
Une fois ce paramètre modifié, vous ne pourrez plus vous connecter au serveur si vous n'avez pas configurée une clef ssh donc voir plus haut pour voir comment faire (et tester la clef avant de faire la manip… je dis ça, je dis rien mais j'le dis quand même…).
On peut dire au système d'autoriser que les ip voulues sur un port donné à se connecter. Pour cela, nous allons utiliser iptables qui est le firewall intégré dans la plupart des noyaux linux.
Nous n'allons pas parler de l'initialisation des règles iptables ni de leur persistance car c'est hors sujet (utiliser un moteur de recherche sur le web).
#!/bin/bash
# on lui dit à quel endroit se trouve le programme iptables (au cas où)
IPTABLES="/sbin/iptables"
# on lui dit quelle est notre carte réseau
WAN1_IFACE="eth0"
# on lui dit quel est le port utilisé par ssh
SSH_PORT="9876"
# on lui donne une liste d'adresses ip autorisées à utiliser ssh (séparées par un espace)
ADMIN_IP="82.228.255.123 78.47.216.123"
# on génère les regles iptables une par une dans une boucle
for admin in ${ADMIN_IP}; do
${IPTABLES} -t filter -A INPUT -p tcp -i ${WAN1_IFACE} -s ${admin} --dport ${SSH_PORT} -j ACCEPT
done
Fail2ban est un daemon écrit en python qui lit en permanence les fichiers de logs à la recherche de choses bizarres et si il détecte quelque chose d'anormal (selon ce qu'on lui demande), il crée une règle iptables permettant de bannir l'ip concernée.
[ssh] enabled = true port = ssh,sftp,9876 filter = sshd logpath = /var/log/auth.log maxretry = 6
Voir plus haut la partie “sftp” pour voir ce que c'est.
Par défaut, sftp est activé donc nous allons voir comment le configurer pour enfermer un utilisateur dans un dossier précis.
Parfois, nous avons besoin de permettre la connection d'un utilisateur sur un serveur afin qu'il puisse modifier certains fichiers (comme sur un serveur web par exemple) sauf qu'on veut surtout pas qu'il matte les dossiers de ses petits camarades ou qu'il se balade sur la bécane…
Pour verrouiller un utilisateur dans un dossier, il y a deux solutions :
Voici la procédure (en prenant l'utilisateur “toto”) :
<callout type=“info” icon=“true”>Note : Si le dossier se trouve autre part sur le système, utiliser ensuite un “mount bind” au besoin…</callout>
Match Group sftpusers
ChrootDirectory /home/%u/sftp
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
PasswordAuthentication yes
<callout type=“info” icon=“true”>Note : les lignes “AllowTCPForwarding”, “X11Forwarding” et “PasswordAuthentication” sont optionnelles.</callout>
<callout type=“info” icon=“true”>Note : si il y a un probleme de connexion, regarder les logs lors de la connexion avec : “tail -f /var/log/auth.log”</callout>