2008-08-22 19 views
6

Sto tentando di implementare l'autenticazione NTLM su uno dei nostri siti interni e tutto funziona. L'unico pezzo del puzzle che non ho è come prendere le informazioni da NTLM e autenticarsi con Active Directory.Come utilizzare l'autenticazione NTLM con Active Directory

C'è uno good description of NTLM e lo encryption used for the passwords, che ho usato per implementarlo, ma non sono sicuro di come verificare se la password dell'utente è valida.

Sto utilizzando ColdFusion ma una soluzione a questo problema può essere in qualsiasi lingua (Java, Python, PHP, ecc.).

Edit:

Sto usando ColdFusion su RedHat Enterprise Linux. Sfortunatamente non possiamo usare IIS per gestirlo e invece dobbiamo scrivere o usare uno strumento di terze parti per questo.


Aggiornamento-ho ottenuto questo lavoro e qui è quello che ho fatto

sono andato con il JCIFS library from samba.org.

Nota che il metodo seguito funziona solo con NTLMv1 e NON funziona con NTLMv2. Se non si riesce a utilizzare NTLMv1 si può provare Jespa, che supporta NTLMv2, ma non è open source, oppure è possibile utilizzare Kerberos/SPNEGO.

Ecco il mio web.xml:

<web-app> 
    <display-name>Ntlm</display-name> 

    <filter> 
     <filter-name>NtlmHttpFilter</filter-name> 
     <filter-class>jcifs.http.NtlmHttpFilter</filter-class> 

     <init-param> 
      <param-name>jcifs.http.domainController</param-name> 
      <param-value>dc01.corp.example.com</param-value> 
     </init-param> 
     <init-param> 
      <param-name>jcifs.smb.client.domain</param-name> 
      <param-value>CORP.EXAMPLE.COM</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>NtlmHttpFilter</filter-name> 
     <url-pattern>/admin/*</url-pattern> 
    </filter-mapping> 
</web-app> 

Ora tutti gli URL /admin/* richiede l'autenticazione NTLM.

risposta

0

Hm, non sono sicuro di quello che stai cercando di realizzare.

In genere l'implementazione di NTLM su un sito interno è semplice come la deselezione "Abilita accesso anonimo" in "Controllo autenticazione e accesso" nella scheda "Protezione directory" delle proprietà del sito Web in IIS. Se questo è cancellato, gli utenti dell'applicazione Web vedranno una finestra di dialogo NTLM a comparsa.

Non è necessario scrivere codice che si interfaccia con Active Directory. IIS si prende cura dell'autenticazione per te.

Puoi essere più specifico su cosa stai cercando di fare?

1

Come ho capito.
NTLM è uno dei metodi di autenticazione incorporati IIS. Se l'host è registrato nel dominio di detta directory attiva, dovrebbe essere automatico. Una cosa a cui prestare attenzione è che il nome utente dovrebbe essere in uno dei due formati.

Se si sta tentando di andare contro una directory attiva diversa si dovrebbe utilizzare un'autenticazione basata su form stile e un po 'di codice LDAP.

Se si sta tentando di fare la cosa Intranet No Zero accesso con l'autenticazione di IIS integrata

  • il dominio deve essere indicato come un sito attendibile in del browser iEX
  • o utilizzare un URL utilizza il NetBIOS nome invece del nome DNS.
  • per farlo funzionare in Firefox leggere here
2

La fonte ModNTLM per Apache può fornire i puntatori giusti.

Se possibile, è consigliabile utilizzare invece Kerberos. Permette di autenticare Apache con AD, ed è uno spazio di progetto più attivo di NTLM.

18

Quello che stai veramente chiedendo è: c'è un modo per convalidare i token "WWW-Authenticate: NTLM" inviati da IE e altri client HTTP quando si esegue il Single Sign-On (SSO). SSO è quando l'utente immette la propria password in un "singolo" tempo quando fa Ctrl-Alt-Canc e la workstation si ricorda e lo usa come necessario per accedere in modo trasparente ad altre risorse senza chiedere nuovamente all'utente una password.

Si noti che Kerberos, come NTLM, può anche essere utilizzato per implementare l'autenticazione SSO. Quando viene presentato con l'intestazione "WWW-Authenticate: Negotiate", IE e altri browser inviano i token Kerberos e/o NTLM con wrapper SPNEGO. Più su questo più tardi, ma prima risponderò alla domanda come chiesto.

L'unico modo per convalidare una "risposta" di password NTLMSSP (come quelli codificati nelle intestazioni "WWW-Authenticate: NTLM" inoltrate da IE e altri browser) è con una chiamata DCERPC NetrLogonSamLogon (Ex) con il servizio NETLOGON di un controller di dominio di Active Directory che è un'autorità per o ha un "trust" con un'autorità per l'account di destinazione. Inoltre, per proteggere correttamente la comunicazione NETLOGON, è necessario utilizzare la crittografia del canale protetto ed è richiesta a partire da Windows Server 2008.

Inutile dire che esistono pochissimi pacchetti che implementano le chiamate di servizio NETLOGON necessarie. Gli unici io sappia sono:

  1. di Windows (ovviamente)

  2. Samba - Samba è un insieme di programmi software per UNIX che implementa una serie di protocolli di Windows compreso il servizio NETLOGON necessaria chiamate. In effetti, Samba 3 ha un demone speciale per questo chiamato "winbind" che altri programmi come i moduli PAM e Apache possono (e fare) interfacciarsi con. Su un sistema Red Hat puoi fare un yum install samba-winbind e yum install mod_auth_ntlm_winbind. Ma questa è la parte facile: impostare queste cose è un'altra storia.

  3. Jespa - Jespa (http://www.ioplex.com/jespa.html) è una libreria Java al 100% che implementa tutte le chiamate di servizio NETLOGON necessarie.Fornisce inoltre implementazioni di interfacce Java standard per l'autenticazione client in vari modi, ad esempio con una Servlet filtro HTTP, server di SASL, JAAS LoginModule, ecc

Attenzione che ci sono una serie di NTLM accettori di autenticazione che non lo fanno implementare le necessarie chiamate di servizio NETLOGON ma invece fare qualcos'altro che alla fine porta a un fallimento in uno scenario o in un altro. Ad esempio, per anni, il modo per farlo in Java era con il filtro Servlet di autenticazione HTTP NTLM da un progetto chiamato JCIFS. Ma quel filtro utilizza una tecnica man-in-the-middle che è stata responsabile di un "singhiozzo" di vecchia data e, cosa più importante, non supporta NTLMv2. Per questi motivi e altri è prevista la rimozione da JCIFS. Ci sono diversi progetti che sono stati involontariamente ispirati a quel pacchetto che ora sono ugualmente condannati. Ci sono anche molti frammenti di codice pubblicati nei forum Java che decodificano il token dell'intestazione e prelevano il dominio e il nome utente, ma non fanno assolutamente nulla per validare effettivamente le risposte della password. Basti dire che se si utilizza uno di quei frammenti di codice, si potrebbe anche andare in giro con i pantaloni abbassati.

Come ho eluso in precedenza, NTLM è solo uno dei numerosi provider di supporto di sicurezza di Windows (SSP). C'è anche un SSP di Digest, un SSP di Kerberos, ecc. Ma l'SSP di negoziazione, che è anche conosciuto come SPNEGO, è solitamente il provider che MS usa nei propri client di protocollo. Il provider di servizi condivisi negozia in realtà negozia solo con NTLM SSP o Kerberos SSP. Si noti che Kerberos può essere utilizzato solo se sia il server che il client hanno account nel dominio di destinazione e il client può comunicare con il controller di dominio in modo sufficiente per acquisire un ticket Kerberos. Se queste condizioni non sono soddisfatte, il SSP NTLM viene utilizzato direttamente. Quindi NTLM non è affatto obsoleto.

Infine, alcune persone hanno menzionato l'uso di un "binding semplice" LDAP come servizio di validazione della password di avviamento. LDAP non è realmente progettato come servizio di autenticazione e per questo motivo non è efficiente. Inoltre, non è possibile implementare SSO utilizzando LDAP. SSO richiede NTLM o SPNEGO. Se è possibile trovare un accettore NETLOGON o SPNEGO, è preferibile utilizzarlo.

Mike

1

Partenza Waffle. Implementa SSO per i server Java utilizzando l'API Win32. Ci sono servlet, valvola tomcat, sicurezza a molla e altri filtri.

1

È possibile risolvere l'autenticazione popup di Firefox eseguendo le seguenti operazioni in Firefox:

  1. Aprire Mozilla Firefox
  2. Tipo about: config nella barra degli indirizzi
  3. Inserisci network.automatic-NTLM-auth. -uris attendibili in Ricerca texfield
  4. doppio clic nome preferenza e digitare il nome del server come valore String
  5. chiudere la scheda
  6. Riavvia Firefox.