ldap_sasl_bind_s (GSSAPI) - Quale dovrebbe essere fornita nella struttura Berval credenziali

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

  •  01-10-2019
  •  | 
  •  

Domanda

Sto cercando di utilizzare la ldap_sasl_bind_s metodo dalla Microsoft LDAP C SDK, con GSSAPI come meccanismo di autenticazione. ldap_sasl_bind_s prevede le credenziali come una struttura BERVAL, che è opaco.

Dato un nome utente (o un DN) e una password, Come faccio a raggiungere la struttura BERVAL che io dovrei passare a ldap_sasl_bind_s?

Gli esempi che ho trovato finora

  • sono da altri SDK LDAP C - non quello da Microsoft
  • uso ldap_sasl_bind_s quando si desidera l'autenticazione semplice - ma ho bisogno di utilizzare GSSAPI
  • uso ldap_sasl_interactive_bind_s quando altri meccanismi di autenticazione SASL sono desiderati. Tuttavia, non v'è alcun ldap_sasl_interactive_bind_s della Microsoft SDK.

Come nota a margine, l'obiettivo è quello di essere in grado di legarsi sopra SASL a una varietà di server LDAP; per ora:. ActiveDirectory e OpenLDAP

Tutti gli indicatori sarà molto apprezzato.

È stato utile?

Soluzione

Sono riuscito a eseguire un binding LDAP SASL GSSAPI sopra, usando ldap_sasl_bind_s. Per chi fosse interessato, qui ci sono alcune indicazioni.

Per una descrizione astratta delle azioni di un client e server necessità di eseguire nel corso di un'autenticazione GSSAPI SASL, "Il Kerberos V5 (" GSSAPI ") Semplice autenticazione e di sicurezza Layer (SASL) Mechanism" RFC dovrebbe essere letto; in particolare, il 'lato client del protocollo di autenticazione di cambio' la sezione è di interesse, perché dà un'indicazione della sequenza di azioni che dobbiamo svolgere per legare con successo a un server LDAP su Kerberos.

Le credenziali ldap_sasl_bind_s aspetta - la loro forma e il loro significato -. Dipendono dal meccanismo di autenticazione effettivamente in uso, che nel nostro caso è Kerberos

Nel Microsoft SDK, Kerberos è disponibile attraverso SSPI - che è circa l'implementazione Microsoft di GSSAPI; i metodi che sono rilevanti per il nostro caso particolare, sono: AcquireCredentialsHandle, InitializeSecurityContext, DecryptMessage, EncryptMessage

Un LDAP SASL legano sopra Kerberos ha 3 fasi.

Fase 1

Chiamata AcquireCredentialsHandle e InitializeSecurityContext.
Indicazioni importanti Questo:

  • passare AcquireCredentialsHandle un puntatore a una struttura SEC_WINNT_AUTH_IDENTITY contenente le credenziali reali (regno, nome utente, password), o NULL se devono essere utilizzate le credenziali del thread corrente
  • il nome di destinazione dovrebbe essere uno SPN mappato l'account con cui il server LDAP è in esecuzione
  • quando si chiama InitializeSecurityContext, deve essere richiesta l'autenticazione reciproca.

Se tutti gli argomenti importanti sono corrette - credenziali valide, SPN valido, ingresso NULL Token - la chiamata InitializeSecurityContext deve restituire SEC_I_CONTINUE_NEEDED e adeguatamente riempire il token di uscita. Il contenuto di questo token in uscita dovrebbero andare nelle aspetta BERVAL struttura ldap_sasl_bind_s come credenziali del client.

ldap_sasl_bind_s chiamata con l'uscita gettone da InitializeSecurityContext come credenziali del client. Se tutti gli argomenti sono corrette - vuoto DN, GSSAPI come il nome meccanismo - la chiamata effettiva dovrebbe restituire LDAP_SUCCESS e l'errore LDAP più recente per la sessione LDAP dovrebbe essere LDAP_SASL_BIND_IN_PROGRESS.

Come nota a margine, il recente errore più LDAP per una sessione LDAP può essere scoperto chiamando ldap_get_option sulla sessione, con LDAP_OPT_ERROR_NUMBER come opzione.

Fase 2

Dopo la chiamata di successo per ldap_sasl_bind_s, i suoi punti di ultimo argomento una struttura BERVAL contenente le credenziali del server. Il contenuto di tale struttura BERVAL dovrebbe ora essere utilizzato come ingresso gettone per la seconda chiamata a InitializeSecurityContext.

Questa seconda chiamata a InitializeSecurityContext dovrebbe restituire SEC_OK e un token output vuoto.

Questo token uscita vuoto dovrebbe essere usato come le credenziali del client per un'altra chiamata a ldap_sasl_bind_s. Questa seconda chiamata a ldap_sasl_bind_s deve restituire LDAP_SUCCESS, con il recente errore più LDAP per la sessione LDAP essendo LDAP_SASL_BIND_IN_PROGRESS.

Fase 3

Dopo la seconda chiamata di successo per ldap_sasl_bind_s, i suoi punti di ultimo argomento una struttura di BERVAL contenente i dati del server. Questi dati del server dovrebbe essere dato come input per DecryptMessage. Come specificato nel RFC precedentemente menzionato, i dati devono essere decriptati 4 byte.

Il client deve costruire la sua risposta in base alle informazioni nella stessa RFC.
Nota : Nel mio caso, ho omesso l'ID di autorizzazione indicato nella RFC. Per la mia comprensione, un vuoto autorizzazione id porta alla autenticazione ID utilizzati per l'autorizzazione pure.

La risposta del client costruita dovrebbe quindi essere passato come input per EncryptMessage. L'uscita della chiamata EncryptMessage dovrebbe quindiessere passato come le credenziali del client per la terza e ultima chiamata al ldap_sasl_bind_s.

Nota : La documentazione di MSDN per l'utilizzo di EncryptMessage sotto Kerberos sembra essere incompleta. di Google Code Search dovrebbe aiutare con un esempio di lavoro. Inoltre, per un esempio del flusso descritto sopra, il codice sorgente di Samba può essere consultato.

Altri suggerimenti

Ho trovato il problema.

Secondo questa discussione ( https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1 ) c'è un bug con ldap_sasl_bind_s ritorno di server vuoto le credenziali in Windows XP. Ho testato la mia applicazione in Windows 2008 Server e le credenziali sono correttamente restituito.

Articolo da Sun e MSDN . Probabilmente se si può provare a creare un programma di esempio si possono ottenere le risposte

Another One

pseudocodice

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 );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top