Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Trong bài viết này, chúng tôi sẽ mô tả cách lấy và kiểm tra log kết nối RDP trong Windows. Log kết nối RDP cho phép quản trị viên máy chủ terminal RDS lấy thông tin về người dùng nào đã đăng nhập vào máy chủ, khi nào một người dùng RDP cụ thể đăng nhập và kết thúc phiên, và từ thiết bị nào (tên DNS hoặc địa chỉ IP) người dùng đã đăng nhập.

Bài viết áp dụng khi phân tích log RDP cho cả Windows Server 2022/2019/2016/2012R2 và các phiên bản desktop (Windows 11, 10 và 8.1).

Sự kiện kết nối RDP trong Windows Event Viewer

Khi người dùng kết nối đến máy chủ bật Remote Desktop hoặc máy chủ RDS, thông tin về các sự kiện này được lưu trong log Event Viewer (eventvwr.msc). Xét các giai đoạn chính của kết nối RDP và các sự kiện liên quan trong Event Viewer, có thể quan tâm đến quản trị viên:

  1. Kết nối mạng (Network Connection);
  2. Xác thực (Authentication);
  3. Đăng nhập (Logon);
  4. Ngắt kết nối/Kết nối lại phiên (Session Disconnect/Reconnect);
  5. Đăng xuất (Logoff).

Kết nối mạng – thiết lập kết nối mạng đến máySERVER từ client RDP của người dùng. Là sự kiện với EventID 1149 (Remote Desktop Services: User authentication succeeded). Nếu tìm thấy sự kiện này, không có nghĩa là xác thực người dùng đã thành công. Log này nằm trong "Applications and Services Logs -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager -> Operational". Bật bộ lọc log cho sự kiện này (chuột phải vào log -> Filter Current Log -> EventId 1149).

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Bạn có thể liệt kê tất cả các lần thử kết nối RDP bằng PowerShell:

$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

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Sau đó bạn sẽ nhận được danh sách sự kiện với lịch sử tất cả kết nối RDP đến máy chủ này. Log cung cấp tên người dùng, domain (trong trường hợp này Network Level Authentication được sử dụng; nếu NLA bị tắt, mô tả sự kiện trông khác), và địa chỉ IP của máy tính người dùng.

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Xác thực cho thấy người dùng RDP đã được xác thực thành công trên máy chủ hay chưa. Log nằm dưới Windows -> Security. Vì vậy, bạn có thể quan tâm đến sự kiện với EventID 4624 (An account was successfully logged on) hoặc 4625 (An account failed to log on).

Vui lòng chú ý giá trị LogonType trong mô tả sự kiện.

  • LogonType = 10 hoặc 3 — nếu dịch vụ Remote Desktop đã được dùng để tạo phiên mới khi đăng nhập;
  • LogonType = 7, có nghĩa là người dùng đã kết nối lại phiên RDP hiện có;
  • LogonType = 5 – Kết nối RDP đến console máy chủ (trong chế độ mstsc.exe /admin).

Bạn có thể sử dụng sự kiện xác thực RDP thất bại để bảo vệ chống lại tấn công brute force RDP. Bạn có thể tự động chặn IP của kẻ tấn công tại Windows Defender Firewall bằng script PowerShell đơn giản.

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Trong trường hợp này, tên người dùng nằm trong mô tả sự kiện trong trường Account Name, tên máy tính trong Workstation Name, và IP người dùng trong Source Network Address.

Lưu ý giá trị trường LogonID. Đây là định danh phiên RDP duy nhất của người dùng giúp theo dõi hoạt động tiếp theo của người dùng. Tuy nhiên, nếu phiên RDP bị ngắt kết nối và người dùng kết nối lại, người dùng sẽ được gán LogonID mới (dù phiên RDP vẫn giống nhau).

Bạn có thể lấy danh sách sự kiện xác thực RDP thành công (EventID 4624) bằng lệnh PowerShell này:

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

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Đăng nhập đề cập đến đăng nhập RDP vào Windows. EventID 21 – sự kiện này xuất hiện sau khi người dùng đã được xác thực thành công (Remote Desktop Services: Session logon succeeded). Các sự kiện này nằm trong "Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational". Như bạn thấy, ở đây bạn có thể tìm thấy ID phiên RDP của người dùng — Session ID.

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

EventID – 21 (Remote Desktop Services: Shell start notification received) cho biết shell Explorer đã được khởi động thành công (màn hình desktop Windows xuất hiện trong phiên RDP của người dùng).

Ngắt kết nối/Kết nối lại phiên – sự kiện ngắt kết nối và kết nối lại phiên có ID khác nhau tùy thuộc vào nguyên nhân gây ngắt kết nối của người dùng (ngắt kết nối do không hoạt động được đặt trong timeout cho phiên RDP, tùy chọn Disconnect được chọn bởi người dùng trong phiên, phiên RDP bị kết thúc bởi người dùng hoặc quản trị viên khác, v.v.). Bạn có thể tìm các sự kiện này trong Event Viewer dưới "Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational". Hãy xem các Event ID RDP có thể hữu ích:

  • EventID – 24 (Remote Desktop Services: Session has been disconnected) – người dùng đã ngắt kết nối khỏi phiên RDP;
  • EventID – 25 (Remote Desktop Services: Session reconnection succeeded) – người dùng đã kết nối lại phiên RDP hiện có trên máy chủ;
  • EventID – 39 (Session <A> has been disconnected by session <B>) – người dùng đã ngắt kết nối khỏi phiên RDP bằng cách chọn mục menu tương ứng (thay vì chỉ đóng cửa sổ client RDP). Nếu ID phiên khác nhau, người dùng đã bị ngắt kết nối bởi người dùng khác (hoặc quản trị viên);
  • EventID – 40 (Session <A> has been disconnected, reason code <B>). Ở đây bạn phải kiểm tra mã lý do ngắt kết nối trong mô tả sự kiện. Ví dụ:
    • reason code 0 (No additional information is available) có nghĩa là người dùng chỉ đóng cửa sổ client RDP;
    • reason code 5 (The client's connection was replaced by another connection) có nghĩa là người dùng đã kết nối lại phiên RDP trước đó;
    • reason code 11 (User activity has initiated the disconnect) người dùng đã nhấn nút Disconnect trong menu Start.

EventID 4778 trong Windows -> Security log (A session was reconnected to a Window Station). Người dùng đã kết nối lại phiên RDP (người dùng được gán LogonID mới).

EventID 4779 trong "Windows -> Security" log (A session was disconnected from a Window Station). Người dùng đã bị ngắt kết nối khỏi phiên RDP.

Đăng xuất đề cập đến kết thúc phiên người dùng. Nó được ghi lại như sự kiện với EventID 23 (Remote Desktop Services: Session logoff succeeded) dưới "Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational".

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Cùng lúc đó EventID 4634 (An account was logged off) xuất hiện trong log Security.

EventID 9009 (The Desktop Window Manager has exited with code <X>) trong log System có nghĩa là người dùng đã khởi động đăng xuất khỏi phiên RDP với cả cửa sổ và shell đồ họa của người dùng đã bị chấm dứt.

EventID 4647 — Đăng xuất do người dùng khởi động.

Lấy lịch sử đăng nhập Remote Desktop bằng PowerShell

Dưới đây là script PowerShell ngắn gọn liệt kê lịch sử tất cả kết nối RDP cho ngày hiện tại từ log sự kiện máy chủ terminal RDS. Bảng kết quả hiển thị thời gian kết nối, địa chỉ IP của client (tên máy tính DNS), và tên người dùng từ xa (nếu cần, bạn có thể bao gồm các LogonType khác trong báo cáo).

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)"}
 }
 }}

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Phương pháp này cho phép bạn thu thập và phân tích log kết nối RDP trên máy chủ RDSH độc lập. Nếu bạn có nhiều máy chủ trong farm RDS, bạn có thể truy vấn từng máy chủ với script này, hoặc lấy log từ máy chủ quản lý với vai trò Remote Desktop Connection Broker.

Bạn có thể xuất log kết nối RDP từ Event Viewer ra file CSV (để phân tích thêm trong bảng tính Excel). Bạn có thể xuất log từ GUI Event Viewer (giả sử log Event Viewer không bị xóa) hoặc qua command prompt:

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

Hoặc với PowerShell:

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

Nếu người dùng của bạn kết nối đến máy chủ RDS doanh nghiệp thông qua Remote Desktop Gateway, bạn có thể kiểm tra log kết nối người dùng trong log Microsoft-Windows-TerminalServices-Gateway theo EventID 302. Ví dụ, script PowerShell sau sẽ hiển thị lịch sử kết nối của người dùng được chỉ định qua RD Gateway:

$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

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Bạn có thể kiểm tra các sự kiện kết nối người dùng RD Gateway sau trong log sự kiện Microsoft-Windows-TerminalServices-Gateway:

  • 300 — Người dùng NAME, trên máy tính client DEVICE, đáp ứng yêu cầu chính sách ủy quyền tài nguyên và do đó được ủy quyền kết nối đến tài nguyên RDPHOST;
  • 302 — Người dùng NAME, trên máy tính client DEVICE, đã kết nối đến tài nguyên RDPHOST;
  • 303 — Người dùng NAME, trên máy tính client DEVICE, đã ngắt kết nối khỏi tài nguyên mạng sau: RDPHOST. Trước khi ngắt kết nối, client đã truyền X byte và nhận X byte. Thời lượng phiên client là X giây.

Bạn có thể hiển thị danh sách các phiên từ xa hiện tại trên máy chủ RDS của bạn bằng lệnh:

qwinsta

Lệnh trả về ID phiên, USERNAME, và trạng thái phiên (Active/Disconnect). Lệnh này hữu ích khi bạn cần lấy ID phiên RDP của người dùng khi sử dụng kết nối Remote Desktop shadow.

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Bạn có thể hiển thị danh sách các tiến trình đang chạy trong phiên RDP cụ thể (ID phiên được chỉ định):

qprocess /id:5

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Log kết nối RDP đi ra trong Windows

Bạn cũng có thể xem log kết nối RDP đi ra phía client. Chúng có sẵn trong log sự kiện sau: Application and Services Logs -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operational.

Ví dụ, EventID 1102 xảy ra khi người dùng kết nối đến máy chủ RDS Windows Server từ xa hoặc máy tính Windows 10/11 với RDP được bật (các phiên bản Windows desktop cũng hỗ trợ nhiều kết nối RDP đồng thời).

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

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Script RDP sau sẽ hiển thị lịch sử kết nối client RDP trên máy tính hiện tại:

$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

Theo dõi và phân tích log kết nối Remote Desktop trong Windows

Script trả về SID của người dùng đã khởi tạo kết nối RDP trên máy tính này, cũng như tên DNS/địa chỉ IP của máy chủ Remote Desktop mà người dùng đã kết nối. Bạn có thể chuyển đổi SID thành tên người dùng như sau.

Cũng có thể kiểm tra lịch sử kết nối RDP trong registry của người dùng.