डिफ़ॉल्ट रूप से, पावरशेल रिमोटिंग सत्र में ट्रैफ़िक एन्क्रिप्टेड होता है चाहे HTTP (TCP/5985) या HTTPS (TCP/5986) ट्रांसपोर्ट प्रोटोकॉल का उपयोग किया जाए। वैसे भी, सभी ट्रैफ़िक AES-256 कुंजी का उपयोग करके एन्क्रिप्टेड होता है। हालांकि, यदि आप अपने AD फ़ॉरेस्ट के बाहर या वर्कग्रुप में किसी रिमोट कंप्यूटर से कनेक्ट करते हैं (जहां Kerberos विश्वास संबंध स्थापित नहीं कर सकता), तो आप मैन-इन-द-मिडल हमलों के जोखिम में हैं। माइक्रोसॉफ्ट तीसरे पक्ष के कंप्यूटर्स से कनेक्ट करते समय PSRemoting के लिए हमेशा HTTPS ट्रांसपोर्ट का उपयोग करने की सिफारिश करता है।
इस लेख में, हम दिखाएंगे कि पावरशेल रिमोटिंग को HTTPS पर SSL सर्टिफिकेट का उपयोग करके कैसे कॉन्फ़िगर करें। HTTPS पर PSRemoting सत्र आपके AD डोमेन/फ़ॉरेस्ट के बाहर के कंप्यूटर्स से कनेक्ट करते समय उच्च सत्र सुरक्षा स्तर प्रदान करते हैं।
नीचे दिए गए चरण बताते हैं कि उस रिमोट डिवाइस को कैसे कॉन्फ़िगर करें जिस पर Windows चल रहा है और जिससे आप पावरशेल रिमोटिंग का उपयोग करके HTTPS पर कनेक्ट करना चाहते हैं।
सुनिश्चित करें कि विंडोज में आपका नेटवर्क स्थान Private या Domain पर सेट है:
Get-NetConnectionProfile
WinRM और PSRemoting को कमांड का उपयोग करके सक्षम करें:
Enable-PSRemoting -Force
डोमेन में, आप GPO का उपयोग करके WinRM कॉन्फ़िगर कर सकते हैं।
WinRM के लिए HTTPS कॉन्फ़िगर करने के लिए, आपको पहले उस कंप्यूटर पर SSL सर्टिफिकेट बनाने की आवश्यकता है जिससे आप कनेक्ट करना चाहते हैं। सर्टिफिकेट का उपयोग WinRM ट्रैफ़िक को एन्क्रिप्ट करने के लिए किया जाएगा। पावरशेल का उपयोग करके सेल्फ-साइन सर्टिफिकेट बनाना आसान है। डोमेन वातावरण में, आप ऑटो-एनरोलमेंट का उपयोग करके WinRM सर्टिफिकेट्स को स्वचालित रूप से जारी कर सकते हैं।
कंप्यूटर नाम और उसके IP पते को सर्टिफिकेट के DNS नाम के रूप में निर्दिष्ट करें (यह सुविधाजनक है यदि आपके नेटवर्क में DNS सर्वर नहीं है)। आप सर्टिफिकेट के सब्जेक्ट अल्टरनेटिव नेम के लिए दोनों मान प्राप्त कर सकते हैं और पावरशेल के साथ सेल्फ-साइन सर्टिफिकेट जनरेट कर सकते हैं:
$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
नया SSL सर्टिफिकेट कंप्यूटर पर पर्सनल सर्टिफिकेट स्टोर में दिखाई देगा।
डिफ़ॉल्ट रूप से, विंडोज में पावरशेल रिमोटिंग के लिए दो लिसनर्स अलग-अलग पोर्ट्स पर बनाए जाते हैं:
- पोर्ट 5985 पर HTTP
- पोर्ट 5986 पर HTTPS
आप सक्रिय WSMan लिसनर्स की सूची इस प्रकार प्राप्त कर सकते हैं:
Get-ChildItem wsman:\localhost\Listener
डिफ़ॉल्ट HTTP और HTTPS लिसनर्स को हटाएं:
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse
एक नया HTTPS लिसनर बनाएं और अपना सर्टिफिकेट इससे बाइंड करें:
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force
विंडोज फ़ायरवॉल नियम बनाएं जो WinRM HTTPS ट्रैफ़िक की अनुमति देता है या सुनिश्चित करें कि यह सक्रिय है:
New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP
WinRM सेवा को पुनरारंभ करें:
Restart-Service WinRM
आप इस कमांड का उपयोग करके जांच सकते हैं कि WinRM HTTPS लिसनर किस सर्टिफिकेट थंबप्रिंट से बंधा है:
WinRM e winrm/config/listener
रिमोट होस्ट कॉन्फ़िगर हो गया है। अब आपको SSL सर्टिफिकेट को CER फ़ाइल में एक्सपोर्ट करना होगा:
Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer
ध्यान रखें कि WinRM सर्वर और क्लाइंट कॉन्फ़िगरेशन डिफ़ॉल्ट रूप से अनएन्क्रिप्टेड कनेक्शन की अनुमति नहीं देते:
dir WSMan:\localhost\Service | ? Name -eq AllowUnencrypted
dir WSMan:\localhost\Client | ? Name -eq AllowUnencrypted
यदि आवश्यक हो, तो आप अनएन्क्रिप्टेड कनेक्शन को इस प्रकार अक्षम कर सकते हैं:
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{AllowUnencrypted="false"}'
CER फ़ाइल को एडमिन कंप्यूटर पर कॉपी करें और नीचे दिए गए कमांड का उपयोग करके इसे इम्पोर्ट करें (या GPO का उपयोग करके सर्टिफिकेट को अन्य कंप्यूटर्स पर तैनात करें):
Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\
फिर, WinRM HTTPS का उपयोग करके रिमोट विंडोज होस्ट से कनेक्ट करने के लिए, आपको Enter-PSSession और Invoke-Command cmdlets में -UseSSL तर्क का उपयोग करना होगा। निम्न उदाहरण में, हम पावरशेल कंसोल से इसके IP पते द्वारा रिमोट होस्ट से कनेक्ट करेंगे (ध्यान दें कि हमने इस IP पते को TrustedHosts में नहीं जोड़ा है):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
IP पते से SkipCNCheck विकल्प के बिना कनेक्ट करते समय, निम्न त्रुटि होती है: SSL सर्टिफिकेट में एक कॉमन नेम (CN) होता है जो होस्टनाम से मेल नहीं खाता।