共用方式為


條件式存取:權杖保護 (預覽)

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

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

重要

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

重要

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

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

注意

我們可能會在此內容中交換登錄令牌和重新整理令牌。 如果您想要為 Microsoft 365 存取權杖和應用程式工作階段的 Cookie 提供保護,請考慮嘗試符合規範的網路檢查強制執行

顯示條件式存取政策需要令牌保護作為會話控制功能的螢幕截圖

需求

此預覽支援下列設定,以存取已套用權杖保護條件式存取原則的資源:

  • 使用 Windows 10 或更新版本的裝置,且該裝置已加入 Microsoft Entra、Microsoft Entra 混合加入,或已註冊於 Microsoft Entra。
  • OneDrive 同步處理用戶端 22.217 版或更新版本
  • Teams 原生用戶端 1.6.00.1331 版或更新版本
  • Power BI Desktop 2.117.841.0 版 (2023 年 5 月) 或更新版本
  • Visual Studio 2022 或更新版本 (當使用 [Windows 驗證代理人] 登入選項時)
  • 不支援 Office 永久用戶端

已知的限制

  • 不支援外部使用者 (Microsoft Entra B2B),且不應包含在條件式存取原則中。
  • 下列應用程式不支援使用受保護的權杖流程登入,且使用者在存取 Exchange 和 SharePoint 時會遭到封鎖:
    • 存取由 Exchange 或 SharePoint 提供服務的 Exchange、SharePoint 或 Microsoft Graph 範圍的 PowerShell 模組
    • 適用於 Excel 的 PowerQuery 延伸模組
    • 存取 Exchange 或 SharePoint 的 Visual Studio Code 擴充套件
    • 新的 Teams 2.1 預覽版用戶端在註銷後因錯誤而遭到封鎖。 未來服務更新中應該修正這個錯誤。
  • 不支援下列 Windows 用戶端裝置:
    • Windows Server
    • Surface Hub
    • 以 Windows 為基礎的 Microsoft Teams 會議室 (MTR) 系統

授權需求

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

注意

憑證保護的強制執行是 Microsoft Entra ID Protection 的一部分,且將在正式發行時即將成為 P2 授權的一部分。

部署

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

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

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

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

建立條件式存取原則

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

下列步驟有助於建立條件式存取原則,以要求 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. 將 [設定] 設定為 [是]

        警告

        未設定用戶端應用程式條件,或保留選取 [瀏覽器] 可能會導致使用 MSAL.js 的應用程式 (例如 Teams Web) 遭到封鎖。

      2. 在 [新式驗證用戶端] 底下,僅選取 [行動應用程式與桌面用戶端]。 保留其他項目未核取。
      3. 選取完成
  8. 在 [存取控制]>[工作階段] 底下,選取 [登入工作階段需要權杖保護],然後選取 [選取]
  9. 確認您的設定,並將 [啟用原則] 設為 [報告專用]
  10. 選取 [建立] 以建立並啟用您的原則。

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

擷取記錄並分析

監視在強制執行前後,權杖保護的條件式存取強制執行。

登入記錄

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

  1. 以至少 條件式存取管理員 的身分登入 Microsoft Entra 系統管理中心
  2. 瀏覽至 身分識別>監控與健康狀態>登入記錄
  3. 選取特定要求,以判斷是否已套用原則。
  4. 根據其狀態移至 [條件式存取] 或 [報告專用] 窗格,然後選擇需要權杖保護的原則名稱。
  5. 會話控制 底下檢查政策需求是否得到滿足。

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

日誌分析

您也可以使用 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   

下一步