Existe-t-il un moyen de vérifier la key SSH d'un user pour voir si la phrase secrète est vide

Je cherche à verrouiller nos servers Solaris 10, RHEL 5 et SLES 11.2. Il est venu à mon attention que certains users n'ont pas de phrase secrète pour leurs keys SSH. Y at-il un moyen je peux vérifier cela avec un script?

Mettre à jour

Ci-dessous, j'ai posté le script que j'ai écrit à partir de la réponse @tylerl m'a donné. Je publie ceci au cas où quelqu'un d'autre aurait besoin de cette information à l'avenir. Il y a probablement de meilleures façons de le faire, mais cela fonctionne. J'ai encore besoin d'écrire des scripts supplémentaires pour les counts qui ne sont pas montés automatiquement. Merci à tous pour votre aide

#!/bin/bash # This script is for checking for a blank passphrase. Meaning no passphrase to secure your SSH key. # Script most be run as root. # Example: sudo ./check-sshkeys mount share:/vol/home /mnt ls /mnt >/tmp/ls for s in `cat /tmp/ls` do echo -e "\e[1m User $s \033[0m " if ls /mnt/$s/.ssh/id_rsa 2>/dev/null then grep ENCRYPTED /mnt/$s/.ssh/id_rsa || echo -e "No RSA passphrase" else echo "RSA key not found" fi if ls /mnt/$s/.ssh/id_dsa 2>/dev/null then grep ENCRYPTED /mnt/$s/.ssh/id_dsa || echo -e "No DSA passphrase" else echo "DSA key not found" fi done rm /tmp/ls umount /mnt 

Si vous vérifiez à partir du server auquel les gens se connectent, alors pas de dés. La key SSH doit être décryptée en memory avant utilisation, ce qui signifie pour le server qu'ils ont la même apparence. À less que vous ne puissiez get une copy du file key réel, vous êtes submergé.

Mais si vous êtes connecté à la machine, alors c'est sortingvial – il suffit de regarder le file key.

Les passwords sur les keys SSH sont utilisés pour chiffrer la key et le file indique si le encryption est utilisé ou quel type.

Une key privée cryptée ressemble à ceci:

 -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-128-CBC,259001658E2E5C2618A9648EA35122F4 GFzPnlYdGYVTmK5t45xv/m0Nok9czOuFNNuS+Sm5vzGaOa7LBMtRNJgWFBCGsfFl wouThpuKxV+ArgmzPa9hnEmy18QW0sbza8SKm/3Hbqi8XwCliz2xP2xS+iGSkYDt ... LAB/DZasuYBSsVadfemDsmrRvUz7/4eJZTxoEvwNQtAWhTS8j9RbRPee4rk1fwew -----END RSA PRIVATE KEY----- 

Alors qu'un file non crypté ressemble à ceci:

 -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAtdKjJa18HbagmuMvb/gDCpXXYPVqRsXDdwTcG3YY5RlJtdxY TJD+626tLTyuzzw6ZsGJtScrSjm2Jp5uUrDXnkek39Zxj24bTM9k/tZBeAQubrwO .... I8u05jPL1WZmre5SVexfFEvAGqMdiWLvURpnQkI7Wn6nXJjEbUOdGQ== -----END RSA PRIVATE KEY----- 

L'œil formé peut remarquer que la deuxième ligne contient le mot " ENCRYPTED ". C'est votre indice. Si le file contient le mot "ENCRYPTED" alors il est, si ce n'est pas le cas, ce n'est pas le cas.

Alors voici votre script:

 grep -L ENCRYPTED /home/*/.ssh/id_rsa 

modifier en fonction de votre environnement, mais vous obtenez l'idée. De toute évidence, les gens pourraient tromper votre script en mettant le mot "ENCRYPTED" au bas du file, mais nous supposons qu'ils ne le feront pas.

Le server ne peut pas savoir si la key que vous utilisez pour vous connecter a une phrase secrète ou non.

La phrase secrète est utilisée pour crypter la key SSH pour le stockage. Lorsque vous utilisez une key SSH, il est décrypté en memory à l'aide de la phrase de passe afin de pouvoir l'utiliser pour se connecter au server. Le server n'a donc aucun moyen de savoir si la key utilisée a été décryptée ou non.

Si les keys privées sont stockées sur le server (plutôt que de les utiliser pour se connecter au server), vous pouvez vérifier cela.


La réponse de Tylerl est le moyen le plus simple de find des keys non chiffrées, bien que cela puisse casser si OpenSSH introduit un nouveau format de key (ce qu'ils ont fait récemment). Une alternative est d'utiliser ssh-keygen pour vérifier, mais cette approche a ses propres problèmes.

Il est difficile de scripter cette vérification parce que les outils OpenSSH sont très méticuleux à propos de leurs keys, et ils veulent vraiment parler à l'user s'ils trouvent une key cryptée. Voici une façon (approximative) de vérifier si vous avez l'outil setsid du package util-linux :

 if res="$(setsid </dev/null 2>&1 env -i ssh-keygen -y -f "$keyfile")" ; then echo "Unencrypted private key!" else echo "Encrypted, or unreadable, or not a private key," echo "or doesn't have correct permissions for a private key," echo "or SSH doesn't like it for some reason." echo "More info that may or may not be helpful:" printf "%s\n" "$res" fi 

S'il est écrit "Clé privée non cryptée!", Vous en avez certainement trouvé une. Si ce n'est pas le cas, vous pouvez au less parier que si c'est une key non cryptée, SSH ne l'utilisera pas telle quelle.

(NB: si vous trouvez que /etc/ssh/ssh_host_rsa_key ou autre n'est pas chiffré, laissez-le tranquille – c'est supposé être ainsi!)

  1. Vous pouvez simplement utiliser la key dans un script. Assurez-vous que ssh n'utilise pas ssh-agent dans ce cas: SSH_AUTH_SOCK=

  2. OpenSSH ssh-keygen peut convertir des keys privées mais seulement si elles n'ont pas de phrase secrète. Vous pouvez donc simplement vérifier le code de sortie: ssh-keygen -f id_dsa -i

Cavité H @ x0r – Les actions fournies dans cet exemple peuvent être considérées comme une violation de la confidentialité de l'user et de la confiance sysadmin. Cet exemple est offert pour votre connaissance et votre compréhension; VOUS êtes responsable de vous assurer que vous avez l'autorité, la permission et la responsabilité de prendre des mesures basées sur ces exemples.

TL; DR > Si vous le pirate malicieusement, c'est votre cul … pas le mien.

Si vous disposez du privilège du superuser sur le système avec le file de keys privé, vous pouvez tester s'il existe une phrase secrète en essayant de modifier la phrase secrète existante. Si la key privée contient une phrase secrète, vous serez invité à saisir l'ancienne phrase avant de pouvoir la modifier. (Assurez-vous que vous n'entrez aucun text, appuyez simplement sur <Enter> lorsque vous êtes invité à <Enter> ancienne phrase secrète.) Voici une démonstration:

 ### Example: trying to change passphrase when one already exists ### $ sudo ssh-keygen -p Enter file in which the key is (/root/.ssh/id_rsa): /home/bob/.ssh/id_rsa Enter old passphrase: Bad passphrase. $ 

Pas de surprise là-bas. Voici comment dire qu'ils n'ont pas de mot de passe configuré.

 ### Example: trying to change passphrase, no phrase configured on key ### $ sudo ssh-keygen -p Enter file in which the key is (/root/.ssh/id_rsa): /home/bob/.ssh/id_rsa Key has comment '/home/bob/.ssh/id_rsa' Enter new passphrase (empty for no passphrase): ... 

J'ai cherché partout et n'ai jamais trouvé de réponse satisfaisante, mais j'ai réussi à en build un, alors …

Notez que cela mettra à jour le file si cela fonctionne, donc si vous essayez de ne pas être remarqué par les users dont vous testez les keys, vous pouvez d'abord copyr la key. OTOH, puisque vous venez d'attraper votre user avec une key sans mot de passe, peut-être que vous ne vous souciez pas s'ils remarquent. :RÉ

 $ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST Key has comment '/home/rlpowell/.ssh/KEYTEST' Your identification has been saved with the new passphrase. $ echo $? 0 $ ssh-keygen -p -P '' -N '' -f ~/.ssh/KEYTEST Bad passphrase. $ echo $? 1