# Le système d'exploitation GNU-Linux/Le serveur de shell distant SSH

* Qu'est-ce qu'un système d'exploitation ?
* Unix et Linux
* Partitionnement du disque
* Installation
** Installer Debian via le réseau
* Utilisateur Unix, l'interface console
** Le login
** Variables d'environnement
** Commandes de base
** L'aide en ligne man
** L'éditeur de texte vi
** Les shells
** La complétion
** Les jokers
** Les répertoires importants
** Redirection des entrées/sorties
** Invoquer un programme en tâche de fond
** Propriétaires et droits d'accès
** Processus
** Locale
* Administration du système
** Configuration du réseau
** Les utilisateurs et groupes
** Le processus d'initialisation
** Les systèmes de fichiers
** Le système virtuel /proc
** Les périphériques /dev
** L'ordonnanceur de travaux cron
** Le backup : tar et gzip
** ghost avec partimage
** sauvegarde de fichiers avec rsync
** Les fichiers journaux syslog
** Installation de nouveaux logiciels
** Le noyau Linux et les modules
** Autres commandes utiles
** Installation RAID1 logiciel + LVM + XFS
** Scripts de surveillance
** Réseaux sans fil
* Administration des services réseaux
** L'outil d'administration Webmin
** telnet
** cURL
** wget
** Le serveur de noms BIND
** Le serveur de configuration réseau DHCP
** Le serveur de shell distant SSH
** Le partage de fichiers Samba
** Le partage de fichiers NFS
** Le serveur d'impression CUPS
** Le serveur de fichiers FTP
** Le serveur Web Apache
** Le serveur Web Nginx
** La base de données MySQL
** La base de données Memcached
** La base de données Redis
** Le serveur de mails Postfix
** Les annuaires LDAP
** La supervision Nagios
* Sécurisation d'un serveur Linux
** Installation d'un service en mode chroot
** Protection avec iptables
* Erreurs connues
* Médiagraphie
* Auteurs
* Qu'est-ce qu'un système d'exploitation ?
* Unix et Linux
* Partitionnement du disque
* Installation
** Installer Debian via le réseau
* Utilisateur Unix, l'interface console
** Le login
** Variables d'environnement
** Commandes de base
** L'aide en ligne man
** L'éditeur de texte vi
** Les shells
** La complétion
** Les jokers
** Les répertoires importants
** Redirection des entrées/sorties
** Invoquer un programme en tâche de fond
** Propriétaires et droits d'accès
** Processus
** Locale
* Administration du système
** Configuration du réseau
** Les utilisateurs et groupes
** Le processus d'initialisation
** Les systèmes de fichiers
** Le système virtuel /proc
** Les périphériques /dev
** L'ordonnanceur de travaux cron
** Le backup : tar et gzip
** ghost avec partimage
** sauvegarde de fichiers avec rsync
** Les fichiers journaux syslog
** Installation de nouveaux logiciels
** Le noyau Linux et les modules
** Autres commandes utiles
** Installation RAID1 logiciel + LVM + XFS
** Scripts de surveillance
** Réseaux sans fil
* Administration des services réseaux
** L'outil d'administration Webmin
** telnet
** cURL
** wget
** Le serveur de noms BIND
** Le serveur de configuration réseau DHCP
** Le serveur de shell distant SSH
** Le partage de fichiers Samba
** Le partage de fichiers NFS
** Le serveur d'impression CUPS
** Le serveur de fichiers FTP
** Le serveur Web Apache
** Le serveur Web Nginx
** La base de données MySQL
** La base de données Memcached
** La base de données Redis
** Le serveur de mails Postfix
** Les annuaires LDAP
** La supervision Nagios
* Sécurisation d'un serveur Linux
** Installation d'un service en mode chroot
** Protection avec iptables
* Erreurs connues
* Médiagraphie
* Auteurs
[ Modifier le sommaire ]

## Le serveur SSH

SSH (Secure SHELL) permet de se connecter à un ordinateur distant et de disposer d'un shell sécurisé. Par défaut, le serveur SSH attend les connexions distantes sur le port 22 / protocole TCP.
Pour installer un serveur SSH, on utilise la commande suivante :
La connexion et le transfert de données via SSH est sécurisée par un système de chiffrement utilisant soit l'algorithme RSA (Rivest Shamir Adleman), soit l'algorithme DSA (Digital Signature Algorithm).
Lors de son installation, le serveur SSH génère des clés de chiffrement RSA et DSA. Ces clés sont composées d'une partie privée et d'une partie publique. Elles sont stockées dans le répertoire /etc/ssh/ :
Chaque tentative de connexion est enregistrée dans le fichier /var/log/auth.log.

### Fichier de configuration

Le fichier de configuration du serveur SSH est /etc/ssh/sshd_config :
Les options de ce fichier de configuration sont décrites dans la page de manuel de sshd_config :
Le fichier de configuration par défaut proposé par Debian nécessite quelques ajustements.
La ligne PermitRootLogin yes autorise les connexions distantes à partir du compte root. Cette option est dangereuse car elle permet à un attaquant distant de scanner le mot de passe du super-utilisateur root.
La bonne pratique est de se connecter avec son compte utilisateur (ex: alex), et ensuite de passer root avec la commande su, ou d'effectuer les opérations d'administration avec la commande sudo.
On remplace donc cette ligne par :
Afin de renforcer la sécurité, on peut limiter les connexions SSH à une liste d'utilisateurs donnés. Ceci est réalisé avec l'option AllowUsers :
Sur le même principe, on peut restreindre les connexions à un ou plusieurs groupes Unix :
Afin que ces modifications soient prises en compte, il faut relancer le serveur SSH :

## Le client SSH
### Utilisation

Pour se connecter à un serveur SSH, on utilise la commande ssh. Sa syntaxe est la suivante :
Exemple :
ou
Si on possède le même login sur la machine locale et distante, il est inutile de spécifier le login :
Si ssh ne fonctionne pas sur le port standard 22, l'option -p permet d'indiquer le port à utiliser :
L'option -X du client SSH permet de rediriger l'affichage graphique (le DISPLAY) via le tunnel SSH, et ainsi lancer un programme graphique distant et l'afficher sur notre ordinateur :
Il faut toutefois que l'option X11Forwarding soit positionnée à yes sur le serveur pour que la redirection graphique fonctionne.

### Vérification du fingerprint

Lors de la première connexion, ssh affiche le fingerprint du serveur SSH et demande confirmation :
Si on veut être certain de l'authenticité du serveur distant, on peut contacter l'administrateur et vérifier avec lui que le fingerprint indiqué est le bon. Pour faire ceci, taper la commande ssh-keygen -l sur le serveur ssh et indiquer le chemin vers la clé RSA du serveur ssh :
Par la suite, le fichier /home/<user>/.ssh/known_hosts stoque l'identité chiffrée de la machine et ssh ne nous demande plus confirmation.

### Authentification automatique

Si on se connecte souvent sur le même serveur, on peut générer une paire de clés afin de ne pas avoir à saisir le mot de passe à chaque connexion.
Sur la machine cliente
On génére une paire de clés avec la commande ssh-keygen :
On ne saisi pas de passphrase, sinon le système va demander à saisir la passphrase à chaque connexion, ce qui est aussi contraignant que la saisie du mot de passe.
Sur la machine distante
On se connecte sur la machine distante et on copie le contenu de la clé publique précédement générée (/home/alex/.ssh/id_rsa.pub) dans le fichier /home/alex/.ssh/authorized_keys.
Note: Si on ne dispose pas de la commande ssh-copy-id (anciennes versions de ssh), on peut utiliser la commande suivante :
Ceci fait, on peut se connecter sur la machine distante sans avoir à saisir le mot de passe.

### La commande scp

La commande scp (Secure Copy) permet de copier un fichier d'un ordinateur vers un autre en utilisant SSH.
Par exemple, la commande suivante permet de copier le fichier fichier.txt vers le répertoire /tmp de l'ordinateur pc211 :
On peut également copier un fichier distant sur la machine locale :
L'option -r permet de copier un répertoire de manière récursive.
scp contient une faille que rsync n'a pas, où un serveur malicieux peut envoyer au client des fichiers non demandés.

### Les clients SSH sous Windows

Il existe plusieurs clients SSH pour Windows, dont notamment les logiciels libres suivants :
* PuTTY : fournit une liste de serveurs où se connecter en SSH uniquement.
* WinSCP : client SSH, SFTP, FTP et SCP.
* Bitvise : n'affiche qu'un serveur SSH et SFTP pour chaque profil (nécessite de les charger depuis le système de fichier à chaque changement de serveur).
* MobaXterm : fournit une liste de sessions où se connecter en double-cliquant (en SSH et SFTP), mais problèmes fréquents pour copier-coller en console.

## Problèmes connus
### Le mot de passe est toujours demandé malgré la clé SSH

Quand on teste la clé SSH depuis le client :
si les logs d'authentification du serveur acceptent la clé :
cela donne :
ou :
au lieu de :
Il faut donc réinstaller les clés.

### Authentication refused: bad ownership or modes for directory

Il faut s'approprier le dossier :

### Could not create directory '/c/UsersUtilisateur/.ssh' ... Failed to add the host to the list of known hosts

Se produit sous Windows quand le chemin défini n'est pas celui retenu par SSH. Par exemple, quand :
ou
ou
donnent tous :
Peu importe la casse.
On peut aussi utiliser CMD au lieu de Bash pour modifier la variable d'environnement "home", ce qui aboutit à un résultat équivalent :
Attention : sous Git CMD cela ne fonctionne pas, il faut vraiment utiliser la console DOS du système :
Mais surtout il faut utiliser CMD pour mettre à jour le contenu du dossier .ssh sans obtenir cette erreur, par exemple en installant OpenSSH for Windows :

### Connection closed by authenticating user user 172.19.0.1 port 55920 [preauth]

Regarder les logs du client SSH. S'il n'en n'a pas, utiliser à la place :
Cela dira si le format de la clé est invalide ou autre.

### Could not open a connection to your authentication agent

Lancer :
et réitérer.

### Enter passphrase for key

Il faut ajouter la clé privée depuis le serveur avec :
Sinon, spécifier la clé privée depuis le client :
Sinon, voir #Permission denied (publickey,hostbased).

### error: Received disconnect from x.x.x.x port yyyyy:13: Unable to authenticate [preauth]

Se produit sur un serveur quand on essaie de se connecter automatiquement sans spécifier de clé privée.

### Failed publickey for...

La clé envoyée par le client ne correspond pas à la clé publique indiquée dans /etc/ssh/sshd_config (ou elle n'est peut-être pas dans ~/.ssh/authorized_keys).

### Load key "my_key.ppk": error in libcrypto

Regénérer les clés.

### Permission denied (publickey,hostbased)

Il manque l'enregistrement de la clé publique (ssh -i).
Sinon, utiliser Putty.

### Server refused our key

Vérifier les permissions, par exemple pour root :
D'où :
Cela peut aussi être lié à la non prise en charge par le serveur de l'en-tête et du pied de la clé publique. Dans ce cas, retirer les deux lignes :
Si le problème persiste, la cause est détaillée dans :
Si aucun log n'apparait lorsque le client reçoit l'erreur, passer en LogLevel DEBUG dans la configuration du serveur SSH :
Cela permettra par exemple de savoir si l'erreur provient de authorized_keys.

### WARNING: UNPROTECTED PRIVATE KEY FILE! / bad permissions / Permission denied (publickey)

Sous Linux il est facile d'appliquer les permissions sur la clé :
NB : sous Windows par contre, la commande chmod n'a aucun effet depuis Bash, même lancée en tant qu'administrateur. Et une modification des droits après suppression de l'ACL, via Cygwin ou l'explorateur Windows fonctionne chez eux, mais n'a guère plus d'effet pour SSH :

### we did not send a packet, disable method

Cette erreur du client SSH peut venir d'un authorized_keys mal rempli :

## Références

* ↑ https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html
* ↑ http://www.putty.org/
* ↑ http://winscp.net