Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

この記事では、WindowsでRDP(リモートデスクトップ)接続ログを取得し、監査する方法を解説します。RDP接続ログを活用することで、RDSターミナルサーバの管理者は、どのユーザーがいつログオン・ログオフしたか、どのデバイス(DNS名またはIPアドレス)から接続したかといった情報を把握できます。

本記事の内容は、Windows Server 2022/2019/2016/2012 R2 およびデスクトップ版(Windows 11、10、8.1)のRDPログ分析に適用可能です。

WindowsイベントビューアでのRDP接続イベント

ユーザーがリモートデスクトップ対応ホストやRDSホストに接続すると、そのイベント情報がイベントビューア(eventvwr.msc)のログに記録されます。RDP接続の主な段階と、管理者が注目すべき関連イベントは以下の5つです。

  1. ネットワーク接続
  2. 認証
  3. ログオン
  4. セッションの切断/再接続
  5. ログオフ

1. ネットワーク接続

ユーザーのRDPクライアントからサーバへのネットワーク接続が確立された段階です。イベントID 1149Remote Desktop Services: User authentication succeeded)として記録されます。このイベントがあっても、ユーザー認証が成功したとは限りません。

ログの場所: 「アプリケーションとサービス ログ」→「Microsoft」→「Windows」→ Terminal-Services-RemoteConnectionManager →「Operational」

右クリック→「現在のログのフィルター」→ EventID 1149 で絞り込みできます。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

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アドレスを含むRDP接続履歴が取得できます。NLAが無効な場合は表示内容が異なります。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

2. 認証

RDPユーザーがサーバで正常に認証されたか(または失敗したか)を示します。ログは「Windows ログ」→「Security」にあります。注目すべきイベントIDは以下の通りです。

  • 4624: An account was successfully logged on(ログオン成功)
  • 4625: An account failed to log on(ログオン失敗)

イベントの説明にある LogonType の値に注目してください。

  • LogonType = 10 または 3: リモートデスクトップサービスにより新しいセッションが作成された
  • LogonType = 7: 既存のRDPセッションに再接続した
  • LogonType = 5: コンソールセッションへのRDP接続(mstsc.exe /admin モード)

認証失敗イベント(4625)を監視し、PowerShellスクリプトで攻撃元IPをWindows Defenderファイアウォールで自動遮断すると、RDPブルートフォース攻撃対策になります。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

ユーザー名は「Account Name」、コンピューター名は「Workstation Name」、ユーザーIPは「Source Network Address」に記録されます。

LogonID フィールドの値にも注目してください。これはユーザーのRDPセッションを一意に識別するIDで、後のアクティビティ追跡に役立ちます。ただし、セッションが切断されて再接続されると、同じRDPセッションでも新しいLogonIDが割り当てられます。

成功したRDP認証イベント(EventID 4624、LogonType 10)を取得するPowerShellコマンド:

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でリモートデスクトップ(RDP)接続ログを取得・分析する方法

3. ログオン

ユーザーがWindowsにRDPログオンしたことを示します。イベントID 21Remote Desktop Services: Session logon succeeded)は、ユーザー認証成功後に記録されます。

ログの場所: 「アプリケーションとサービス ログ」→「Microsoft」→「Windows」→ TerminalServices-LocalSessionManager →「Operational」

ここではユーザーのRDPセッションID(Session ID)を確認できます。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

イベントID 21Remote Desktop Services: Shell start notification received)は、エクスプローラーシェルが正常に開始され、ユーザーのRDPセッションにWindowsデスクトップが表示されたことを意味します。

4. セッションの切断/再接続

セッション切断と再接続のイベントIDは、切断原因(アイドルタイムアウト、ユーザーの「切断」選択、管理者による強制切断など)によって異なります。これらも「TerminalServices-LocalSessionManager/Operational」ログに記録されます。主なイベントIDは以下の通りです。

  • EventID 24: Remote Desktop Services: Session has been disconnected — ユーザーがRDPセッションから切断した
  • EventID 25: Remote Desktop Services: Session reconnection succeeded — ユーザーが既存のRDPセッションに再接続した
  • EventID 39: Session <A> has been disconnected by session <B> — ユーザーがメニューの「切断」を選択して切断した。セッションIDが異なる場合は、他のユーザー/管理者によって切断された
  • EventID 40: Session <A> has been disconnected, reason code <B> — 切断理由コードを確認する
    • reason code 0: No additional information is available — RDPクライアントウィンドウを閉じただけ
    • reason code 5: The client's connection was replaced by another connection — 以前のRDPセッションに再接続した
    • reason code 11: User activity has initiated the disconnect — スタートメニューの「切断」をクリックした

また、「Windows ログ」→「Security」にも以下のイベントがあります。

  • EventID 4778: A session was reconnected to a Window Station — RDPセッションに再接続(新しいLogonIDが割り当てられる)
  • EventID 4779: A session was disconnected from a Window Station — RDPセッションから切断された

5. ログオフ

ユーザーセッションの終了です。イベントID 23Remote Desktop Services: Session logoff succeeded)が「TerminalServices-LocalSessionManager/Operational」に記録されます。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

同時に、SecurityログにイベントID 4634An account was logged off)が現れます。

SystemログのイベントID 9009The Desktop Window Manager has exited with code <X>)は、ユーザーがRDPセッションからログオフし、ウィンドウとグラフィックシェルが両方終了したことを意味します。

イベントID 4647 は、ユーザーが自らログオフを開始したことを示します。

PowerShellでリモートデスクトップログイン履歴を取得する

以下のPowerShellスクリプトは、ターミナル/RDSサーバのイベントログから当日のすべてのRDP接続履歴を一覧表示します。結果のテーブルには接続時刻、クライアント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でリモートデスクトップ(RDP)接続ログを取得・分析する方法

この方法では、スタンドアロンのRDSHサーバでRDP接続ログを収集・解析できます。RDSファームに複数のサーバがある場合は、各サーバに対してこのスクリプトを実行するか、Remote Desktop Connection Broker役割を持つ管理サーバからログを取得します。

イベントビューアのログをCSVファイルにエクスポートしてExcelで分析することも可能です。GUIからエクスポートするか、コマンドプロンプト/PowerShellで以下のように実行します。

# コマンドプロンプト
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

ユーザーがリモートデスクトップゲートウェイ(RD Gateway)経由で社内RDSホストに接続している場合、Microsoft-Windows-TerminalServices-Gateway ログのイベントID 302 で接続履歴を確認できます。以下のスクリプトは、指定ユーザーの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
Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

RD Gateway関連の主なユーザー接続イベントは以下の通りです。

  • 300 — ユーザー NAME がクライアントコンピューター DEVICE からリソース認証ポリシーを満たし、リソース RDPHOST への接続が許可された
  • 302 — ユーザー NAME がクライアントコンピューター DEVICE からリソース RDPHOST に接続した
  • 303 — ユーザー NAME がクライアントコンピューター DEVICE からネットワークリソース RDPHOST から切断した。切断前の送受信バイト数とセッション継続時間が記録される

現在のリモートセッション一覧を表示するには、以下のコマンドを使用します。

qwinsta

セッションID、ユーザー名、セッション状態(Active/Disconnect)が返されます。シャドウ接続でユーザーのセッションIDを特定する際に便利です。

Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

特定のRDPセッションで実行中のプロセス一覧を表示するには(セッションIDを指定):

qprocess /id:5
Windowsでリモートデスクトップ(RDP)接続ログを取得・分析する方法

Windowsでの送信側RDP接続ログ

クライアント側(接続元)のRDP接続ログも確認できます。場所は以下の通りです。 「アプリケーションとサービス ログ」→「Microsoft」→「Windows」→「TerminalServices-ClientActiveXCore」→「Microsoft-Windows-TerminalServices-RDPClient」→「Operational」

例えば、イベントID 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)接続ログを取得・分析する方法

このスクリプトでは、RDP接続を開始したユーザーのSIDと、接続先のリモートデスクトップホストのDNS名/IPアドレスが返されます。SIDをユーザー名に変換することも可能です。

また、ユーザーのレジストリからRDP接続履歴を確認することもできます。

  1. Windows 10でリモートデスクトップ接続を設定する方法【Pro/Home対応】

    リモートデスクトップ接続は、Microsoft Windowsに標準搭載されている機能で、ネットワーク経由で離れた場所にあるコンピューターを操作できるようにするものです。この機能は「リモートデスクトッププロトコル(RDP)」と呼ばれる安全なネットワーク通信プロトコルを使用しており、遠隔管理を効率的に行うことができます。接続先のPCにアクセスするためにサードパーティ製ソフトウェアは必要ありません。ただし、RDPはWindowsの初期状態では無効化されているため、接続元と接続先の両方のコンピューターでRDPを有効にする必要があります。また、両方のPCがインターネットに接続していることも確認してくだ

  2. Windows 10 でリモートデスクトップのポート番号(RDP)を変更する方法

    Windows 10 の「リモートデスクトップ」機能をご存じの方は多いでしょう。職場や自宅の別のコンピューターに離れた場所からアクセスするために、この機能を活用している方も少なくありません。例えば、急ぎで会社のPCに保存したファイルが必要になったとき、リモートデスクトップはまさに救世主となります。このように、遠隔地から自分のPCへアクセスしたい場面はさまざまあります。 通常、リモートデスクトップを使うには、ルーターでポート転送(ポートフォワーディング)の設定を行うだけで簡単に利用できます。しかし、ルーターを経由せずインターネットに接続している環境では、リモートデスクトップ機能を使用するためにポ