Introduction
Le SSH (Secure Shell) est un protocole de communication sécurisé qui permet d'établir une connexion réseau cryptée entre un client et un serveur, généralement pour l'administration à distance des systèmes informatiques. On va détailler tout ça ici (elle claque pas trop la phrase à ChatGPT pour une fois ?)
Comprendre
Connaissances de bases
C'est un Finlandais avec un nom compliqué qui l'a inventé pour rempalcer Telnet & Rlogin parceque ces jolis protocoles transmettaient toutes les données en clair sur le réseau. En gros n'importe quel skid qui savait se servir de Python & Wireshark pouvait voir tout ce que vous faisiez y compris vos mot de passes :)
On utilise actuellement la version SSH-2.
Lors de l'établissement d'une connexion SSH, une session sécurisée est établie par un chiffrement symétrique (comme AES ou 3DES) et une authentification des deux parties (serveur et client). Le chiffrement symétrique garantit que les données envoyées sont illisibles pour toute personne interceptant les paquets.
L'une des principales forces du SSH est l'authentification basée sur une paire de clés cryptographiques. Le client crée une paire de clefs puis partage la clé publique avec le serveur. Lors d'une connexion serveur/client le serveur envoie un message au client qui possède la clé privée, un échange de clés (Diffie-Hellman) est mis en place et si tout se passe bien tout le monde est content et communique de manière sécurisée.
Le protocole SSH utilise des fonctions de hachagecryptographique (par exemple, SHA-2) pour garantir l'intégrité des données transmises. Cela permet de vérifier que les données n'ont pas été modifiées en transit.
Le SSH utilise un mécanisme appelé MAC (Message Authentication Code), basé sur un algorithme de hachage pour vérifier l'intégrité des messages et détecter toute tentative de modification des données pendant leur transmission.
Protocoles & Programmes qui utilisent SSH
SFTP
SSH File Transfer Protocol est la version de FTP qui utilise ssh pour le transfert de fichier sur le réseau. Parceque sans grandes surprises le ftp balance lui aussi tout en clair sur le réseau (port 21)
SCP
SSH Copy Très facile a manier pour copier des fichiers d'un endoirt à un autre via SSH, c'est utile pour les VPS.
SSHFS
SSH File System SSHFS permet de monter un système de fichiers distant sur votre machine locale via une connexion SSH. Cela signifie que vous pouvez accéder aux fichiers d'un serveur distant comme s'ils étaient sur votre propre machine, mais le tout est sécurisé par SSH.
Rsync sur SSH
Rsync est un outil de synchronisation de fichiers populaire qui peut être utilisé sur SSH pour effectuer des transferts de fichiers sécurisés et efficaces. L'avantage de rsync est qu'il permet de transférer uniquement les différences entre deux répertoires (deltas), ce qui le rend particulièrement efficace pour les sauvegardes.
Mosh
Mobile Shell est une alternative à SSH qui est conçue pour être plus robuste dans des conditions de réseau instables, comme les connexions mobiles. Mosh utilise SSH pour l'authentification, mais il fournit un shell plus résistant aux interruptions de réseau et des latences élevées.
Git
Git est un outil de versionning qui utilise principalement HTTPS mais peut utiliser SSH pour la gestion de dépôt distants (Voir l'article Comprendre Git)
X11 Forwarding via SSH
X11 Forwarding est une fonctionnalité qui permet d'exécuter des applications graphiques à distance tout en affichant leur interface graphique sur la machine locale via SSH. Cela peut être très utile pour exécuter des applications Linux/Unix graphiques sur une machine distante, tout en ayant l'affichage local sur votre propre machine.
Ansible via SSH
Ansible, un outil de gestion de configuration et d'automatisation, utilise SSH pour communiquer avec les hôtes distants. Il ne nécessite pas d'agent ou de serveur spécial côté client ou serveur, ce qui le rend plus léger que d'autres solutions d'automatisation comme Puppet ou Chef.
VPN
Il est aussi possible d'utiliser SSH pour établir un VPN sécurisé, en particulier avec des outils comme OpenVPN ou Tinc, qui peuvent encapsuler tout le trafic réseau via un tunnel SSH, assurant ainsi la sécurité des communications même sur des réseaux non sécurisés.
Tunneling SSH (Port Forwarding)
Tunneling ou Redirection de port est une fonctionnalité avancée du SSH qui permet de faire passer des connexions réseau de manière sécurisée à travers une connexion SSH. Il existe plusieurs types de tunneling :
- Local Port Forwarding : Permet de rediriger un port local vers un serveur distant via une connexion SSH.
- Remote Port Forwarding : Permet de rediriger un port distant vers un client local via SSH.
- Dynamic Port Forwarding: Crée un "proxy" via SSH pour acheminer le trafic de manière sécurisée, souvent utilisé pour créer un VPN personnel.
Exemple de tunneling local :
ssh -L 8080:localhost:80 utilisateur@serveur
Cette commande redirige le port local 8080 vers le port 80 du serveur via SSH.
Automatisation de tâches
SSH offre la possibilité de pouvoir se connecter sans mot de passes tout en garantissant la sécurité ds données via un échange de clefs serveur/client:
# Créer une paire de clefs
ssh-key-gen -t ed25519
# Un prompt vous sera addressé, laissez tous les champs vides.
# Puis copiez la clé publique sur le serveur distant
ssh-copy-id -i ~/.ssh/id_ed25519 utilisateur@serveur
Exécution de Commandes via SSH
ssh utilisateur@serveur "ls /var/www"
Quelques Notions de Sécurité
-
Utilisation de clés fortes : Il est essentiel d'utiliser des clés privées suffisamment longues et sécurisées (par exemple, 4096 bits ou plus (ed25519 fera laaaaaaaargement l'affaire)) et de configurer des passphrases pour protéger les clés privées.
-
Désactivation de l'accès par mot de passe: Une bonne pratique consiste à désactiver l'authentification par mot de passe et à n'autoriser que les connexions par clés SSH. Cela renforce la sécurité en éliminant les risques liés à des mots de passe faibles ou compromis.
-
Gestion des clés publiques : Les serveurs SSH doivent vérifier les clés publiques autorisées, et il est important de régulièrement révoquer ou supprimer les clés d'accès non utilisées.
-
Mises à jour régulières (Automatisation préférée): Comme tout logiciel, SSH doit être maintenu à jour pour bénéficier des dernières améliorations et des correctifs de sécurité.
SSH & Windows
Activer la Fonctionnalité
Allez dans Clic Droit Icone Windows > Paramètres > Système > Fonctionnalités Facultatives > Ajouter une Fonctionnalité : Recherchez Client OpenSSH
WinConPtyShell
La théorie
Le WinConPtyShell est une fonctionnalité plus récente de Windows, introduite avec Windows 10 et utilisée principalement pour gérer les connexions à des shells interactifs (reverse_shells, etc...)^^. Ce n'est pas un programme à part entière que vous installez, mais une infrastructure qui permet d'implémenter des shells interactifs, comme SSH, dans des environnements Windows.
Le terme WinConPtyShell fait référence à un mécanisme interne dans Windows qui permet d'établir des sessions interactives avec des shells, en particulier pour des applications comme OpenSSHou des outils de gestion de terminal. Cela permet à des programmes comme PowerShell ou des applications tierces comme OpenSSH d'interagir avec des shells et des terminaux de manière plus fluide.
Concrètement, cela facilite l’intégration de shells de commande interactifs (par exemple, une connexion SSH ou un script PowerShell qui interagit avec un terminal Windows) avec le système d’exploitation Windows.
WinConPtyShell repose sur un concept de "pseudo-terminal" (pty) utilisé dans de nombreux systèmes Unix/Linux. Ce mécanisme permet à un programme de simuler un terminal pour qu'une autre application puisse y interagir.
Le mécanisme fonctionne en deux parties :
- Le maître (master) : Il envoie des commandes et reçoit les réponses, comme un terminal virtuel.
- L'esclave (slave) : C'est le shell ou le programme qui reçoit les commandes et renvoie les résultats. C'est typiquement une instance de PowerShell, Command Prompt, ou un shell SSH.
La Pratique
Quand on est développeur ou hackeur ou je ne sais quel autre nom qui fini en eur les WinConPtyShell peuvent être extrêmement utile pour communiquer de manière fluide avec des shell interactif qui casse pas comme netcat en voici un exemple :
$ConPty = New-Object -TypeName System.Management.Automation.Runspaces.PseudoTerminal # Créer l'objet Pseudo Terminal
$Process = Start-Process -FilePath "powershell.exe" -PassThru # Le Processus que va utiliser le Pseudo-Terminal (Ici Powershell mais ça aurait pu être git Bash ou autre)
$ConPty.Create($Process) # On démarre la session powershell dans un pseudo terminal
$ConPty.WriteLine("Get-Process") # On écrit les commandes
On peut aisément créer un programme qui fait tout ça automatiquement :)
Passer à la suite
Pour passer à la suite vous pouvez déjà commencer par contribuer psk j'suis un mec cool et sinon j'ai quelques articles sympathiques ici en lien plus ou moins proche avec celui-ci :