Ça date mais j'attendais que ça se stabilise après les révélations d'Appelbaum et Poitras lors du 31C3 car la sécurité dans l'urgence est le moyen le plus sûr de faire n'importe quoi et d'obtenir un résultat pire que la situation que l'on cherche à améliorer/résoudre. À ce sujet, se reporter à la fin du billet linké par ce shaarli qui cause justement des mauvais choix initiaux faits en réaction zélée à la présentation d'Appelbaum et Poitras.
Je pense que la crypto dans SSH est de la poudre aux yeux. Le débat RSA versus EC, par exemple, est un faux débat certes très intéressant pour les cryptographes (car ça permet les avancées) mais pas pour un adminsys. Les limites pratiques de la cryptographie surviennent sur des choses beaucoup plus connes et concrètes : générateur de nombres pseudos aléatoires pas assez aléatoires, bug logiciel, cryptographie mal utilisée (de la crypto avec IE6 sous XP, comment dire ...), ... Les deux procédés (EC et RSA) sont toujours d'actualité. Le seul argument de plus en faveur des courbes elliptiques est leur faible taille (à niveau de sécurité jugé équivalent) et des temps de traitement plus courts donc une meilleure montée en charge. Débat intéressant : la NSA recommande officiellement d'utiliser les courbes elliptiques plutôt que RSA, avec, dans le lot la courbe P-256 normalisée par le NIST. Partant de là : la NSA sait-elle casser RSA (et c'est donc pour cela qu'elle conseille aux sociétés/administrations US de passer à EC) ou EC-P256 (et c'est donc pour un espionnage massif qu'elle conseille d'y migrer) ? Pour se protéger de la NSA, faut-il suivre les conseils de la NSA ou aller à l'encontre ? :)
Typiquement, avec SSH, la sécurité repose sur d'autres paramètres, notamment :
* Désactiver SSHv1 ;
* Authentification des clients par clé ou, à défaut, par mot de passe avec, dans ce cas-là, un anti-bruteforce ;
* Désactiver la possibilité pour root de se connecter à distance (compte classique + su : double sécurité), utiliser la directive de configuration « Users » (qui permet d'indiquer quels utilisateurs du système sont autorisés à se connecter à distance) ;
* Vérifier la fingerprint de la clé du serveur lors de la première connexion ! Ne pas mettre "yes" aveuglement ! Les fois suivantes, ne pas ignorer les messages d'erreur de SSH ! Et dans un futur proche, utiliser DNSSEC + SSHFP (
http://shaarli.guiguishow.info/?X1OYWg)
* UseDNS à no car en cas d'attaque volumétrique ((D)DoS), une requête DNS est effectuée à chaque connexion pour écrire dans auth.log : le déni de service est aggravé.
Une autre ressource intéressante pondue par Aeris :
https://pad.lqdn.fr/p/ssh-hardening
« Ciphers :
* RC4 est notoirement troué, donc à supprimer --> voir à ce propos le changelog
http://www.openssh.com/txt/release-6.7
* CBC n’a pas d’avantage comparé à GCM ou CTR, à supprimer source ? GCM n’est pas breveté, et GCM/CTR supportent la parallélisation
* Blowfish n’est pas recommandé à l’usage par Bruce Schneier (son concepteur) lui-même source ? ?
https://www.computerworld.com.au/article/46254/bruce_almighty_schneier_preaches_security_linux_faithful/?pp=3
* Privilégie les méthodes non AES (chacha-poly)
* Trie des AES dans l’ordre de taille de clef
* Préférence pour GCM, puis CTR
* CAST128 est breveté
HostKey :
* Pas d’utilité des suites -cert (pas utilisé ?)
* Privilégie les méthodes ECC sur RSA/DSA
* Privilégie les méthodes non NIST (ED) sur celles NIST (ECDSA)
Kex :
* Suppression des suites SHA-1 (trop faible)
* Privilégier les ECC sur les DH
* Privilégie les méthodes non NIST (CURVE) sur celles NIST (ECDH)
MACs :
* Suppression SHA-1 et MD-5 (trop faible)
* Suppression des algos < 128 bits (64 & 96)
* Trie dans l’ordre des tailles de hash (512, 256 puis 128)
* Privilégier les -ETM (encrypt then mac)
* Privilégier RIPEMD sur SHA-2 ?
* Quid sécu UMAC comparée à HMAC / SHA-2 / RIPyMEND ? »
Ce qui suit se place dans un contexte d'auto-hébergement : je suis le (quasi) seul utilisateur de mes machines, je n'ai pas de clients/adhérents/autres. Dans le cas contraire, il faut être très prudent dans les algorithmes que l'on désactive car on exclu souvent des logiciels clients. Exemple : PuTTY ne supporte pas hmac-sha512, WinSCP ne supporte pas curve25519-sha256, la version d'OpenSSH sur FreeBSD ne supporte pas hmac-sha512, ...
Et rappelez-vous : je ne suis pas une bête en crypto, hein. ;)
L'union des deux ressources précédentes donne ça :
---- HostKeyAlgorithms (côté client !)
1) On vire les algos « -cert » car inutilisés, on ajoute « ssh-ed25519 » (algo récent, courbes elliptiques, hors NIST) :
ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,ssh-rsa
2) Plus nazi : on vire ssh-dss. Puis on vire les ecdsa possiblement owned par NIST/NSA
ssh-ed25519,ssh-rsa
Ça donne ça :
Pour Debian Jessie :
Host *
HostKeyAlgorithms ssh-ed25519,ssh-rsa
Pour Debian Wheezy (ssh-ed25519 n'est pas présent dans la version 6.0 d'OpenSSH)
Host *
HostKeyAlgorithms ssh-rsa
3) On continue côté serveur :
Sous Wheezy, dans /etc/sshd_config, il doit rester une seule ligne :
HostKey /etc/ssh/ssh_host_rsa_key
Pour Jessie :
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
4) On peut aussi en profiter pour régénérer des clés robustes (attention donc à vos clients qui vous informerons, à raison, que la fingerprint de votre serveur a changé).
cd /etc/ssh
rm ssh_host_*key*
ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key
Sous Jessie on peut ajouter :
ssh-keygen -t ed25519 -f ssh_host_ed25519_key
---- KexAlgorithms
1) On vire les algos avec sha1 (car avancées cryptos, un des prochains algos qui tomberont, prendre de l'avance,...) :
curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256
2) Plus nazi : on vire les ecdh possiblement owned par NIST/NSA
curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ça donne ça :
Pour Debian Jessie :
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Pour Debian Wheezy (curve25519-sha256@libssh.org n'est pas présent dans la version 6.0 d'OpenSSH)
KexAlgorithms diffie-hellman-group-exchange-sha256
awk '$5 > 2000' /etc/ssh/moduli > "${HOME}/moduli"
wc -l "${HOME}/moduli" # make sure there is something left
mv "${HOME}/moduli" /etc/ssh/moduli
---- Ciphers
1) On vire tous les ciphers faibles (arcfour (petit nom de RC4), 3DES) ou couverts par un brevet (cast128).
chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
2) Nazi par GuiGui : virer les algos 128/192 bits puisque 256 bits disponibles
chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
Ça donne ça :
Pour Debian Jessie :
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
Pour Debian Wheezy (chacha20-poly1305 et GCM ne sont pas implémentés dans la version 6.0 d'openSSH)
Ciphers aes256-ctr
---- MACs
1) On vire les fonctions de hachage faibles/cassées (MD5, SHA1)
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
2) Pour moi encrypt-then-MAC (
http://www.bortzmeyer.org/7366.html) passe après l'utilisation de bons algos, je fais + confiance aux fonctions de la famille sha2 (même si normalisées au NIST, l'important est leur robustesse démontrée par l'usage et surtout, la variété : utiliser des algos pas normalisés par le NIST en complément d'algos normalisés par le NIST), enfin, ripemd160 arrive en dernier
Macs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160-etm@openssh.com,umac-128@openssh.com,hmac-ripemd160
3) Encore plus nazi : on vire umac-128 (que je ne connais pas), ripemd160 (car seulement 160 bits comme sha1), et on vire sha256 puisque sha512 est disponible
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-512
Ça donne ça :
Pour Debian Jessie :
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-512
Pour Debian Wheezy (encrypt-then-MAC n'est pas disponible dans OpenSSH 6.0):
MACs hmac-sha2-512
On peut aussi blinder la conf' côté client et mettre les directives de configurations suivantes :
Pour Debian Jessie :
Host *
HostKeyAlgorithms ssh-ed25519,ssh-rsa
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-512
Pour Debian Wheezy :
Host *
HostKeyAlgorithms ssh-rsa
KexAlgorithms diffie-hellman-group-exchange-sha256
Ciphers aes256-ctr
MACs hmac-sha2-512
Mais attention si vous vous connectez sur différents équipements qui n'ont pas le support de ces algorithmes (routeurs/switchs, appliances, ...) car le debug est un peu chiant pour identifier la cause.