¿Cómo puedo determinar si la clave SSH de alguien contiene una frase de contraseña vacía?

44

Algunos de mis sistemas Linux y FreeBSD tienen docenas de usuarios. El personal utilizará estos nodos de "puerta de enlace ssh" para SSH en otros servidores internos.

Nos preocupa que algunas de estas personas usen una clave SSH privada sin cifrar (una clave sin una frase de contraseña . Esto es malo , porque si un cracker alguna vez obtuvo acceso a su cuenta en esta máquina, podrían robar la clave privada y ahora tener acceso a cualquier máquina que use esta misma clave. Por razones de seguridad, requerimos que todos los usuarios cifren sus claves SSH privadas con una frase de contraseña.

¿Cómo puedo saber si una clave privada no está encriptada (por ejemplo, no contiene una frase de contraseña)? ¿Existe un método diferente para hacer esto en una clave blindada ASCII frente a una clave no blindada ASCII?

Actualizar:

Para aclarar, suponga que tengo acceso de superusuario en la máquina y puedo leer las claves privadas de todos.

Stefan Lasiewski
fuente
2
grumble ssh-agent grumble No debería haber ninguna clave privada en la puerta de enlace.
derobert
Algunas notas pedantes: - Los usuarios a menudo tienen una frase de contraseña pobre . - Los usuarios pueden cambiar las frases de contraseña. - El usuario puede almacenar sus claves en múltiples lugares. - Es probable que los usuarios usen el agente ssh para que puedan desbloquear la clave una vez, digamos en su computadora portátil.
Ben Hyde

Respuestas:

59

Bueno, las claves privadas OpenSSH con frases de contraseña vacías en realidad no están encriptadas.

Las claves privadas cifradas se declaran como tales en el archivo de clave privada. Por ejemplo:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,7BD2F97F977F71FC

BT8CqbQa7nUrtrmMfK2okQLtspAsZJu0ql5LFMnLdTvTj5Sgow7rlGmee5wVuqCI
/clilpIuXtVDH4picQlMcR+pV5Qjkx7BztMscx4RCmcvuWhGeANYgPnav97Tn/zp
...
-----END RSA PRIVATE KEY-----

Entonces algo como

# grep -L ENCRYPTED /home/*/.ssh/id_[rd]sa

debería hacer el truco.

cabeza de código
fuente
3
@ jmanning2k: Acabo de crear una clave privada RSA sin frase de contraseña, y no contiene la cadena 'Cifrado: ninguno'.
Stefan Lasiewski
@ jmanning2k: el -Lindicador enumera solo los nombres de archivo que no coinciden con el patrón. Entonces esta respuesta es correcta por sí sola.
bahamat
Estoy corregido, comentario eliminado para mayor claridad. Para el registro, tengo algunos archivos de clave privada de Putty copiados, que dicen 'Cifrado: ninguno'.
jmanning2k
2
o cadena OPENSSH: ver tedunangst.com/flak/post/…
Jack
10

Busqué todo esto y nunca encontré una respuesta satisfactoria, pero logré construir una, así que ...

Tenga en cuenta que esto actualizará el archivo si funciona, por lo que si está tratando de que los usuarios cuyas claves esté probando no lo noten, puede copiar primero la clave. OTOH, dado que acabas de atrapar a tu usuario con una clave sin contraseña, tal vez no te importe si se dan cuenta. :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
rlpowell
fuente
3
¿Por qué no en su -N ''lugar para que la frase de contraseña se deje siempre sin cambios?
trata bien tus modificaciones el
Facepalm Eso es perfecto, muchas gracias.
rlpowell
+1 porque esta solución incluso funciona con el nuevo formato de clave privada de SSH.
Sebastian Krysmanski el
8

Si tiene acceso a la clave privada, supongo, puede usarla sin frase de contraseña para autenticarse con la clave pública. Si esto funciona, sabes que no tiene frase de contraseña. Si lo hubiera hecho, le daría un mensaje de error.

Si no tiene acceso a la clave privada, dudo que pueda detectar esto. El propósito de la frase de contraseña es "desbloquear" la clave privada, no tiene ninguna función con respecto a la clave pública.

De hecho, si lo hiciera, haría que el sistema fuera menos seguro. Se podría usar la clave pública, que está disponible para tratar de montar fuerza bruta u otros ataques que intentan descifrar la frase de contraseña.

txwikinger
fuente