8

Ricercando i metodi ei protocolli di autenticazione di Windows, ho deciso di comprendere la differenza esatta tra negoziazione, Kerberos e NTLM utilizzati in un file eseguibile semplice prima di utilizzarlo con IIS e l'autenticazione Web.Autenticazione file eseguibile di Windows

Ho raggiunto buoni risultati, ma ho ancora bisogno di ulteriori dettagli sul negoziato e sul Kerberos.

Ho il seguente scenario:

ho creato molto semplici # Windows C moduli di domanda che mostra una finestra di messaggio viene visualizzato il valore per:

System.Security.Principal.WindowsIdentity.GetCurrent().AuthenticationType 

notare che io sono un utente di dominio con Admin privilegi sulla mia macchina locale, che hanno i seguenti risultati:

  1. quando ho eseguito il file exe (doppio clic) mentre sto attivamente collegato al DC, ho ottenuto " Negoziare".

  2. Quando eseguo il file exe (eseguito come utente differnet/utilizzando l'utente locale) mentre sono attivamente connesso alla DC, ho ottenuto "NTLM".

  3. Quando eseguo il file exe utilizzando "Esegui come amministratore" o "Esegui come utente diverso" ho "Kerberos".

  4. Quando eseguo il file exe mentre sono localmente connesso utilizzando l'account locale, ho ottenuto "NTLM".

Capisco che la LSA utilizzerà NTLM per gli account locali. Comprendo inoltre che Active Directory utilizza Kerberos per autenticare utenti e computer del dominio.

La mia domanda è: perché sto ottenendo il Negoziare Tipo di autenticazione quando ho eseguito l'exe utilizzando il mio conto sia con (doppio clic), o "Esecuzione come altro utente" utilizzando il mio stesso account?

Update: ho notato quanto segue:

- Se utente locale è in esecuzione il file exe, allora è NTLM
- Se l'utente dominio eseguire il file EXE, allora è Negoziare (Se tale utente è l'amministratore locale) ma è Kerberos (se tale utente non è l'amministratore locale)
- Se amministratore dominio esegui l'exe, quindi è Kerberos

Ho solo un chiarimento su questo comportamento.

+0

La domanda non è chiaro. Il pacchetto di autenticazione utilizzato per autenticare un utente è distinto dal protocollo utilizzato per autenticare l'utente e ciascuno è distinto dall'entità che esegue l'autenticazione. Non esiste una relazione one-to-one (-to-one). NTLM e Kerberos (e Negozia) sono rilevanti solo quando si esegue l'autenticazione su un computer remoto. L'autenticazione su un computer remoto in un ambiente non di dominio utilizzerà NTLM e l'autenticazione su un computer remoto in un dominio utilizzerà Kerberos o NTLM. Che cosa stai cercando di scoprire esattamente? – conio

+0

Questo non è vero. Una macchina locale utilizza anche un pacchetto di autenticazione per autenticare le credenziali di accesso raccolte da Winlogon tramite GINA. Winlogon chiama LsaLogonUser, che utilizza un pacchetto di autenticazione per creare la sessione di accesso. LSA utilizza NTLM (Msv1_0.dll) per cercare l'account nel computer locale SAM nel caso di un accesso locale; nessun computer remoto necessario. – codekaizen

+1

Non sei nemmeno vicino. Il fatto che alcune pagine (come quella che hai collegato nella tua risposta) descrivono erroneamente MSV1_0 come "NTLM" non significa che sia in uso il protocollo NTLM ** ** - quello descritto in [MS-NLMP]. (La descrizione corretta è [Autenticazione Microsoft] (http://i.stack.imgur.com/k6rdD.png) [Pacchetto v1.0] (http://i.stack.imgur.com/313Y3.png), btw.) Non so come posso essere più chiaro su questo punto. Quando esegui l'autenticazione con il SAM locale, nessuno crea una sfida e nessuno crea una risposta a tale sfida in base agli hash LM o NT della password. – conio

risposta

6

Prima di tutto, (che sembra capire nella domanda, ma solo per essere chiari) un EXE non ha alcuna autenticazione - è solo un eseguibile. L'OS creates a process object che lo esegue all'interno di una sessione di accesso identificata da un principal. È questo principale che è stato autenticato da NTLM o Kerberos (o qualche altro protocollo).

Avanti, Negozia significa che quando è stata creata la sessione di accesso è stato utilizzato Negotiate authentication package per decidere quale pacchetto di autenticazione - Kerberos o NTLM - sarebbe stato utilizzato.

Quando si esegue una query sul valore WindowsIdentity.AuthenticationType, si sta infine chiamando una funzione nella Local Security Authority (LSA) denominata LsaGetLogonSessionData. Questo riporta i dettagli della sessione di accesso utilizzata per eseguire il processo che si sta eseguendo. Il modo in cui è stata creata questa sessione di accesso probabilmente ha l'effetto maggiore sul pacchetto di autenticazione utilizzato per verificare le credenziali.

When logging into Windows the first time, Winlogon.exe establishes an interactive logon chiamando LsaLogonUser. Interroga i pacchetti di autenticazione in HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages finché non ne trova uno in grado di autenticare le credenziali specificate. Una volta stabilito un accesso interattivo, è possibile creare nuovi processi utilizzando accessi non interattivi con credenziali diverse e, in questo caso, è probabile che venga chiamata la funzione LogonUser. Uno dei parametri di questa funzione è dwLogonProvider che ha il seguente valore predefinito (che è probabilmente quella usata):

LOGON32_PROVIDER_DEFAULT 

Use the standard logon provider for the system. 
The default security provider is negotiate, unless you pass NULL 
for the domain name and the user name is not in UPN format. 
In this case, the default provider is NTLM. 

Quindi, il pacchetto riportato per la sessione di accesso il processo è in esecuzione in dipende da come l'accesso la sessione è stata creata. (Non è chiaro dalla tua domanda esattamente come crei le sessioni di accesso che stai testando ... facendo "Esegui come" in tutti i casi? Disconnessione/Log in Windows per alcuni casi?) Dipende anche da quale pacchetto Winlogon è stato in grado di autenticarsi con successo con successo per la sessione di accesso interattivo. In definitiva, tuttavia, si noti che i meccanismi di autenticazione invocano tutti in qualche pacchetto di autenticazione e, se si utilizza Negotiate, è preferibile utilizzare Kerberos, anche se Negotiate è ciò che viene segnalato.

Qui è uno schema vecchio ma ancora attuale che mostra come tutto l'autenticazione combacia in Windows:

Windows Authentication Architecture

Source

+0

Re. la tua citazione dai documenti 'LogonUser' - cosa succede se voglio usare un altro pacchetto di autenticazione? 'LsaLogonUser' permette questo? Credo anche che la documentazione sia fuorviante in alcuni aspetti: sto indovinando per gli utenti di dominio MSV1_0 e MSV1_0 che controlla le credenziali memorizzate nella cache e utilizza in altro modo Negozia, ed è sicuramente MSV1_0 che viene utilizzato per gli utenti locali. Sono disposto a scommettere che la password fornita da un utente è paragonata a quella memorizzata nel SAM piuttosto che giocare a uno sciocco gioco di risposta alle sfide all'interno dell'LSA. – conio

+0

Sì, è possibile specificare qualsiasi pacchetto di autenticazione durante l'accesso (in realtà questo è ciò che si può fare tramite l'implementazione del proprio pacchetto GINA/autenticazione). Winlogon ottiene un ID per il pacchetto tramite 'LsaLookupAuthenticationPackage' e quindi passa il valore restituito a' LsaLogonUser'. Per gli utenti del dominio, è possibile utilizzare MSV1_0 (sebbene il pass-through sia gestito specificamente da quel pacchetto, non da LSA), oppure è possibile utilizzare Kerberos. Per un accesso locale, come il documento afferma "si passa NULL per il nome di dominio e il nome utente non è in formato UPN" per ottenere NTLM, e quindi il pacchetto NTLM (non LSA) utilizzerà il SAM. – codekaizen