在企業內部寫ASP.NET的人都用過整合式Windows驗證吧?來個小測驗:

  1. 沒加入網域的PC可以用AD帳號登入隸屬該網域的IIS嗎?
  2. 在測試環境建立一測試網域,與公司正式AD網域間無信任關係。正式網域PC是否可以用測試網域帳號登入測試網域的IIS?
  3. 承上,正式網域PC需將DNS指向測試網域DC才能用測試網域帳號登入嗎?

依據實際使用經驗,我知道的答案是:Yes、Yes、No,但不知所以然。最近因工作需要做了粗淺研究,整理筆記備忘兼分享。(如有謬誤,有請各方高人指正)

IIS實現Windows驗證的方式有兩種,NTLM與Kerberos。NTLM如其名,是NT時代就有的Challenge/Response驗證方式(不透過網路傳輸密碼本身);Windows 2000起改用Kerberos作為預設認證協定,主要有以下優點:

  • 驗證速度快
    使用NTLM時,若資源伺服器本身不是DC(Domain Controller,網域控制器),則轉向DC求證身分真偽(稱之Pass-Through Authentication);而資源伺服器取得Kerberros Tickets(或稱Authenticator)時就已取得足以驗證客戶端的資訊,較有效率。
  • 交互驗證
    Kerberos驗證時,不只客戶端向伺服器證明自己身分,伺服器也可要求伺服器驗明正身,社絕NTLM可能被冒牌伺服器騙取身分的風險。
  • Kerberos為開放標準
    由於Kerberos為開放標準,故有機會整合Windows與其他作業系統達成單一登入(Single Sign On)。
  • 支援驗證委派
    資源伺服器取得代表使用者身分的Kerberos Ticket後,可直接代表該使用者存取其他資源伺服器。例如:使用者登入Web後,Web以該使用者身分登入SQL。 
  • 支援Smart Card登入
    可整合Smart Card做到雙因子登入,登入時需擁有實體卡片並知道密碼,降低身分盜用風險。

當我們設定IIS使用Windows驗證時,預設的提供者為Negotiate,包含Kerberos及NTLM兩種驗證方式,而其選用規則為「與瀏覽器協商,先嘗試使用Kerberos,若條件不符則改用NTLM」。

IIS採用NTLM或Kerberos則有以下區別:

NTLM

  • 客戶端不管有沒有加入網域都適用
  • 可使用網域帳號或本機帳號
  • 使用網域帳號時,只有IIS主機需要連線DC
    註:忙碌的NTLM Server (IIS, Exchange, TMG/ISA)可能產生大量NTLM請求,對DC形成負擔
  • 客戶端只需連上IIS,不用連到DC
  • 可以穿透支援HTTP Keep-Alives的Proxy
  • 認證過程需多次往返(HTTP 401 –> HTTP 401 –> HTTP 200)
  • 不支援Double-Hop Authenticataion(即驗證委派,將使用者認證用於另一台電腦執行的服務)
  • 支援Windows 2000以下的舊版系統(註:此點已可忽略)
  • 易受LM Auth Level不一致影響(lmcompatibilitylevel不吻合)
  • 為Negotiate提供者的備援方案,若 Kerberos不成功就轉用NTLM

 

Kerberos

  • 只適用已加入網域的客戶端
  • 客戶端必須自己連上AD DC(TCP/UDP 88 Port)
  • 不易穿透Proxy
  • 憑證效期長(10小時),DC負荷較輕
  • 認證過程為HTTP 401 –> 傳送Token(6-16KB) –> HTTP 200
  • 認證身分可以轉用。例如:使用者登入IIS後,Web使用同一AD帳號登入SQL
  • Negotiate提供者的優先選項
  • 必須搞定SPN註冊(手續挺複雜)
  • 非常容易失敗,如果你…
    • 在URL使用IP而不是機器名稱
    • 沒註冊SPN
    • 重複註冊SPN
    • SPN註冊錯帳號 (KRB_ERR_AP_MODIFIED)
    • 客戶端無法連線DNS/DC
    • Proxy/Local Intranet Zone沒設好

理解以上知識,一開始的三個問題就有了答案,而我才這發現平日使用的Windows驗證,幾乎都是走NTLM,理由包含:使用測試AD帳號、使用IP URL、未特別為網站註冊SPN、啟用Web Farm或負載平衡設備無法用機器名稱… 換言之,Kerberos雖然更安全,但成立條件嚴苛,稍有不慎就會掉回NTLM。

活到老學到老,今天又上了一課。

參考資料:


Comments

# by Sid

黑大您好,我今日實作IIS Windows驗證時也遇到一些疑惑,想請教您看看是否有相關經驗 我目前是用ASP.NET 架設一個網站,放置在IIS上,我想程式執行時取得訪問網站者的AD UserName 發現必須要將IIS的Windwos驗證開啟並且關閉匿名驗證才可順利抓取 程式被訪問後,由於Windows驗證開啟緣故,需先輸入AD Name & Password才可進入程式開始執行 也順路抓取到登入者的資訊(廢話XD,都登入了) 但我的疑問是,當我想清除輸入過的AD帳密資訊,發現我不管清除瀏覽器快取或是重新啟動IIS 完全沒用! 這令我有點害怕,感覺變成是IIS與Windows及AD Server溝通後,自己默默達成協議 什麼時候失效,什麼時候需要再重新輸入,會有什麼狀況,完全不知,讓我有點不敢用在客戶環境上... 不知黑大是否有相關資料或經驗能分享一下...感激不盡

# by Jeffrey

to Sid, 依我的理解,瀏覽器使用 Windows 驗證登入 IIS 後會記住該網站的登入身分,避免反覆詢問帳密。你試試將瀏覽器全部關閉(工作列上的所有視窗通通要關掉)或是另開無痕視窗,看是會要求重新輸入帳號密碼?(補充:測試多種登入身分的技巧 https://blog.darkthread.net/blog/test-website-with-mutli-account/ )

# by Ou Sir

比如 IE,網際網路選項/安全性/自訂等級/使用者驗證/登入/勾選"提示輸入使用者名稱及密碼"

Post a comment