Computer >> 컴퓨터 >  >> 체계 >> Windows Server

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

이 기사에서는 Windows에서 RDP 연결 로그를 가져오고 감사하는 방법을 설명합니다. RDP 연결 로그를 통해 RDS 터미널 서버 관리자는 특정 RDP 사용자가 로그온하여 세션을 종료할 때 서버에 로그온한 사용자와 사용자가 로그온한 장치(DNS 이름 또는 IP 주소)에 대한 정보를 얻을 수 있습니다.


이 기사는 Windows Server 2022/2019/2016/2012R2 및 데스크톱 버전(Windows 11, 10 및 8.1) 모두에 대한 RDP 로그를 분석할 때 적용됩니다.

Windows 이벤트 뷰어의 RDP 연결 이벤트

사용자가 원격 데스크톱 지원 또는 RDS 호스트에 연결하면 이러한 이벤트에 대한 정보가 이벤트 뷰어 로그(eventvwr.msc ). 관리자가 관심을 가질 수 있는 이벤트 뷰어에서 RDP 연결의 주요 단계 및 관련 이벤트를 고려하십시오.

  1. 네트워크 연결
  2. 인증;
  3. 로그온;
  4. 세션 연결 해제/재연결;
  5. 로그오프.

네트워크 연결 – 사용자의 RDP 클라이언트에서 서버로 네트워크 연결을 설정합니다. EventID가 1149 인 이벤트입니다. (Remote Desktop Services: User authentication succeeded ). 이 이벤트가 발견되었다고 해서 사용자 인증이 성공한 것은 아닙니다. 이 로그는 "응용 프로그램 및 서비스 로그 -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager에 있습니다.> 운영”. 이 이벤트에 대한 로그 필터를 활성화합니다(로그를 마우스 오른쪽 버튼으로 클릭 -> 현재 로그 필터링 -> EventId 1149 ).

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

PowerShell을 사용하여 모든 RDP 연결 시도를 나열할 수 있습니다.

$RDPAuths = Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath '<QueryList><Query Id="0"><Select>*[System[EventID=1149]]</Select></Query></QueryList>'
[xml[]]$xml=$RDPAuths|Foreach{$_.ToXml()}
$EventData = Foreach ($event in $xml.Event)
{ New-Object PSObject -Property @{
TimeCreated = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm:ss K')
User = $event.UserData.EventXML.Param1
Domain = $event.UserData.EventXML.Param2
Client = $event.UserData.EventXML.Param3
}
} $EventData | FT

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

그러면 이 서버에 대한 모든 RDP 연결 기록이 포함된 이벤트 목록이 표시됩니다. 로그는 사용자 이름, 도메인(이 경우 네트워크 수준 인증이 사용됨, NLA가 비활성화된 경우 이벤트 설명이 다르게 표시됨) 및 사용자 컴퓨터의 IP 주소를 제공합니다.

<강한> Windows에서 원격 데스크톱 연결 로그 추적 및 분석

인증 RDP 사용자가 서버에서 성공적으로 인증되었는지 여부를 보여줍니다. 로그는 Windows -> 보안 아래에 있습니다. 따라서 EventID가 4624인 이벤트에 관심이 있을 수 있습니다. (An account was successfully logged on ) 또는 4625 (An account failed to log on ).

LogonType에 주의하십시오. 이벤트 설명의 값입니다.

  • 로그온 유형 =10 또는 3 — 원격 데스크톱 서비스를 사용하여 로그온하는 동안 새 세션을 만든 경우
  • 로그온 유형 =7 , 사용자가 기존 RDP 세션에 다시 연결되었음을 의미합니다.
  • 로그온 유형 =5 – 서버 콘솔에 대한 RDP 연결(mstsc.exe /admin 모드에서).
RDP 인증 실패 이벤트를 사용하여 RDP 무차별 대입 공격으로부터 보호할 수 있습니다. 간단한 PowerShell 스크립트를 사용하여 Windows Defender 방화벽에서 공격자 IP를 자동으로 차단할 수 있습니다.

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

이 경우 사용자 이름은 계정 이름 의 이벤트 설명에 포함됩니다. 필드, 워크스테이션 이름의 컴퓨터 이름 및 소스 네트워크 주소의 사용자 IP .

LogonID 값을 기록해 두십시오. 들. 이것은 사용자의 추가 활동을 추적하는 데 도움이 되는 고유한 사용자 RDP 세션 식별자입니다. 그러나 RDP 세션의 연결이 끊어지고 사용자가 다시 연결하면 사용자에게 새 LogonID가 할당됩니다(RDP 세션은 동일하게 유지됨).

다음 PowerShell 명령을 사용하여 성공적인 RDP 인증 이벤트(EventID 4624) 목록을 가져올 수 있습니다.

Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridView

<강한> Windows에서 원격 데스크톱 연결 로그 추적 및 분석

로그온 Windows에 대한 RDP 로그인을 나타냅니다. 이벤트 ID 21 – 이 이벤트는 사용자가 성공적으로 인증된 후에 나타납니다(Remote Desktop Services: Session logon succeeded). ). 이 이벤트는 "응용 프로그램 및 서비스 로그 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager에 있습니다. -> 운영”. 보시다시피 여기에서 사용자 RDP 세션의 ID를 찾을 수 있습니다. 세션 ID .

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

이벤트 ID – 21 (Remote Desktop Services: Shell start notification received ) 탐색기 셸이 성공적으로 시작되었음을 나타냅니다(Windows 바탕 화면이 사용자의 RDP 세션에 표시됨).

세션 연결 해제/재연결 – 세션 연결 끊김 및 재연결 이벤트는 사용자 연결 끊김의 원인에 따라 ID가 다릅니다(RDP 세션의 타임아웃에 설정된 비활성으로 인한 연결 끊김, 세션에서 사용자가 연결 끊기 옵션을 선택했거나, 다른 사용자 또는 관리자가 RDP 세션을 종료한 경우, 등.). 이벤트 뷰어의 "응용 프로그램 및 서비스 로그 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational"에서 이러한 이벤트를 찾을 수 있습니다. 유용할 수 있는 RDP 이벤트 ID를 살펴보겠습니다.

  • 이벤트 ID – 24 (Remote Desktop Services: Session has been disconnected ) – 사용자가 RDP 세션에서 연결을 끊었습니다.
  • 이벤트 ID – 25 (Remote Desktop Services: Session reconnection succeeded ) – 사용자가 서버의 기존 RDP 세션에 다시 연결했습니다.
  • 이벤트 ID – 39 (Session <A> has been disconnected by session <B>에 의해 연결이 끊어졌습니다. ) – 사용자가 RDP 클라이언트 창을 닫는 대신 해당 메뉴 옵션을 선택하여 RDP 세션에서 연결을 끊었습니다. 세션 ID가 다른 경우 사용자는 다른 사용자(또는 관리자)에 의해 연결이 끊긴 것입니다.
  • 이벤트 ID – 40 (Session <A> has been disconnected, reason code <B> ). 여기서 이벤트 설명에서 연결 해제 이유 코드를 확인해야 합니다. 예:
    • 이유 코드 0 (No additional information is available ) 사용자가 방금 RDP 클라이언트 창을 닫았음을 의미합니다.
    • 이유 코드 5 (The client’s connection was replaced by another connection ) 사용자가 이전 RDP 세션에 다시 연결했음을 의미합니다.
    • 이유 코드 11 (User activity has initiated the disconnect ) 사용자가 시작 메뉴에서 연결 해제 버튼을 클릭했습니다.

이벤트 ID 4778 Windows -> 보안 로그에서(세션이 Window Station에 다시 연결되었습니다). 사용자가 RDP 세션에 다시 연결했습니다(사용자에게 새 LogonID가 할당됨).

이벤트 ID 4779 "Windows -> 보안" 로그에서 (A session was disconnected from a Window Station ). 사용자가 RDP 세션에서 연결 해제되었습니다.

로그오프 사용자 세션의 끝을 나타냅니다. EventID가 23인 이벤트로 기록됩니다. (Remote Desktop Services: Session logoff succeeded ) "응용 프로그램 및 서비스 로그 -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> 작동"에서.

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

동시에 EventID 4634 (An account was logged off )가 보안 로그에 나타납니다.

이벤트 ID 9009 (The Desktop Window Manager has exited with code <X> ) 시스템 로그에서 사용자의 창과 그래픽 셸이 모두 종료된 상태에서 사용자가 RDP 세션에서 로그오프를 시작했음을 의미합니다.

이벤트 ID 4647 — 사용자 시작 로그오프

PowerShell을 사용하여 원격 데스크톱 로그인 기록 가져오기

다음은 터미널 RDS 서버 이벤트 로그에서 현재 날짜의 모든 RDP 연결 기록을 나열하는 짧은 PowerShell 스크립트입니다. 결과 테이블에는 연결 시간, 클라이언트의 IP 주소(DNS 컴퓨터 이름) 및 원격 사용자 이름이 표시됩니다(필요한 경우 보고서에 다른 LogonType을 포함할 수 있음).

Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'
UserName = $_.Message -replace '(?smi).*\s\sAccount Name:\s+([^\s]+)\s+.*','$1'
UserDomain = $_.Message -replace '(?smi).*\s\sAccount Domain:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network connection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

이 방법을 사용하면 독립 실행형 RDSH 서버에서 RDP 연결 로그를 수집하고 구문 분석할 수 있습니다. RDS 팜에 여러 서버가 있는 경우 이 스크립트를 사용하여 각 서버를 쿼리하거나 원격 데스크톱 연결 브로커 역할이 있는 관리 서버에서 로그를 가져올 수 있습니다.

이벤트 뷰어에서 CSV 파일로 RDP 연결 로그를 내보낼 수 있습니다(Excel 스프레드시트에서 추가 분석을 위해). 이벤트 뷰어 GUI(이벤트 뷰어 로그가 지워지지 않았다고 가정)에서 또는 명령 프롬프트를 통해 로그를 내보낼 수 있습니다.

WEVTUtil query-events Security > c:\ps\rdp_security_log.txt

또는 PowerShell 사용:

get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp_connection_log.txt  -Encoding UTF8

사용자가 원격 데스크톱 게이트웨이를 통해 기업 RDS 호스트에 연결하는 경우 Microsoft-Windows-TerminalServices-Gateway에서 사용자 연결 로그를 확인할 수 있습니다. EventID 302로 기록 . 예를 들어 다음 PowerShell 스크립트는 RD 게이트웨이를 통해 지정된 사용자의 연결 기록을 표시합니다.

$rdpusername="b.smith"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='Source IP Adress';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='Target RDP host';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusername

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

Microsoft-Windows-TerminalServices-Gateway 이벤트 로그에서 다음 RD 게이트웨이 사용자 연결 이벤트를 확인할 수 있습니다.

  • 300 — 클라이언트 컴퓨터 DEVICE의 사용자 NAME이 리소스 권한 부여 정책 요구 사항을 충족하므로 리소스 RDPHOST에 연결할 수 있는 권한이 부여되었습니다.
  • 302 — RDPHOST 리소스에 연결된 클라이언트 컴퓨터 DEVICE의 사용자 NAME,
  • 303 — 클라이언트 컴퓨터 DEVICE의 사용자 NAME이 다음 네트워크 리소스에서 연결이 끊겼습니다. RDPHOST. 사용자가 연결을 끊기 전에 클라이언트는 X 바이트를 전송하고 X 바이트를 받았습니다. 클라이언트 세션 시간은 X초였습니다.

다음 명령을 사용하여 RDS 호스트의 현재 원격 세션 목록을 표시할 수 있습니다.

qwinsta
이 명령은 세션 ID, USERNAME 및 세션 상태(Active/Disconnect)를 반환합니다. 이 명령은 섀도우 원격 데스크톱 연결을 사용할 때 사용자의 RDP 세션 ID를 가져와야 할 때 유용합니다.

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

특정 RDP 세션에서 실행 중인 프로세스 목록을 표시할 수 있습니다(세션 ID가 지정됨):

qprocess /id:5

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

Windows에서 나가는 RDP 연결 로그

클라이언트 측에서 나가는 RDP 연결 로그를 볼 수도 있습니다. 다음 이벤트 로그에서 사용할 수 있습니다. 응용 프로그램 및 서비스 로그 -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operational.

예:EventID 1102 사용자가 원격 Windows Server RDS 호스트 또는 RDP가 활성화된 Windows 10/11 컴퓨터에 연결할 때 발생합니다(데스크톱 Windows 버전도 여러 동시 RDP 연결을 지원함).

The client has initiated a multi-transport connection to the server 192.168.13.201.

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

다음 RDP 스크립트는 현재 컴퓨터의 RDP 클라이언트 연결 기록을 표시합니다.

$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='Target RDP host';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $properties
선택

Windows에서 원격 데스크톱 연결 로그 추적 및 분석

스크립트는 이 컴퓨터에서 RDP 연결을 시작한 사용자의 SID와 사용자가 연결한 원격 데스크톱 호스트의 DNS 이름/IP 주소를 반환합니다. 다음과 같이 SID를 사용자 이름으로 변환할 수 있습니다.

또한 사용자 레지스트리에서 RDP 연결 내역을 확인할 수 있습니다.