ldap_sasl_bind_s (GSSAPI) - ¿Cuál debe ser proporcionada en la estructura Berval credenciales
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 hayldap_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.
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 estructuraSEC_WINNT_AUTH_IDENTITY
que contiene las credenciales reales (reino, nombre de usuario, contraseña), oNULL
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 EncryptMessage
pasar 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
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 );