Microsoft Entra 조건부 액세스: 토큰 보호(미리 보기)
토큰 보호(종종 업계에서 토큰 바인딩이라고도 함)는 의도한 디바이스에서만 토큰을 사용할 수 있도록 하여 토큰 도난을 사용하는 공격을 줄이려고 시도합니다. 공격자가 하이재킹 또는 재생을 통해 토큰을 훔칠 수 있는 경우 토큰이 만료되거나 해지될 때까지 피해자를 가장할 수 있습니다. 토큰 도용은 상대적으로 드문 사건으로 생각되지만 이로 인한 피해는 상당할 수 있습니다.
토큰 보호는 발급된 토큰과 디바이스(클라이언트 암호) 간에 암호화된 보안 관계를 만듭니다. 클라이언트 암호가 없으면 바인딩된 토큰은 쓸모가 없습니다. 사용자가 Microsoft Entra ID에서 Windows 10 이상 디바이스를 등록하면 기본 ID가 디바이스에 바인딩됩니다. 의미: 정책은 리소스에 대한 액세스를 요청할 때 애플리케이션에서 PRT(기본 새로 고침 토큰)라고도 하는 바인딩된 로그인 세션(또는 새로 고침) 토큰만 사용하도록 할 수 있습니다.
중요한
토큰 보호는 현재 공개 미리 보기로 제공됩니다. 미리 보기에 관한 자세한 내용은 온라인 서비스에 대한 유니버설 사용 조건을 참조하세요. 이 미리 보기를 통해 특정 서비스에 대한 로그인 토큰(새로 고침 토큰)에 대한 토큰 보호를 요구하는 조건부 액세스 정책을 만들 수 있습니다. Windows 디바이스에서 Exchange Online 및 SharePoint Online에 액세스하는 데스크톱 애플리케이션의 조건부 액세스에서 로그인 토큰에 대한 토큰 보호를 지원합니다.
중요한
토큰 보호는 초기 공개 미리 보기 릴리스 이후 다음과 같이 변경되었습니다.
로그인 로그 출력:enforcedSessionControls 및 sessionControlsNotSatisfied 사용된 문자열 값이 2023년 6월 말 바인딩SignInTokenProtection 변경되었습니다. 이 변경 사항을 반영하도록 로그인 로그 데이터에 대한 쿼리를 업데이트해야 합니다.
특정 방법을 사용하여 Microsoft Entra에 조인된 디바이스는 더 이상 지원되지 않습니다. 전체 목록은 알려진 제한 사항 섹션 참조하세요.
오류 코드 변경: 토큰 보호 조건부 액세스 정책 오류 코드가 53003에서 530084 변경되어 토큰 보호와 관련된 오류를 더 잘 식별합니다.
요구 사항
이 기능을 사용하려면 Microsoft Entra ID P2 라이선스가 필요합니다. 요구 사항에 적합한 라이선스를 찾으려면 Microsoft Entra ID의 일반 공급 기능 비교를 참조하세요.
참고
토큰 보호 적용은 Microsoft Entra ID Protection의 일부이며 일반 공급 시 Microsoft Entra ID P2 라이선스가 필요합니다.
다음 디바이스 및 애플리케이션은 토큰 보호 조건부 액세스 정책이 적용되는 리소스 액세스를 지원합니다.
지원되는 장치:
- Microsoft Entra 조인, Microsoft Entra 하이브리드 조인 또는 Microsoft Entra 등록된 Windows 10 이상 디바이스. 지원되지 않는 디바이스 유형에 대한 알려진 제한 사항 섹션 참조하세요.
- 하이브리드 Microsoft Entra가 가입된 Windows Server 2019 이상
지원되는 애플리케이션:
- OneDrive 동기화 클라이언트 버전 22.217 이상
- Teams 네이티브 클라이언트 버전 1.6.00.1331 이상
- Power BI 데스크톱 버전 2.117.841.0(2023년 5월) 이상
- Exchange PowerShell 모듈 버전 3.7.0 이상
- EnableLoginByWAM 옵션을 사용하는 Microsoft Graph PowerShell 버전 2.0.0 이상
- 'Windows 인증 브로커' 로그인 옵션을 사용하는 경우 Visual Studio 2022 이상
알려진 제한 사항
- Office 영구 클라이언트는 지원되지 않습니다.
- 다음 애플리케이션은 보호된 토큰 흐름을 사용한 로그인을 지원하지 않으며 Exchange 및 SharePoint에 액세스할 때 사용자가 차단됩니다.
- Exchange 또는 SharePoint에서 제공하는 Exchange, SharePoint 또는 Microsoft Graph 범위에 액세스하는 PowerShell 모듈
- Excel용 PowerQuery 확장
- Exchange 또는 SharePoint에 액세스하는 Visual Studio Code 확장
- 다음 Windows 클라이언트 디바이스는 지원되지 않습니다.
- Surface Hub
- MTR(Windows 기반 Microsoft Teams 룸) 시스템
- 홈 테넌트에서 토큰 보호 디바이스 등록 요구 사항을 충족하는 외부 사용자 지원됩니다. 그러나 이러한 요구 사항을 충족하지 않는 사용자는 근본 원인을 나타내지 않고 불분명한 오류 메시지를 볼 수 있습니다.
- 다음 방법을 사용하여 Microsoft Entra ID에 등록된 디바이스는 지원되지 않습니다.
- Microsoft Entra가 Azure Virtual Desktop 세션 호스트에 연결되었습니다.
- 대량 등록을 사용하여 배포된 Windows 디바이스.
- Windows 365에 의해 배포된 Microsoft Entra에 가입된 클라우드 PC입니다.
- Microsoft Entra에 가입된 Power Automate 호스트된 컴퓨터 그룹.
- 자체 배포 모드를 사용한 Windows Autopilot 디바이스는 배포됩니다.
- Microsoft Entra ID 인증 사용하도록 설정된 VM(가상 머신) 확장을 사용하여 Azure에 배포된 Windows 가상 머신.
- 사용자가 등록하는 동안 새 로그인을 수행하지 않으면 24H2 이전의 Windows 버전에서 Microsoft Entra ID로 등록된 디바이스가 차단될 수 있습니다. Windows 24H2 릴리스는 새 로그인을 요구하여 이 문제를 해결합니다.
이전에 나열된 지원되지 않는 등록 유형으로 인해 영향을 받은 디바이스를 식별하려면 로그인 로그에서 tokenProtectionStatusDetails
특성을 검사합니다. 지원되지 않는 디바이스 등록 유형으로 인해 차단된 토큰 요청은 signInSessionStatusCode
값 1003으로 식별할 수 있습니다.
새 온보딩의 중단을 방지하기 위해 이전에 설명한 배포 범주에 속하는 모든 디바이스를 제외하는 디바이스 필터 조건을 추가하여 토큰 보호 조건부 액세스 정책을 수정할 수 있습니다. 예를 들어 제외하려면 다음을 수행합니다.
- Microsoft Entra에 가입된 클라우드 PC는
systemLabels -eq "CloudPC" and trustType -eq "AzureAD"
사용할 수 있습니다. - Microsoft Entra에 조인된 Azure Virtual Desktops에서는
systemLabels -eq "AzureVirtualDesktop" and trustType -eq "AzureAD"
을 사용할 수 있습니다. - Microsoft Entra에 연결된 Power Automate 호스팅 머신 그룹을 사용하여
systemLabels -eq "MicrosoftPowerAutomate" and trustType -eq "AzureAD"
을 사용할 수 있습니다. - Azure의 Microsoft Entra에 조인된 Windows 가상 머신에서
systemLabels -eq "AzureResource" and trustType -eq "AzureAD"
을(를) 사용할 수 있습니다.
배포
사용자의 경우 등록된 디바이스 및 호환되는 애플리케이션에서 호환되는 클라이언트 플랫폼을 사용할 때 토큰 보호를 적용하는 조건부 액세스 정책의 배포가 표시되지 않아야 합니다.
앱 또는 디바이스 비호환성으로 인한 사용자 중단 가능성을 최소화하려면 다음을 수행하는 것이 좋습니다.
- 파일럿 사용자 그룹으로 시작하고 시간이 지남에 따라 확장합니다.
- 토큰 보호 적용으로 이동하기 전에 보고서 전용 모드에서 조건부 액세스 정책을 만듭니다.
- 대화형 및 비대화형 로그인 로그를 모두 캡처합니다.
- 일반적인 애플리케이션 사용을 처리할 수 있을 만큼 오랫동안 이러한 로그를 분석합니다.
- 알려진 좋은 사용자를 적용 정책에 추가합니다.
이 프로세스는 토큰 보호 적용에 대한 사용자의 클라이언트 및 앱 호환성을 평가하는 데 도움이 됩니다.
조건부 액세스 정책 만들기
권한 있는 액세스 보안 수준에 설명된 것과 같은 특수한 역할을 수행하는 사용자는 이 기능의 대상이 될 수 있습니다. 소규모 그룹으로 시범 운영을 시작하는 것이 좋습니다.
다음 단계는 Windows 디바이스에서 Exchange Online 및 SharePoint Online에 대한 토큰 보호를 요구하는 조건부 액세스 정책을 만드는 데 도움이 됩니다.
- 최소한 조건부 액세스 관리자로 Microsoft Entra 관리 센터에 로그인합니다.
- 보호>조건부 액세스>정책으로 이동합니다.
- 새 정책을 선택합니다.
- 정책에 이름을 지정합니다. 조직에서 정책 이름에 의미 있는 표준을 만드는 것이 좋습니다.
-
할당 아래에서 사용자 또는 워크로드 ID를 선택합니다.
- 포함에서 이 정책을 테스트하는 사용자 또는 그룹을 선택합니다.
- 제외에서 사용자 및 그룹을 선택한 후, 조직의 응급 액세스 또는 비상 계정을 선택합니다.
-
대상 리소스>리소스 (이전의 클라우드 앱)>포함>리소스 선택
선택 아래에서 미리 보기에서 지원하는 다음 애플리케이션을 선택합니다.
- Office 365 Exchange Online
- Office 365 SharePoint Online
경고
조건부 액세스 정책은 이러한 애플리케이션에 대해서만 구성해야 합니다. Office 365 애플리케이션 그룹을 선택하면 의도하지 않은 오류가 발생할 수 있습니다. 이 변경은 조건부 액세스 정책에서 Office 365 응용 프로그램 그룹을 선택해야 한다는 일반 규칙의 예외입니다.
선택을 선택합니다.
-
조건에서:
-
디바이스 플랫폼에서:
- 구성을 예로 설정합니다.
- 포함>디바이스 플랫폼 선택>Windows.
- 완료를 선택합니다.
-
클라이언트 앱에서:
구성을 예로 설정합니다.
경고
클라이언트 앱 조건을 구성하지 않거나 Browser 선택한 상태로 두면 Teams 웹과 같은 MSAL.js사용하는 애플리케이션이 차단될 수 있습니다.
최신 인증 클라이언트에서 모바일 앱 및 데스크톱 클라이언트만 선택합니다. 다른 항목은 선택 취소된 상태로 둡니다.
완료를 선택합니다.
-
디바이스 플랫폼에서:
- 액세스 제어>세션에서 로그인 세션에 토큰 보호 필요를 선택하고 선택을 선택합니다.
- 설정을 확인하고 정책 사용을 보고 전용으로 설정합니다.
- 만들기를 선택하여 정책을 만들어 사용하도록 설정합니다.
관리자가 보고 전용 모드를 사용하여 설정을 확인한 후 정책 사용 토글을 보고 전용에서 켜기로 이동할 수 있습니다.
팁 (조언)
토큰 보호가 필요한 조건부 액세스 정책은 현재 Windows 디바이스에서만 사용할 수 있으므로 공격자가 다른 플랫폼에서 온 것처럼 보일 수 있는 경우 잠재적인 정책 바이패스로부터 환경을 보호해야 합니다.
또한 다음 정책을 구성해야 합니다.
로그 캡처 및 분석
정책 영향(미리 보기), 로그인 로그또는 Log Analytics 같은 기능을 사용하여 적용 전후에 토큰 보호의 조건부 액세스 적용을 모니터링합니다.
로그인 로그
Microsoft Entra 로그인 로그를 사용하여 보고서 전용 모드 또는 사용 모드에서 토큰 보호 적용 정책의 결과를 확인합니다.
- 최소한 조건부 액세스 관리자로 Microsoft Entra 관리 센터에 로그인합니다.
- ID>모니터링 및 상태>로그인 로그로 이동합니다.
- 특정 요청을 선택하여 정책이 적용되는지 여부를 확인합니다.
- 상태에 따라 조건부 액세스 또는 보고서 전용 창으로 이동하여 토큰 보호가 필요한 정책의 이름을 선택합니다.
- 세션 제어에서 정책의 요구 사항이 충족되었는지 여부를 점검합니다.
- 요청의 바인딩 상태에 대한 자세한 내용을 보려면 기본 정보 창을 선택하고 토큰 보호 - 로그인 세션 필드를 참조하세요. 가능한 값은 다음과 같습니다.
- Bound: 요청이 바인딩된 프로토콜을 사용하고 있었습니다. 일부 로그인에는 여러 요청이 포함될 수 있으며 모든 요청은 토큰 보호 정책을 충족하도록 바인딩되어야 합니다. 개별 요청이 바인딩된 것처럼 보이더라도 다른 요청이 바인딩되지 않은 경우 정책 준수를 보장하지 않습니다. 로그인에 대한 모든 요청을 보려면 특정 사용자에 대한 모든 요청을 필터링하거나 corelationid별로 볼 수 있습니다.
- 언바운드: 요청이 바인딩된 프로토콜을 사용하지 않았습니다. 요청이 바인딩되지 않은 경우 가능한
statusCodes
다음과 같습니다.- 1002: Microsoft Entra ID 디바이스 상태가 부족하여 요청이 바인딩되지 않습니다.
- 1003: Microsoft Entra ID 디바이스 상태가 토큰 보호에 대한 조건부 액세스 정책 요구 사항을 충족하지 않으므로 요청이 바인딩되지 않습니다. 이 오류는 지원되지 않는 디바이스 등록 유형 또는 새 로그인 자격 증명을 사용하여 디바이스가 등록되지 않았기 때문일 수 있습니다.
- 1005: 다른 지정되지 않은 이유로 요청이 바인딩되지 않습니다.
- 1006: OS 버전이 지원되지 않으므로 요청이 바인딩되지 않습니다.
- 1008: 클라이언트가 WAM(Windows 계정 관리자)과 같은 플랫폼 브로커와 통합되지 않으므로 요청이 바인딩되지 않습니다.
로그 분석
Log Analytics를 사용하여 토큰 보호 적용 실패로 인해 차단된 요청에 대한 로그인 로그(대화형 및 비대화형)를 쿼리할 수도 있습니다.
다음은 지난 7일 동안 비대화형 로그인 로그를 검색하는 샘플 Log Analytics 쿼리로, 애플리케이션별로 차단된 요청과 허용된 요청을 강조 표시합니다. 이러한 쿼리는 샘플일 뿐이며 변경될 수 있습니다.
참고
로그인 로그 출력: "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"
//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
이전 쿼리의 결과는 다음 스크린샷과 유사해야 합니다.
다음 쿼리 예제에서는 지난 7일 동안의 비대화형 로그인 로그를 살펴보고 사용자별로 차단된 요청과 허용된 요청을 강조 표시합니다.
//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
다음 쿼리 예제에서는 지난 7일 동안의 비대화형 로그인 로그를 살펴보고, 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