# Windows 驗證中的認證程序 https://docs.microsoft.com/zh-tw/windows-server/security/windows-authentication/credentials-processes-in-windows-authentication Windows憑證管理是指OS從服務或用戶處接收憑證,並保證該資訊的安全,以便將來呈現給認證目標的過程。 在已加入網域的電腦情況下,認證目標是domain controller。認證中使用的憑證是數字文件,將用戶的身份與某種形式的真實性證明聯繫起來,如證書、密碼或PIN碼。 默認情況下,Windows憑證是通過Winlogon服務,根據本地計算機上的安全賬戶管理器(SAM)數據庫或域連接計算機上的活動目錄進行驗證的。憑證通過登錄用戶界面上的用戶輸入或通過應用程序編程接口(API)以編程方式收集,然後提交給驗證目標。 預設情況下,Local computer 透過Winlogon service向Security Accounts Manager (SAM) database 驗證;網域內的computer透過Winlogon service向AD認證 憑證通過登錄用戶界面(Winlogon)上的用戶輸入或通過(API)收集,然後提交給驗證目標。 Local security information儲存在注冊表HKEY_LOCAL_MACHINE/SECURITY下。儲存的資訊包括policy設置、default security values和account information,如cached logon credentials。 SAM數據庫的copy也存儲在這里,盡管它是write-protected.的。 下圖顯示了驗證用戶或process成功登錄所需的components 和憑證通過系統的路徑。 ![](https://i.imgur.com/vmm6VDk.png) * Winlogon.exe是負責管理安全用戶交互(secure user interactions)的可執行文件。 * Winlogon服務通過Secur32.dll將用戶在安全桌面(Logon UI)上操作收集的憑證傳遞給 Local Security Authority(LSA),從而啟動Windows操作系統的登錄過程。 * 應用程序或服務登錄不需要交互式(interact)登錄。大多數由用戶啟動的process都是通過使用Secur32.dll在用戶模式下運行,而在啟動時的初始processes ,如services,則是通過使用Ksecdd.sys在內核模式下運行。 * Secur32.dll:多種身份驗證提供者,身份驗證過程的基礎 * Lsasrv.dll:LSA Server service,它既執行安全策略,又充當LSA的security package manager 。LSA包含Negotiate功能,它在確定哪種協議成功後選擇NTLM或Kerberos協議。 * 根據AD最基本的兩種驗證方法, 預設有Kerberos以及NTLM驗證: Kerberos vs NTLM驗證流程不同: NTLM驗證流程,主要是被存取端(server)會轉發驗證資訊給上層DC,經過層層轉發驗證。 Kerberos 驗證流程,主要是用戶端發起,故需要從用戶端去找到正確的DC做驗證 ![](https://i.imgur.com/iBe2uDt.jpg) --- ### User mode & Kernel Mode ![](https://i.imgur.com/zBErVz4.png) 運行Windows的計算機處理器有兩種不同的模式:用戶模式和內核模式。 處理器根據處理器上運行的代碼類型在這兩種模式之間切換。應用程序在用戶模式下運行,而核心操作系統組件在內核模式下運行。雖然許多驅動程序在內核模式下運行,但有些驅動程序可能在用戶模式下運行。 當您啟動一個用戶模式的應用程序時,Windows會為該應用程序創建一個process。該process為應用程序提供了一個私有的虛擬地址空間和一個私有的句柄表。因為應用程序的虛擬地址空間是私有的,所以一個應用程序不能改變屬於另一個應用程序的數據。每一個應用程序都是孤立運行的,如果一個應用程序崩潰,崩潰的範圍僅限於這一個應用程序。其他應用程序和操作系統不會受到崩潰的影響。 除了是私有的,用戶模式應用程序的虛擬地址空間也是有限的。以用戶模式運行的處理器不能訪問為操作系統保留的虛擬地址。限制用戶模式應用程序的虛擬地址空間可以防止該應用程序改變並可能損壞關鍵的操作系統數據。 所有在內核模式下運行的代碼都共享一個虛擬地址空間。這意味著內核模式的驅動程序不會與其他驅動程序和操作系統本身隔離。如果內核模式驅動程序不小心寫到了錯誤的虛擬地址,那麽屬於操作系統或其他驅動程序的數據就會被泄露。如果內核模式的驅動程序崩潰,整個操作系統就會崩潰。 --- 用戶登錄後,將生成各種憑據並將其存儲在記憶體中的本地安全授權子系統服務LSASS process中。 這旨在促進單點登錄(SSO),確保每次請求資源訪問時都不會提示用戶。 憑據數據可能包括Kerberos票證,NTLM密碼哈希,LM密碼hash(如果密碼小於15個字符,取決於Windows OS版本和補丁程序級別),甚至是明文密碼(以支持WDigest和SSP身份驗證等)。雖然可以阻止Windows計算機在本地計算機SAM數據庫(和AD數據庫)中創建LM哈希,但這不會阻止系統在記憶體中生成LM哈希。 默認情況下,除非明確啟用,否則Windows Server 2008和Windows Vista將不再為用戶生成LM哈希。從Windows 8.1和Windows Server 2012 R2開始,LM哈希和“明文”密碼不再存儲在記憶體中。 kb2871997中也將此功能“反向移植”到了Windows的早期版本(Windows 7/8 / 2008R2 / 2012),儘管為了防止將“明文”密碼放置在LSASS中,需要以下註冊表項設置為“ 0”(摘要禁用): HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ WDigest“ UseLogonCredential”(DWORD) ![](https://i.imgur.com/O18XAAF.png) --- ![](https://i.imgur.com/8gy11TU.png) ## Windows 主要登錄機碼目錄名稱 ![](https://i.imgur.com/7o4Bqga.png) ### HKEY_LOCAL_MACHINE 這個分支中包含了電腦上會影響到所有使用者的設定,例如驅動程式和安全性管理原則等。在其下有五個 subkey,在此簡述他們的功用: ![](https://i.imgur.com/DYsfQse.png) ### HKEY_USERS 儲存有關各使用者的資訊。在描述其下各 key 的內容之前,必頇先介紹一個名詞:SID。 SID(Security Identifiers)定義了安全性原則,SID 在同一台電腦中是唯一的,每個帳戶都會有一個專屬的 SID,可以想像成帳戶的識別代碼或是身分證,藉由 SID 可以對應到所屬的帳戶。SID 的格式大約是這種形式: S-1-5-21-2593218664-641331954-590486339-1001 SID 在登錄檔中很常見,用了表示某個特定的帳戶。 ![](https://i.imgur.com/Qfn5gmD.png) ## 參考資料 https://github.com/sisoc-tokyo/Real-timeDetectionAD_journal