ค้นหาเว็บไซต์

การกำหนดค่า PowerShell Remoting (WinRM) ผ่าน HTTPS


ตามค่าเริ่มต้น การรับส่งข้อมูลในเซสชันระยะไกลของ PowerShell จะถูกเข้ารหัสไม่ว่าจะใช้โปรโตคอลการขนส่ง 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

ในโดเมน คุณสามารถกำหนดค่า WinRM โดยใช้ GPO

ในการกำหนดค่า HTTPS สำหรับ WinRM คุณต้องสร้างใบรับรอง SSL บนคอมพิวเตอร์ที่คุณต้องการเชื่อมต่อก่อน ใบรับรองจะถูกใช้เพื่อเข้ารหัสการรับส่งข้อมูล WinRM การสร้างใบรับรองที่ลงนามด้วยตนเองโดยใช้ PowerShell นั้นง่ายกว่า ในสภาพแวดล้อมโดเมน คุณสามารถออกใบรับรอง WinRM ได้โดยอัตโนมัติโดยใช้การลงทะเบียนอัตโนมัติ

ระบุชื่อคอมพิวเตอร์และที่อยู่ IP เป็นชื่อ 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

ใบรับรอง SSL ใหม่จะปรากฏในที่เก็บใบรับรองส่วนบุคคลบนคอมพิวเตอร์

ตามค่าเริ่มต้น ผู้ฟังสองคนบนพอร์ตที่แตกต่างกันจะถูกสร้างขึ้นสำหรับ PowerShell Remoting ใน Windows:

  • HTTP บนพอร์ต 5985

  • HTTPS บนพอร์ต 5986

คุณสามารถรับรายชื่อผู้ฟัง 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

โฮสต์ระยะไกลได้รับการกำหนดค่า ตอนนี้คุณต้องส่งออกใบรับรอง 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\

จากนั้น หากต้องการเชื่อมต่อกับโฮสต์ Windows ระยะไกลโดยใช้ WinRM HTTPS คุณต้องใช้อาร์กิวเมนต์ -UseSSL ใน cmdlets 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

บทความที่เกี่ยวข้อง