relecture et compléments avant publication

This commit is contained in:
Gregory Colpart 2017-10-29 01:40:29 +02:00
parent 50b533dd90
commit d83595c102

View file

@ -6,13 +6,8 @@ title: Howto OpenSSH
* Documentation : <https://www.openssh.com/manual.html>
[OpenSSH](https://www.openssh.com/) est l'implémentation la plus répandue du protocole SSH permettant de se connecter sur une machine à travers le réseau de manière sécurisée.
OpenSSH est développé par le projet [OpenBSD](HowtoOpenBSD), il
OpenSSH est développé par le projet [OpenBSD](HowtoOpenBSD) avec une grande attention sur la sécurité. Il offre de nombreuses fonctionnalités : SCP, SFTP, clés SSH, tunnels, VPN, etc.
fait partie du projet [OpenBSD](HowtoOpenBSD) et permet de nombreuses fonctionnalités : SFTP, gestion de clés, tunnels, VPN, etc.
Ce protocole existe en plusieurs
versions et nous utilisons uniquement la version 2. La version 1
comporte des failles de sécurité et ne doit plus être utilisée.
## Installation
@ -243,6 +238,8 @@ Host foo ssh.example.com
Host sql.example.com
IdentityFile ~/.ssh/id_bastion_ed25519
ProxyCommand ssh bastion.example.com -W %h:%p
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host nfs.example.com
ProxyCommand ssh -W bastion.example.com:2222 john@192.0.2.111
@ -281,7 +278,18 @@ Options utiles pour `scp` :
## SFTP
Le protocole SFTP correspond au **SSH File Transfer Protocol** : c'est une extension du protocole SSH qui permet non seulement de transférer des fichiers (comme [SCP](HowtoOpenSSH#scp)) mais aussi d'avoir des fonctionnalités plus avancées (listing de répertoire, suppression de fichiers, etc.) similaire au vieux protocole FTP.
Le protocole SFTP correspond au **SSH File Transfer Protocol** : c'est une extension du protocole SSH qui permet non seulement de transférer des fichiers (comme [SCP](HowtoOpenSSH#scp)) mais aussi d'avoir des fonctionnalités plus avancées (listing de répertoire, suppression de fichiers, etc.) similaire au vieux protocole FTP :
~~~
$ sftp ssh.example.com
Connected to ssh.example.com.
sftp> ls
sftp> lls
sftp> pwd
sftp> get FICHIER
sftp> put FICHIER
sftp> bye
~~~
### chroot SFTP
@ -418,7 +426,7 @@ no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa XXXXX co
### Agent SSH
Il est important de protéger une clé SSH utilisée par humain par une passphrase.
Pour éviter de taper sa passphrase à chaque utilisation, on peut utiliser un *agent SSH* qui va la retenir en mémoire.
Pour éviter de taper sa passphrase à chaque utilisation, on peut utiliser un *agent SSH* qui va retenir la clé SSH en mémoire.
En général, un agent SSH est lancé par son Window Manager.
Sinon, on peut le lancer automatiquement via son `~/.profile` :
@ -434,7 +442,7 @@ SSH_AUTH_SOCK=/tmp/ssh-IklIVmCGvWgT/agent.1151
SSH_AGENT_PID=1198
~~~
On peut alors lancer la commande `ssh-add` qui va nous demander notre passphrase et la transmettre à l'agent SSH :
On peut alors lancer la commande `ssh-add` qui va nous demander notre passphrase pour transmettre la clé à l'agent SSH :
~~~
$ ssh-add -t 36000
@ -503,6 +511,16 @@ Enfin il faut noter que si l'on veut utiliser un port local inférieur à 1024,
# ssh -L 443:127.0.0.1:443 ssh.example.com
~~~
### Tunnel SSH inverse
Si l'on est derrière une connexion NAT par exemple, on peut ouvrir un tunnel pour permettre une connexion distante depuis une machine accessible en SSH :
~~~
ssh -R 22000:127.0.0.1:22 ssh.example.com
~~~
Depuis *ssh.example.com* on peut ainsi accéder à la machine derrière le NAT via `ssh -p22000 127.0.0.1`.
### Proxy SOCKS via SSH
On peut lancer un proxy SOCKS passant par un serveur distant ainsi :
@ -563,7 +581,7 @@ $ ssh -J bastion.example.com cible.example.com
### Agent forwarding
Si vous voulez utiliser une [clé SSH](HowtoOpenSSH#cle-SSH) locale depuis un serveur distant, vous pouvez utiliser l'option `-A` :
Si vous voulez utiliser une [clé SSH](HowtoOpenSSH#cle-SSH) locale depuis un serveur distant, vous pouvez utiliser l'option `-A` qui va rendre votre agent local accessible depuis le serveur distant :
~~~
$ ssh -A ssh.example.com
@ -573,6 +591,12 @@ SSH_AUTH_SOCK=/tmp/ssh-sUSruIwyCa/agent.3265
> *Note* : attention, cette option doit être utilisée en connaissance de cause car l'utilisateur *root* sur la machine *ssh.example.com* aura accès à vos clés et donc aux machines distantes auxquelles vous avez accès avec vos clés.
On peut également ajouter les clés SSH présentes sur un serveur distant en faisant :
~~~
$ ssh ssh.example.com -t -A ssh-add
~~~
### VPN over SSH
On peut utiliser OpenSSH comme VPN !
@ -625,6 +649,50 @@ On peut également désactiver cette vérification en utilisant un fichier alter
$ ssh -o UserKnownHostsFile=/dev/null ssh.example.com
~~~
On peut également générer à l'avance les fingerpints dans un fichier `~/.ssh/known_hosts2` (utilisé par défaut).
Pour générer les fingerprints, on peut utiliser la commande `ssh-keyscan` :
~~~
$ ssh-keyscan ssh.example.com
ssh.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2nP2WzQ8hkZDiEq5+QSGFhTB7SYfRa7/IG0gMOIoCDXH8b3sfsBUUEL8ZSFaWgNKskUnpgg/fqAhvnDLOPskr3OGXRfrCR68fCqn5H1zBrHB1kpdjPW9ezUe1xoY3hGp6LITANHWpZie1wBjYAzaBO70hNAo4JMCQvZXDsQdyws2DRSuYtiAoG/ZY0+t2VZh3MJLcofv1wNo43M+aHJR2xWmQSE7cWjMlcw/QOmsWJBv1+Kb/nK2Q7buX/byvY8ySu5ydATnyEinzbutZXc/t/FioOtWMeqh6NlD3aPGIpUTmf8ow+c1QwZWOC3T2GWyTD5KVmAZSm77lWkpYFcd1
ssh.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBsUneE642qr/kzKwJcKl9Cgog/kgCqRLZwZs4J7RRt8
~~~
Puis l'on crée un fichier contenant :
~~~
example-ssh,ssh.example.com,192.0.2.42 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2nP2WzQ8hkZDiEq5+QSGFhTB7SYfRa7/IG0gMOIoCDXH8b3sfsBUUEL8ZSFaWgNKskUnpgg/fqAhvnDLOPskr3OGXRfrCR68fCqn5H1zBrHB1kpdjPW9ezUe1xoY3hGp6LITANHWpZie1wBjYAzaBO70hNAo4JMCQvZXDsQdyws2DRSuYtiAoG/ZY0+t2VZh3MJLcofv1wNo43M+aHJR2xWmQSE7cWjMlcw/QOmsWJBv1+Kb/nK2Q7buX/byvY8ySu5ydATnyEinzbutZXc/t/FioOtWMeqh6NlD3aPGIpUTmf8ow+c1QwZWOC3T2GWyTD5KVmAZSm77lWkpYFcd1
example-ssh,ssh.example.com,192.0.2.42 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBsUneE642qr/kzKwJcKl9Cgog/kgCqRLZwZs4J7RRt8
~~~
Ce fichier contenant les fingerprints peut aussi être placé dans `/etc/ssh/ssh_known_hosts` ou `/etc/ssh/ssh_known_hosts2` et sera ainsi utilisé par défaut par tous les utilisateurs d'une machine.
Une autre technique pour vérifier un fingerprint est d'avoir des enregistrements DNS SSHFP.
On peut les générer à l'aide de la commande `ssh-keygen` :
~~~
$ ssh-keygen -r ssh.example.com
ssh.example.com IN SSHFP 1 1 b0db7dbfe0775199662453c9d6eace6f993b9fdc
ssh.example.com IN SSHFP 1 2 13e60f2c4d2848aea91c420b783273afe6c23efd23818ab220f167a53a0be886
ssh.example.com IN SSHFP 2 1 c2ea7d50f05af4cabc8e6add3491a08654127f83
ssh.example.com IN SSHFP 2 2 1222b6f7ad0d3447a31e3cba1af2eaf8aab7316570b63cc3eccdd4d865fee474
ssh.example.com IN SSHFP 3 1 d93dbd0af9c7fd456b3fa4e9094ede031791da84
ssh.example.com IN SSHFP 3 2 3b885c365ae3cebab6dea63b3eb697d2060d9da906e129011841d665a4ccfe4f
ssh.example.com IN SSHFP 4 1 39d521c3d4b6f672149c1cc053014c9ebdfd4727
ssh.example.com IN SSHFP 4 2 0f28d1764793b519c9c74bfb7c6d0dc9b980bdf22c68d1e324d19247d8cbe161
~~~
On peut ainsi vérifier à la connexion :
~~~
$ ssh -o "VerifyHostKeyDNS ask" ssh.example.com
The authenticity of host 'ssh.example.com (192.0.2.42)' can't be established.
ED25519 key fingerprint is SHA256:sln94vzrKSsTezPvT6pyO/Glavvl7/Ao8Wcd46BeRb0.
Matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?
~~~
### ControlMaster
OpenSSH peut permettre de réutiliser une connexion en cours pour d'autres connexions via l'option `ControlMaster`.
@ -645,6 +713,23 @@ $ sshfs ssh.example.com:/foo/bar /mnt
$ fusermount -u /mnt/ssh
~~~
### X Forwarding
SSH peut créer automatiquement un tunnel et gérer la variable $DISPLAY pour afficher en local les applications graphiques distantes.
Côté serveur, il faut la présence du package `xauth` et l'option `X11Forwarding yes` dans la configuration SSH.
On peut alors lancer :
~~~
$ ssh -X ssh.example.com
$ xlogo
~~~
### mosh
<https://mosh.org/>
En cas de connexion réseau avec une latence ou de la perte de paquets, une alternative à OpenSSH est **mosh**.
## FAQ
@ -713,3 +798,50 @@ $ unset TMOUT
$ export TMOUT=999999
~~~
### Comment lister les clés SSH en mémoire d'un agent SSH ?
On peut utiliser la commande `ssh-add -l` :
~~~
$ ssh-add -l
256 71:fd:ba:ef:aa:94:27:14:05:d8:b6:db:28:e4:65:c2 /home/jdoe/.ssh/id_ed25519 (ED25519)
2048 2b:c8:ae:c0:d3:25:93:83:d4:41:4d:21:1e:80:2f:f4 rsa w/o comment (RSA)
~~~
À noter que l'on peut forcer un agent SSH à oublier les clés SSH à l'aide d'une des deux commandes suivantes :
~~~
$ ssh-add -D
All identities removed.
$ keychain --clear
* ssh-agent: All identities removed.
* gpg-agent: All identities removed.
~~~
On peut aussi verrouiller temporairement son agent SSH via :
~~~
$ ssh-add -x
Enter lock password:
Again:
Agent locked.
$ ssh-add -l
The agent has no identities.
$ ssh-add -X
Enter lock password:
Agent unlocked.
~~~
### Comment protéger un serveur SSH des attaques ?
Voici plusieurs méthodes pour protéger son serveur SSH (qui peuvent se cumuler)
- ne pas ouvrir son port SSH à l'extérieur à l'exception de certaines adresses IP
- modifier le port d'écoute de son serveur SSH pour diminuer un peu les attaques automatiques (`Port 2200` dans *sshd_config*)
- utiliser du Port Knocking pour camoufler son port SSH
- ne pas autoriser les connexions SSH avec un mot de passe (`PasswordAuthentication no` dans *sshd_config*)
- configurer [Fail2Ban](HowtoFail2Ban) pour bannir les adresses IP qui se trompent de mot de passe