¿Cómo puedo desactivar SSH KeychainIntegration en OS X Mavericks?

18

Tengo algunos problemas con SSH KeychainIntegration en OS X Mavericks. He intentado hurgar en el sitio de soporte de Apple, pero no he visto a nadie que tenga mi problema. He visto a muchas personas que aparentemente no saben cómo usar SSH tan bien, así que decidí probar con otra comunidad.

Primero, mi configuración está funcionando. Puedo usar mi par de claves y ssh en los hosts cuando lo necesito, con mis credenciales almacenadas en caché en el agente. Puedo ver mis credenciales en caché a través de "ssh-add -l", como se esperaba. Se me solicita que ingrese mi contraseña mediante un cuadro de diálogo de estilo OS X, con una casilla de verificación que dice "Recordar contraseña en mi llavero". Por lo general, ignoro esta casilla de verificación, pero cuando la reviso, veo mi clave almacenada en el llavero. Sin embargo, esta clave almacenada en el llavero aparentemente nunca se usa, ya que tengo una contraseña. Al menos eso es lo que he aprendido de varias cosas que he leído. Cuando ingreso mi contraseña en el cuadro de diálogo, y la clave está en caché en el agente, me conecto con éxito, pero no antes de que me digan "Error al guardar la contraseña en el llavero". Ver este mensaje de error es lo que me llevó a investigar más a fondo; No me gusta recibir un error cada vez que me conecto.

Las cosas se ponen interesantes al mirar la página de manual SSH_CONFIG (5) . Existen dos opciones para manejar el llavero, específicas de Apple: AskPassGUI y KeychainIntegration. Puede alternar estos en ~ / .ssh / config, y al hacerlo arroja algunos resultados interesantes.

Si configura AskPassGUI en no, ya no se le solicitará un cuadro de diálogo estilo OS X, sino una línea de texto de entrada en su terminal. No es problema. Pero si hace esto, ssh-agent no almacenará en caché sus credenciales. Esto está claramente roto y es frustrante porque podría vivir fácilmente con el mensaje de texto si las credenciales se almacenaran en caché.

Al establecer KeychainIntegration en no, ssh arroja un error difícil, de la siguiente manera:

~/.ssh/config: line 11: Bad configuration option: KeychainIntegration
~/.ssh/config: terminating, 1 bad configuration options

Mi pregunta, simplemente, es esta: ¿hay alguna manera de desactivar realmente la integración de llavero OS X para SSH?

Jim
fuente
Buena pregunta, no tengo una respuesta inmediata, pero espero que con los votos que tenga, aparezca en el radar de alguien. Puedo confirmar el error en mi compilación de OS X con solo un archivo de configuración de una línea; establecer el valor en sí o no falla como se describe.
bmike
Un punto de aclaración: solo recibo el mensaje "Error al guardar la contraseña en el llavero" cuando ssh-add almacena correctamente las credenciales en caché. No lo veo en cada intento de conexión, que es cómo se lee, cuando lo vuelvo a leer. Con credenciales almacenadas en caché, simplemente se conecta silenciosamente, como era de esperar.
Jim

Respuestas:

7

Según el código fuente de la versión actual de SSH que se envía con Mavericks (ubicado aquí ), parece que la funcionalidad de la opción de configuración KeychainIntegrationaún no se ha implementado. Estoy haciendo esta suposición basada en el contenido de openssh / readconf.h , que no hace referencia a la KeychainIntegrationopción. Sin embargo, hace referencia a la askpassguiopción. Verificar la estructura de "palabras clave" en ese archivo muestra que la keychainintegrationopción no está presente (lo que a su vez implica que oBadOptionse devolvería el código operativo (NULL)).

Otra pista que implica que la funcionalidad que desea no se implementa de la manera que especifica la página de manual es el archivo: openssh / keychain.c . El código fuente en realidad muestra que el defaultssistema (es decir, los archivos de la Lista de propiedades) se está utilizando para almacenar configuraciones relacionadas KeychainIntegration. Específicamente, las líneas de la store_in_keychainreferencia de función KeychainIntegration:

/* Bail out if KeychainIntegration preference is -bool NO */
if (get_boolean_preference("KeychainIntegration", 1, 1) == 0) {
    fprintf(stderr, "Keychain integration is disabled.\n");
    goto err;
}

Aquí está la get_boolean_preferencefunción correspondiente . Tenga en cuenta que se utiliza CFPreferencesCopyAppValuepara obtener un booleano del identificador de aplicación "org.openbsd.openssh":

#if defined(__APPLE_KEYCHAIN__)

static int get_boolean_preference(const char *key, int default_value,
int foreground)
{
int value = default_value;
CFStringRef keyRef = NULL;
CFPropertyListRef valueRef = NULL;

keyRef = CFStringCreateWithCString(NULL, key, kCFStringEncodingUTF8);
if (keyRef != NULL)
    valueRef = CFPreferencesCopyAppValue(keyRef,
        CFSTR("org.openbsd.openssh"));
if (valueRef != NULL)
    if (CFGetTypeID(valueRef) == CFBooleanGetTypeID())
        value = CFBooleanGetValue(valueRef);
    else if (foreground)
        fprintf(stderr, "Ignoring nonboolean %s preference.\n", key);

if (keyRef)
    CFRelease(keyRef);
if (valueRef)
    CFRelease(valueRef);

return value;
}

#endif

Esto puede implicar que puede deshabilitar la KeychainIntegrationfuncionalidad por sí mismo mediante la ejecución de este comando predeterminado:

defaults write org.openbsd.openssh KeychainIntegration -bool NO

o para configurarlo para todos los usuarios:

sudo defaults write /Library/Preferences/org.openbsd.openssh KeychainIntegration -bool NO

Eddie Kelley
fuente
2
Cavaste profundamente, y te lo agradezco. Traté de configurar KeychainIntegrationa NOtravés de defaultscomo sugirió. ssha continuación, se comporta como si me había puesto AskPassGUIen ~/.ssh/config- no hay credenciales se almacenan en caché, y yo estoy se le pida la contraseña todo el tiempo. Menos que útil. Aún así, creo que ha respondido la pregunta, y la respuesta es simplemente: "Se puede desactivar, pero no está completamente implementado y probablemente no le gusten los resultados".
Jim
Muchas gracias. Estaba buscando por todas partes para encontrar una respuesta a esto. Como tengo un archivo .zshrc personalizado que porto entre mac y linux, me estaba volviendo loco que el llavero tomara el control de la administración de ssh-agent y las claves agregadas.
LF4