डिफ़ॉल्ट रूप से, पावरशेल रिमोटिंग सत्र में ट्रैफ़िक एन्क्रिप्ट किया जाता है चाहे HTTP (टीसीपी/5985) या एचटीटीपीएस (टीसीपी/5986) ट्रांसपोर्ट प्रोटोकॉल का उपयोग किया गया हो। वैसे भी, AES-256 कुंजी का उपयोग करके सभी ट्रैफ़िक को एन्क्रिप्ट किया गया है। हालाँकि, यदि आप अपने AD फ़ॉरेस्ट के बाहर या किसी कार्यसमूह में किसी दूरस्थ कंप्यूटर से कनेक्ट होते हैं (Kerberos के साथ एक विश्वास संबंध स्थापित नहीं कर सकता), तो आपको मध्य-में-आक्रमण का जोखिम है। Microsoft अनुशंसा करता है कि जब आप तृतीय-पक्ष कंप्यूटर से कनेक्ट हों तो हमेशा PSRemoting के लिए HTTPS ट्रांसपोर्ट का उपयोग करें।
इस लेख में, हम दिखाएंगे कि कैसे HTTPS पर PowerShell रिमोटिंग को कॉन्फ़िगर करें एक एसएसएल प्रमाणपत्र का उपयोग करना। आपके AD डोमेन/फ़ॉरेस्ट के बाहर के कंप्यूटरों से कनेक्ट होने पर HTTPS पर PSRemoting सत्र एक उच्च सत्र सुरक्षा स्तर प्रदान करते हैं।
नीचे दिए गए चरणों में बताया गया है कि विंडोज चलाने वाले रिमोट डिवाइस को कैसे कॉन्फ़िगर करें जिसे आप एचटीटीपीएस पर पावरशेल रिमोटिंग का उपयोग करके कनेक्ट करना चाहते हैं।
सुनिश्चित करें कि विंडोज़ में आपका नेटवर्क स्थान निजी या डोमेन पर सेट है:
Get-NetConnectionProfile
कमांड का उपयोग करके WinRM और PSRemoting को सक्षम करें:
Enable-PSRemoting -Force
WinRM के लिए HTTPS को कॉन्फ़िगर करने के लिए, आपको पहले उस कंप्यूटर पर एक SSL प्रमाणपत्र बनाना होगा जिससे आप कनेक्ट करना चाहते हैं। प्रमाणपत्र का उपयोग WinRM ट्रैफ़िक को एन्क्रिप्ट करने के लिए किया जाएगा। PowerShell का उपयोग करके स्व-हस्ताक्षरित प्रमाणपत्र बनाना आसान है। डोमेन परिवेश में, आप स्वतः नामांकन का उपयोग करके स्वचालित रूप से WinRM प्रमाणपत्र जारी कर सकते हैं।
प्रमाणपत्र के DNS नाम के रूप में कंप्यूटर का नाम और उसका आईपी पता निर्दिष्ट करें (यदि आपके नेटवर्क में DNS सर्वर नहीं है तो यह सुविधाजनक है)। आप प्रमाणपत्र के विषय वैकल्पिक नाम के लिए दोनों मान प्राप्त कर सकते हैं और PowerShell के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न कर सकते हैं:
$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
नया एसएसएल प्रमाणपत्र कंप्यूटर पर व्यक्तिगत प्रमाणपत्र स्टोर में दिखाई देगा।
डिफ़ॉल्ट रूप से, विंडोज़ में पॉवरशेल रिमोटिंग के लिए अलग-अलग पोर्ट पर दो श्रोता बनाए जाते हैं:
- पोर्ट 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
एक Windows फ़ायरवॉल नियम बनाएँ जो 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
दूरस्थ होस्ट कॉन्फ़िगर किया गया है। अब आपको एसएसएल प्रमाणपत्र को सीईआर फ़ाइल में निर्यात करना होगा:
Export-Certificate -Cert $srvCert -FilePath c:\PS\SSL_PS_Remoting.cer
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 का उपयोग करके किसी दूरस्थ Windows होस्ट से कनेक्ट करने के लिए, आपको -UseSSL का उपयोग करना चाहिए Enter-PSSession और Invoke-Command cmdlets में तर्क। निम्नलिखित उदाहरण में, हम PowerShell कंसोल से किसी दूरस्थ होस्ट से उसके IP पते से कनेक्ट होंगे (ध्यान दें कि हमने इस IP पते को TrustedHosts में नहीं जोड़ा है):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
SkipCNcheck . के बिना किसी IP पते से कनेक्ट होने पर विकल्प, निम्न त्रुटि होती है:
The SSL certificate contains a common name (CN) that does not match the hostname
.