====== SSH ====== {{indexmenu>:start:securite:SSH#5}} Voici les paramètres les plus sécurisés pour un serveur SSH adaptable à tous les systèmes *NIX. Pour les explications voir les sources: * [[http://blog.adminrezo.fr/2016/01/comment-choisir-sa-cle-ssh-rsa-dsa-ecdsa-ed25519/|http://blog.adminrezo.fr/2016/01/comment-choisir-sa-cle-ssh-rsa-dsa-ecdsa-ed25519/]] * [[https://www.guillaume-leduc.fr/securiser-secure-shell-ssh.html|https://www.guillaume-leduc.fr/securiser-secure-shell-ssh.html]] * [[https://github.com/e2ma3n/sshc|https://github.com/e2ma3n/sshc]] * [[https://www.noobunbox.net/serveur/securite/securiser-ssh-avec-sshfp|https://www.noobunbox.net/serveur/securite/securiser-ssh-avec-sshfp]] * [[http://damiengustave.fr/ssh-blamer/|http://damiengustave.fr/ssh-blamer/]] * [[https://medium.com/swlh/ssh-how-does-it-even-9e43586e4ffc#.gdmpwzlyl|https://medium.com/swlh/ssh-how-does-it-even-9e43586e4ffc#.gdmpwzlyl]] * [[https://blog.nathanaelcherrier.com/2016/08/10/fabriquer-sa-cle-usb-rsa/|https://blog.nathanaelcherrier.com/2016/08/10/fabriquer-sa-cle-usb-rsa/]] * [[https://github.com/mcginty/shoop|https://github.com/mcginty/shoop]] * [[https://www.abyssproject.net/2016/08/regler-problemes-de-connexion-longues-ssh-debian-rhel/|https://www.abyssproject.net/2016/08/regler-problemes-de-connexion-longues-ssh-debian-rhel/]] * [[https://www.abyssproject.net/2016/08/securiser-son-serveur-et-son-client-openssh/|https://www.abyssproject.net/2016/08/securiser-son-serveur-et-son-client-openssh/]] * [[https://upandclear.org/2016/09/01/pac-manager-gestionnaire-ssh-ftp-telnet-etc/|https://upandclear.org/2016/09/01/pac-manager-gestionnaire-ssh-ftp-telnet-etc/]] * [[https://code.facebook.com/posts/365787980419535/scalable-and-secure-access-with-ssh/?_fb_noscript=1|https://code.facebook.com/posts/365787980419535/scalable-and-secure-access-with-ssh/?_fb_noscript=1]] * [[https://www.debian-fr.org/t/clipboard-configuration-ssh-securisee-key/69006|https://www.debian-fr.org/t/clipboard-configuration-ssh-securisee-key/69006]] * [[https://wiki.openwrt.org/doc/uci/dropbear|https://wiki.openwrt.org/doc/uci/dropbear]] * [[https://wiki.openwrt.org/oldwiki/dropbearpublickeyauthenticationhowto|https://wiki.openwrt.org/oldwiki/dropbearpublickeyauthenticationhowto]] * [[https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/ssh-agent|https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/ssh-agent]] * [[https://wiki.mozilla.org/Security/Guidelines/OpenSSH|https://wiki.mozilla.org/Security/Guidelines/OpenSSH]] * [[https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/ssh-agent|https://github.com/robbyrussell/oh-my-zsh/tree/master/plugins/ssh-agent]] * SFTP [[http://linuxfr.org/users/eaufroide/journaux/tuto-howto-sshfs-mises-en-place-et-montage|http://linuxfr.org/users/eaufroide/journaux/tuto-howto-sshfs-mises-en-place-et-montage]] * honeypot - [[https://github.com/jaksi/sshesame|https://github.com/jaksi/sshesame]] * change comment ending key [[http://serverfault.com/questions/309171/possible-to-change-email-address-in-keypair|http://serverfault.com/questions/309171/possible-to-change-email-address-in-keypair]] * Controler des tunnels SSH en arrière-plan - http://damiengustave.fr/controler-des-tunnels-ssh-en-arriere-plan/ * Notification Mobile pour SSH - https://blog.genma.fr/?SSH-Notification-par-SMS-Freemobile-a-la-connexion * MySecureShell - SFTP Better - https://ancel1.fr/2017/01/29/a-la-decouverte-de-mysecureshell/ * Connexion qui se bloque - https://wiki.debian.org/fr/SSH#SSH_se_bloque * TCP-Wrapper pour augmenter la sécurité - http://www.dsfc.net/infrastructure/securite/renforcer-la-securite-de-vos-serveurs-ssh-avec-tcp-wrapper/ * SSH vers IPv6 - https://techoverflow.net/2018/06/09/how-to-ssh-to-an-ipv6-address/ * Rebond - https://blog.seboss666.info/2017/04/monter-un-rebond-ssh/ * Mozilla secure guide https://blog.adminrezo.fr/2017/04/serveur-openssh-bien-configure-securise/ * SFTP chroot https://memo-linux.com/sftp-ajouter-un-acces-vers-un-repertoire-en-dehors-du-chroot-de-lutilisateur/ * Fail2ban https://blog.garamotte.net/posts/2018/01/07/fr-limit-brute-force-attacks-on-the-ssh-service.html * Paramiko http://www.paramiko.org/installing.html * ControlMaster - https://www.blog-libre.org/2019/05/11/loption-controlmaster-de-ssh_config/ * Option Match - https://www.blog-libre.org/2015/11/21/loption-match-de-sshd_config/ * https://unix.stackexchange.com/questions/454728/can-an-ssh-config-host-have-multiple-hostname-entries * AutoSSH & Reverse SSH: * https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/ * https://raymii.org/s/tutorials/Autossh_persistent_tunnels.html * https://b5.pm/fr/post/auto_reverse_ssh/ * https://gist.github.com/thomasfr/9707568 * Cyber Plumber - https://github.com/opsdisk/the_cyber_plumbers_handbook ===== Version rapide (sans configuration - OneKillerLine) ===== Aujourd’hui la clé RSA 4096 est le meilleur rapport qualité/compatibilité mais vous pouvez déjà commencer à utiliser ED25519 pour les OS récents. __Régénération du moduli__ \\ ''awk '$5> 2000' /etc/ssh/moduli> “${HOME}/moduli”; wc -l “${HOME}/moduli”; sudo mv “${HOME}/moduli” /etc/ssh/moduli'' \\ \\ __Création du moduli__ \\ ''sudo ssh-keygen -G /etc/ssh/moduli.all -b 4096; sudo ssh-keygen -T /etc/ssh/moduli.safe -f /etc/ssh/moduli.all; sudo mv /etc/ssh/moduli.safe /etc/ssh/moduli; sudo rm /etc/ssh/moduli.all'' \\ \\ __Régénération des clés serveur__ \\ ''cd /etc/ssh; sudo rm ssh_host_*key*; sudo ssh-keygen -t ed25519 -f ssh_host_ed25519_key KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 Et dans /etc/ssh/ssh_config : # Github a parfois besoin de diffie-hellman-group-exchange-sha1, mais pas toujours #Host github.com # KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 Host * KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 Si vous choisissez d’activer le 5, ouvrez /etc/ssh/moduli s’il existe et supprimez les lignes où la cinquième colonne est inférieure à 2000 : awk '$5> 2000' /etc/ssh/moduli> "${HOME}/moduli" wc -l "${HOME}/moduli" # Assure-vous que le fichier généré ne soit pas vide sudo mv "${HOME}/moduli" /etc/ssh/moduli //**OKL:**// ''awk '$5> 2000' /etc/ssh/moduli> "${HOME}/moduli"; wc -l "${HOME}/moduli"; sudo mv "${HOME}/moduli" /etc/ssh/moduli'' Ou s’il n’existe pas, créez-le : sudo ssh-keygen -G /etc/ssh/moduli.all -b 4096 sudo ssh-keygen -T /etc/ssh/moduli.safe -f /etc/ssh/moduli.all sudo mv /etc/ssh/moduli.safe /etc/ssh/moduli sudo rm /etc/ssh/moduli.all //**OKL:**// ''sudo ssh-keygen -G /etc/ssh/moduli.all -b 4096; sudo ssh-keygen -T /etc/ssh/moduli.safe -f /etc/ssh/moduli.all; sudo mv /etc/ssh/moduli.safe /etc/ssh/moduli; sudo rm /etc/ssh/moduli.all'' Cette étape risque de prendre un peu de temps… Environ 4h sur mun petit Intel Core i3-4010U CPU @ 1.7GHz. ===== L’authentification ===== ==== Authentification du serveur ==== La ligne à mettre dans /etc/ssh/sshd_config Protocol 2 HostKey /etc/ssh/ssh_host_ed25519_key HostKey /etc/ssh/ssh_host_rsa_key La configuration ci-dessus désactive aussi la v1 du protocole SSH, troué de partout et qui de toute manière ne devrait JAMAIS être activée. Nous pouvons aussi supprimer les clés inutilisées et générées par OpenSSH lors de son installation afin de regénérer des clés RSA et Ed25519 plus longues et plus robustes. cd /etc/ssh sudo rm ssh_host_*key* sudo ssh-keygen -t ed25519 -f ssh_host_ed25519_key //**OKL:**// ''cd /etc/ssh; sudo rm ssh_host_*key*; sudo ssh-keygen -t ed25519 -f ssh_host_ed25519_key PasswordAuthentication no ChallengeResponseAuthentication no La configuration recommandée pour /etc/ssh/ssh_config : Host * PasswordAuthentication no ChallengeResponseAuthentication no La méthode la plus sûre et la plus répandue passe par l’utilisation d’une clé publique, tout comme l’authentification du serveur évoquée précédemment. Côté serveur (/etc/ssh/sshd_config) cela donne : PubkeyAuthentication yes Et côté client (/etc/ssh/ssh_config) : Host * PubkeyAuthentication yes HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa Les clés SSH peuvent être générées avec les commandes suivantes : ssh-keygen -t ed25519 -o -a 100 ssh-keygen -t rsa -b 4096 -o -a 100 //**OLK:**// ''ssh-keygen -t ed25519 -o -a 100; ssh-keygen -t rsa -b 4096 -o -a 100'' Et le déploiement de vos nouvelles clés publique via ssh-copy-id. ssh-copy-id -i .ssh/id_ed25519.pub utilisateur@serveur ==== Authentification de l’utilisateur ==== La directive AllowUsers dans /etc/ssh/sshd_config vous permet de spécifier quels sont les utilisateurs autorisés à se connecter via SSH. Mais cela peut s’avérer compliqué si vous avez à gérer un nombre important d’utilisateurs. D’autant plus que si vous supprimez l’un d’entre eux, celui-ci ne sera pas retiré de /etc/ssh/sshd_config, ce qui alourdit encore plus la maintenance. Une solution possible est de se tourner vers AllowGroups à la place, et d’ajouter un groupe ssh-users sur votre machine par exemple. Ce qui donnerait dans /etc/ssh/sshd_config: '' '' AllowGroups ssh-users Rappels pour créer le groupe et ajouter un utilisateur dedans : '' '' sudo groupadd ssh-users sudo usermod -a -G ssh-users utilisateur ===== Chiffrement symétrique ===== On a donc pour /etc/ssh/sshd_config : Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr Et pour /etc/ssh/ssh_config Host * Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr ===== Codes d’authentification de message ===== L’extrait pour /etc/ssh/sshd_config : MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com Et pour /etc/ssh/ssh_config : Host * MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com ===== Prévenir le vol de clé ===== ==== Durcir son système ==== /etc/ssh/ssh_config : Host * UseRoaming no ==== Stockage de votre clé ==== Vous devriez utiliser un mot de passe fort pour la clé privée de votre client. Vous pouvez en plus utiliser ''ssh-keygen -o -a'' pour ralentir les tentatives de cassage en itérant la fonction de hash plusieurs fois.