Skip to content

Commit a84a83c

Browse files
Update
1 parent 84582e2 commit a84a83c

File tree

7 files changed

+179
-91
lines changed

7 files changed

+179
-91
lines changed

articles/active-directory/conditional-access/TOC.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
href: service-dependencies.md
4040
- name: Filter for applications
4141
href: concept-filter-for-applications.md
42-
- name: Token binding
43-
href: concept-token-binding.md
42+
- name: Token protection
43+
href: concept-token-protection.md
4444
- name: Location conditions
4545
href: location-condition.md
4646
- name: Workload identities

articles/active-directory/conditional-access/concept-token-binding.md

Lines changed: 0 additions & 89 deletions
This file was deleted.
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
---
2+
title:
3+
description:
4+
ms.service: active-directory
5+
ms.subservice: conditional-access
6+
ms.topic: conceptual
7+
ms.date: 02/24/2023
8+
9+
ms.author: joflore
10+
author: MicrosoftGuyJFlo
11+
manager:
12+
ms.reviewer:
13+
14+
ms.collection: M365-identity-device-management
15+
---
16+
# Conditional Access: Token protection (preview)
17+
18+
Token protection (sometimes referred to as token binding in the industry) attempts to reduce attacks using token theft by ensuring a token is usable only from the intended device. When an attacker is able to steal a token, by hijacking or replay, they can impersonate their victim until the token expires or is revoked. Token theft is thought to be a relatively rare event, but the damage from it can be significant.
19+
20+
Token protection creates a cryptographically secure tie between the token and the device (client secret) it's issued to. Without the client secret, the bound token is useless. When a user registers a Windows 10 or newer device in Azure AD, their primary identity is [bound to the device](../devices/concept-primary-refresh-token.md#how-is-the-prt-protected). This connection means that any issued sign-in token is tied to the device significantly reducing the chance of theft and replay attacks. These sign-in tokens are specifically the session cookies in Microsoft Edge and most Microsoft product refresh tokens in this preview release.
21+
22+
With this preview, we're giving you the ability to create a Conditional Access policy to require token protection for sign-in tokens for specific services. We support token protection for sign-in tokens in Conditional Access for Exchange Online and SharePoint Online on Windows devices.
23+
24+
:::image type="content" source="media/concept-token-protection/complete-policy-components-session.png" alt-text="Screenshot showing a Conditional Access policy requiring token protection as the session control":::
25+
26+
## Requirements
27+
28+
This preview supports the following configurations:
29+
30+
* Windows 10 or newer devices that are Azure AD joined, hybrid Azure AD joined, or Azure AD registered.
31+
* OneDrive sync client version 22.217 or later
32+
* Teams native client version 1.6.00.1331 or later
33+
* Office Perpetual clients aren't supported
34+
35+
### Known limitations
36+
37+
- External users (Azure AD B2B) aren't supported and shouldn't be included in your Conditional Access policy.
38+
- The following applications don't support signing in using protected token flows and users are blocked when accessing Exchange and SharePoint:
39+
- Power BI Desktop client
40+
- PowerShell modules accessing Exchange, SharePoint, or Microsoft Graph scopes that are served by Exchange or SharePoint
41+
- PowerQuery extension for Excel
42+
- Extensions to Visual Studio Code which access Exchange or SharePoint
43+
- Visual Studio
44+
- The following Windows client devices aren't supported:
45+
- Microsoft Azure Virtual Desktop
46+
- Windows Server
47+
- Surface Hub
48+
49+
## Deployment
50+
51+
For users, the deployment of a Conditional Access policy to enforce token protection should be invisible when using compatible client platforms on registered devices and compatible applications.
52+
53+
To minimize the likelihood of user disruption due to app or device incompatibility, we highly recommend:
54+
55+
- Start with a pilot group of users, and expand over time.
56+
- Create a Conditional Access policy in [report-only mode](concept-conditional-access-report-only.md) before moving to enforcement of token protection.
57+
- Capture both Interactive and Non-interactive sign in logs.
58+
- Analyze these logs for long enough to cover normal application use.
59+
- Add known good users to an enforcement policy.
60+
61+
This process helps to assess your users’ client and app compatibility for token protection enforcement.
62+
63+
### Create a Conditional Access policy
64+
65+
Users who perform specialized roles like those described in [Privileged access security levels](/security/compass/privileged-access-security-levels#specialized) are possible targets for this functionality. We recommend piloting with a small subset to begin.
66+
67+
The steps that follow help create a Conditional Access policy to require token protection for Exchange Online and SharePoint Online on Windows devices.
68+
69+
1. Sign in to the **Azure portal** as a Conditional Access Administrator, Security Administrator, or Global Administrator.
70+
1. Browse to **Azure Active Directory** > **Security** > **Conditional Access**.
71+
1. Select **New policy**.
72+
1. Give your policy a name. We recommend that organizations create a meaningful standard for the names of their policies.
73+
1. Under **Assignments**, select **Users or workload identities**.
74+
1. Under **Include**, select the users or groups who are testing this policy.
75+
1. Under **Exclude**, select **Users and groups** and choose your organization's emergency access or break-glass accounts.
76+
1. Under **Cloud apps or actions** > **Include**, select **Select apps**.
77+
1. Under **Select**, select the following applications supported by the preview:
78+
1. Office 365 Exchange Online
79+
1. Office 365 SharePoint Online
80+
81+
> [!WARNING]
82+
> Your Conditional Access policy should only be configured for these applications. Selecting the **Office 365** application group may result in unintended failures. This is an exception to the general rule that the **Office 365** application group should be selected in a Conditional Access policy.
83+
84+
1. Choose **Select**.
85+
1. Under **Conditions**:
86+
1. Under **Device platforms**:
87+
1. Set **Configure** to **Yes**.
88+
1. **Include** > **Select device platforms** > **Windows**.
89+
1. Select **Done**.
90+
1. Under **Client apps**:
91+
1. Set **Configure** to **Yes**.
92+
1. Under Modern authentication clients, only select **Mobile apps and desktop clients**. Leave other items unchecked.
93+
1. Select **Done**.
94+
1. Under **Access controls** > **Session**, select **Require token protection for sign-in sessions** and select **Select**.
95+
1. Confirm your settings and set **Enable policy** to **Report-only**.
96+
1. Select **Create** to create to enable your policy.
97+
98+
After confirming your settings using [report-only mode](howto-conditional-access-insights-reporting.md), an administrator can move the **Enable policy** toggle from **Report-only** to **On**.
99+
100+
### Capture logs and analyze
101+
102+
Monitoring Conditional Access enforcement of token protection before and after enforcement.
103+
104+
#### Sign-in logs
105+
106+
Use Azure AD sign-in log to verify the outcome of a token protection enforcement policy in report only mode or in enabled mode.
107+
108+
1. Sign in to the **Azure portal** as a Conditional Access Administrator, Security Administrator, or Global Administrator.
109+
1. Browse to **Azure Active Directory** > **Sign-in logs**.
110+
1. Select a specific request to determine if the policy is applied or not.
111+
1. Go to the **Conditional Access** or **Report-Only** pane depending on its state and select the name of your policy requiring token protection.
112+
1. Under **Session Controls** check to see if the policy requirements were satisfied or not.
113+
114+
:::image type="content" source="media/concept-token-protection/sign-in-log-sample.png" alt-text="Screenshot showing an example of a policy not being satisfied." lightbox="media/concept-token-protection/sign-in-log-sample.png":::
115+
116+
#### Log Analytics
117+
118+
You can also use [Log Analytics](../reports-monitoring/tutorial-log-analytics-wizard.md) to query the sign-in logs (interactive and non-interactive) for blocked requests due to token protection enforcement failure.
119+
120+
Here's a sample Log Analytics query searching the non-interactive sign-in logs for the last seven days, highlighting **Blocked** versus **Allowed** requests by **Application**.
121+
122+
```kusto
123+
//Per Apps query
124+
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs )
125+
//SigninLogs
126+
AADNonInteractiveUserSignInLogs
127+
// Adjust the time range below
128+
| where TimeGenerated > ago(7d)
129+
| project Id,ConditionalAccessPolicies, Status,UserPrincipalName, AppDisplayName, ResourceDisplayName
130+
| where ConditionalAccessPolicies != "[]"
131+
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online"
132+
//Add userPrinicpalName if you want to filter
133+
// | where UserPrincipalName =="<user_principal_Name>"
134+
| mv-expand todynamic(ConditionalAccessPolicies)
135+
| where ConditionalAccessPolicies ["enforcedSessionControls"] contains '["Protection"]'
136+
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied"
137+
| extend SessionNotSatisfyResult = ConditionalAccessPolicies["sessionControlsNotSatisfied"]
138+
| extend Result = case (SessionNotSatisfyResult contains 'Protection', 'Block','Allow')
139+
| summarize by Id,UserPrincipalName, AppDisplayName, Result
140+
| summarize Requests = count(), Users = dcount(UserPrincipalName), Block = countif(Result == "Block"), Allow = countif(Result == "Allow"), BlockedUsers = dcountif(UserPrincipalName, Result == "Block") by AppDisplayName
141+
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2)
142+
| sort by Requests desc
143+
```
144+
145+
The result of the previous query should be similar to those in the following screenshot:
146+
147+
:::image type="content" source="media/concept-token-protection/log-analytics-results.png" alt-text="Screenshot showing example results of a Log Analytics query looking for token protection policies" lightbox="media/concept-token-protection/log-analytics-results.png":::
148+
149+
The following
150+
Another query example looking in the non-interactive sign-in log for the last seven days, highlighting **Blocked** versus **Allowed** requests by **User**.
151+
152+
```kusto
153+
//Per users query
154+
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs )
155+
//SigninLogs
156+
AADNonInteractiveUserSignInLogs
157+
// Adjust the time range below
158+
| where TimeGenerated > ago(7d)
159+
| project Id,ConditionalAccessPolicies, UserPrincipalName, AppDisplayName, ResourceDisplayName
160+
| where ConditionalAccessPolicies != "[]"
161+
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online"
162+
//Add userPrincipalName if you want to filter
163+
// | where UserPrincipalName =="<user_principal_Name>"
164+
| mv-expand todynamic(ConditionalAccessPolicies)
165+
| where ConditionalAccessPolicies.enforcedSessionControls contains '["Protection"]'
166+
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied"
167+
| extend SessionNotSatisfyResult = ConditionalAccessPolicies.sessionControlsNotSatisfied
168+
| extend Result = case (SessionNotSatisfyResult contains 'Protection', 'Block','Allow')
169+
| summarize by Id, UserPrincipalName, AppDisplayName, ResourceDisplayName,Result
170+
| summarize Requests = count(),Block = countif(Result == "Block"), Allow = countif(Result == "Allow") by UserPrincipalName, AppDisplayName,ResourceDisplayName
171+
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2)
172+
| sort by UserPrincipalName asc
173+
```
174+
175+
## Next steps
176+
177+
- [What is a Primary Refresh Token?](../devices/concept-primary-refresh-token.md)
Loading
668 KB
Loading
27.6 KB
Loading
430 KB
Loading

0 commit comments

Comments
 (0)