Notes et transcriptions du cours “Administrez un système Linux” disponible sur la plateforme Openclassrooms.
Rassurez-vous, l'idée derrière ces mots un peu barbares est simple : il s'agit de mettre en œuvre des mécanismes pour garantir la sécurité de l'échange entre vous et votre serveur sur deux aspects principaux :
Ces deux aspects historiques de la sécurité de l'information ne datent pas d'aujourd'hui : les Égyptiens utilisaient déjà des principes de chiffrement pour s'assurer de la confidentialité des échanges !
D'ailleurs, avant toute chose, un peu de vocabulaire :
Le principe de la cryptographie est le suivant :
Prenons un exemple tout bête : Imaginons que vous souhaitiez communiquer la phrase suivante “Linux rocks !” (et c’est vrai…) à votre correspondant. Mais vous voulez être sûr qu'une personne lambda qui tomberait volontairement ou par hasard sur votre message ne puisse pas le lire.
Vous vous mettez d'accord avec votre correspondant sur l'algorithme suivant :
Votre message chiffré devient : “Jyvt< zuwhq ;”.
Vous conviendrez que le message est, d’emblée, beaucoup moins lisible par un tiers qui ne connaît pas d'algorithme !
Nous venons ici d'illustrer le principe de cryptographie symétrique (aussi nommé “à clé secrète“). Le même algorithme, la même clé va servir à chiffrer et déchiffrer le message. C'est simple, efficace et très performant.
Le gros inconvénient de cette méthode réside dans la criticité de cette clé unique, qui doit être très protégée et transmise de façon sûre à vos correspondants.
Bien entendu, notre clé ici est ridicule, un calculateur mettrait quelques millisecondes à la casser, et un humain familier des processus de cryptographie le ferait également assez rapidement.
Heureusement pour nous, l'informatique peut nous fournir assez facilement des algorithmes de chiffrement performants :
Pour résoudre le problème de la criticité de la clé de chiffrement symétrique, nous employons plutôt la cryptographie asymétrique, c'est à dire l'utilisation de deux clés plutôt qu'une :
Comment la clé privée déchiffre-t-elle le message chiffré à partir de la clé publique ?
Et bien, en utilisant un procédé mathématique nommé brèche secrète : La clé publique est générée à partir de la clé privée, qui y laisse une brèche secrète, soit un élément permettant de déchiffrer le message…
Bref, sans trop rentrer dans le détail des mathématiques, retenez simplement que la clé publique sert à chiffrer et que la clé privée sert à déchiffrer.
Ce processus présente l'avantage d'être très sécurisé, une personne lambda en possession de la clé publique (seul élément à être transmis) ne pourra pas déchiffrer le message.
Ajoutons à cela l'avantage de pouvoir identifier de manière sûre la provenance du message en inversant la transmission.
En effet, un message chiffré à l'aide de la clé privée présente une empreinte (on parle ici de condensat ou de hash). Ce condensat est identique à celui du même message chiffré avec la clé publique.
Le gros inconvénient de cette méthode réside dans ces performances. En effet, la cryptographie asymétrique est beaucoup plus gourmande en ressources de calcul que la cryptographie symétrique. Les deux principaux algorithmes de cryptographie asymétrique sont RSA et DSA, et ils sont environ 1 000 fois plus lents que DES.
Bon, ok, mais quid de notre serveur SSH du coup ?
Et bien, le protocole SSH se définit par l'utilisation des deux procédés de cryptographie :
Le principe de fonctionnement est le suivant :
Voilà pour la théorie, passons maintenant à la pratique !
Parmi les nombreuses distributions Linux, OpenBSD, dérivée de la branche 4.4DSB, est l'une des plus anciennes (1994) et des plus réputées sur l'importance qu'elle accorde à la sécurité.
L'équipe de développement de cette distribution a donc construit une brique logiciel basée sur le protocole SSH : OpenSSH. Cette brique logicielle fournit notamment les éléments suivants :
sshd
: le service SSH ;ssh
: le client SSH ;ssh-keygen
et ssh-copy-id: les utilitaires de gestion de clé RSA, DSA ;scp
et sftp
: les clients permettant le transfert de données via SSH.
Nous allons nous intéresser à sshd
, le processus service s'appuyant sur le protocole SSH.
Le code source du service SSH est diffusé sous licence BSD et est porté pour les principales distributions Linux.
Ainsi, il est possible de trouver un package openssh-server
pour les distributions Debian, RedHat et leurs dérivées respectives. Néanmoins, il est également possible de trouver les sources du serveur.
Le service SSH est un logiciel installé par défaut avec toutes les distributions. Même lorsqu'il s'agit d'une version minimale de la distribution, vous aurez la possibilité de l'installer dès le départ.
# Installer le serveur SSH apt-get install openssh-server # Vérifier l'état du service systemclt status sshd # Afficher les ports ouverts par le service avec ss (remplace netstat) ss -lptun | grep ssh # Démarrer automatiquement le service SSH systemctl enable sshd
Bien entendu, les développeurs de la brique logicielle OpenSSH fournissent également la partie cliente, nommée SSH. Ce logiciel permet de se connecter à distance sur un serveur disposant d'un service SSH. Pour l'installer, il suffit de charger les packages associés.
Vous allez sûrement constater un nombre d'options et de paramètres assez conséquent pour la commande ssh. Mais finalement, pour une utilisation basique du client, il suffit de lancer le programme en indiquant :
La partie la plus intéressante de la connexion SSH réside probablement dans la gestion et l’échange des clés dont on a parlé plus haut. Ci dessous on va :
ssh-keygen
est votre meilleure amie.# Connexion au serveur distant ssh user@host.name # Equivalent ssh -l user -h hots.name
Le plus souvent, sans configuration particulière, lors du premier contact, l'authenticité de serveur distant n'est pas établie par le client. Un message l' indique. Lorsque l'utilisateur valide l'échange, la clé publique du serveur distant est enregistrée : cela permettra au client de vérifier lors des prochains échanges que son interlocuteur est identique ( le serveur distant est bien le même).
Les condensats des clé publiques des serveurs connus sont enregistrés par le client dans le fichier ~/.ssh/known_hosts
.
N'oubliez pas cependant que le service SSH vous permet de vous connecter de manière sécurisée, à distance, sur votre serveur Linux. C'est tout.
Lorsque le processus de connexion/authentification est terminé, le service SSH rend la main en exécutant le shell associé au compte de connexion.
Les données de la session shell sont ensuite chiffrées via le protocole SSH.
Dernier point : la brique logicielle OpenSSH est disponible pour tous les Unix/Linux, si vous souhaitez utiliser un client SSH sur les ancinnes versions de Windows, il est nécessaire d'installer PuTTY par exemple, qui permet d'obtenir avec le même logiciel un client SSH ainsi qu'un émulateur de terminal.
Allons maintenant un peu plus loin avec la connexion SSH.
Le point faible de la connexion telle que décrite ci-dessus reste bien évidemment le mot de passe du compte utilisateur : lorsque vous allez multiplier les connexions sur différents serveurs, avec différents comptes utilisateurs, la gestion de ces mots de passe va se compliquer. Par ailleurs, la saisie d'un mot de passe est toujours une source de faille potentielle, que ce soit sur votre poste de travail, ou encore avec vos collègues…
L'idée ici est une nouvelle fois d'utiliser les bienfaits de la cryptographie asymétrique. Il s'agit de générer, en tant que client, notre propre jeu de clé privée/clé publique. Cela permettra notamment de diffuser cette clé publique sur les serveurs pour faciliter notre authentification avec la clé privée associée.
Oui, vous avez bien compris, le client va aussi diffuser sa clé publique sur le serveur
Attention : ce processus d’authentification par clés asymétriques est TRÈS important en termes de sécurité, et vous allez probablement le rencontrer très souvent en entreprise. Donc prenez bien le temps de le comprendre parfaitement.
On va :
ssh-keygen
pour générer vos propres clés SSH ;ssh-copy-id
;# Depuis le poste client # L'utilisateur génère sa paire de clé ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ''
L'option -N permet de ne pas associer de mot de passe à la clé : on ne veut pas utiliser de mot de passe lors de l'authentification : c'est bien la détention de la clé rivée qui fera foi (preuve par possession)
Une fois la paire de clés générée, l'utilisateur va pouvoir diffuser sa clé publique sur le serveur sur lequel il souhaite pouvoir se connecter.
ssh-copy-id -i ~/.ssh/id_rsa.pub user@name.server
Après execution de la commande précédente, sur le serveur distant, dans le dossier ~/.ssh/
de l'utilisateur un fichier autorized_keys
a été créé.
L'utilisateur n'a alors plus besoin de taper le mot de passe : son authentification sur le serveur distant est assurée via sa paire de clé.
L'accès à distance est maintenant opérationnel sur votre serveur, il peut aller se placer avec les autres dans la salle blanche prévue à cet effet, bien au frais.
Dans le prochain chapitre, je vous propose de nous pencher sur les fonctionnalités permettant de télécharger ou de transférer des données à partir d'un terminal, et vous verrez que la brique logicielle OpenSSH n'a pas fini de nous servir !