¿Hay alguna manera de verificar la key SSH de un usuario para ver si la frase de contraseña está en blanco?

Estoy buscando bloquear nuestros serveres Solaris 10, RHEL 5 y SLES 11.2. Me ha llamado la atención que algunos de los usuarios no tienen frase de contraseña para sus keys SSH. ¿Hay alguna manera de verificar esto con un script?

Actualizar

A continuación he publicado el guión que escribí a partir de la respuesta que @tylerl me dio. Estoy publicando esto en caso de que alguien más necesite esta información en el futuro. Probablemente haya mejores forms de hacerlo, pero esto funciona. Todavía necesito escribir scripts adicionales para las counts que no están automontables. Gracias a todos por toda la ayuda

#!/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 está comprobando desde el server al que se está conectando la gente, entonces no hay dados. La key SSH debe descifrarse en memory antes de su uso, lo que significa que para el server tienen el mismo aspecto. A less que pueda get una copy del file de key real, está hundido.

Pero si estás en la máquina desde la que las personas se conectan, entonces es trivial, solo mira el file de la llave.

Las passwords en las keys SSH se utilizan para cifrar la key, y el file indica si se utiliza el encryption, así como de qué tipo.

Una key privada cifrada se ve así:

 -----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----- 

Mientras que uno sin cifrar se ve así:

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

El ojo entrenado podría notar que la segunda línea contiene la palabra " CIFRADO ". Esa es tu idea. Si el file contiene la palabra "CIFRADO", entonces es, si no lo está, no lo es.

Así que aquí está tu guión:

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

modificar para adaptarse a su entorno, pero se entiende la idea. Obviamente, la gente podría engañar a su script colocando la palabra "CIFRADO" en la parte inferior del file, pero asumimos que no lo hará.

El server no puede saber si la key que está utilizando para conectarse tiene una frase de contraseña o no.

La frase de contraseña se utiliza para cifrar la key SSH para el almacenamiento. Cuando usa una key SSH, se descifra en memory usando la frase de contraseña para que pueda usarse para conectarse al server. Por lo tanto, el server no tiene forma de saber si la key que se utilizó fue descifrada o no.

Si las keys privadas se almacenan en el server (en lugar de utilizarse para conectarse al server), puede verificarlo.


La respuesta de Tylerl es la forma más fácil de encontrar las keys no cifradas, aunque puede romperse si OpenSSH introduce un nuevo formatting de key (lo que hicieron recientemente). Una alternativa es usar ssh-keygen para verificar, pero ese enfoque tiene sus propios problemas.

Es difícil realizar un script de este control porque las herramientas de OpenSSH son realmente quisquillosas con sus keys, y también quieren hablar con el usuario si encuentran una key encriptada. Aquí hay una forma (difícil) de verificar, si tiene la herramienta setsid del 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 

Si dice "Clave privada no encriptada", definitivamente has encontrado una. Si no lo hace, al less puede apostar que si es una key no cifrada, SSH no la usará tal como es.

(Nota: si encuentras que /etc/ssh/ssh_host_rsa_key o algo así no está encryption, déjalo en /etc/ssh/ssh_host_rsa_key , ¡se supone que es así!)

  1. Solo puede usar la key dentro de un script. Asegúrese de que ssh no use ssh-agent en ese caso: SSH_AUTH_SOCK=

  2. OpenSSH ssh-keygen puede convertir keys privadas, pero solo si no tienen una frase de contraseña. Entonces puedes verificar el código de salida: ssh-keygen -f id_dsa -i

Advertencia H @ x0r : las acciones proporcionadas en este ejemplo podrían considerarse una violación de la privacidad del usuario y la confianza de administrador del sistema. Este ejemplo se ofrece para su conocimiento y comprensión; USTED es responsable de asegurarse de tener la autoridad, el permiso y la responsabilidad para tomar medidas basadas en estos ejemplos.

TL; DR > Si lo pirateas maliciosamente, es tu trasero … no el mío.

Si tiene privilegio de superusuario en el sistema con el file de key privado, puede probar si hay una frase de contraseña al intentar cambiar la frase de contraseña existente. Si la key privada tiene una frase de contraseña, se le pedirá la frase anterior antes de que le permita cambiarla. (Asegúrese de no ingresar ningún text, solo presione <Enter> cuando se le solicite la frase de contraseña anterior). Aquí hay una demostración:

 ### 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. $ 

No hay sorpresas allí. A continuación, le indicamos cómo decir que no tienen una frase de contraseña configurada.

 ### Example: trying to change passphrase, no phrase configunetworking 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): ... 

Busqué todo esto y nunca encontré una respuesta satisfactoria, pero me las arreglé para build una, así que …

Tenga en count que esto actualizará el file si funciona, por lo tanto, si está tratando de que los usuarios cuyas keys las testing no lo noten, primero debe copyr la key. OTOH, ya que acabas de atrapar a tu usuario con una key sin contraseña, tal vez no te importe si lo notan. :RE

 $ 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