इस लेख में, हम वर्णन करेंगे कि विंडोज में RDP कनेक्शन लॉग्स कैसे प्राप्त करें और ऑडिट करें। RDP कनेक्शन लॉग्स RDS टर्मिनल सर्वर एडमिनिस्ट्रेटर्स को यह जानकारी प्राप्त करने की अनुमति देते हैं कि कौन से उपयोगकर्ता सर्वर पर लॉगऑन हुए, कब एक विशिष्ट RDP उपयोगकर्ता लॉगऑन हुआ और सत्र समाप्त किया, और किस डिवाइस (DNS नाम या IP पता) से उपयोगकर्ता लॉगऑन हुआ।
यह लेख विंडोज सर्वर 2022/2019/2016/2012R2 और डेस्कटॉप संस्करणों (विंडोज 11, 10, और 8.1) दोनों के लिए RDP लॉग्स का विश्लेषण करते समय लागू होता है।
विंडोज इवेंट व्यूअर में RDP कनेक्शन इवेंट्स
जब कोई उपयोगकर्ता रिमोट डेस्कटॉप-सक्षम या RDS होस्ट से कनेक्ट होता है, तो इन इवेंट्स के बारे में जानकारी इवेंट व्यूअर लॉग्स (eventvwr.msc) में संग्रहीत होती है। RDP कनेक्शन के मुख्य चरणों और इवेंट व्यूअर में संबंधित इवेंट्स पर विचार करें जो एडमिनिस्ट्रेटर के लिए रुचिकर हो सकते हैं:
- नेटवर्क कनेक्शन;
- प्रमाणीकरण;
- लॉगऑन;
- सत्र डिस्कनेक्ट/रीकनेक्ट;
- लॉगऑफ।
नेटवर्क कनेक्शन – उपयोगकर्ता के RDP क्लाइंट से सर्वर पर नेटवर्क कनेक्शन स्थापित करना। यह इवेंट आईडी 1149 वाला इवेंट है (रिमोट डेस्कटॉप सर्विसेज: उपयोगकर्ता प्रमाणीकरण सफल)। यदि यह इवेंट मिलता है, तो इसका मतलब यह नहीं है कि उपयोगकर्ता प्रमाणीकरण सफल रहा है। यह लॉग "एप्लिकेशन और सर्विस लॉग्स -> माइक्रोसॉफ्ट -> विंडोज -> टर्मिनल-सर्विसेज-रिमोटकनेक्शनमैनेजर -> ऑपरेशनल" में स्थित है। इस इवेंट के लिए लॉग फिल्टर सक्षम करें (लॉग पर राइट-क्लिक करें -> वर्तमान लॉग फिल्टर करें -> EventId 1149)।
आप पावरशेल के साथ सभी 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
फिर आपको इस सर्वर पर सभी RDP कनेक्शन्स के इतिहास के साथ एक इवेंट सूची मिलेगी। लॉग्स एक उपयोगकर्ता नाम, एक डोमेन (इस मामले में नेटवर्क लेवल ऑथेंटिकेशन का उपयोग किया जाता है; यदि NLA अक्षम है, तो इवेंट विवरण अलग दिखता है), और उपयोगकर्ता के कंप्यूटर का IP पता प्रदान करते हैं।
प्रमाणीकरण दर्शाता है कि RDP उपयोगकर्ता को सर्वर पर सफलतापूर्वक प्रमाणित किया गया है या नहीं। लॉग विंडोज -> सुरक्षा के अंतर्गत स्थित है। इसलिए, आप इवेंट आईडी 4624 (एक खाते को सफलतापूर्वक लॉगऑन किया गया) या 4625 (एक खाता लॉगऑन करने में विफल रहा) वाले इवेंट्स में रुचि रख सकते हैं।
कृपया इवेंट विवरण में LogonType मान पर ध्यान दें।
- LogonType = 10 या 3 — यदि रिमोट डेस्कटॉप सेवा का उपयोग लॉगऑन के दौरान एक नया सत्र बनाने के लिए किया गया है;
- LogonType = 7, इसका मतलब है कि उपयोगकर्ता मौजूदा RDP सत्र से पुनः कनेक्ट हुआ है;
- LogonType = 5 – सर्वर कंसोल पर RDP कनेक्शन (mstsc.exe /admin मोड में)।
आप RDP प्रमाणीकरण विफलता इवेंट्स का उपयोग RDP ब्रूट फोर्स हमलों से बचाने के लिए कर सकते हैं। आप एक साधारण पावरशेल स्क्रिप्ट का उपयोग करके हमलावर IPs को विंडोज डिफेंडर फ़ायरवॉल पर स्वचालित रूप से ब्लॉक कर सकते हैं।
इस मामले में, उपयोगकर्ता नाम इवेंट विवरण में खाता नाम फ़ील्ड में होता है, कंप्यूटर का नाम वर्कस्टेशन नाम में, और उपयोगकर्ता IP स्रोत नेटवर्क पता में।
कृपया LogonID फ़ील्ड के मान पर ध्यान दें। यह एक अद्वितीय उपयोगकर्ता RDP सत्र पहचानकर्ता है जो उपयोगकर्ता की आगे की गतिविधि को ट्रैक करने में मदद करता है। हालांकि, यदि RDP सत्र डिस्कनेक्ट हो जाता है और उपयोगकर्ता इससे पुनः कनेक्ट होता है, तो उपयोगकर्ता को एक नया LogonID असाइन किया जाएगा (हालांकि RDP सत्र वही रहता है)।
आप इस पावरशेल कमांड का उपयोग करके सफल 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
लॉगऑन विंडोज में RDP लॉगिन को संदर्भित करता है। EventID 21 – यह इवेंट उपयोगकर्ता के सफलतापूर्वक प्रमाणित होने के बाद दिखाई देता है (रिमोट डेस्कटॉप सर्विसेज: सत्र लॉगऑन सफल)। ये इवेंट्स "एप्लिकेशन और सर्विस लॉग्स -> माइक्रोसॉफ्ट -> विंडोज -> टर्मिनलसर्विसेज-लोकलसेशनमैनेजर -> ऑपरेशनल" में स्थित हैं। जैसा कि आप देख सकते हैं, यहां आप उपयोगकर्ता के RDP सत्र की आईडी – सत्र आईडी पा सकते हैं।
EventID – 21 (रिमोट डेस्कटॉप सर्विसेज: शेल प्रारंभ सूचना प्राप्त) इंगित करता है कि एक्सप्लोरर शेल सफलतापूर्वक शुरू हो गया है (उपयोगकर्ता के RDP सत्र में विंडोज डेस्कटॉप दिखाई देता है)।
सत्र डिस्कनेक्ट/रीकनेक्ट – सत्र डिस्कनेक्शन और पुनः कनेक्शन इवेंट्स के अलग-अलग आईडी होते हैं जो इस बात पर निर्भर करते हैं कि उपयोगकर्ता डिस्कनेक्शन का कारण क्या था (RDP सत्रों के लिए टाइमआउट में सेट निष्क्रियता के कारण डिस्कनेक्शन, उपयोगकर्ता द्वारा सत्र में डिस्कनेक्ट विकल्प चुना गया, RDP सत्र किसी अन्य उपयोगकर्ता या एडमिनिस्ट्रेटर द्वारा समाप्त किया गया, आदि)। आप इन इवेंट्स को इवेंट व्यूअर में "एप्लिकेशन और सर्विस लॉग्स -> माइक्रोसॉफ्ट -> विंडोज -> टर्मिनलसर्विसेज-लोकलसेशनमैनेजर -> ऑपरेशनल" के अंतर्गत पा सकते हैं। आइए उन RDP इवेंट आईडी पर विचार करें जो उपयोगी हो सकते हैं:
- EventID – 24 (
रिमोट डेस्कटॉप सर्विसेज: सत्र डिस्कनेक्ट हो गया) – उपयोगकर्ता RDP सत्र से डिस्कनेक्ट हो गया; - EventID – 25 (
रिमोट डेस्कटॉप सर्विसेज: सत्र पुनः कनेक्शन सफल) – उपयोगकर्ता सर्वर पर मौजूदा RDP सत्र से पुनः कनेक्ट हुआ; - EventID – 39 (
सत्र <A> को सत्र <B> द्वारा डिस्कनेक्ट किया गया) – उपयोगकर्ता ने संबंधित मेनू विकल्प का चयन करके RDP सत्र से डिस्कनेक्ट किया (केवल RDP क्लाइंट विंडो बंद करने के बजाय)। यदि सत्र आईडी अलग हैं, तो उपयोगकर्ता को किसी अन्य उपयोगकर्ता (या एडमिनिस्ट्रेटर) द्वारा डिस्कनेक्ट किया गया है; - EventID – 40 (
सत्र <A> डिस्कनेक्ट हो गया, कारण कोड <B>)। यहां आपको इवेंट विवरण में डिस्कनेक्शन कारण कोड की जांच करनी होगी। उदाहरण के लिए:
- कारण कोड 0 (
कोई अतिरिक्त जानकारी उपलब्ध नहीं है) का अर्थ है कि उपयोगकर्ता ने केवल RDP क्लाइंट विंडो बंद की; - कारण कोड 5 (
क्लाइंट का कनेक्शन किसी अन्य कनेक्शन द्वारा प्रतिस्थापित किया गया) का अर्थ है कि उपयोगकर्ता पिछले RDP सत्र से पुनः कनेक्ट हुआ; - कारण कोड 11 (
उपयोगकर्ता गतिविधि ने डिस्कनेक्शन आरंभ किया) उपयोगकर्ता ने स्टार्ट मेनू में डिस्कनेक्ट बटन पर क्लिक किया।
- कारण कोड 0 (
विंडोज -> सुरक्षा लॉग में EventID 4778 (एक सत्र को विंडो स्टेशन से पुनः कनेक्ट किया गया)। एक उपयोगकर्ता RDP सत्र से पुनः कनेक्ट हुआ (उपयोगकर्ता को एक नया LogonID असाइन किया गया)।
विंडोज -> सुरक्षा लॉग में EventID 4779 (एक सत्र को विंडो स्टेशन से डिस्कनेक्ट किया गया)। एक उपयोगकर्ता RDP सत्र से डिस्कनेक्ट हुआ।
लॉगऑफ उपयोगकर्ता सत्र के अंत को संदर्भित करता है। यह EventID 23 (रिमोट डेस्कटॉप सर्विसेज: सत्र लॉगऑफ सफल) वाले इवेंट के रूप में लॉग किया जाता है, जो "एप्लिकेशन और सर्विस लॉग्स -> माइक्रोसॉफ्ट -> विंडोज -> टर्मिनलसर्विसेज-लोकलसेशनमैनेजर -> ऑपरेशनल" के अंतर्गत होता है।
उसी समय EventID 4634 (एक खाते को लॉगऑफ किया गया) सुरक्षा लॉग में दिखाई देता है।
सिस्टम लॉग में EventID 9009 (डेस्कटॉप विंडो मैनेजर कोड <X> के साथ बाहर निकल गया) का अर्थ है कि उपयोगकर्ता ने RDP सत्र से लॉगऑफ आरंभ किया है जिससे उपयोगकर्ता की विंडो और ग्राफिकल शेल दोनों समाप्त हो गए हैं।
EventID 4647 — उपयोगकर्ता द्वारा शुरू किया गया लॉगऑफ।
पावरशेल के साथ रिमोट डेस्कटॉप लॉगिन इतिहास प्राप्त करना
यहां एक छोटी पावरशेल स्क्रिप्ट है जो करंट दिन के लिए टर्मिनल RDS सर्वर इवेंट लॉग्स से सभी RDP कनेक्शन्स के इतिहास को सूचीबद्ध करती है। परिणामी तालिका कनेक्शन समय, क्लाइंट का IP पता (DNS कंप्यूटरनाम), और रिमोट उपयोगकर्ता नाम दिखाती है (यदि आवश्यक हो, तो आप रिपोर्ट में अन्य LogonTypes शामिल कर सकते हैं)।
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 {'इंटरैक्टिव - स्थानीय लॉगऑन'}
3 {'नेटवर्क कनेक्शन शेयर्ड फोल्डर तक)'}
4 {'बैच'}
5 {'सेवा'}
7 {'अनलॉक (स्क्रीनसेवर के बाद)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (मौजूदा कनेक्शन के तहत स्थानीय प्रतिरूपण प्रक्रिया)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"लॉगटाइप पहचाना नहीं गया: $($_.LogonType)"}
}
}}
यह विधि आपको स्टैंडअलोन RDSH सर्वर पर RDP कनेक्शन लॉग्स को एकत्र और पार्स करने की अनुमति देती है। यदि आपके RDS फार्म में कई सर्वर्स हैं, तो आप इस स्क्रिप्ट से उनमें से प्रत्येक को क्वेरी कर सकते हैं, या रिमोट डेस्कटॉप कनेक्शन ब्रोकर भूमिका वाले मैनेजमेंट सर्वर से लॉग्स प्राप्त कर सकते हैं।
आप इवेंट व्यूअर से RDP कनेक्शन लॉग्स को CSV फ़ाइल में एक्सपोर्ट कर सकते हैं (एक्सेल स्प्रेडशीट में आगे के विश्लेषण के लिए)। आप इवेंट व्यूअर GUI से लॉग एक्सपोर्ट कर सकते हैं (यह मानते हुए कि इवेंट व्यूअर लॉग्स क्लियर नहीं किए गए हैं) या कमांड प्रॉम्प्ट के माध्यम से:
WEVTUtil query-events Security > c:\ps\rdp_security_log.txt
या पावरशेल के साथ:
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 द्वारा उपयोगकर्ता कनेक्शन लॉग्स की जांच कर सकते हैं। उदाहरण के लिए, निम्न पावरशेल स्क्रिप्ट निर्दिष्ट उपयोगकर्ता के RD गेटवे के माध्यम से कनेक्शन इतिहास को प्रदर्शित करेगी:
$rdpusername="b.smith"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='स्रोत IP पता';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='लक्ष्य RDP होस्ट';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusername
आप Microsoft-Windows-TerminalServices-Gateway इवेंट लॉग में निम्न RD गेटवे उपयोगकर्ता कनेक्शन इवेंट्स की जांच कर सकते हैं:
- 300 — उपयोगकर्ता NAME, क्लाइंट कंप्यूटर DEVICE पर, संसाधन प्राधिकरण नीति आवश्यकताओं को पूरा करता था और इसलिए संसाधन RDPHOST से कनेक्ट करने के लिए अधिकृत था;
- 302 — उपयोगकर्ता NAME, क्लाइंट कंप्यूटर DEVICE पर, संसाधन RDPHOST से कनेक्ट हुआ;
- 303 — उपयोगकर्ता NAME, क्लाइंट कंप्यूटर DEVICE पर, निम्न नेटवर्क संसाधन से डिस्कनेक्ट हुआ: RDPHOST। उपयोगकर्ता के डिस्कनेक्ट होने से पहले, क्लाइंट ने X बाइट्स ट्रांसफर किए और X बाइट्स प्राप्त किए। क्लाइंट सत्र अवधि X सेकंड थी।
आप अपने RDS होस्ट पर वर्तमान रिमोट सत्रों की सूची इस कमांड के साथ प्रदर्शित कर सकते हैं:
qwinsta
कमांड सत्र आईडी, उपयोगकर्ता नाम, और सत्र स्थिति (सक्रिय/डिस्कनेक्ट) लौटाता है। यह कमांड तब उपयोगी होती है जब आपको शैडो रिमोट डेस्कटॉप कनेक्शन का उपयोग करते समय उपयोगकर्ता की RDP सत्र आईडी प्राप्त करने की आवश्यकता होती है।
आप निर्दिष्ट RDP सत्र में चल रही प्रक्रियाओं की सूची प्रदर्शित कर सकते हैं (सत्र आईडी निर्दिष्ट है):
qprocess /id:5
विंडोज में आउटगोइंग RDP कनेक्शन लॉग्स
आप क्लाइंट साइड पर आउटगोइंग RDP कनेक्शन लॉग्स भी देख सकते हैं। वे निम्न इवेंट लॉग में उपलब्ध हैं: एप्लिकेशन और सर्विस लॉग्स -> माइक्रोसॉफ्ट -> विंडोज -> टर्मिनलसर्विसेज-क्लाइंटएक्टिवएक्सकोर -> माइक्रोसॉफ्ट-विंडोज-टर्मिनलसर्विसेज-RDPClient -> ऑपरेशनल।
उदाहरण के लिए, EventID 1102 तब होता है जब कोई उपयोगकर्ता रिमोट विंडोज सर्वर RDS होस्ट या RDP सक्षम विंडोज 10/11 कंप्यूटर से कनेक्ट होता है (डेस्कटॉप विंडोज संस्करण भी एक साथ कई RDP कनेक्शन्स का समर्थन करते हैं)।
क्लाइंट ने सर्वर 192.168.13.201 पर मल्टी-ट्रांसपोर्ट कनेक्शन आरंभ किया है।
निम्न RDP स्क्रिप्ट वर्तमान कंप्यूटर पर RDP क्लाइंट कनेक्शन के इतिहास को प्रदर्शित करेगी:
$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='लक्ष्य RDP होस्ट';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $properties
स्क्रिप्ट उन उपयोगकर्ताओं के SIDs को लौटाती है जिन्होंने इस कंप्यूटर पर RDP कनेक्शन आरंभ किए, साथ ही उन रिमोट डेस्कटॉप होस्ट्स के DNS नाम/IP पते जिनसे उपयोगकर्ता कनेक्ट हुए। आप SIDs को उपयोगकर्ता नामों में इस प्रकार परिवर्तित कर सकते हैं।
आप उपयोगकर्ता की रजिस्ट्री में RDP कनेक्शन इतिहास भी देख सकते हैं।