Quản lý Windows Server VPS bảo mật RDP và tự động hóa PowerShell

Cuối tuần, mở điện thoại lên thấy cảnh báo từ Windows VPS của khách hàng: hàng trăm lần thử đăng nhập RDP thất bại từ một dải IP lạ. Tình huống này không hiếm nếu bạn mở port 3389 ra Internet mà không có lớp bảo vệ nào. Khi thuê một VPS Windows với quyền Administrator đầy đủ, việc đầu tiên không phải là cài ứng dụng, mà là siết chặt cửa RDP và thiết lập kênh quản trị tự động an toàn. Bài này sẽ hướng dẫn bạn bảo mật Remote Desktop đúng cách, sau đó dùng PowerShell Remoting để quản lý và tự động hóa tác vụ trên Windows Server mà không cần mở thêm dịch vụ không cần thiết.
Vì sao RDP mặc định trên Windows Server là mục tiêu dễ bị tấn công
Cổng RDP mặc định 3389 thường xuyên bị quét trên toàn cầu. Kẻ tấn công dùng tool tự động dò mật khẩu yếu, khai thác lỗ hổng chưa vá, hoặc lợi dụng tài khoản Administrator có tên mặc định. Nếu VPS của bạn đặt tại Việt Nam và dùng VPS Linux có IPv4 riêng, mức độ phơi nhiễm vẫn tương tự khi mở Windows ra Internet.
Vấn đề không chỉ là mật khẩu mạnh. Kẻ tấn công có thể dùng kỹ thuật tấn công trung gian nếu kết nối RDP không được mã hóa đúng chuẩn, hoặc khai thác các phiên bản Windows Server chưa cập nhật. Do đó bảo mật RDP cần nhiều lớp: xác thực mạnh, giới hạn nguồn truy cập, và giảm bề mặt tấn công.
| Lớp bảo vệ | Mục đích | Khuyến nghị |
|---|---|---|
| Network Level Authentication (NLA) | Xác thực trước khi tạo phiên làm việc đầy đủ | Bật mặc định trên Windows Server hiện đại |
| Firewall Windows Defender | Giới hạn IP được phép kết nối RDP | Chỉ cho phép dải IP tin cậy |
| Đổi port RDP | Giảm tiếng ồn từ quét cổng tự động | Chọn port ngẫu nhiên cao, không dùng port phổ biến |
| Chính sách khóa tài khoản | Chặn brute-force mật khẩu | Khóa sau 5 lần sai, kết hợp với nguồn giám sát |
Yêu cầu trước khi bắt đầu
- Một VPS chạy Windows Server 2022 hoặc 2019 với quyền Administrator.
- Địa chỉ IP công cố định của bạn hoặc dải IP nơi làm việc để tránh tự khóa mình ngoài.
- Hiểu biết cơ bản về PowerShell và khái niệm firewall.
- Sử dụng VPS Windows có IPv4 riêng để quản lý an toàn hơn khi cấu hình IP whitelist.
Trước khi bắt đầu, hãy chắc chắn bạn đang kết nối qua RDP và có quyền admin. Nếu bạn tự khóa mình vì firewall, bạn sẽ cần dùng tính năng cài lại OS hoặc console ảo từ nhà cung cấp. Lưu ý điều này trước khi thực hiện các bước thay đổi cấu hình mạng.
Bước 1 - Bật Network Level Authentication và xác minh cấu hình RDP hiện tại
NLA yêu cầu người dùng xác thực trước khi phiên làm việc từ xa được thiết lập hoàn chỉnh. Điều này giảm tải tài nguyên và chặn nhiều kiểu tấn công khai thác trước xác thực.
Mở PowerShell với quyền Administrator và chạy lệnh kiểm tra trạng thái NLA hiện tại:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication
Nếu giá trị UserAuthentication trả về 0, NLA đang tắt. Bật lên bằng lệnh:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1
Kiểm tra trạng thái RDP được bật:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections
Giá trị 0 nghĩa là RDP đang được phép. Tiếp theo, bật NLA qua Registry cũng cần đồng bộ với Group Policy nếu máy nằm trong domain, nhưng với VPS độc lập thì Registry là đủ.
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 0
Sau đó khởi động lại dịch vụ Remote Desktop Services để áp dụng:
Restart-Service TermService -Force
Xác minh: Chạy lệnh sau để chắc chắn dịch vụ đang chạy và NLA đã bật:
Get-Service TermService | Select-Object Status, Name
Kết quả mong đợi là Status: Running. Lúc này khi kết nối RDP từ client, bạn sẽ thấy màn hình yêu cầu nhập thông tin đăng nhập trước khi vào phiên làm việc.
Bước 2 - Đổi port RDP mặc định để giảm quét tự động
Đổi port không phải là biện pháp bảo mật mạnh, nhưng nó loại bỏ phần lớn tiếng ồn từ các bot quét port 3389 tự động. Kết hợp với firewall giới hạn IP, đây là lớp phòng thủ hiệu quả.
Mở Registry Editor qua PowerShell và thay đổi giá trị PortNumber:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber -Value 43389
Chọn một port cao, ít bị quét, ví dụ 43389. Tránh các port phổ biến như 8080, 8443, hay 1433 vì chúng thường bị quét cho mục đích khác. Sau khi đổi, cần thêm quy tắc firewall cho phép port mới và chặn port cũ.
New-NetFirewallRule -DisplayName "RDP-New-Port-43389" -Direction Inbound -Protocol TCP -LocalPort 43389 -Action Allow
Remove-NetFirewallRule -DisplayName "Remote Desktop" -ErrorAction SilentlyContinue
Lưu ý rằng lệnh Remove có thể xóa cả quy tắc nhóm nếu bạn không cẩn thận. An toàn hơn là không xóa mà chỉ vô hiệu hóa quy tắc cũ bằng lệnh:
Disable-NetFirewallRule -DisplayName "Remote Desktop"
Xác minh: Kiểm tra quy tắc firewall mới đã tồn tại và port đang lắng nghe:
Get-NetFirewallRule -DisplayName "RDP-New-Port-43389" | Select-Object DisplayName, Enabled
netstat -an | findstr 43389
Nếu output của netstat không hiện dòng nào, khởi động lại dịch vụ TermService lần nữa và kiểm tra lại. Sau đó thử kết nối RDP từ máy của bạn với port mới, ví dụ qua mstsc nhập IP:43389.
Bước 3 - Cấu hình firewall Windows Defender giới hạn IP truy cập RDP
Đây là lớp bảo vệ quan trọng nhất. Thay vì để RDP mở cho mọi địa chỉ IP, bạn chỉ cho phép đúng dải IP mà bạn thực sự dùng. Với một Windows VPS quản trị từ xa, việc này đơn giản hơn nhiều vì bạn thường có IP tĩnh tại văn phòng hoặc VPN.
Giả sử IP công của bạn là 203.113.150.25. Thay đổi quy tắc firewall để chỉ cho phép IP này truy cập port RDP mới:
Set-NetFirewallRule -DisplayName "RDP-New-Port-43389" -RemoteAddress 203.113.150.25
Nếu bạn dùng dải IP động từ ISP, hãy cấu hình theo dải CIDR. Ví dụ dải 203.113.150.0/24. Tuy nhiên không nên mở quá rộng vì sẽ giảm tác dụng bảo vệ.
Để chắc chắn quy tắc cũ không còn cho phép truy cập rộng rãi, kiểm tra toàn bộ quy tắc liên quan RDP:
Get-NetFirewallRule -DisplayName "*RDP*" | Get-NetFirewallAddressFilter | Select-Object -Property RemoteAddress
Kết quả mong đợi chỉ hiện đúng IP hoặc dải IP bạn đã khai báo. Nếu có Any, quy tắc đó vẫn mở cho tất cả, cần sửa ngay.
Bước 4 - Thiết lập PowerShell Remoting (WinRM) qua HTTPS để quản trị tự động
PowerShell Remoting dùng WinRM, mặc định lắng nghe trên port 5985 (HTTP) và 5986 (HTTPS). Khi bạn đã giới hạn RDP theo IP, mở thêm WinRM cho cùng dải IP đó là hợp lý. Bạn sẽ có hai kênh quản trị: RDP cho phiên làm việc trực quan, PowerShell cho tự động hóa.
Bật PowerShell Remoting bằng lệnh:
Enable-PSRemoting -Force
Lệnh này tự động cấu hình WinRM, tạo quy tắc firewall cho phép truy cập từ máy cùng domain. Trên VPS độc lập, bạn cần cấu hình thêm để giới hạn IP và bật HTTPS nếu muốn mã hóa toàn phiên.
Xem cấu hình WinRM hiện tại:
winrm enumerate winrm/config/Listener
Output sẽ hiện listener HTTP trên port 5985. WinRM qua HTTP vẫn mã hóa payload của PowerShell, nhưng để an toàn tuyến đầu, bạn nên cấu hình HTTPS bằng chứng chỉ tự ký hoặc chứng chỉ từ CA nội bộ.
$Subject = "CN=windows-vps.example.com"
$Cert = New-SelfSignedCertificate -DnsName "windows-vps.example.com" -CertStoreLocation "Cert:\LocalMachine\My"
New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -Port 5986 -CertificateThumbPrint $Cert.Thumbprint -Force
Sau khi tạo listener HTTPS, đảm bảo firewall cho phép port 5986 với đúng dải IP của bạn:
New-NetFirewallRule -DisplayName "WinRM-HTTPS" -Direction Inbound -Protocol TCP -LocalPort 5986 -RemoteAddress 203.113.150.25 -Action Allow
Xác minh: Từ máy trạm của bạn (đã cài PowerShell 7 trở lên), thử kết nối đến VPS:
Enter-PSSession -ComputerName IP_VPS -Port 5986 -Credential (Get-Credential) -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck)
Lưu ý khi dùng chứng chỉ tự ký, client cần bỏ qua kiểm tra CA. Trong môi trường production, hãy dùng chứng chỉ từ PKI nội bộ hoặc ít nhất là chứng chỉ công khai nếu VPS có domain.
Bước 5 - Tạo script tự động hóa tác vụ quản trị qua PowerShell
Một trong những lợi ích lớn nhất của PowerShell Remoting là khả năng chạy script trên nhiều VPS cùng lúc. Bạn không cần mở RDP để kiểm tra từng máy một.
Ví dụ script kiểm tra dung lượng ổ đĩa và thông báo qua email hoặc file log. Tạo file check-disk.ps1 trên máy trạm:
$servers = @("VPS1", "VPS2", "VPS3")
$cred = Get-Credential
foreach ($server in $servers) {
Invoke-Command -ComputerName $server -Credential $cred -UseSSL -Port 5986 -ScriptBlock {
Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -gt 0 } |
Select-Object @{Name="Server"; Expression={$env:COMPUTERNAME}},
@{Name="Drive"; Expression={$_.Name}},
@{Name="FreeGB"; Expression={[math]::Round($_.Free/1GB,2)}},
@{Name="UsedGB"; Expression={[math]::Round($_.Used/1GB,2)}}
}
}
Để chạy script này định kỳ mà không cần can thiệp thủ công, bạn có thể lên lịch bằng Task Scheduler trên máy trạm hoặc dùng systemd timer nếu máy trạm là Linux kết hợp PowerShell. Với môi trường Windows thuần, dùng Task Scheduler với trigger hằng ngày và action chạy powershell.exe -File check-disk.ps1.
Bạn cũng có thể gửi cảnh báo qua Telegram khi phát hiện vấn đề. Script dưới đây kiểm tra service quan trọng và gửi thông báo:
$services = @("W3SVC", "MSSQLSERVER")
foreach ($server in $servers) {
$result = Invoke-Command -ComputerName $server -Credential $cred -UseSSL -Port 5986 -ScriptBlock {
param($svcList)
foreach ($svc in $svcList) {
Get-Service -Name $svc | Select-Object Name, Status
}
} -ArgumentList $services
$failed = $result | Where-Object { $_.Status -ne "Running" }
if ($failed) {
$message = "Service DOWN on $server : $($failed.Name -join ', ')"
# Gửi request tới Telegram bot API
Invoke-RestMethod -Uri "https://api.telegram.org/bot/sendMessage" -Method Post -Body @{ chat_id = ""; text = $message }
}
}
Với cách này bạn đã có một hệ thống giám sát và cảnh báo cơ bản mà không cần thêm phần mềm bên thứ ba, không cần mở thêm port nào ngoài 5986 cho dải IP quản trị.
Xử lý lỗi thường gặp
Không kết nối được RDP sau khi đổi port hoặc cấu hình firewall
Đầu tiên kiểm tra dịch vụ TermService còn chạy không qua console ảo của nhà cung cấp VPS:
Get-Service TermService
Get-NetFirewallRule -DisplayName "RDP-New-Port-43389" | Select-Object Enabled, Action
Nếu firewall chặn, hãy tạm thời bật quy tắc với RemoteAddress là Any để kiểm tra kết nối, sau đó siết lại IP. Một mẹo nhỏ: luôn giữ một phiên RDP đang mở trước khi thay đổi firewall để tránh tự khóa mình ngoài.
PowerShell Remoting báo lỗi WinRM cannot complete the operation
Kiểm tra listener WinRM và cấu hình TrustedHosts nếu bạn dùng HTTP thay vì HTTPS:
winrm enumerate winrm/config/Listener
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "203.113.150.25"
Nếu dùng HTTPS, hãy chắc chắn client dùng đúng tham số -UseSSL và bỏ qua kiểm tra CA nếu dùng chứng chỉ tự ký. Lỗi này thường gặp nhất là do thiếu -SessionOption (New-PSSessionOption -SkipCACheck).
Kết nối RDP bị treo hoặc màn hình đen sau khi bật NLA
Nguyên nhân thường do client RDP cũ không hỗ trợ NLA. Hãy cập nhật Microsoft Remote Desktop client lên bản mới nhất hoặc dùng ứng dụng Windows App. Kiểm tra lại bằng lệnh:
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication
Bạn cũng nên kiểm tra xem có đang dùng tài khoản không thuộc nhóm Remote Desktop Users không. Thêm user vào nhóm nếu cần:
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "username"
Câu hỏi thường gặp
Bảo mật RDP trên Windows Server có cần đổi port không?
Đổi port giúp giảm đáng kể lượng quét tự động từ bot, nhưng không thay thế cho mật khẩu mạnh và firewall giới hạn IP. Bạn nên kết hợp cả ba lớp: NLA, firewall IP whitelist và port tùy chỉnh.
PowerShell Remoting và RDP khác nhau thế nào khi quản trị từ xa?
RDP cho phiên làm việc trực quan như đang ngồi trước máy, tốn tài nguyên và dễ bị tấn công hơn. PowerShell Remoting qua WinRM chỉ truyền lệnh và dữ liệu, nhẹ hơn nhiều, thích hợp cho tự động hóa và chạy script hàng loạt trên nhiều VPS.
Có nên vô hiệu hóa RDP hoàn toàn để dùng PowerShell không?
Không hoàn toàn. Khi cần thao tác giao diện, cài phần mềm có wizard, hoặc gỡ lỗi trực quan bạn vẫn cần RDP. Chiến lược tốt là giữ RDP nhưng giới hạn IP nghiêm ngặt, còn PowerShell Remoting dành cho các tác vụ lặp lại và tự động.
Port 5986 HTTPS cho WinRM có an toàn để mở ra Internet không?
An toàn nếu bạn giới hạn RemoteAddress trong firewall chỉ cho dải IP quản trị của mình và dùng xác thực người dùng mạnh. Khuyến nghị không mở WinRM ra toàn Internet mà chỉ cho phép IP văn phòng hoặc qua VPN.
VPS Windows của tôi bị khóa ngoài do firewall, làm sao vào lại?
Dùng console ảo hoặc tính năng VNC từ trang quản trị của nhà cung cấp VPS để đăng nhập local, sau đó sửa lại quy tắc firewall. Nếu không có console, bạn phải yêu cầu nhà cung cấp hỗ trợ hoặc cài lại OS và khôi phục từ snapshot.
Bài viết liên quan
- Hướng dẫn thuê VPS Windows và cấu hình RDP an toàn 2026
- Cấu hình Remote Desktop an toàn cho VPS Windows
- Quản lý VPS Windows bằng PowerShell Remoting
- Cài đặt Windows Server 2022 trên VPS từ A đến Z


