8

Przeszukując metody uwierzytelniania i protokoły Windows, postanowiłem zrozumieć dokładną różnicę między Negotiate, Kerberos i NTLM używaną w prostym pliku wykonywalnym, zanim polubię go za pomocą IIS i uwierzytelniania internetowego.Uwierzytelnianie plików wykonywalnych systemu Windows

Osiągnąłem dobre wyniki, ALE nadal potrzebuję więcej szczegółów na temat Negocjacji i Kerberos.

Mam następujący scenariusz:

Stworzyłem bardzo proste C# Windows tworzy aplikacją, która wyświetla okno komunikatu wyświetla wartość dla:

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

Zauważ, że jestem użytkownik domeny z Administrator przywileje na moim komputerze lokalnym, mam następujące wyniki:

  1. kiedy uruchomić plik exe (podwójne kliknięcie), a ja jestem aktywnie podłączony do gniazda DC, mam " Negocjować".

  2. Po uruchomieniu pliku exe (uruchom jako inny użytkownik/użytkownik lokalny), gdy jestem aktywnie podłączony do DC, mam "NTLM".

  3. Po uruchomieniu pliku exe przy użyciu opcji "Uruchom jako administrator" lub "Uruchom jako inny użytkownik" otrzymałem komunikat "Kerberos".

  4. Po uruchomieniu pliku exe, gdy jestem zalogowany lokalnie przy użyciu konta lokalnego, mam "NTLM".

Rozumiem, że LSA użyje NTLM dla kont lokalnych. Rozumiem również, że usługa Active Directory używa Kerberos do uwierzytelniania użytkowników domeny i komputerów.

Moje pytanie brzmi: dlaczego uzyskuję Negocjuj Typ uwierzytelnienia, gdy uruchamiam plik exe przy użyciu mojego konta przez (podwójne kliknięcie) lub "uruchom jako inny użytkownik" przy użyciu tego samego konta?

Aktualizacja: zauważyłem następujące:

- Jeśli użytkownik lokalny działa exe to jest NTLM
- Jeśli użytkownik domeny uruchomić exe to jest Negocjuj (Jeśli jest to lokalny administrator), ale jest to Kerberos (jeśli ten użytkownik nie jest administratorem lokalnym)
- Jeśli domeny admin uruchom exe to jest Kerberos

Ja tylko wyjaśnienie na temat tego zachowania.

+0

Pytanie jest niejasne. Pakiet uwierzytelniający użyty do uwierzytelnienia użytkownika różni się od protokołu używanego do uwierzytelnienia użytkownika, a każdy z nich jest odrębny od podmiotu, który wykonuje uwierzytelnienie. Nie ma relacji jeden do jednego (jeden do jednego). NTLM i Kerberos (i Negotiate) są istotne tylko podczas uwierzytelniania na komputerze zdalnym. Uwierzytelnianie na komputerze zdalnym w środowisku innym niż domena będzie używać NTLM, a uwierzytelnianie na komputerze zdalnym w domenie będzie korzystało z protokołu Kerberos lub NTLM. Co dokładnie próbujesz się dowiedzieć? – conio

+0

To nie jest prawda. Lokalny komputer używa również pakietu uwierzytelniającego do uwierzytelnienia poświadczeń logowania zebranych przez Winlogon za pośrednictwem GINA. Winlogon wywołuje LsaLogonUser, który używa pakietu uwierzytelniającego do utworzenia sesji logowania. LSA używa NTLM (Msv1_0.dll), aby wyszukać konto w lokalnej maszynie SAM w przypadku lokalnego logowania; nie jest potrzebny zdalny komputer. – codekaizen

+1

Nie jesteś nawet blisko. Fakt, że niektóre strony (takie jak te, które zostały połączone w odpowiedzi) nieprawidłowo opisują MSV1_0 jako "NTLM", nie oznacza, że ​​używany jest protokół NTLM ** - ten opisany w [MS-NLMP]. (Prawidłowy opis to [Microsoft Authentication] (http://i.stack.imgur.com/k6rdD.png) [Package v1.0] (http://i.stack.imgur.com/313Y3.png), btw.) Nie wiem, jak mogę być bardziej jasne w tej kwestii. Kiedy uwierzytelnisz się na lokalnym SAM, nikt nie stwarza wyzwania i nikt nie tworzy odpowiedzi na to wyzwanie w oparciu o skróty LM lub NT hasła. – conio

Odpowiedz

6

Po pierwsze, (co wydaje się zrozumiałe w pytaniu, ale po to, aby było jasne), EXE nie ma żadnego uwierzytelnienia - jest to po prostu plik wykonywalny. OS creates a process object, który wykonuje go w ramach sesji logowania zidentyfikowanej przez głównego użytkownika. To ta główna osoba, która została uwierzytelniona przez NTLM lub Kerberos (lub inny protokół).

Dalej, Negocjacja oznacza, że ​​po utworzeniu sesji logowania użyto Negotiate authentication package, aby zdecydować, który pakiet uwierzytelniający - Kerberos lub NTLM - zostanie użyty.

Po wysłaniu zapytania o wartość WindowsIdentity.AuthenticationType, użytkownik ostatecznie wywołuje funkcję w lokalnym ośrodku zabezpieczeń (LSA) o nazwie LsaGetLogonSessionData. To raportuje szczegóły sesji logowania używanej do uruchomienia wykonywanego procesu. Sposób, w jaki ta sesja logowania została utworzona, prawdopodobnie ma największy wpływ na pakiet uwierzytelniający używany do weryfikowania poświadczeń.

When logging into Windows the first time, Winlogon.exe establishes an interactive logon dzwoniąc pod numer LsaLogonUser. Pyta pakiety uwierzytelniania w HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages w kolejności, dopóki nie znajdzie takiego, który może uwierzytelnić dane poświadczenia. Po ustanowieniu logowania interaktywnego można tworzyć nowe procesy przy użyciu nieinteraktywnych danych logowania przy użyciu różnych poświadczeń, w tym przypadku wywoływana jest prawdopodobnie funkcja LogonUser. Jednym z parametrów tej funkcji jest dwLogonProvider który posiada następującą domyślną (co jest prawdopodobne, że jeden używany):

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. 

Tak, pakiet zgłaszane na sesji logowania proces jest uruchomiony pod zależy od sposobu logowania sesja została utworzona. (Z twojego pytania nie wynika jasno, w jaki sposób tworzysz sesje logowania, które testujesz ... robisz "Uruchom jako" we wszystkich przypadkach? Logoff/Logon Windows w niektórych przypadkach?) Zależy to również od tego, który pakiet Winlogon był w stanie pomyślnie uwierzytelnić się z pierwszym dla interaktywnej sesji logowania. Należy jednak pamiętać, że wszystkie mechanizmy autoryzacji odwołują się do jakiegoś pakietu uwierzytelniającego, a jeśli jest używana opcja Negotiate, preferowany jest protokół Kerberos, chociaż zgłaszany jest komunikat Negotiate.

Oto stary, ale nadal istotne schemat, który pokazuje, jak wszystko do siebie pasuje uwierzytelniania w systemie Windows:

Windows Authentication Architecture

Source

+0

Re. Twój cytat z dokumentacji 'LogonUser' - co jeśli chcę użyć innego pakietu uwierzytelniającego? "LsaLogonUser" pozwala na to? Wierzę również, że dokumentacja wprowadza w błąd w kilku aspektach: Zgaduję, że użytkownicy domeny używają MSV1_0, a MSV1_0 sprawdza buforowane referencje i w inny sposób używa Negotiate iz pewnością jest to MSV1_0, który jest używany dla lokalnych użytkowników. Mogę się założyć, że użyte hasło jest porównywane z tym przechowywanym w SAM, zamiast grać głupią grę typu challenge-response w LSA. – conio

+0

Tak, można określić dowolny pakiet uwierzytelniający podczas logowania (tak naprawdę można to zrobić za pomocą własnego pakietu GINA/uwierzytelniania). Winlogon otrzymuje identyfikator pakietu za pomocą 'LsaLookupAuthenticationPackage', a następnie przekazuje wartość zwróconą do' LsaLogonUser'. W przypadku użytkowników domeny można użyć MSV1_0 (chociaż przekazywanie jest obsługiwane wyłącznie przez ten pakiet, a nie przez LSA) lub można użyć protokołu Kerberos. W przypadku logowania lokalnego, na przykład dokument "przekazujesz NULL dla nazwy domeny, a nazwa użytkownika nie ma formatu UPN", aby uzyskać NTLM, a następnie pakiet NTLM (nie LSA) użyje SAM. – codekaizen

Powiązane problemy