다음을 통해 공유


Microsoft Entra 조건부 액세스의 토큰 보호

토큰 보호는 애플리케이션이 보호된 리소스에 대한 액세스를 요청할 때 PRT(기본 새로 고침 토큰)와 같은 디바이스 바인딩된 로그인 세션 토큰만 Entra ID에 의해 허용되도록 하여 토큰 재생 공격을 줄이려는 조건부 액세스 세션 제어입니다.

사용자가 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의 일반적으로 제공되는 기능을 비교한 을 참조하세요.

다음 디바이스 및 애플리케이션은 토큰 보호 조건부 액세스 정책이 적용되는 리소스 액세스를 지원합니다.

지원되는 디바이스

  • Microsoft Entra에 가입된, Microsoft Entra 하이브리드에 가입된 또는 Microsoft Entra에 등록된 Windows 10 이상의 디바이스. 지원되지 않는 디바이스 유형 에 대한 알려진 제한 사항 섹션 을 참조하세요.
  • 하이브리드 Microsoft Entra에 가입된 Windows Server 2019 이상

Note

디바이스를 등록하는 방법에 대한 자세한 단계는 회사 또는 학교 네트워크에 개인 디바이스 등록을 참조하세요.

지원되는 애플리케이션

  • 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 이상
  • Windows 앱 버전 2.0.379.0 이상

다음 리소스는 토큰 보호를 지원합니다.

  • Office 365Exchange Online
  • Office 365 SharePoint Online
  • Microsoft Teams 서비스
  • Azure Virtual Desktop
  • Windows 365

알려진 제한 사항

  • Office 영구 클라이언트는 지원되지 않습니다.
  • 다음 애플리케이션은 보호된 토큰 흐름을 사용한 로그인을 지원하지 않으며 Exchange 및 SharePoint에 액세스할 때 사용자가 차단됩니다.
    • SharePoint에 액세스하는 PowerShell 모듈
    • Excel용 PowerQuery 확장
    • Exchange 또는 SharePoint에 액세스하는 Visual Studio Code 확장
  • 다음 Windows 클라이언트 디바이스는 지원되지 않습니다.
    • Surface Hub
    • MTR(Windows 기반 Microsoft Teams 룸) 시스템
  • 홈 테넌트에서 토큰 보호 디바이스 등록 요구 사항을 충족하는 외부 사용자가 지원됩니다. 그러나 이러한 요구 사항을 충족하지 않는 사용자는 근본 원인을 나타내지 않고 불분명한 오류 메시지를 볼 수 있습니다.
  • 다음 방법을 사용하여 Microsoft Entra ID에 등록된 디바이스는 지원되지 않습니다.

이전에 나열된 지원되지 않는 등록 유형으로 인해 영향을 받은 디바이스를 식별하려면 로그인 로그의 특성을 검사 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"을 사용할 수 있습니다.
  • 자체 배포 모드를 사용하여 배포된 Windows Autopilot 디바이스는 enrollmentProfileName 속성을 사용할 수 있습니다. 예를 들어 Autopilot 자체 배포 모드 디바이스에 대한 등록 프로필을 Intune에서 "Autopilot 자체 배포 프로필"로 만든 경우 'enrollmentProfileName -eq "Autopilot 자체 배포 프로필"을 사용할 수 있습니다.
  • Azure의 Microsoft Entra에 조인된 Windows 가상 머신에서 profileType -eq "SecureVM" and trustType -eq "AzureAD"을(를) 사용할 수 있습니다.

Deployment

사용자의 경우 등록된 디바이스 및 호환되는 애플리케이션에서 호환되는 클라이언트 플랫폼을 사용할 때 토큰 보호를 적용하는 조건부 액세스 정책의 배포가 표시되지 않아야 합니다.

앱 또는 디바이스 비호환성으로 인한 사용자 중단 가능성을 최소화하려면 다음 권장 사항을 따르세요.

  • 파일럿 사용자 그룹으로 시작하고 시간이 지남에 따라 확장합니다.
  • 토큰 보호를 적용하기 전에 보고서 전용 모드 에서 조건부 액세스 정책을 만듭니다.
  • 대화형 및 비대화형 로그인 로그를 모두 캡처합니다.
  • 이러한 로그를 충분히 오랫동안 분석하여 일반적인 애플리케이션 사용을 다룹니다.
  • 알려진 신뢰할 수 있는 사용자를 적용 정책에 추가합니다.

이 프로세스는 토큰 보호 적용에 대한 사용자의 클라이언트 및 앱 호환성을 평가하는 데 도움이 됩니다.

조건부 액세스 정책 만들기

권한 있는 액세스 보안 수준에 설명된 것과 같은 특수한 역할을 수행하는 사용자는 이 기능의 가능한 대상입니다. 소규모 그룹으로 시범 운영을 시작하는 것이 좋습니다.

다음 단계는 Windows 디바이스에서 Exchange Online 및 SharePoint Online에 대한 토큰 보호를 요구하는 조건부 액세스 정책을 만드는 데 도움이 됩니다.

  1. Microsoft Entra 관리 센터에 최소한 조건부 액세스 관리자로 로그인합니다.
  2. Entra ID>조건부 액세스>정책으로 이동합니다.
  3. 새 정책을 선택합니다.
  4. 정책에 이름을 지정합니다. 조직에서 정책 이름에 의미 있는 표준을 만드는 것이 좋습니다.
  5. 할당 아래에서 사용자 또는 워크로드 ID를 선택합니다.
    1. 포함에서 이 정책을 테스트하는 사용자 또는 그룹을 선택합니다.
    2. 제외에서 사용자 및 그룹을 선택하고 조직의 긴급 액세스 또는 브레이크 글래스 계정을 선택합니다.
  6. 대상 리소스>리소스 (이전의 클라우드 앱)>포함>리소스 선택
    1. 선택에서 다음 애플리케이션을 선택합니다.

      1. Office 365Exchange Online
      2. Office 365 SharePoint Online
      3. Microsoft Teams 서비스
      4. 사용자 환경에서 Windows 앱을 배포한 경우 다음을 포함합니다.
        1. Azure Virtual Desktop
        2. Windows 365
        3. Windows 클라우드 로그인

      Warning

      조건부 액세스 정책은 이러한 애플리케이션에 대해서만 구성해야 합니다. Office 365 애플리케이션 그룹을 선택하면 의도하지 않은 오류가 발생할 수 있습니다. 이 변경은 조건부 액세스 정책에서 Office 365 응용 프로그램 그룹을 선택해야 하는 일반 규칙의 예외입니다.

    2. 선택합니다.

  7. 조건에서:
    1. 디바이스 플랫폼에서:
      1. 구성로 설정합니다.
      2. 포함>디바이스 플랫폼 선택>Windows.
      3. 완료를 선택합니다.
    2. 클라이언트 앱에서:
      1. 구성로 설정합니다.

        Warning

        클라이언트 앱 조건을 구성하지 않거나 브라우저를 선택한 상태로 두면 Teams 웹과 같은 MSAL.js사용하는 애플리케이션이 차단될 수 있습니다.

      2. 최신 인증 클라이언트에서 모바일 앱 및 데스크톱 클라이언트만 선택합니다. 다른 항목은 선택 취소된 상태로 둡니다.

      3. 완료를 선택합니다.

  8. 액세스 제어>세션에서 로그인 세션에 토큰 보호 필요를 선택하고 선택을 선택합니다.
  9. 설정을 확인하고 정책 사용보고 전용으로 설정합니다.
  10. 만들기를 선택하여 정책을 사용하도록 설정합니다.

정책 영향 또는 보고서 전용 모드를 사용하여 설정을 확인한 후 정책 사용 토글을 보고서 전용에서 기로 이동합니다.

Tip

토큰 보호가 필요한 조건부 액세스 정책은 현재 Windows 디바이스에서만 사용할 수 있으므로 공격자가 다른 플랫폼에서 온 것처럼 보일 수 있는 경우 잠재적인 정책 바이패스로부터 환경을 보호해야 합니다.

또한 다음 정책을 구성해야 합니다.

로그 캡처 및 분석

정책 영향, 로그인 로그Log Analytics와 같은 기능을 사용하여 적용 전후에 토큰 보호의 조건부 액세스 적용을 모니터링합니다.

로그인 로그

Microsoft Entra 로그인 로그를 사용하여 보고서 전용 모드 또는 사용 모드에서 토큰 보호 적용 정책의 결과를 확인합니다.

충족되지 않는 정책의 예를 보여 주는 스크린샷

  1. Microsoft Entra 관리 센터에 최소한 조건부 액세스 관리자로 로그인합니다.
  2. Entra ID>모니터링 및 상태>로그인 로그로 이동합니다.
  3. 특정 요청을 선택하여 정책이 적용되는지 여부를 확인합니다.
  4. 상태에 따라 조건부 액세스 또는 보고서 전용 창으로 이동하여 토큰 보호가 필요한 정책의 이름을 선택합니다.
  5. 세션 제어에서 정책 요구 사항이 충족되었는지 여부를 확인합니다.
  6. 요청의 바인딩 상태에 대한 자세한 내용을 보려면 기본 정보 창을 선택하고 토큰 보호 - 로그인 세션 필드를 참조하세요. 가능한 값은 다음과 같습니다.
    1. Bound: 요청이 바인딩된 프로토콜을 사용하고 있었습니다. 일부 로그인에는 여러 요청이 포함될 수 있으며 모든 요청은 토큰 보호 정책을 충족하도록 바인딩되어야 합니다. 개별 요청이 바인딩된 것처럼 보이더라도 다른 요청이 바인딩되지 않은 경우 정책 준수를 보장하지 않습니다. 로그인에 대한 모든 요청을 보려면 특정 사용자에 대한 모든 요청을 필터링하거나 corelationid별로 볼 수 있습니다.
    2. 언바운드: 요청이 바인딩된 프로토콜을 사용하지 않았습니다. 요청이 바인딩되지 않은 경우 가능한 statusCodes 다음과 같습니다.
      1. 1002: Microsoft Entra ID 디바이스 상태가 부족하여 요청이 바인딩되지 않습니다.
      2. 1003: Microsoft Entra ID 디바이스 상태가 토큰 보호에 대한 조건부 액세스 정책 요구 사항을 충족하지 않으므로 요청이 바인딩되지 않습니다. 이 오류는 지원되지 않는 디바이스 등록 유형 또는 새 로그인 자격 증명을 사용하여 디바이스가 등록되지 않았기 때문일 수 있습니다.
      3. 1005: 다른 지정되지 않은 이유로 요청이 바인딩되지 않습니다.
      4. 1006: OS 버전이 지원되지 않으므로 요청이 바인딩되지 않습니다.
      5. 1008: 클라이언트가 WAM(Windows 계정 관리자)과 같은 플랫폼 브로커와 통합되지 않으므로 요청이 바인딩되지 않습니다.

토큰 보호 - 로그인 세션 특성이 강조 표시된 샘플 로그인을 보여 주는 스크린샷

Log Analytics

Log Analytics를 사용하여 토큰 보호 적용 실패로 인해 차단된 요청에 대한 로그인 로그(대화형 및 비대화형)를 쿼리할 수도 있습니다.

다음은 지난 7일 동안 비대화형 로그인 로그를 검색하는 샘플 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 

이전 쿼리의 결과는 다음 스크린샷과 유사해야 합니다.

토큰 보호 정책을 찾는 Log Analytics 쿼리의 예제 결과를 보여 주는 스크린샷

다음 쿼리 예제에서는 지난 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" 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   

다음 쿼리 예제에서는 지난 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 

최종 사용자 환경

지원되는 디바이스를 등록하거나 등록한 사용자는 토큰 보호 요구 사항이 설정된 경우 토큰 보호 지원 애플리케이션의 로그인 환경에 차이가 없습니다.

디바이스를 등록하거나 등록하지 않은 사용자와 토큰 보호 정책을 사용하는 경우 인증 후 다음 스크린샷이 표시됩니다.

디바이스가 등록되지 않거나 등록되어 있지 않을 때 표시되는 토큰 보호 오류 메시지의 스크린샷.

토큰 보호 정책을 사용할 때 지원되는 애플리케이션을 사용하지 않는 사용자는 인증 후 다음 스크린샷을 볼 수 있습니다.

토큰 보호 정책이 액세스를 차단하는 경우 오류 메시지의 스크린샷.

기본 새로 고침 토큰이란?