在 Conditional Access 條件下設置 Jamf Connect Login 的 MFA 挑戰

Published by gleetsai on

Mac 世界的零接觸話題,每年都可以有新的話題出現。圍繞著使用者體驗,讓用戶在拿到電腦的那一刻,就能自動化配置所有公司要求的設定,不需 IT 人員幫忙。這不僅是節省 IT 人員的時間而已,更是讓整個出機流程變得更為流暢。

除了軟體與設定可以全自動化部署以外,使用者帳號當然也可以自助化的設定在電腦裡,而且完全按照公司的規範。所以如果公司正在使用 Entra ID 這樣的目錄服務時,當然也可以把 Entra ID 上面的帳密同步化成電腦本機電腦上的帳密,減少人員帳密疲疺的風險。然而,要求更高等級的公司,可能會要求人員在登入 Entra ID 時必須通過兩階段驗證,而這可能就為同步密碼帶來挑戰。

以 Jamf Connect 來說,這一套軟體可以在 Mac 設備開箱時自動就安裝在電腦上,並且出現一個可客製化的登入視窗給用戶登入 Entra ID。剖析這套軟體,事實上是由兩個 OIDC 授權類別完成的,一個是 Authorization Code Grant,另外一個是 ROPG。

Jamf Connect Login 畫面,取自 Jamf 官網
  • Authorization Code Grant 是 Jamf Connect 用來創建 Mac 本地帳號時會使用到的授權類別。簡單來說,當用戶把公司帳密輸入在上方登入畫面時,Microsoft Entra ID 就會回傳一個 token,Jamf Connect 就可以利用這個 token 裡面的資料去創建本地帳號,例如使用者名稱等等。
  • ROPG 則是在本地帳號建立後,Jamf Connect 為了要確保本地帳戶的密碼與在 Microsoft Entra ID 上的使用者密碼一致,會再利用這個授權類別去確認兩邊密碼一致。

以上這些情況都沒有什麼問題。然而,當公司配置 Microsoft Conditional Access 在 Jamf Connect 上時就會出現問題了。假設配置的條件是必須完成 MFA 驗證才提供 Token,那麼 ROPG 這種授權類別就會難以進行。一是 ROPG 這個授權類別不會彈出一個畫面要使用者輸入兩階段驗證碼之類的東西,二是這種同步密碼的頻率可能是 15 分鐘一次,不可能每 15 分鐘就去挑戰使用者。

然而,當這個 ROPG 挑戰失敗,不只是密碼無法同步,也會留下一道登入失敗的紀錄在 Entra ID 上面,這對於風險控管會是另一個棘手的問題。所以,如何滿足登入時必須完成 MFA 挑戰,且密碼同步時不會留下錯誤紀錄並取得合法的 Token,就是這篇主要討論的問題。

我參考了 Jamf 工程師在 Github 上面的做法,成功解決了這個問題,過程略顯複雜,但是直到動筆的當下都還能用。簡約來說,這個做法大概拆成以下幾個步驟:

  1. 在 Entra ID 上面註冊兩個 Jamf Connect App,一個對外公開、一個做為內部呼叫使用。
  2. 在內部呼叫的 App 上面,另外去 Expose API,方便由對外公司的 App 呼叫。
  3. 設定 Microsoft Custom Security Attribute,稍候會套用到 All Cloud Apps 的排除清單裡。
  4. 在面向外部的 App 上面,連結已開放 API 的內部 App,並且套用剛才設定的 Custom Security Attribute
  5. 回到 Microsoft Entra Conditional Access 上面找出所有已設定 All Cloud apps 的政策,並且排除具有該 Secuiry Attribute 的 App
  6. 使用 Jamf Connect Configuration Tool 設定兩個 App 的 Client ID,並且實機測試。

設定內部呼叫的 Jamf Connect App

姑且稱這個 App 叫做 Jamf Connect API App 好了。首先前往 Microsoft Entra ID > App Registrations > New Registration,填完名字、選擇 Single Tenant 後按下註冊就好。

接著編輯剛才已經註冊好的 App,點選 Expose API > Application ID URI > Add,就會自動新增一個 URI。接著按下 Add a Scope。

在 Add a scope 裡面按照以下畫面填妥,Scope name 照圖填寫、並選擇 Admins only,最後 Add Scope。

結果就會長得像下面這張圖一樣,請把 Application ID URI 先抄下來,等一下會用到。

接著選擇左邊的 API Permissions,並且點選 Grant admin consent。

設定 Custom Security Extension Attribute

微軟預設是沒有把這項功能打開的(不是因為繳的錢不夠多),照微軟文件來看,你應該要加上這些角色權限才能使用:

  • Attribute Definition Reader
  • Attribute Definition Administrator
  • Attribute Assignment Reader
  • Attribute Assignment Administrator

你可以前往 Entra ID > Users > 選擇用戶 > Assigned Roles 裡面去確認一下

確定有權限後,前往 Entra ID > Custom Security Attributes > Add attribute set,自己取一個名字,例如叫做 JamfConnect。

然後再點選剛才建立的 Set > Add attribute,然後按照下圖輸入。意思是這個欄位的名字叫做 exempt,裡面只有一個選項是 exemptMFA,而且不允許使用多個值來設定這個欄位,而且不允許預設以外的值被設定。

特別留意一下,Custom Security Attribute 這個功能目前只能新增不能刪除,所以如果後來想刪掉的話…在執筆這篇文章時是做不到的。

設定對外公開的 App

再回到一次 Entra ID > App Registrations > New registration,這次取名為 Jamf Connect OIDC App。比較不一樣的是在下方的 Redirect URI 的地方,選擇 Public client…,值填入 https://127.0.0.1/jamfconnect

按下註冊後,再繼續編輯這個 App > API permissions > Add a permission > APIs my organization uses > 找到剛才建立的 Jamf Connect API,最後記得按一下 Grant admin consent for…

結果大概像下面這張圖:

接著前往 Entra ID > Enterprise Applications > 選擇剛才建立的 OIDC App > Custom Security Attribtes,並且新增一個 Assignment,就選擇剛才建立好的 Custom Security Attribute,值的話就選擇 ExemptMFA。(下方截圖是之前就已經做過的設定,所以值的名稱叫做 Exempt,而不叫做 ExemptMFA,但總之前面只有設定一個值在這個欄位裡,所以就選擇你設定的那個值就是了)

設定 All Cloud Apps 的 Conditional Access 政策

前往 Microsoft Entra Conditional Access > Policies,一條一條看有沒有任何的 Policy 是套用到 All Cloud Apps 的。如果有,請編輯該 Policy,並且新增 Exclude 條件。也就是說,如果 App 裡面帶有這個 Custom Security Attribute 的話,就略過套用這個 Policy。

設定 Jamf Connect Configuration

請按照圖片設定。關於 OpenID connect scopes 的內容,請參考剛才小抄的 Application ID URI,後面再加上 +openid+profile+email。

接下來只要把 Jamf Connect Login 與 Jamf Connect 這兩個設定檔安裝到電腦上面,就可以實機測試看看了,最後的 Entra ID Logs 應該會長得跟下面一樣。也就是使用者在登入電腦時仍然必須經過 MFA 挑戰,但是做為密碼驗證的 ROPG 不會被要求 MFA。

Categories: Jamf