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> * 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](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 ## Installation
@ -243,6 +238,8 @@ Host foo ssh.example.com
Host sql.example.com Host sql.example.com
IdentityFile ~/.ssh/id_bastion_ed25519 IdentityFile ~/.ssh/id_bastion_ed25519
ProxyCommand ssh bastion.example.com -W %h:%p ProxyCommand ssh bastion.example.com -W %h:%p
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host nfs.example.com Host nfs.example.com
ProxyCommand ssh -W bastion.example.com:2222 john@192.0.2.111 ProxyCommand ssh -W bastion.example.com:2222 john@192.0.2.111
@ -281,7 +278,18 @@ Options utiles pour `scp` :
## SFTP ## 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 ### chroot SFTP
@ -418,7 +426,7 @@ no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa XXXXX co
### Agent SSH ### Agent SSH
Il est important de protéger une clé SSH utilisée par humain par une passphrase. 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. En général, un agent SSH est lancé par son Window Manager.
Sinon, on peut le lancer automatiquement via son `~/.profile` : 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 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 $ 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 # 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 ### Proxy SOCKS via SSH
On peut lancer un proxy SOCKS passant par un serveur distant ainsi : 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 ### 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 $ 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. > *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 ### VPN over SSH
On peut utiliser OpenSSH comme VPN ! 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 $ 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 ### ControlMaster
OpenSSH peut permettre de réutiliser une connexion en cours pour d'autres connexions via l'option `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 $ 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 ## FAQ
@ -713,3 +798,50 @@ $ unset TMOUT
$ export TMOUT=999999 $ 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