ldap_sasl_bind_s (GSSAPI) - ¿Cuál debe ser proporcionada en la estructura Berval credenciales

StackOverflow https://stackoverflow.com/questions/3144910

  •  01-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de utilizar el ldap_sasl_bind_s método de la Microsoft LDAP C SDK, con GSSAPI como mecanismo de autenticación. ldap_sasl_bind_s espera que las credenciales como una estructura BERVAL, que es opaco.

Dado un nombre de usuario (o un DN) y una contraseña, ¿Cómo llego a la estructura BERVAL que se supone que tengo que pasar a ldap_sasl_bind_s?

Los ejemplos que he encontrado hasta ahora

  • son de otros SDK de LDAP C - no el de Microsoft
  • ldap_sasl_bind_s uso cuando se desea la autenticación simple - pero necesito utilizar GSSAPI
  • ldap_sasl_interactive_bind_s uso cuando se desean otros mecanismos de autenticación SASL. Sin embargo, no hay ldap_sasl_interactive_bind_s en el SDK de Microsoft.

Como nota aparte, el objetivo es ser capaz de unirse sobre SASL a una variedad de servidores LDAP; por ahora:. ActiveDirectory y OpenLDAP

Cualquier indicador será grandemente apreciado.

¿Fue útil?

Solución

Me las arreglé para realizar un enlace LDAP SASL GSSAPI más, usando ldap_sasl_bind_s. Para los interesados, aquí hay algunos consejos.

Para una descripción abstracta de las acciones de una necesidad de cliente y servidor para realizar durante una autenticación GSSAPI SASL, "El Kerberos V5 (" GSSAPI ") simple de autenticación y seguridad de la capa (SASL) Mecanismo" RFC debe ser leído; En concreto, el 'del lado del cliente de autenticación de protocolo de intercambio de la sección es de interés, ya que da una indicación de la secuencia de acciones que necesitamos para llevar a cabo con éxito para unirse a un servidor LDAP a través de Kerberos.

Las credenciales ldap_sasl_bind_s Espera - su forma y su significado -. Dependerá del mecanismo de autenticación real utilizada, que en nuestro caso es Kerberos

En el SDK de Microsoft, Kerberos está disponible a través de SSPI - que es aproximadamente la implementación de Microsoft de GSSAPI; los métodos que son relevantes para nuestro caso particular, son: AcquireCredentialsHandle, InitializeSecurityContext, DecryptMessage, EncryptMessage

Un LDAP SASL bind sobre Kerberos tiene 3 fases.

Fase 1

AcquireCredentialsHandle llamadas y InitializeSecurityContext.
Notas importantes aquí:

  • pasar a AcquireCredentialsHandle un puntero a una estructura SEC_WINNT_AUTH_IDENTITY que contiene las credenciales reales (reino, nombre de usuario, contraseña), o NULL si se van a utilizar las credenciales del hilo actual
  • el nombre de destino debe ser un SPN asignado a la cuenta en la que el servidor LDAP se está ejecutando
  • al llamar InitializeSecurityContext, se debe solicitar la autenticación mutua.

Si todos los argumentos importantes son correctas - credenciales válidas, SPN válidos, de entrada NULL símbolo - la llamada InitializeSecurityContext recaiga SEC_I_CONTINUE_NEEDED y debidamente llenar el símbolo de salida. El contenido de este símbolo de salida deben ir en las Espera BERVAL estructura ldap_sasl_bind_s como las credenciales del cliente.

ldap_sasl_bind_s de llamadas con la salida de token de InitializeSecurityContext como las credenciales del cliente. Si todos los argumentos son correctos - DN vacío, GSSAPI como el nombre de mecanismo - la llamada real debería devolver LDAP_SUCCESS y el error más reciente LDAP para la sesión LDAP debe ser LDAP_SASL_BIND_IN_PROGRESS.

Como nota al margen, el error LDAP más reciente para una sesión LDAP se puede descubrir llamando ldap_get_option en la sesión, con LDAP_OPT_ERROR_NUMBER como la opción.

Fase 2

Después de la llamada con éxito a ldap_sasl_bind_s, sus último argumento apunta a una estructura BERVAL que contiene las credenciales del servidor. El contenido de esta estructura BERVAL ahora debe utilizarse como la entrada de símbolo para la segunda llamada a InitializeSecurityContext.

Esta segunda llamada a InitializeSecurityContext debe devolver SEC_OK y un símbolo de salida vacía.

Esta señal de salida de vacío debe ser utilizado como las credenciales del cliente para otra llamada a ldap_sasl_bind_s. Esta segunda llamada a ldap_sasl_bind_s debe devolver LDAP_SUCCESS, con el error LDAP más reciente para la sesión LDAP siendo LDAP_SASL_BIND_IN_PROGRESS.

Fase 3

Después de la segunda llamada con éxito a ldap_sasl_bind_s, sus puntos último argumento de la estructura BERVAL que contiene los datos del servidor. Estos datos del servidor se debe dar como entrada a DecryptMessage. Como se especifica en la anteriormente mencionada RFC, los datos descifrados deben ser de 4 bytes de largo.

El cliente debe construir su respuesta de acuerdo con la información contenida en el mismo RFC.
Nota: : En mi caso, omite el ID de autorización mencionada en el RFC. A mi entender, un vacío conduce ID de autorización a la ID de autenticación que se utiliza para la autorización también.

La respuesta del cliente construido debe entonces ser pasado como entrada a EncryptMessage. La salida de la llamada debe entonces EncryptMessagepasar como las credenciales del cliente para la tercera y última llamada a ldap_sasl_bind_s.

Nota: : La documentación de MSDN para el uso de EncryptMessage bajo Kerberos parece estar incompletos. Código de búsqueda de Google debe ayudar con un ejemplo de trabajo. También, para un ejemplo de trabajo del flujo descrito anteriormente, el código fuente de Samba puede ser consultado.

Otros consejos

He encontrado el problema.

De acuerdo con este hilo ( https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1 ) hay un error con ldap_sasl_bind_s regresar jarra vacía credenciales en Windows XP. He probado mi aplicación en Windows 2008 Server y las credenciales son devueltos correctamente.

Sun y MSDN . Probablemente si puede intentar crear un programa de ejemplo que puede obtener las respuestas

Otra Uno

pseudocódigo

struct berval   cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top