共用方式為


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

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

權杖保護會在權杖與其發行的目標裝置 (用戶端密碼) 之間建立密碼編譯安全繫結。 如果沒有用戶端密碼,繫結的權杖就無法使用。 當使用者在 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 查詢因權杖保護強制執行失敗而遭到封鎖的要求登入記錄 (互動式和非互動式)。

以下是過去七天搜尋非互動式登入記錄的 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   

下一步