{"id":212,"date":"2015-01-09T13:45:42","date_gmt":"2015-01-09T12:45:42","guid":{"rendered":"http:\/\/almin.tf\/blog\/?p=212"},"modified":"2025-11-16T01:45:30","modified_gmt":"2025-11-16T00:45:30","slug":"securiser-ssh","status":"publish","type":"post","link":"https:\/\/almic.fr\/blog\/2015\/01\/09\/securiser-ssh\/","title":{"rendered":"S\u00e9curiser SSH"},"content":{"rendered":"<p style=\"text-align: justify;\">Le titre semble paradoxal (s\u00e9curiser Secure SHell), n\u00e9anmoins on peut am\u00e9liorer la configuration fournie par d\u00e9faut.<\/p>\n<p><!--more--><\/p>\n<p style=\"text-align: justify;\">Ce qui va suivre est pr\u00e9vu pour Debian jessie. Si ce n\u2019est pas votre distribution, vous pouvez v\u00e9rifier quels choix sont disponibles pour KexAlgorithms, Ciphers et MACs avec votre version de SSH, en faisant <i>man sshd_config<\/i>.<\/p>\n<p style=\"text-align: justify;\">Les commandes pr\u00e9fix\u00e9es d\u2019un # sont \u00e0 lancer en root. Les commandes pr\u00e9fix\u00e9es d\u2019un % sont \u00e0 lancer en simple utilisateur.<\/p>\n<h2>C\u00f4t\u00e9 serveur<\/h2>\n<p style=\"text-align: justify;\">La configuration se situe dans <i>\/etc\/ssh\/sshd_config<\/i>.<\/p>\n<h4>Version du protocole<\/h4>\n<p style=\"text-align: justify;\">Pour commencer, il faut d\u00e9sactiver le protocole 1 si ce n\u2019est pas d\u00e9j\u00e0 fait. Utiliser le protocole 1 aujourd\u2019hui, \u00e7a revient quasiment \u00e0 utiliser telnet.<\/p>\n<p><code>Protocol 2<\/code><\/p>\n<h4>Le type de cl\u00e9<\/h4>\n<p style=\"text-align: justify;\">ECDSA repose sur des nombres choisis de mani\u00e8re arbitraire et pr\u00e9sente donc un risque de backdoor. Les cl\u00e9s DSA sont limit\u00e9es \u00e0 1024 bits, ce qui n\u2019est plus suffisant depuis quelques ann\u00e9es. On va utiliser l\u2019algo ED25519, la meilleure option \u00e0 ce jour.<\/p>\n<p style=\"text-align: justify;\">Une seule ligne HostKey doit rester :<\/p>\n<p><code>HostKey \/etc\/ssh\/ssh_host_ed25519_key<\/code><\/p>\n<p style=\"text-align: justify;\">On supprime les anciennes cl\u00e9s et on g\u00e9n\u00e8re une nouvelle cl\u00e9 pour le serveur :<\/p>\n<p><code># rm -i \/etc\/ssh\/ssh_host_*key*<br \/>\n# ssh-keygen -t ed25519 -N \"\" -f \/etc\/ssh\/ssh_host_ed25519_key<\/p>\n<p style=\"text-align: justify;\">Si vous avez encore des syst\u00e8mes en wheezy, la meilleure option c\u2019est une cl\u00e9 RSA solide, avec une taille de 4096 bits :<\/p>\n<p><code># ssh-keygen -t rsa -b 4096 -N \"\" -f \/etc\/ssh\/ssh_host_rsa_key<\/code><\/p>\n<h4>L\u2019\u00e9change des cl\u00e9s<\/h4>\n<p style=\"text-align: justify;\">ECDH peut fuiter des infos lors de la synchronisation, et SHA1 est compl\u00e8tement d\u00e9pass\u00e9. On choisit donc curve25519.<\/p>\n<p><code>KexAlgorithms curve25519-sha256@libssh.org<\/code><\/p>\n<h4>L\u2019algo de chiffrement<\/h4>\n<p style=\"text-align: justify;\">L\u2019algo chacha20-poly1305 est la meilleure option \u00e0 l\u2019heure actuelle.<\/p>\n<p><code>Ciphers chacha20-poly1305@openssh.com<\/code><\/p>\n<p style=\"text-align: justify;\">Il faut aussi se soucier des algos MAC (message authentication code), qui s\u2019occupent de l\u2019int\u00e9grit\u00e9 des donn\u00e9es.<\/p>\n<p><code>MACs hmac-sha2-512-etm@openssh.com<\/code><\/p>\n<h4>Autres pr\u00e9cautions<\/h4>\n<p style=\"text-align: justify;\">SSH se base sur un mod\u00e8le TOFU (Trust On First Use). Si vous n\u2019\u00eates pas certain du r\u00e9seau utilis\u00e9 lors de la premi\u00e8re connexion, il vaut mieux ajouter manuellement les fingerprints dans <i>~\/.ssh\/known_hosts<\/i>, pour \u00e9viter un MITM sur cette premi\u00e8re connexion.<\/p>\n<p style=\"text-align: justify;\">Le port 22 fait l\u2019objet de scans automatiques, ce qui remplit les logs de lignes sans int\u00e9r\u00eat. Vous pouvez changer SSH de port et le sp\u00e9cifier dans <i>~\/.ssh\/config<\/i> pour que cela soit transparent.<\/p>\n<p style=\"text-align: justify;\">Si vous avez install\u00e9 le syst\u00e8me avant wheezy, il aura gard\u00e9 l\u2019acc\u00e8s root activ\u00e9, si vous n\u2019avez pas install\u00e9 la nouvelle version de <i>sshd_config<\/i> fournie par le paquet.<\/p>\n<p><code>PermitRootLogin no<\/code><\/p>\n<p style=\"text-align: justify;\">Limitez l\u2019acc\u00e8s SSH aux comptes que vous sp\u00e9cifiez  :<\/p>\n<p><code>AllowUsers utilisateur1 utilisateur2<\/code><\/p>\n<p style=\"text-align: justify;\">Attention, quand vous ajoutez un nouvel utilisateur sur le syst\u00e8me, il faudra l\u2019ajouter dans cette liste si vous voulez qu\u2019il puisse se connecter avec SSH. Ce dernier ne vous fournira pas un message d\u2019erreur explicite, il faudra y penser.<\/p>\n<p style=\"text-align: justify;\">Une fois les modifications termin\u00e9es, on relance SSH :<\/p>\n<p><code># service ssh restart<\/code><\/p>\n<p style=\"text-align: justify;\">Bien \u00e9videmment, \u00e0 la prochaine connexion SSH vers ce serveur, vous aurez le message suivant :<\/p>\n<pre>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @\n@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\nIT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!<\/pre>\n<p style=\"text-align: justify;\">En temps normal, c\u2019est tr\u00e8s mauvais signe, mais dans notre cas c\u2019est normal puisqu\u2019on vient de reg\u00e9n\u00e9rer la cl\u00e9 du serveur. Il suffit d\u2019\u00e9diter <i>~\/.ssh\/known_hosts<\/i> pour supprimer les lignes correspondant \u00e0 l\u2019ancienne cl\u00e9, qui sont indiqu\u00e9es dans la suite du message. Ensuite, soit vous ajoutez manuellement la nouvelle cl\u00e9 \u00e0 la fin de <i>~\/.ssh\/known_hosts<\/i>, soit vous relancez la m\u00eame commande SSH et vous acceptez la nouvelle cl\u00e9 (mais vous courez un risque de MitM pour cette connexion).<\/p>\n<h2>C\u00f4t\u00e9 client<\/h2>\n<p style=\"text-align: justify;\">On va mettre en place la m\u00eame configuration c\u00f4t\u00e9 client. Ainsi, elle s\u2019appliquera aussi aux connexions vers les serveurs que vous n\u2019administrez pas, quand c\u2019est possible. \u00c9ditez <i>\/etc\/ssh\/ssh_config<\/i> :<\/p>\n<pre>Host *\n    KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256\n    Ciphers chacha20-poly1305@openssh.com,aes256-ctr\n    MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256\nHost serveur-qui-utilise-encore-sha1\n    KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1\n    Ciphers aes256-ctr\n    MACs hmac-sha2-512,hmac-sha2-256,umac-64@openssh.com,hmac-sha1<\/pre>\n<p style=\"text-align: justify;\">Il faudra ajouter des exceptions pour les serveurs qui ne proposent que les vieux algos. Ou bien vous pouvez passer outre sur la ligne de commande, avec :<\/p>\n<p><code>% ssh -m hmac-sha1 h\u00f4te<\/code><\/p>\n<h2>Pourquoi tout \u00e7a ?<\/h2>\n<p style=\"text-align: justify;\">L\u2019espionnage industriel reste sous-\u00e9valu\u00e9. Pourtant, on sait que les compagnies am\u00e9ricaines b\u00e9n\u00e9ficient de l\u2019aide des agences gouvernementales pour faire de l\u2019espionnage industriel. Un d\u00e9put\u00e9 a assez bien <a href=\"http:\/\/lexpansion.lexpress.fr\/actualite-economique\/espionnage-economique-bercy-est-il-une-passoire_1633989.html\">r\u00e9sum\u00e9 la situation<\/a> : \u00ab\u00a0Nos principaux partenaires sont d'abord nos principaux pr\u00e9dateurs\u00a0\u00bb.<\/p>\n<p style=\"text-align: justify;\">Il faut changer de politique et chiffrer par d\u00e9faut. On ne doit passer en clair que si on a une contrainte de performance, et encore faut-il que \u00e7a soit sur des donn\u00e9es non sensibles.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le titre semble paradoxal (s\u00e9curiser Secure SHell), n\u00e9anmoins on peut am\u00e9liorer la configuration fournie par d\u00e9faut.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-212","post","type-post","status-publish","format-standard","hentry","category-reseau","radius"],"_links":{"self":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/comments?post=212"}],"version-history":[{"count":27,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/212\/revisions"}],"predecessor-version":[{"id":675,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/posts\/212\/revisions\/675"}],"wp:attachment":[{"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/media?parent=212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/categories?post=212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/almic.fr\/blog\/wp-json\/wp\/v2\/tags?post=212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}