ตามค่าเริ่มต้น การรับส่งข้อมูลในเซสชัน PowerShell Remoting จะถูกเข้ารหัสไม่ว่าจะใช้โปรโตคอลการขนส่ง HTTP (TCP/5985) หรือ HTTPS (TCP/5986) อย่างไรก็ตาม การรับส่งข้อมูลทั้งหมดจะถูกเข้ารหัสโดยใช้คีย์ AES-256 อย่างไรก็ตาม หากคุณเชื่อมต่อกับคอมพิวเตอร์ระยะไกลนอกฟอเรสต์ AD หรือในเวิร์กกรุ๊ป (Kerberos ไม่สามารถสร้างความสัมพันธ์ที่ไว้วางใจได้) คุณจะเสี่ยงที่จะถูกโจมตีโดยคนกลาง Microsoft แนะนำให้ใช้การขนส่ง HTTPS สำหรับ PSRemoting เสมอเมื่อคุณเชื่อมต่อกับคอมพิวเตอร์ของบริษัทอื่น
ในบทความนี้ เราจะแสดงวิธีกำหนดค่า PowerShell Remoting ผ่าน HTTPS โดยใช้ใบรับรอง SSL เซสชัน PSRemoting ผ่าน HTTPS ให้ระดับความปลอดภัยเซสชันที่สูงขึ้นเมื่อเชื่อมต่อกับคอมพิวเตอร์นอกโดเมน/ฟอเรสต์ AD ของคุณ
ขั้นตอนด้านล่างอธิบายวิธีกำหนดค่าอุปกรณ์ระยะไกลที่ใช้ Windows ที่คุณต้องการเชื่อมต่อโดยใช้ PowerShell Remoting ผ่าน HTTPS
ตรวจสอบให้แน่ใจว่าตำแหน่งเครือข่ายของคุณใน Windows ถูกตั้งค่าเป็นส่วนตัวหรือโดเมน:
Get-NetConnectionProfile
เปิดใช้งาน WinRM และ PSRemoting โดยใช้คำสั่ง:
Enable-PSRemoting -Force
ในการกำหนดค่า HTTPS สำหรับ WinRM คุณต้องสร้างใบรับรอง SSL บนคอมพิวเตอร์ที่คุณต้องการเชื่อมต่อก่อน ใบรับรองจะถูกใช้เพื่อเข้ารหัสการรับส่งข้อมูล WinRM ง่ายกว่าในการสร้างใบรับรองที่ลงนามเองโดยใช้ PowerShell ในสภาพแวดล้อมของโดเมน คุณสามารถออกใบรับรอง WinRM โดยอัตโนมัติโดยใช้การลงทะเบียนอัตโนมัติ
ระบุชื่อคอมพิวเตอร์และที่อยู่ IP เป็นชื่อ DNS ของใบรับรอง (สะดวกหากเครือข่ายของคุณไม่มีเซิร์ฟเวอร์ DNS) คุณสามารถรับค่าทั้งสองค่าสำหรับ Subject Alternative Name ของใบรับรอง และสร้างใบรับรองที่ลงนามเองด้วย PowerShell:
$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
ใบรับรอง SSL ใหม่จะปรากฏในที่เก็บใบรับรองส่วนบุคคลบนคอมพิวเตอร์
ตามค่าเริ่มต้น ตัวฟังสองตัวบนพอร์ตที่ต่างกันจะถูกสร้างขึ้นสำหรับ PowerShell Remoting ใน Windows:
- HTTP บนพอร์ต 5985
- HTTPS บนพอร์ต 5986
คุณสามารถรับรายชื่อผู้ฟัง WSMan ที่ใช้งานอยู่ดังแสดงด้านล่าง:
Get-ChildItem wsman:\localhost\Listener
ลบ HTTP และ HTTPS listeners เริ่มต้น:
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
มีการกำหนดค่าโฮสต์ระยะไกล ตอนนี้คุณต้องส่งออกใบรับรอง SSL ไปยังไฟล์ CER:
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\
จากนั้น ในการเชื่อมต่อกับโฮสต์ Windows ระยะไกลโดยใช้ WinRM HTTPS คุณต้องใช้ -UseSSL อาร์กิวเมนต์ใน cmdlet ของ Enter-PSSession และ Invoke-Command ในตัวอย่างต่อไปนี้ เราจะเชื่อมต่อกับโฮสต์ระยะไกลจากคอนโซล PowerShell ด้วยที่อยู่ IP (โปรดทราบว่าเรายังไม่ได้เพิ่มที่อยู่ IP นี้ใน TrustedHosts):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
เมื่อเชื่อมต่อด้วยที่อยู่ IP โดยไม่มี SkipCNCheck ตัวเลือก เกิดข้อผิดพลาดต่อไปนี้:
The SSL certificate contains a common name (CN) that does not match the hostname
.