--- categories: OpenBSD sysadmin title: Howto SSH ... * Documentation : SSH est un protocole réseau permettant de se connecter sur une machine à travers le réseau de manière sécurisée. Nous utilisons l'implémentation la plus répandue : [OpenSSH](https://www.openssh.com/). 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 ### Debian On peut installer la partie client et la partie serveur indépendamment : ~~~ # apt install openssh-client # ssh -V OpenSSH_6.7p1 Debian-5+deb8u3, OpenSSL 1.0.1t 3 May 2016 # apt install openssh-server # nc localhost 22 SSH-2.0-OpenSSH_6.7p1 Debian-5+deb8u3 ~~~ ### OpenBSD OpenSSH étant développé au sein d'OpenBSD, la partie cliente et la partie serveur sont incluses dans la base. L'activation de la partie serveur dépend du choix qui a été fait lors de l'installation. ## Configuration SSH ### Configuration minimale ~~~ /etc/ssh ├── moduli ├── ssh_config ├── sshd_config ├── ssh_host_dsa_key ├── ssh_host_dsa_key.pub ├── ssh_host_ecdsa_key ├── ssh_host_ecdsa_key.pub ├── ssh_host_ed25519_key ├── ssh_host_ed25519_key.pub ├── ssh_host_rsa_key └── ssh_host_rsa_key.pub ~~~ La configuration de base qu'on utilise (les options commentées sont les valeurs par défaut). ~~~ # Package generated configuration file # See the sshd_config(5) manpage for details # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes # Logging SyslogFacility AUTH LogLevel INFO # Authentication: LoginGraceTime 120 PermitRootLogin no StrictModes yes RSAAuthentication yes PubkeyAuthentication yes #AuthorizedKeysFile %h/.ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication #IgnoreUserKnownHosts yes # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to yes to enable challenge-response passwords (beware issues with # some PAM modules and threads) ChallengeResponseAuthentication no # Change to no to disable tunnelled clear text passwords #PasswordAuthentication yes X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes #UseLogin no Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes AllowUsers johndoe janedoe alice bob Match Address 192.0.2.42 PasswordAuthentication yes Match User alice bob PasswordAuthentication no ~~~ ### Log verbeux pour SFTP Pour augmenter la verbosité du sous-système sftp-server, notamment loguer les commandes SFTP, il suffit de passer l'option -l à l'appel de sftp-server dans sshd_config : ~~~ Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO ~~~ ### SFTP chroot Voici un ensemble de commandes pouvant être utilisé pour mettre en place un accès SFTP pour un ou plusieurs utilisateurs, qui n'auront accès qu'à une vue limitée de l'arborescence du système : ~~~ # Répertoire dans lequel SSHD va se chrooter mkdir /home/sftp chmod 755 /home/sftp # Les utilisateurs du groupe sftp (ici account1) disposeront de l'accès SFTP restreint groupadd sftp useradd -g sftp -d /account1 account1 mkdir /home/sftp/account1/ chown account1:sftp /home/sftp/account1/ chmod 700 /home/sftp/account1/ ~~~ Dans le fichier /etc/ssh/sshd_config : ~~~ Subsystem sftp internal-sftp Match group sftp ChrootDirectory /home/sftp X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ~~~ ### SFTP Only Mettre shell /usr/lib/sftp-server pour l'utilisateur et s'assurer que ce shell est bien présent dans /etc/shells ~~~ # usermod -s /usr/lib/sftp-server userna # echo '/usr/lib/stfp-server' >> /etc/shells ~~~ ## Administration SSH ### .ssh/config Il est possible de configurer des sortes d'*alias* pour son utilisateur unix via le fichier `~/.ssh/config` Un exemple plutôt complet (on n'a pas besoin forcément de décrire tout ça) sans être exhaustif : ~~~ Host www00 Hostname www00.example.com Port 2222 User johndoe IdentityFile ~/.ssh/id_ed25519 ProxyCommand ssh bastion -W %h:%p ~~~ ### Agent SSH Il est très important (comprendre vital) de protéger sa clé ssh avec un mot de passe lors de sa création. Taper son mot de passe à chaque connexion peut-être pesant, on peut donc passer par l'agent ssh qui va retenir en mémoire le mot de passe (de la même manière que sudo par exemple). Pour l'utiliser il convient de rajouter dans son fichier `~/.profile` (ou équivalent) la ligne : ~~~ eval $(ssh-agent) 1> /dev/null ~~~ Ensuite pour rajouter la clé dans un agent il suffit de taper la commande ~~~ $ ssh-add /home/user/.ssh/id_secure ~~~ Néanmoins, contrairement à sudo où l'accès est temporaire, dans le cas présent l'agent garde les clés de manière illimité ce qui n'est pas forcément bon. On pourra donc utiliser l'option [-t](http://man.openbsd.org/ssh-agent#t) pour spécifier une durée. On peut lire dans des tutoriels d'utiliser l'option -A de ssh(1) pour se connecter à des machines via une autre machine. Cependant cela donne accès aux utilisateurs root la machine sur laquelle vous mettez votre agent de se connecter, en utilisant vos clés, à d'autres machines. On privilégiera donc d'utiliser l'option -J de ssh(1) pour faire un rebond. ### Obtenir l'empreinte de la clé publique du serveur ~~~ $ ssh-keygen -lf /etc/ssh/clé.pub ~~~ ### Regénérer les clés du serveur #### Sous Debian : ~~~ # mv /etc/ssh/{moduli,*key*} /tmp/ssh/ # dpkg-reconfigure openssh-server Creating SSH2 RSA key; this may take some time ... Creating SSH2 DSA key; this may take some time ... Restarting OpenBSD Secure Shell server: sshd. ~~~ #### Sous OpenBSD : ~~~ # rm -i /etc/ssh/ssh_host_* # ssh-keygen -A ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 ~~~ À noter que c'est fait à chaque boot (via */etc/rc*), si les clés n'existent pas donc une autre solution est de supprimer les clés et de rebooter. ### reload/restart le démon ssh sur Debian sans passer par le script d'init Pour reload : ~~~ # start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd ~~~ Pour redémarrer : ~~~ # start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/sshd.pid # start-stop-daemon --start --quiet --pidfile /var/run/sshd.pid --exec /usr/sbin/sshd ~~~ ## Restriction de l'accès d'une clé ssh Pour autoriser une clé SSH en limitant les accès via `.ssh/authorized_keys` : ~~~ no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa XXXXX commentaires ~~~ ### VPN over SSH Côté serveur SSH : - Ajouter "PermitTunnel yes" dans la config ssh - sysctl -w net.ipv4.ip_forward=1 - iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE Puis se connecter de root vers root : ~~~ # ssh -w 42:42 ssh.example.com ~~~ On a ensuite un périphérique "tun42" utilisable des 2 côtés à configurer. Serveur SSH : ifconfig tun42 172.17.18.2/24 En local : ifconfig tun42 172.17.18.1/24 On peut alors router au niveau IP : ip route add 8.8.8.8/32 via 172.17.18.2 dev tun42 ## Connexion SSH par rebond Il se peut qu'on doive passer par une machine pour se connecter à une machine cible (c'est le principe d'un [bastion](https://fr.wikipedia.org/wiki/Bastion_(informatique))) : ~~~ $ ssh -J bastion machine-cible ~~~ À noter que cela nécessite une version récente d'OpenSSH (celle présente dans Stretch est ok, mais pas celle de Jessie) ### Tunnel SSH #### Pour une ressource donnée Si on veut accéder via la machine 192.0.2.4 à un service https hébergé sur 192.0.2.5 mais que seule la machine 192.0.2.6 y accède on peut lancer la commande : ~~~ $ ssh -L 192.0.2.4:9000:192.0.2.5:443 192.0.2.6 ~~~ On peut ensuite faire pointer son navigateur sur https://192.0.2.4:9000. #### Pour tout le trafic web On lance la commande ~~~ $ ssh -D 6789 proxy ~~~ Puis on configure son navigateur pour utiliser un proxy SOCKS (4a ou 5) avec comme adresse 127.0.0.1 et port 6789. ### Séquence d'échappement On peut des séquences d'échappement pour communiquer avec le client ssh dans le terminal. La séquence la plus connue permet de tuer une session ssh qui ne répond plus (perte de connexion internet, problème sur le serveur ou autre), il faut taper sur la touche entrée puis sur `~` et `.`. D'autres séquences d'échappement sont possibles, voir [cet article](https://lonesysadmin.net/2011/11/08/ssh-escape-sequences-aka-kill-dead-ssh-sessions/amp/).