權杖保護是條件式存取的工作階段控制,旨在降低權杖重播攻擊風險,確保當應用程式要求存取受保護的資源時,Entra ID 只接受與裝置綁定的登入工作階段權杖,例如主要更新權杖(PRT)。
當使用者向 Microsoft Entra 註冊 Windows 10 或更新版本的裝置時,會發出 PRT 並以密碼編譯方式系結至該裝置。 此繫結可確保即使威脅行為者竊取權杖,也無法從其他裝置使用該權杖。 啟用權杖保護後,Microsoft Entra 會驗證支援的應用程式只會使用這些綁定的登入會話權杖。
您可以在 Exchange Online、SharePoint Online 和 Teams 資源上強制執行權杖保護原則。 許多 Microsoft 365 本機應用程式都支援它。 有關支援的應用程式和資源的完整列表,請參閱「要求」部分。
Note
使用此政策作為一種更廣泛策略的一環,以防止權杖被竊,如《Microsoft Entra中如何保護權杖》中所述。
Requirements
使用此功能需要 Microsoft Entra ID P1 授權。 若要尋找符合您需求的授權,請參閱 比較 Microsoft Entra ID 的一般可用功能。
下列裝置和應用程式支援存取套用權杖保護條件式存取原則的資源:
支援的裝置
- 使用 Windows 10 或更新版本的裝置,且該裝置已加入 Microsoft Entra、Microsoft Entra 混合加入,或已註冊於 Microsoft Entra。 如需不支援的裝置類型,請參閱 已知限制一節 。
- 已加入混合式 Microsoft Entra 的 Windows Server 2019 或更新版本。
Note
關於如何註冊您的裝置的詳細步驟,請參閱 「在您的工作或學校網路上註冊您的個人裝置」。
支援的應用程式
- 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 或更新版本
- Windows 應用程式 2.0.379.0 版或更新版本
下列資源支援權杖保護:
- Office 365Exchange Online
- Office 365 SharePoint 在線
- Microsoft Teams 服務
- Azure 虛擬桌面
- 視窗 365
已知的限制
- 不支援 Office 永久用戶端。
- 下列應用程式不支援使用受保護的權杖流程登入,且使用者在存取 Exchange 和 SharePoint 時會遭到封鎖:
- 存取 SharePoint 的 PowerShell 模組
- 適用於 Excel 的 PowerQuery 延伸模組
- 存取 Exchange 或 SharePoint 的 Visual Studio Code 擴充套件
- 不支援下列 Windows 用戶端裝置:
- Surface Hub
- 以 Windows 為基礎的 Microsoft Teams 會議室 (MTR) 系統
- 符合其主租戶中令牌保護裝置註冊需求的外部使用者將獲得支援。 不過,不符合這些需求的使用者會看到不清楚的錯誤訊息,沒有根本原因的指示。
- 不支援使用下列方法向 Microsoft Entra ID 註冊的裝置:
- Microsoft Entra 已加入 Azure 虛擬桌面會話主機。
- 使用 大量註冊方法部署的 Windows 裝置。
- 由 Windows 365 部署且已加入 Microsoft Entra 的雲端電腦。
- Microsoft Entra 連接的 Power Automate 託管機器群組。
- 使用 自我部署模式部署的 Windows Autopilot 裝置。
- 在 Azure 中部署透過啟用 Microsoft Entra ID 驗證的虛擬機擴充功能的 Windows 虛擬機。
若要識別因先前列出的不支援註冊類型而受影響的裝置,請檢查 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"。 - 在使用自我部署模式部署 Windows Autopilot 裝置時,您可以使用 enrollmentProfileName 屬性。 例如,如果您已在 Intune 中為 Autopilot 自我部署模式裝置建立註冊設定檔作為“Autopilot 自我部署配置檔”,您可以使用 'enrollmentProfileName -eq “Autopilot 自我部署配置檔”。
- 已加入 Microsoft Entra 的 Azure 上的 Microsoft Windows 虛擬機器,您可以使用
profileType -eq "SecureVM" and trustType -eq "AzureAD"。
Deployment
對使用者而言,當使用相容的客戶端平台、已註冊的裝置以及相容的應用程式時,部署條件式存取政策以進行權杖保護應該是無形的。
為了最大限度地減少因應用程式或裝置不相容而導致使用者中斷的可能性,請遵循以下建議:
- 從試驗使用者群組開始,並隨著時間進行擴展。
- 在強制執行權杖保護之前,先在 僅限報告模式 中建立條件式存取原則。
- 擷取互動式和非互動式登入記錄。
- 分析這些記錄的時間足夠長,以涵蓋正常的應用程式使用情況。
- 將已知、可靠的使用者新增至執行政策。
此流程有助於評估使用者的用戶端和應用程式相容性,以執行權杖保護。
建立條件式存取原則
執行特殊角色的使用者,例如 特殊許可權存取安全性層級 中所述的使用者,是此功能的可能目標。 我們建議先從小範圍開始試點。
下列步驟可協助您建立條件式存取原則,以要求 Windows 裝置上的 Exchange Online 和 SharePoint Online 權杖保護。
- 以至少條件式存取系統管理員身分登入 Microsoft Entra 系統管理中心。
- 流覽至 Entra ID>條件式存取>策略。
- 選擇 新政策。
- 為您的政策取名字。 建議組織針對其原則的名稱建立有意義的標準。
- 在 [指派] 底下,選取 [使用者] 或 [工作負載識別]。
- 在 [包括] 下,選取正在測試此原則的使用者或群組。
- 在 排除 下,選擇 使用者和群組,然後選擇您組織的緊急存取帳戶或「破窗」帳戶。
- 在目標資源>(先前稱為雲端應用程式的資源)>中包含>選取資源
在 [選取] 底下,選取下列應用程式:
- Office 365Exchange Online
- Office 365 SharePoint 在線
- Microsoft Teams 服務
- 如果您在環境中部署 Windows 應用程式,請包括:
- Azure 虛擬桌面
- 視窗 365
- Windows 雲端登入
Warning
您的條件式存取原則應該只針對這些應用程式進行設定。 選取 Office 365 應用程式群組可能會導致非預期的失敗。 這項變更是一般規則的例外狀況,即應該在條件式存取原則中選取 Office 365 應用程式群組。
選擇 [] 選取 []。
- 在 [條件] 底下:
- 在 [裝置平台] 底下:
- 將 [設定] 設定為 [是]。
- [包括]>[選取裝置平台]>[Windows]。
- 選擇 完成。
- 在 [用戶端應用程式] 底下:
將 [設定] 設定為 [是]。
Warning
未設定 [用戶端應用程式 ] 條件,或讓 [瀏覽器 ] 保持選取可能會導致使用 MSAL.js的應用程式遭到封鎖,例如 Teams Web。
在 [新式驗證用戶端] 底下,僅選取 [行動應用程式與桌面用戶端]。 保留其他項目未核取。
選擇 完成。
- 在 [裝置平台] 底下:
- 在 [存取控制]>[會話] 底下,選取 [需要權杖保護的登入會話],然後按一下 [選取]。
- 確認您的設定,並將 [啟用原則] 設為 [報告專用]。
- 選取 [建立] 以啟用您的政策。
使用 原則影響或僅限報告模式確認您的設定之後,請將 [啟用原則] 切換從 [僅限報告] 移至 [ 開啟]。
Tip
由於要求令牌保護的條件式存取原則目前僅適用於 Windows 裝置,因此當攻擊者似乎來自不同平臺時,必須保護您的環境,以防止潛在的原則略過。
此外,您應該設定下列原則:
擷取記錄並分析
在強制執行前後,使用 原則影響、登入記錄和日誌分析等功能,監視條件式存取的強制執行。
登入記錄
使用 Microsoft Entra 登入記錄,在報告專用模式或啟用模式中驗證權杖保護強制執行原則的結果。
- 以至少條件式存取系統管理員身分登入 Microsoft Entra 系統管理中心。
- 流覽至 Entra ID>監視與健康>登入記錄。
- 選取特定要求,以判斷是否已套用原則。
- 根據其狀態移至 [條件式存取] 或 [報告專用] 窗格,然後選擇需要權杖保護的原則名稱。
- 在 [工作階段控制] 底下,檢查是否滿足政策要求。
- 若要尋找要求系結狀態的詳細資訊,請選取窗格 [基本資訊 ],並查看 [ 令牌保護 - 登入會話] 字段。 可能的值包括:
- 綁定:請求是使用綁定的通訊協定。 有些登入可能包含多個請求,且必須將所有請求綁定以符合令牌保護政策。 即使個別要求似乎已系結,如果其他要求未繫結,它也不會確保原則的合規性。 若要查看登入的所有要求,您可以篩選特定使用者的所有要求,或依corelationid查看。
- 未系結:要求未使用系結通訊協定。 當請求未綁定時,可能的
statusCodes為:- 1002:因缺少 Microsoft Entra ID 裝置狀態,請求未受限。
- 1003:請求未綁定,因為 Microsoft Entra ID 裝置狀態不符合令牌保護的條件式存取政策要求。 此錯誤可能是因為不支援的裝置註冊類型,或裝置未使用全新的登入認證進行註冊。
- 1005:要求因其他未指定的原因而未能進行綁定。
- 1006:要求未系結,因為不支援作業系統版本。
- 1008:請求未系結,因為用戶端未與平台代理整合,例如 Windows 帳戶管理員(WAM)。
Log Analytics
您也可以使用 Log Analytics 查詢因權杖保護強制執行失敗而遭到封鎖的要求登入記錄 (互動式和非互動式)。
以下是一個 Log Analytics 查詢範例,用於搜尋過去七天的非互動式登入記錄,並根據應用程式來突出顯示封鎖和允許的要求。 這些查詢只是範例,而且可能會變更。
Note
登入記錄輸出: “enforcedSessionControls” 和 “sessionControlsNotSatisfied” 中使用的字串值在 2023 年 6 月下旬從 “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" or ResourceDisplayName =="Azure Virtual Desktop" or ResourceDisplayName =="Windows 365" or ResourceDisplayName =="Windows Cloud Login"
| 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, 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
上一個查詢的結果應該類似下列螢幕擷取畫面:
下列查詢範例會查看過去七天的非互動式登入記錄,並重點顯示被使用者封鎖的要求與被使用者允許的要求。
//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" or ResourceDisplayName =="Azure Virtual Desktop" or ResourceDisplayName =="Windows 365" or ResourceDisplayName =="Windows Cloud Login"
| 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
使用者體驗
啟用權杖保護要求時,註冊或將其支援裝置註冊的使用者在支援權杖保護的應用程式上的登入體驗沒有任何差異。
尚未註冊或註冊其裝置的使用者,如果已啟用權杖保護原則,則會在驗證之後看到下列螢幕擷取畫面。
啟用權杖保護原則時未使用支援應用程式的使用者會在驗證之後看到下列螢幕快照。