搭配 Jamf Pro 設定 macOS Kerberos SSO

Published by gleetsai on

Apple 自 2019 年後直接在作業系統裡面內建了 macOS Kerberos SSO Extension 的整合,讓依賴 Microsoft Active Directory 地端環境的公司,現在也能利用 Kerberos SSOe 完成 SSO,這個功能必須要搭配 MDM 才能啟用,沒辦法透過 UI 或 Script 的方式開啟。

Jamf Pro 設定方式

前往 Computers > Configuration Profiles > Single Sign-On Extension,並將頁面切換成 Kerberos 後,完成相關的設定。例如:

  • Realm 就填入 AD 網域的名稱,應該是全大寫的
  • Hosts 就填入要自動完成 Kerberos SSOe 的網站有哪些:
    例如公司的網站都是 *.gleelab.com,這時候只需要填寫 .gleelab.com 就可以了

macOS 使用者體驗

接著使用者的 macOS 電腦就會在上方工具列的地方出現一把鑰匙,點擊後按下登入,就會出現下方的登入視窗。使用者就在下面輸入 AD 使用者名稱及密碼,就能登入到 AD 網域裡。如果在 Jamf Pro 裡面有配置密碼同步的話,使用者的 macOS 本機帳戶也會被同步成 AD 的密碼。

It just works ?

Apple 最著名的台詞就是:「It just works」,看起來似乎是這樣沒有錯。只要現在打開 Safari,並且連線到公司的某一個 Kerberos 為認證的網站,使用者應該不再需要輸入帳號密碼,就能夠直接登入。但問題總是沒這麼簡單,在最近跟客戶討論的案例裡,發現很多網站還是需要輸入帳密,似乎 Kerberos SSOe 沒有工作,這是為什麼呢?

NTLM 與 Kerberos 很愛攪在一起

事實上是許多公司內部的開發者,利用大量的 Windows 驗證整合技術(Integrated Windows Authentication),這個技術會透過交談的方式判定應該要走 Kerberos 或是降轉成 NTLM。要讓 Kerberos 驗證發生有以下條件(取自於黑暗執行緒 – 關於IIS整合式Windows驗證的冷知識

  • 只適用已加入網域的客戶端
  • 客戶端必須自己連上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沒設好
關於IIS整合式Windows驗證的冷知識

閱讀上面的幾個條件後,我們把焦點放在「非常容易失敗」的那一小段裡,總結出幾個偵錯的方向:

  1. 確定測試案例裡要使用域名連線
  2. 檢查 SPN 註冊是否正常
  3. 檢查 Negotiate Provider 的優先級
  4. 利用 Wireshark 觀察背後驗證的流程(參考黑暗執行緒 – Windows驗證歷程觀察與Kerberos/NTLM判別

利用 app-sso 指令偵錯

理論上我們能用 Safari 拜訪某一個 Kerberos 網站並且成功,其實已經驗證從 Jamf Pro 安裝下來的 Kerberos SSOe 設定是正常可用的了,但如果需要在本機上再驗證一次的話,可以利用 app-sso 這個指令確認。

app-sso -i 網域名稱

利用 klist 與 kdestroy 確認 SPN

kdestroy 這個指令可以把目前拿到的 Kerberos Ticket 全部清空,方便進行驗證。而 klist 指令可以列出目前已經拿到了哪一些 Kerberos Ticket,並且檢查他的 SPN。

檢查 IIS 的 Negotiate 與 SPN 的設定

(1) 檢查 IIS 的 Negotiate Provider 是否正確,匿名式驗證是否已經關閉。

(2) 打開 Active Directory Users and Computers,並且新增一個使用者,例如叫做 iis_service。這個使用者應該要是一個 Service Account,然後在屬性編輯器裡的 ServicePrincipleName 應該會是空白的。

(3) 打開 Powershell 準備輸入以下指令,假設提供的網址叫做 web.gleelab.com,那麼 SPN 的設定方式就要輸入:

Setspn /s HTTP/web.gleelab.com gleelab\iis_service

(4) 調整 ApplicationPool

(5) 選擇 IIS 網站上的 Configurtion Editor,並將裡面的 UseAppPoolCredentials 設為 True

(6) 接著打開 Powershell 執行 iisreset

以上步驟更詳細的教學可以參考 Configuring Kerberos Authentication on IIS Website

讓 Chrome 也支援 Kerberos SSOe

在 Jamf Pro 上面的 Computers 新增 Configuration Profile > Application & Custom Settings:

  • Domain: com.google.Chrome
  • Plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AuthNegotiateDelegateAllowlist</key>
<string>*.gleelab.com</string> 若有多個網域,可以使用逗點分隔
<key>AuthServerAllowlist</key>
<string>*.gleelab.com</string> 若有多個網域,可以使用逗點分隔
<key>AmbientAuthenticationInPrivateModesEnabled</key>
<integer>3</integer> 無痕模式要不要也啟用 Kerberos SSOe,可參考文件
</dict>
</plist>

Categories: Jamf