Start typing to search across invoices, services, domains, tickets, and more...
インターネットに公開された Windows サーバーは、起動から数分で 3389 番ポートをスキャンされ、パスワード総当たり攻撃を受けます。そのため Windows VPS のセキュリティ強化は導入直後に必ず行いましょう。この記事では Windows Server 2016/2019/2022 を対象に、Administrator の強力なパスワードと名前変更、アカウントロックアウトポリシー、RDP のネットワークレベル認証(NLA)、RDP 接続元 IP の制限、不要なサービスの停止、Defender の確認、Get-WinEvent によるログオン失敗(4625)の監査を順に解説します。
パスワードは 16 文字以上で大文字・小文字・数字・記号を組み合わせ、他サービスと使い回さないでください。総当たりツールのほとんどは Administrator を狙うため、名前を変えるだけで無差別攻撃の大半を防げます。
# Set a new strong password (you will be prompted, nothing is echoed)
net user Administrator *
# Rename the built-in Administrator account
Rename-LocalUser -Name "Administrator" -NewName "srvadmin"
Get-LocalUser | Format-Table Name,Enabled,LastLogon一定回数パスワードを間違えたアカウントを一時的にロックし、総当たり攻撃を大幅に遅らせます。secpol.msc の「アカウントポリシー → アカウントロックアウトのポリシー」からも設定できます。
# Lock an account for 30 minutes after 5 failed attempts within 30 minutes
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
net accountsNLA はリモートデスクトップのセッションを作成する前に認証を求める仕組みで、未認証接続によるリソース消費を抑え、一部の RDP 脆弱性も緩和します。「システムのプロパティ → リモート」で「ネットワークレベル認証でリモートデスクトップを実行しているコンピューターからのみ接続を許可する」にチェックするか、以下を実行します。
$rdp = "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
Set-ItemProperty -Path $rdp -Name UserAuthentication -Value 1
Get-ItemProperty -Path $rdp -Name UserAuthentication, PortNumberRDP のブルートフォース対策として最も効果的な手順です。組み込みのリモートデスクトップ用ファイアウォール規則を編集し、オフィスの IP やサブネットだけを許可します。規則名はどの言語の OS でも共通です。RDP ポートを変更して独自の規則を作成した場合は、その規則にも -RemoteAddress を設定してください。
# Built-in Remote Desktop rules (names are the same on every OS language)
Set-NetFirewallRule -Name RemoteDesktop-UserMode-In-TCP, RemoteDesktop-UserMode-In-UDP -RemoteAddress 203.0.113.10, 198.51.100.0/24
Get-NetFirewallRule -Name RemoteDesktop-UserMode-In-TCP | Get-NetFirewallAddressFilter
# Undo: allow RDP from anywhere again
Set-NetFirewallRule -Name RemoteDesktop-UserMode-In-TCP, RemoteDesktop-UserMode-In-UDP -RemoteAddress Any動作中のサービスはすべて攻撃対象になり得ます。実行中のサービスを一覧表示し、不要なものを停止します。印刷スプーラー(Spooler)はサーバーではほぼ使われず、過去に深刻な脆弱性もありました。用途が分からないシステムサービスは停止しないでください。
Get-Service | Where-Object { $_.Status -eq "Running" } | Sort-Object DisplayName | Format-Table Name,DisplayName
# Example: print spooler is rarely needed on a server
Stop-Service -Name Spooler
Set-Service -Name Spooler -StartupType DisabledWindows Server 2016 以降には Microsoft Defender ウイルス対策が標準搭載されています。リアルタイム保護が有効か確認し、定義ファイルを更新してクイックスキャンを実行します。
Get-MpComputerStatus | Select-Object AMServiceEnabled,RealTimeProtectionEnabled,AntivirusSignatureLastUpdated
Set-MpPreference -DisableRealtimeMonitoring $false
Update-MpSignature
Start-MpScan -ScanType QuickScanイベント ID 4625 はログオン失敗を示します。以下で直近の失敗と、過去 24 時間で試行回数の多い送信元 IP を確認できます。攻撃を受けているか判断し、怪しい IP をファイアウォールでブロックしましょう。
# Make sure failed logons are audited (GUID = "Logon" subcategory, language independent)
auditpol /set /subcategory:"{0CCE9215-69AE-11D9-BED3-505054503030}" /failure:enable
# Last 20 failed logons
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 20 |
Select-Object TimeCreated, @{n='User';e={$_.Properties[5].Value}}, @{n='SourceIP';e={$_.Properties[19].Value}}
# Top attacking IPs in the last 24 hours
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
ForEach-Object { $_.Properties[19].Value } | Group-Object | Sort-Object Count -Descending |
Select-Object -First 10 Count, Name自動スキャンのノイズは減りますが、強力なパスワードや IP 制限の代わりにはなりません。3 つを組み合わせるのが最善です。「Windows の RDP ポート変更」記事も参照してください。
プロバイダーの IP 範囲ごと許可するか、固定 IP の踏み台サーバーや VPN を経由してリモートデスクトップに接続する方法があります。
ローカルログオン、または NLA の段階でアドレスが記録されなかった場合です。大量にある場合はファイアウォールのログと照らし合わせてください。
上記の手順で解決しない場合は、サポートチケットから IMIDC の 24 時間 365 日対応テクニカルサポートへお問い合わせください。サーバー IP、OS のバージョン、実行したコマンド、エラー画面のスクリーンショットを添えていただくと、より早く原因を特定できます。