Share via


조건부 액세스: 토큰 보호(미리 보기)

토큰 보호(종종 업계에서 토큰 바인딩이라고도 함)는 의도한 디바이스에서만 토큰을 사용할 수 있도록 하여 토큰 도난을 사용하는 공격을 줄이려고 시도합니다. 공격자가 하이재킹 또는 재생을 통해 토큰을 훔칠 수 있는 경우 토큰이 만료되거나 해지될 때까지 피해자를 가장할 수 있습니다. 토큰 도용은 상대적으로 드문 사건으로 생각되지만 이로 인한 피해는 상당할 수 있습니다.

토큰 보호는 발급된 토큰과 디바이스(클라이언트 암호) 간에 암호화된 보안 관계를 만듭니다. 클라이언트 암호가 없으면 바인딩된 토큰은 쓸모가 없습니다. 사용자가 Microsoft Entra ID에서 Windows 10 이상 디바이스를 등록하면 기본 ID가 디바이스에 바인딩됩니다. 의미: 정책은 리소스에 대한 액세스를 요청할 때 애플리케이션에서 PRT(기본 새로 고침 토큰)라고도 하는 바인딩된 로그인 세션(또는 새로 고침) 토큰만 사용하도록 할 수 있습니다.

Important

토큰 보호는 현재 공개 미리 보기로 제공됩니다. 미리 보기에 관한 자세한 내용은 온라인 서비스에 대한 유니버설 사용 조건을 참조하세요. 이 미리 보기를 통해 특정 서비스에 대한 로그인 토큰(새로 고침 토큰)에 대한 토큰 보호를 요구하는 조건부 액세스 정책을 만들 수 있습니다. Windows 디바이스에서 Exchange Online 및 SharePoint Online에 액세스하는 데스크톱 애플리케이션의 조건부 액세스에서 로그인 토큰에 대한 토큰 보호를 지원합니다.

Important

토큰 보호는 초기 공개 미리 보기 릴리스 이후 다음과 같이 변경되었습니다.

  • 로그인 로그 출력: "enforcedSessionControls" 및 "sessionControlsNotSatisfied"에 사용된 문자열의 값이 2023년 6월 말에 "Binding"에서 "SignInTokenProtection"으로 변경되었습니다. 이 변경 사항을 반영하도록 로그인 로그 데이터에 대한 쿼리를 업데이트해야 합니다.

참고 항목

이 콘텐츠에서 로그인 토큰과 새로 고침 토큰을 교환할 수 있습니다. 이 미리 보기는 현재 액세스 토큰 또는 웹 쿠키를 지원하지 않습니다.

Screenshot showing a Conditional Access policy requiring token protection as the session control

요구 사항

이 미리 보기는 토큰 보호 조건부 액세스 정책이 적용된 리소스에 액세스하기 위한 다음 구성을 지원합니다.

  • Microsoft Entra 조인, Microsoft Entra 하이브리드 조인 또는 Microsoft Entra 등록된 Windows 10 이상 디바이스.
  • OneDrive 동기화 클라이언트 버전 22.217 이상
  • Teams 네이티브 클라이언트 버전 1.6.00.1331 이상
  • Power BI 데스크톱 버전 2.117.841.0(2023년 5월) 이상
  • 'Windows 인증 브로커' 로그인 옵션을 사용하는 경우 Visual Studio 2022 이상
  • 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
    • MTR(Windows 기반 Microsoft Teams 룸) 시스템

라이선싱 요구 사항

이 기능을 사용하려면 Microsoft Entra ID P2 라이선스가 필요합니다. 요구 사항에 적합한 라이선스를 찾으려면 Microsoft Entra ID의 일반 공급 기능 비교를 참조하세요.

참고 항목

토큰 보호 적용은 Microsoft Entra ID Protection의 일부이며 일반 공급 시 P2 라이선스의 일부가 됩니다.

배포

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

앱 또는 디바이스 비호환성으로 인한 사용자 중단 가능성을 최소화하려면 다음을 수행하는 것이 좋습니다.

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

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

조건부 액세스 정책 만들기

권한 있는 액세스 보안 수준에 설명된 것과 같은 특수한 역할을 수행하는 사용자는 이 기능의 대상이 될 수 있습니다. 작은 하위 집합으로 파일럿을 시작하는 것이 좋습니다.

Screenshot of a configured Conditional Access policy and its components.

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

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

      1. Office 365 Exchange Online
      2. Office 365 SharePoint Online

      Warning

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

    2. 선택을 선택합니다.

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

        Warning

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

      2. 최신 인증 클라이언트에서 모바일 앱 및 데스크톱 클라이언트만 선택합니다. 다른 항목은 선택 취소된 상태로 둡니다.
      3. 완료를 선택합니다.
  8. 액세스 제어>세션에서 로그인 세션에 토큰 보호 필요를 선택하고 선택을 선택합니다.
  9. 설정을 확인하고 정책 사용보고 전용으로 설정합니다.
  10. 만들기를 선택하여 정책을 만들어 사용하도록 설정합니다.

관리자가 보고 전용 모드를 사용하여 설정을 확인한 후 정책 사용 토글을 보고 전용에서 켜기로 이동할 수 있습니다.

로그 캡처 및 분석

적용 전후에 토큰 보호의 조건부 액세스 적용을 모니터링합니다.

로그인 로그

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

  1. 최소한 조건부 액세스 관리자Microsoft Entra 관리 센터에 로그인합니다.
  2. ID>모니터링 및 상태>로그인 로그로 찾습니다.
  3. 특정 요청을 선택하여 정책이 적용되는지 여부를 확인합니다.
  4. 상태에 따라 조건부 액세스 또는 보고서 전용 창으로 이동하여 토큰 보호가 필요한 정책의 이름을 선택합니다.
  5. 세션 제어에서 검사 정책 요구 사항이 충족되었는지 여부를 확인합니다.

Screenshot showing an example of a policy not being satisfied.

Log Analytics

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 

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

Screenshot showing example results of a Log Analytics query looking for token protection policies

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

다음 단계