共用方式為


Microsoft Entra 條件式存取:令牌保護(預覽)

權杖保護 (業界中有時稱為權杖綁定) 嘗試透過確保權杖只能在目標裝置上使用,來減少使用權杖竊取的攻擊。 當攻擊者能夠透過劫持或重播攻擊來竊取權杖時,他們可以冒充受害者,直到權杖過期或被撤銷為止。 權杖竊取被認為是一個相對罕見的事件,但其造成的損害可能相當巨大。

權杖保護會在權杖與其被發行的目標裝置(用戶端秘密)之間建立一個密碼學上安全的連結。 如果沒有客戶端密鑰,綁定的令牌是無用的。 當使用者在 Microsoft Entra ID 中註冊 Windows 10 或更新版本裝置時,其主要身分識別會繫結至裝置。 這表示:原則可以確保應用程式在要求存取資源時,僅使用連結的登入(或重新整理)權杖,也稱為「主要重新整理令牌 (PRT)」。

重要

令牌保護目前處於公開預覽狀態。 如需預覽的詳細資訊,請參閱線上線服務的通用授權條款。 在此預覽中,我們讓您能建立條件式存取原則,以要求特定服務的登入權杖(包括重新整理權杖)進行權杖保護。 在 Windows 裝置上運行的桌面應用程式,若需存取 Exchange Online 和 SharePoint Online,我們支援在條件式存取中保護登入權杖的使用。

重要

自初始公開預覽發佈以來,已對權杖保護進行下列變更:

  • 登入記錄輸出: 2023 年 6 月下旬,enforcedSessionControlssessionControlsNotSatisfied 的字符串值從 Binding 變更為 SignInTokenProtection。 登入記錄資料的查詢應進行更新,以反映這項變更。

  • 不再支援使用特定方法加入至 Microsoft Entra 的裝置。 如需完整清單,請參閱 已知限制一節

  • 錯誤碼變更:令牌保護條件式存取原則錯誤碼從 53003 變更為530084,以更清楚地識別與令牌保護相關的錯誤。

條件式存取原則的螢幕快照,要求令牌保護作為工作階段控制。

需求

使用此功能需要 Microsoft Entra ID P2 授權。 若要尋找適合您需求的授權,請參閱比較 Microsoft Entra ID 正式推出的功能

注意

令牌保護強制執行是 Microsoft Entra ID Protection 的一部分。一旦達到全面可用性,則需要 Microsoft Entra ID P2 授權。

下列裝置和應用程式支援存取套用令牌保護條件式存取原則的資源:

支援的裝置:

  • 使用 Windows 10 或更新版本的裝置,且該裝置已加入 Microsoft Entra、Microsoft Entra 混合加入,或已註冊於 Microsoft Entra。 如需不支援的裝置類型,請參閱 已知限制一節
  • 已加入混合式Microsoft Entra 的 Windows Server 2019 或更新版本。

支援的應用程式:

  • OneDrive 同步處理用戶端 22.217 版或更新版本
  • Teams 原生用戶端 1.6.00.1331 版或更新版本
  • Power BI Desktop 2.117.841.0 版 (2023 年 5 月) 或更新版本
  • Exchange PowerShell 模組 3.7.0 版或更新版本
  • Microsoft Graph PowerShell 2.0.0 版或更新版本搭配 EnableLoginByWAM 選項
  • 使用 [Windows 驗證代理人] 登入選項時,Visual Studio 2022 或更新版本

已知的限制

若要識別受影響的裝置,因為先前列出的註冊類型不受支援,請檢查登入記錄中的 tokenProtectionStatusDetails 屬性。 由於裝置註冊類型不受支援而封鎖的令牌請求,可以藉由值為 1003 的 signInSessionStatusCode 來識別。

若要防止新上線的任何中斷,您可以新增裝置篩選條件條件,以修改令牌保護條件式存取原則,以排除任何落在先前所述部署類別中的裝置。 例如,若要排除:

  • 加入了 Microsoft Entra 的雲端電腦,您可以使用 systemLabels -eq "CloudPC" and trustType -eq "AzureAD"
  • 加入 Microsoft Entra 的 Azure 虛擬桌面,您可以使用 systemLabels -eq "AzureVirtualDesktop" and trustType -eq "AzureAD"
  • 已加入 Microsoft Entra 的 Power Automate 託管機器群組,您可以使用 systemLabels -eq "MicrosoftPowerAutomate" and trustType -eq "AzureAD"
  • 已加入 Microsoft Entra 的 Azure 上的 Microsoft Windows 虛擬機器,您可以使用 systemLabels -eq "AzureResource" and trustType -eq "AzureAD"

部署

對使用者而言,當使用相容的客戶端平台、已註冊的裝置以及相容的應用程式時,部署條件式存取政策以進行權杖保護應該是無形的。

為了最大限度地降低由於應用程式或裝置不相容而導致使用者中斷的可能性,我們強烈建議:

  • 從試驗使用者群組開始,並隨時間擴充。
  • 在移至強制執行權杖保護之前,先以報告專用模式建立條件式存取原則。
  • 擷取互動式和非互動式登入記錄。
  • 分析這些日誌的時間應足夠長,以涵蓋一般應用程式的使用。
  • 將已知的良好使用者新增至強制執行政策。

此過程有助於評估使用者的客戶端與應用程式的相容性,以執行權杖保護措施。

建立條件式存取原則

執行特殊角色的使用者 (例如特殊權限存取安全性層級中所述的使用者) 是此功能的可能目標。 我們建議先從小範圍開始試點。

下列步驟有助於建立條件式存取原則,以要求 Windows 裝置上的 Exchange Online 和 SharePoint Online 權杖保護。

  1. 以至少條件式存取管理員的身分登入Microsoft Entra 系統管理中心
  2. 瀏覽至 保護>條件式存取>政策
  3. 選取 新增政策
  4. 為您的政策取名字。 建議組織針對其原則的名稱建立有意義的標準。
  5. 在 [指派] 底下,選取 [使用者] 或 [工作負載識別]
    1. 在 [包括] 下,選取正在測試此原則的使用者或群組。
    2. 排除 下,選擇 使用者和群組,然後選擇您組織的緊急存取或急用帳戶。
  6. 目標資源>(先前稱為雲端應用程式的資源)>中包含>選取資源
    1. 在 [選取] 底下,選取預覽支援的下列應用程式:

      1. Office 365 Exchange Online
      2. Office 365 SharePoint Online

      警告

      您的條件式存取原則應該只針對這些應用程式進行設定。 選取 Office 365 應用程式群組可能會導致非預期的失敗。 這項變更是一般規則的例外狀況,即應該在條件式存取原則中選取 Office 365 應用程式群組。

    2. 選擇選擇

  7. 在 [條件] 底下:
    1. 在 [裝置平台] 底下:
      1. 將 [設定] 設定為 [是]
      2. [包括]>[選取裝置平台]>[Windows]
      3. 選取完成
    2. 在 [用戶端應用程式] 底下:
      1. 將 [設定] 設定為 [是]

        警告

        未設定用戶端應用程式條件,或將 Browser 選取可能會導致使用 MSAL.js的應用程式遭到封鎖,例如 Teams Web。

      2. 在 [新式驗證用戶端] 底下,僅選取 [行動應用程式與桌面用戶端]。 保留其他項目未核取。

      3. 選取完成

  8. 在 [存取控制]>[會話] 底下,選取 [需要權杖保護的登入會話],然後按一下 [選取]
  9. 確認您的設定,並將 [啟用原則] 設為 [報告專用]
  10. 選取 [建立] 以建立並啟用您的原則。

管理員使用報告專用模式確認設定之後,即可以將 [啟用原則] 從 [報告專用] 切換至 [開啟]

小提示

由於要求令牌保護的條件式存取原則目前僅適用於 Windows 裝置,因此當攻擊者似乎來自不同平臺時,必須保護您的環境,以防止潛在的原則略過。

此外,您應該設定下列原則:

擷取記錄並分析

使用 原則影響(預覽)登入記錄Log Analytics等功能,監控在強制執行之前和之後的條件式存取令牌保護強制執行。

登入記錄

使用 Microsoft Entra 登入記錄,在報告專用模式或啟用模式中驗證權杖保護強制執行原則的結果。

顯示未滿足原則之範例的螢幕擷取畫面。

  1. 以至少條件式存取管理員的身分登入Microsoft Entra 系統管理中心
  2. 瀏覽至 身分識別>監控與健康狀態>登入記錄
  3. 選取特定要求,以判斷是否已套用原則。
  4. 根據其狀態移至 [條件式存取] 或 [報告專用] 窗格,然後選擇需要權杖保護的原則名稱。
  5. 會話控制 底下檢查政策需求是否得到滿足。
  6. 若要尋找要求系結狀態的詳細資訊,請選取窗格 [基本資訊],並查看 [令牌保護 - 登入會話] 欄位。 可能的值包括:
    1. 綁定:請求是使用綁定的通訊協定。 有些登入可能包含多個請求,且必須將所有請求綁定以符合令牌保護政策。 即使個別要求似乎已系結,如果其他要求未繫結,它也不會確保原則的合規性。 若要查看登入的所有要求,您可以篩選特定使用者的所有要求,或依corelationid查看。
    2. 未系結:要求未使用系結通訊協定。 當要求未系結時,可能的 statusCodes 為:
      1. 1002:因缺少 Microsoft Entra ID 裝置狀態,請求未受限。
      2. 1003:請求未綁定,因為 Microsoft Entra ID 裝置狀態不符合令牌保護的條件式存取政策要求。 此錯誤可能是因為不支援的裝置註冊類型,或裝置未使用全新的登入認證進行註冊。
      3. 1005:要求因其他未指定的原因而未能進行綁定。
      4. 1006:要求未系結,因為不支援作業系統版本。
      5. 1008:要求未系結,因為用戶端未與平臺代理程式整合,例如 Windows 帳戶管理員(WAM)。

一個螢幕快照,顯示帶有令牌保護的登入範例,當中醒目提示「登入會話屬性」。

日誌分析

您也可以使用 Log Analytics 查詢因權杖保護強制執行失敗而遭到封鎖的要求登入記錄 (互動式和非互動式)。

以下是一個 Log Analytics 查詢範例,用於搜尋過去七天的非互動式登入記錄,並根據應用程式來突出顯示封鎖允許的要求。 這些查詢只是範例,而且可能會變更。

注意

登入記錄輸出:2023 年 6 月下旬,"enforcedSessionControls" 和 "sessionControlsNotSatisfied" 中使用的字串值從 "Binding" 變更為 "SignInTokenProtection"。 登入記錄資料的查詢應進行更新,以反映這項變更。 這些範例涵蓋這兩個值以包含歷程資料。

//Per Apps query 
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs ) 
//SigninLogs 
AADNonInteractiveUserSignInLogs 
// Adjust the time range below 
| where TimeGenerated > ago(7d) 
| project Id,ConditionalAccessPolicies, Status,UserPrincipalName, AppDisplayName, ResourceDisplayName 
| where ConditionalAccessPolicies != "[]" 
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online" 
//Add userPrinicpalName if you want to filter  
// | where UserPrincipalName =="<user_principal_Name>" 
| mv-expand todynamic(ConditionalAccessPolicies) 
| where ConditionalAccessPolicies ["enforcedSessionControls"] contains '["Binding"]' or ConditionalAccessPolicies ["enforcedSessionControls"] contains '["SignInTokenProtection"]' 
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied" 
| extend SessionNotSatisfyResult = ConditionalAccessPolicies["sessionControlsNotSatisfied"] 
| extend Result = case (SessionNotSatisfyResult contains 'SignInTokenProtection' or SessionNotSatisfyResult contains 'SignInTokenProtection', 'Block','Allow')
| summarize by Id,UserPrincipalName, AppDisplayName, Result 
| summarize Requests = count(), Users = dcount(UserPrincipalName), Block = countif(Result == "Block"), Allow = countif(Result == "Allow"), BlockedUsers = dcountif(UserPrincipalName, Result == "Block") by AppDisplayName 
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2) 
| sort by Requests desc 

上一個查詢的結果應該類似下列螢幕擷取畫面:

顯示 Log Analytics 查詢尋找權杖保護原則之範例結果的螢幕擷取畫面

下列查詢範例會查看過去七天的非互動式登入記錄,並重點顯示被使用者封鎖的要求與被使用者允許的要求。

//Per users query 
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs ) 
//SigninLogs 
AADNonInteractiveUserSignInLogs 
// Adjust the time range below 
| where TimeGenerated > ago(7d) 
| project Id,ConditionalAccessPolicies, UserPrincipalName, AppDisplayName, ResourceDisplayName 
| where ConditionalAccessPolicies != "[]" 
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online" 
//Add userPrincipalName if you want to filter  
// | where UserPrincipalName =="<user_principal_Name>" 
| mv-expand todynamic(ConditionalAccessPolicies) 
| where ConditionalAccessPolicies ["enforcedSessionControls"] contains '["Binding"]' or ConditionalAccessPolicies ["enforcedSessionControls"] contains '["SignInTokenProtection"]'
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied" 
| extend SessionNotSatisfyResult = ConditionalAccessPolicies.sessionControlsNotSatisfied 
| extend Result = case (SessionNotSatisfyResult contains 'SignInTokenProtection' or SessionNotSatisfyResult contains 'SignInTokenProtection', 'Block','Allow')
| summarize by Id, UserPrincipalName, AppDisplayName, ResourceDisplayName,Result  
| summarize Requests = count(),Block = countif(Result == "Block"), Allow = countif(Result == "Allow") by UserPrincipalName, AppDisplayName,ResourceDisplayName 
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2) 
| sort by UserPrincipalName asc   

下列查詢範例會查看過去七天的非互動式登入記錄,醒目提示使用裝置的使用者,其中Microsoft Entra ID 裝置狀態不符合令牌保護 CA 原則需求。

AADNonInteractiveUserSignInLogs 
// Adjust the time range below 
| where TimeGenerated > ago(7d) 
| where TokenProtectionStatusDetails!= "" 
| extend parsedBindingDetails = parse_json(TokenProtectionStatusDetails) 
| extend bindingStatus = tostring(parsedBindingDetails["signInSessionStatus"]) 
| extend bindingStatusCode = tostring(parsedBindingDetails["signInSessionStatusCode"]) 
| where bindingStatusCode == 1003 
| summarize count() by UserPrincipalName 

什麼是主要更新令牌?