Theo mặc định, lưu lượng truy cập trong phiên PowerShell Remoting được mã hóa cho dù sử dụng giao thức truyền tải HTTP (TCP / 5985) hay HTTPS (TCP / 5986). Dù sao, tất cả lưu lượng được mã hóa bằng khóa AES-256. Tuy nhiên, nếu bạn kết nối với một máy tính từ xa bên ngoài khu rừng AD của bạn hoặc trong một nhóm làm việc (Kerberos không thể thiết lập mối quan hệ tin cậy với), bạn có nguy cơ bị tấn công trung gian. Microsoft khuyến nghị luôn sử dụng truyền tải HTTPS cho PSRemoting khi bạn kết nối với máy tính của bên thứ ba.
Trong bài viết này, chúng tôi sẽ hướng dẫn cách định cấu hình PowerShell Remoting qua HTTPS sử dụng chứng chỉ SSL. Phiên PSRemoting qua HTTPS cung cấp cấp độ bảo mật phiên cao hơn khi kết nối với các máy tính bên ngoài miền / rừng AD của bạn.
Các bước bên dưới mô tả cách định cấu hình thiết bị từ xa chạy Windows mà bạn muốn kết nối bằng cách sử dụng PowerShell Remoting qua HTTPS.
Đảm bảo rằng vị trí mạng của bạn trong Windows được đặt thành Riêng tư hoặc Miền:
Get-NetConnectionProfile
Bật WinRM và PSRemoting bằng lệnh:
Enable-PSRemoting -Force
Để cấu hình HTTPS cho WinRM, trước tiên bạn cần tạo chứng chỉ SSL trên máy tính bạn muốn kết nối. Chứng chỉ sẽ được sử dụng để mã hóa lưu lượng WinRM. Việc tạo chứng chỉ tự ký bằng PowerShell sẽ dễ dàng hơn. Trong môi trường miền, bạn có thể tự động cấp chứng chỉ WinRM bằng tính năng Tự động đăng ký.
Chỉ định tên máy tính và địa chỉ IP của nó làm tên DNS của chứng chỉ (rất tiện lợi nếu mạng của bạn không có máy chủ DNS). Bạn có thể nhận cả hai giá trị cho Tên thay thế chủ đề của chứng chỉ và tạo chứng chỉ tự ký với PowerShell:
$hostName = $env:COMPUTERNAME
$hostIP=(Get-NetAdapter| Get-NetIPAddress).IPv4Address|Out-String
$srvCert = New-SelfSignedCertificate -DnsName $hostName,$hostIP -CertStoreLocation Cert:\LocalMachine\My
$srvCert
Chứng chỉ SSL mới sẽ xuất hiện trong kho chứng chỉ cá nhân trên máy tính.
Theo mặc định, hai trình nghe trên các cổng khác nhau được tạo cho PowerShell Remoting trong Windows:
- HTTP trên cổng 5985
- HTTPS trên Cổng 5986
Bạn có thể nhận được danh sách các trình nghe WSMan đang hoạt động như được hiển thị bên dưới:
Get-ChildItem wsman:\localhost\Listener
Xóa trình nghe HTTP và HTTPS mặc định:
Get-ChildItem wsman:\localhost\Listener\ | Where-Object -Property Keys -like 'Transport=HTTP*' | Remove-Item -Recurse
Tạo trình nghe HTTPS mới và liên kết chứng chỉ của bạn với nó:
New-Item -Path WSMan:\localhost\Listener\ -Transport HTTPS -Address * -CertificateThumbPrint $srvCert.Thumbprint -Force
Tạo quy tắc Tường lửa của Windows cho phép lưu lượng WinRM HTTPS hoặc đảm bảo rằng nó đang hoạt động:
New-NetFirewallRule -Displayname 'WinRM - Powershell remoting HTTPS-In' -Name 'WinRM - Powershell remoting HTTPS-In' -Profile Any -LocalPort 5986 -Protocol TCP
Khởi động lại dịch vụ WinRM:
Restart-Service WinRM
Bạn có thể kiểm tra bản ghi chứng chỉ nào mà trình nghe WinRM HTTPS bị ràng buộc với việc sử dụng lệnh này:
WinRM e winrm/config/listener
Máy chủ từ xa đã được định cấu hình. Bây giờ bạn phải xuất chứng chỉ SSL sang tệp 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
Nếu cần, bạn có thể tắt các kết nối không được mã hóa như sau:
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
‘
winrm set winrm/config/client '@{AllowUnencrypted="false"}
Sao chép tệp CER vào máy tính quản trị và nhập tệp đó bằng lệnh bên dưới (hoặc triển khai chứng chỉ cho các máy tính khác bằng GPO):
Import-Certificate -FilePath c:\PS\SSL_PS_Remoting.cer -CertStoreLocation Cert:\LocalMachine\root\
Sau đó, để kết nối với máy chủ Windows từ xa bằng WinRM HTTPS, bạn phải sử dụng -UseSSL trong lệnh ghép ngắn Enter-PSSession và Invoke-Command. Trong ví dụ sau, chúng tôi sẽ kết nối với máy chủ từ xa từ bảng điều khiển PowerShell bằng địa chỉ IP của nó (lưu ý rằng chúng tôi chưa thêm địa chỉ IP này vào TrustedHosts):
$SessionOption = New-PSSessionOption -SkipCNCheck
Enter-PSSession -Computername 192.168.13.4 -UseSSL -Credential maxbak -SessionOption $SessionOption
Khi kết nối bằng địa chỉ IP mà không có SkipCNCheck , lỗi sau xảy ra:
The SSL certificate contains a common name (CN) that does not match the hostname
.