Windows'ta Uzak Masaüstü Bağlantı Günlüklerini İzleme ve Analiz Etme


Bu yazıda, Windows'ta RDP bağlantı günlüklerinin nasıl alınacağını ve denetleneceğini açıklayacağız. RDP bağlantı günlükleri, RDS terminal sunucusu yöneticilerinin, belirli bir RDP kullanıcısı oturum açıp oturumu sonlandırdığında sunucuda hangi kullanıcıların oturum açtığı ve kullanıcının hangi cihazdan (DNS adı veya IP adresi) oturum açtığı hakkında bilgi almasına olanak tanır.

Windows Olay Görüntüleyicide RDP Bağlantı Olayları

Bir kullanıcı Uzak Masaüstü etkinleştirilmiş veya RDS ana bilgisayarına bağlandığında, bu olaylarla ilgili bilgiler Olay Görüntüleyicisi günlüklerinde depolanır (

eventvwr.msc

). RDP bağlantısının ana aşamalarını ve yöneticinin ilgisini çekebilecek Olay Görüntüleyicideki ilgili olayları göz önünde bulundurun

  1. Ağ bağlantısı;

  2. kimlik doğrulama;

  3. oturum açma;

  4. Oturum Bağlantısını Kesme/Yeniden Bağlanma;

  5. Oturumu Kapat.

Ağ Bağlantısı - kullanıcının RDP istemcisinden bir sunucuya ağ bağlantısı kurma. EventID 1149 (

Remote Desktop Services: User authentication succeeded

). Bu olayın bulunması, kullanıcı kimlik doğrulamasının başarılı olduğu anlamına gelmez. Bu günlük, "Uygulamalar ve Hizmetler Günlükleri -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager> Operasyonel" konumunda bulunur. Bu olay için günlük filtresini etkinleştirin (günlüğe sağ tıklayın -> Geçerli Günlüğü Filtrele -> EventId 1149).

PowerShell ile tüm RDP bağlantı denemelerini listeleyebilirsiniz:

$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

Ardından, bu sunucuya yapılan tüm RDP bağlantılarının geçmişini içeren bir olay listesi alacaksınız. Günlükler bir kullanıcı adı, bir etki alanı (bu durumda Ağ Düzeyinde Kimlik Doğrulama kullanılır; NLA devre dışıysa, olay açıklaması farklı görünür) ve kullanıcının bilgisayarının IP adresini sağlar.

Kimlik Doğrulama bir RDP kullanıcısının sunucuda kimliğinin başarıyla doğrulanıp doğrulanmadığını gösterir. Günlük, Windows -> Güvenlik altında bulunur. Bu nedenle, EventID 4624() olan etkinliklerle ilgilenebilirsiniz.

An account was successfully logged on

) veya 4625 (

An account failed to log on

).

Lütfen olay açıklamasındaki LogonType değerine dikkat edin.

  • LogonType=10 veya 3 — oturum açma sırasında yeni bir oturum oluşturmak için Uzak Masaüstü hizmeti kullanılmışsa;

  • LogonType=7, kullanıcının mevcut RDP oturumuna yeniden bağlandığı anlamına gelir;

  • LogonType=5 - Sunucu konsoluna RDP bağlantısı (mstsc.exe /admin modunda).

RDP kaba kuvvet saldırılarına karşı koruma sağlamak için RDP kimlik doğrulama hatası olaylarını kullanabilirsiniz. Basit bir PowerShell komut dosyası kullanarak Windows Defender Güvenlik Duvarı'nda saldırgan IP'lerini otomatik olarak engelleyebilirsiniz.

Bu durumda, kullanıcı adı Hesap Adı alanındaki olay açıklamasında, bilgisayar adı İş İstasyonu Adı'nda ve kullanıcı IP'si Kaynak Ağ Adresi.

Lütfen LogonID alanının değerini not edin. Bu, kullanıcının daha fazla etkinliğini izlemeye yardımcı olan benzersiz bir kullanıcı RDP oturum tanımlayıcısıdır. Ancak, bir RDP oturumunun bağlantısı kesilirse ve bir kullanıcı oturuma yeniden bağlanırsa, kullanıcıya yeni bir LogonID atanır (RDP oturumu aynı kalsa da).

Bu PowerShell komutunu kullanarak başarılı RDP kimlik doğrulama olaylarının (EventID 4624) bir listesini alabilirsiniz:

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

Oturum açma , Windows'ta bir RDP oturum açma anlamına gelir. EventID 21 - bu olay, bir kullanıcının kimliği başarıyla doğrulandıktan sonra görünür (

Remote Desktop Services: Session logon succeeded

). Bu olaylar, "Uygulamalar ve Hizmetler Günlükleri -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operasyonel" konumunda bulunur. Gördüğünüz gibi, burada bir kullanıcı RDP oturumunun kimliğini bulabilirsiniz — Oturum Kimliği.

Etkinlik Kimliği - 21 (

Remote Desktop Services: Shell start notification received

), Explorer kabuğunun başarıyla başlatıldığını gösterir (Windows masaüstü, kullanıcının RDP oturumunda görünür).

Oturum Bağlantısını Kesme/Yeniden Bağlanma - oturum bağlantısının kesilmesi ve yeniden bağlanma olaylarının kimlikleri, kullanıcının bağlantısının kesilmesine neyin sebep olduğuna bağlı olarak farklı kimliklere sahiptir (etkinlik nedeniyle bağlantı kesilmesi ayarlanan RDP oturumları için zaman aşımları, oturumda kullanıcı tarafından Bağlantıyı Kes seçeneğinin seçilmesi, RDP oturumunun başka bir kullanıcı veya yönetici tarafından sonlandırılması vb.). Bu olayları Olay Görüntüleyicide “Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational” altında bulabilirsiniz. Yararlı olabilecek RDP Olay Kimliklerini ele alalım:

  • Etkinlik Kimliği - 24 (

    Remote Desktop Services: Session has been disconnected

    ) -bir kullanıcının RDP oturumuyla bağlantısı kesildi;

  • Etkinlik Kimliği - 25 (

    Remote Desktop Services: Session reconnection succeeded

    ) - bir kullanıcı, sunucudaki mevcut RDP oturumuna yeniden bağlandı;

  • Etkinlik Kimliği - 39 (

    Session <A> has been disconnected by session <B>

    ) - bir kullanıcının ilgili menü seçeneğini seçerek RDP oturumuyla bağlantısı kesildi (yalnızca RDP istemci penceresini kapatmak yerine). Oturum kimlikleri farklıysa, bir kullanıcının bağlantısı başka bir kullanıcı (veya yönetici) tarafından kesilmiştir;

  • Etkinlik Kimliği - 40 (

    Session <A> has been disconnected, reason code <B>

    ). Burada olay açıklamasında bağlantı kesilmesi neden kodunu kontrol etmelisiniz. Örneğin:

    • sebep kodu 0 (

    • No additional information is available

      ), bir kullanıcının RDP istemci penceresini henüz kapattığı anlamına gelir;

    • neden kodu 5 (

      The client’s connection was replaced by another connection

      ), bir kullanıcının önceki RDP oturumuna yeniden bağlandığı anlamına gelir;

    • sebep kodu 11 (

      User activity has initiated the disconnect

      ) bir kullanıcı başlat menüsündeki Bağlantıyı Kes düğmesine tıkladı.

Windows'ta EventID 4778 -> Güvenlik günlüğü (Bir oturum bir Windows Station'a yeniden bağlandı). Bir kullanıcı bir RDP oturumuna yeniden bağlandı (bir kullanıcıya yeni bir LogonID atanır).

“Windows -> Güvenlik ” günlüğündeki EventID 4779 (

A session was disconnected from a Window Station

). Bir kullanıcının bir RDP oturumuyla bağlantısı kesildi.

Oturumu Kapat, bir kullanıcı oturumunun sonunu ifade eder. EventID 23 (

Remote Desktop Services: Session logoff succeeded

) "Uygulamalar ve Hizmet Günlükleri -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operasyonel" altında.

Aynı zamanda EventID 4634 (

An account was logged off

) Güvenlik günlüğünde görünür.

Olay Kimliği 9009 (

The Desktop Window Manager has exited with code <X>

) Sistem günlüğünde, bir kullanıcının RDP oturumundan oturumu kapatmayı başlattığı ve kullanıcının hem penceresinin hem de grafik kabuğunun sonlandırıldığı anlamına gelir.

EventID 4647 — Kullanıcı tarafından başlatılan oturum kapatma

PowerShell ile Uzak Masaüstü Oturum Açma Geçmişini Alma

İşte terminal RDS sunucusu olay günlüklerinden geçerli gün için tüm RDP bağlantılarının geçmişini listeleyen kısa bir PowerShell betiği. Ortaya çıkan tablo bağlantı süresini, istemcinin IP adresini (DNS bilgisayar adı) ve uzak kullanıcı adını gösterir (gerekirse, rapora diğer LogonType'ları dahil edebilirsiniz).

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

Bu yöntem, bağımsız bir RDSH sunucusunda RDP bağlantı günlüklerini toplamanıza ve ayrıştırmanıza olanak tanır. RDS grubunda birden çok sunucunuz varsa bu betik ile her birini sorgulayabilir veya Uzak Masaüstü Bağlantı Aracısı rolüyle bir yönetim sunucusundan günlükler alabilirsiniz.

RDP bağlantı günlüklerini Olay Görüntüleyiciden bir CSV dosyasına aktarabilirsiniz (bir Excel elektronik tablosunda daha fazla analiz için). Günlüğü Olay Görüntüleyici GUI'sinden (Olay Görüntüleyici günlüklerinin temizlenmediği varsayılarak) veya komut istemi aracılığıyla dışa aktarabilirsiniz:

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

Veya PowerShell ile:

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

Kullanıcılarınız Uzak Masaüstü Ağ Geçidi aracılığıyla kurumsal RDS ana bilgisayarlarına bağlanıyorsa Microsoft-Windows-TerminalServices-Gateway günlüğündeki kullanıcı bağlantı günlüklerini EventID 302 ile kontrol edebilirsiniz. Örneğin, aşağıdaki PowerShell betiği, belirtilen kullanıcının RD Ağ Geçidi üzerinden bağlantı geçmişini görüntüler:

$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

Microsoft-Windows-TerminalServices-Gateway olay günlüğünde aşağıdaki RD Ağ Geçidi kullanıcı bağlantısı olaylarını kontrol edebilirsiniz:

  • 300 — DEVICE istemci bilgisayarındaki NAME adlı kullanıcı, kaynak yetkilendirme politikası gereksinimlerini karşıladı ve bu nedenle RDPHOST kaynağına bağlanma yetkisi aldı;

  • 302 — RDPHOST kaynağına bağlı CİHAZ istemci bilgisayarındaki NAME kullanıcısı;

  • 303 — DEVICE istemci bilgisayarındaki NAME kullanıcısının şu ağ kaynağıyla bağlantısı kesildi: RDPHOST. Kullanıcının bağlantısı kesilmeden önce, istemci X bayt aktardı ve X bayt aldı. İstemci oturum süresi X saniyeydi.

RDS sunucunuzdaki geçerli uzak oturumların listesini şu komutla görüntüleyebilirsiniz:

qwinsta

Komut, oturum kimliğini, KULLANICI ADI'nı ve oturum durumunu (Etkin/Bağlantıyı Kes) döndürür. Bu komut, gölge Uzak Masaüstü bağlantılarını kullanırken kullanıcının RDP oturum kimliğini almanız gerektiğinde kullanışlıdır.

Belirli bir RDP oturumunda çalışan işlemlerin listesini görüntüleyebilirsiniz (oturum kimliği belirtilir):

qprocess /id:5

Windows'ta Giden RDP Bağlantı Günlükleri

İstemci tarafında giden RDP bağlantı günlüklerini de görüntüleyebilirsiniz. Aşağıdaki olay günlüğünde bulunurlar: Uygulama ve Hizmet Günlükleri -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operasyonel.

Örneğin, Olay Kimliği 1102, bir kullanıcı uzak bir Windows Server RDS ana bilgisayarına veya RDP etkinleştirilmiş bir Windows 10/11 bilgisayarına bağlandığında oluşur (masaüstü Windows sürümleri aynı anda birden çok RDP bağlantısını da destekler).

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

Aşağıdaki RDP betiği, geçerli bilgisayardaki RDP istemci bağlantılarının geçmişini görüntüler:

$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

Komut dosyası, bu bilgisayarda RDP bağlantılarını başlatan kullanıcıların SID'lerinin yanı sıra kullanıcıların bağlandığı Uzak Masaüstü ana bilgisayarlarının DNS adlarını/IP adreslerini döndürür. SID'leri aşağıdaki gibi kullanıcı adlarına dönüştürebilirsiniz.

Ayrıca, kullanıcının kayıt defterindeki RDP bağlantı geçmişini de kontrol edebilirsiniz.

İlgili makaleler