From d83595c102d1a359887de26b7833ef1c4054c605 Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Sun, 29 Oct 2017 01:40:29 +0200 Subject: [PATCH] =?UTF-8?q?relecture=20et=20compl=C3=A9ments=20avant=20pub?= =?UTF-8?q?lication?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HowtoOpenSSH.md | 152 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 142 insertions(+), 10 deletions(-) diff --git a/HowtoOpenSSH.md b/HowtoOpenSSH.md index c01a0242..78f13787 100644 --- a/HowtoOpenSSH.md +++ b/HowtoOpenSSH.md @@ -6,13 +6,8 @@ title: Howto OpenSSH * Documentation : [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 + + + +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 +