ぶるすなさんVPSでFXの自動売買(EA)を動かしていると、「自分のVPSにも、パスワードを何度も試す接続が来ているのでは」と気になることがあります。2026年10月25日には、自分のVPSで9.5時間に約2万回の失敗ログオンを確認した、という投稿もXで見かけました。
この記事では、WindowsのVPSで失敗したログインを自分で数えて、結果から次に何をするかを決める方法をまとめます。数え方と、数字を読むときの注意が中心です。入口を閉じる手順は、別の記事に任せます。
こっちゃん9.5時間で2万回って、すごい数だね。うちのVPSも、同じくらい来てるのかな。
ぶるすなさんそれは、数えてみないと分からないんだ。この投稿のVPSの条件(開けている入口や、ログが残る期間)は分からないので、ほかのVPSの目安にはなりません。
この記事では、自分のVPSのログを、自分で数える方法を紹介します。
Windows VPSへのログイン失敗は、入口ごとに別のログを、期間を決めて数えると確かめられます。RDPとSSHは記録される場所が違い、数字を足し合わせないのがコツです。
- Windows全体の失敗
Securityの4625 - SSHの試行
OpenSSH/Operational - RDPの接続
RdpCoreTSの131・140
数え方VPSの中で、管理者のPowerShellを開き、期間を指定して読み取りだけで数えます。0件は「記録上は見つからなかった」という意味で、侵入がなかった証明にはなりません。
運営者の実測運営者の1台では、SSHの存在しないユーザー名での試行が約46時間で973回、公開IPからのRDPの接続の受付が10月16〜22日の7日付分(初日と最終日は一部)で126回ありました。条件が違うため、ほかのVPSや話題の投稿とは比べられません。
先に相談するとき説明できない成功ログオンや、見覚えのないアカウントがあれば、設定を変える前にログを保存して、VPS会社やFX会社に相談します。
件数が多い・少ないの目安は示しません。開けている入口、ポート、ログの残る期間で、数字の意味が変わるためです。
注意ログの件数だけで、攻撃を受けている・受けていないは判断できません。入口を閉じても万全ではなく、ログに残らない試行もあります。
この記事でわかること
- ログで分かること・分からないことと、先に相談したほうがよい兆候
- 数える前に確かめる、監査設定・ログの保存期間・時刻
- イベントビューアーとPowerShellで、失敗ログオンを数える方法
- 運営者のVPSで数えた結果(SSHとRDPの実測)
- 結果から次の行動を選ぶ流れと、ロックアウトの注意
りっちゃん数えるのはいいけど、それで「攻撃されてる」って言えるの? そこが一番知りたいのよね。
ログで分かること・分からないことと、先に相談する兆候
ぶるすなさんいい質問だよ。先に、たとえで整理するね。
VPSの入口(RDPやSSH)を玄関、ログをその玄関の来客ノートと考えてみます。呼び鈴を鳴らされた、名乗って断られた、中に入れた、という出来事が、ノートに書かれます。
ノートは受付係ごとに別で、決まった厚さを超えると古いページから上書きされます。RDPの受付、SSHの受付、Windows全体の受付で、書く場所も数え方も違います。
れおしゃんノートに書かれていなければ、来なかったとは限らない、ってことだね。
ぶるすなさんそうなんだ。書かれていない理由は、本当に来なかった、記録の設定がなかった、古くて上書きされた、など複数あるよ。
たとえは理解のための道具なので、実際のログの意味は、次の表で正確に整理します。
| 見るもの | 分かること | 分からないこと |
|---|---|---|
| 失敗ログオンの記録(Securityの4625・OpenSSHのログ・RdpCoreTSの140) | その期間に、ログインの失敗が記録された回数 | 誰が試したか。攻撃か、自分の入力ミスか(件数だけでは区別できません) |
| RDPの接続の受付(RdpCoreTSの131) | RDPの入口に、接続が届いた回数 | 認証を試した回数ではありません。自分の接続も含まれます |
| 成功ログオンの記録(Securityの4624) | 中に入れた記録と、その時刻・アカウント | 見覚えがないだけでは、侵入と決められません。OpenSSHを入れていると、sshd_に数字が続く一時的な内部アカウントの記録が出ることがあります |
| 0件という結果 | 記録上は、その期間に見つからなかったこと | 侵入がなかった証明にはなりません。監査設定・上書き・ログに残らない試行があるためです |
りっちゃんもし見覚えのない成功ログオンが見つかったら? 数える前に、先に決めておきたいわ。
ぶるすなさん大事な点だね。兆候があれば、数える作業よりも、ログの保全と相談を先にします。目安を枠にまとめるよ。
説明できない成功ログオンや、見覚えのないアカウントがあれば、設定を変える前にログを保存して、VPS会社やFX会社に相談します。
兆候の例自分が接続していない時刻の成功ログオン、見覚えのないアカウント、Securityログの消去の記録(イベントID 1102)、EAの設定や注文に覚えのない変化、などです。
先にすること古い記録は、新しい記録で上書きされていきます。先に、イベントビューアーの操作メニューにある保存の項目で、対象のログをファイルに残します。そのあと、VPS会社とFX会社に状況を伝えます。
この枠は目安で、侵入の有無を判定するものではありません。迷ったら、設定を変える前に相談してください。
こっちゃんお名前.comのデスクトップクラウドの件と、これは関係あるの?
数える前に、監査設定・ログの保存期間・時刻を確かめる
こっちゃんすぐ数えちゃだめなの?
ぶるすなさん数える前に、4つだけ確かめるよ。確かめないと、0件の意味が変わってしまうんだ。
確認用のコードは、後の「PowerShellで期間を決めて数える」の最初のコード(コード1)にまとめています。
| 確かめること | 確かめないと起きること | 確かめ方 |
|---|---|---|
| 監査設定(ログオンの失敗を記録する設定か) | 記録しない設定だと、失敗してもSecurityログに4625が残らず、0件でも意味がありません | コード1のauditpolの行。サブカテゴリ「ログオン(Logon)」の行が「失敗」または「成功と失敗」(Failure / Success and Failure)なら、失敗も記録されます。別の項目の「成功と失敗」では代わりになりません |
| ログの方式と大きさ | 上書き方式だと、新しい記録のために古い記録から消えます。最も古い記録より前は数えられません | コード1のShow-LogInfo。方式がCircularなら上書きです |
| 時刻とタイムゾーン | ログの時刻はサーバーの表示です。日本時間と違うと、日別の数がずれます | コード1の最後の行 |
| ログの消去履歴 | 消去されていれば、それより前の記録は残っていません | コード1の「消去の記録(1102)」の行 |
こっちゃん上書きって、どのくらいで古い記録が消えるの?
ぶるすなさんログの大きさと、記録される量で決まるから、一概には言えないよ。
運営者のVPSでは、Securityログは上書き方式で最大20MB、約34,000件で、最も古い記録が10月17日の16時台でした(10月25日20時台の確認)。約8日分しか残っていません。
SSHのログ(OpenSSH/Operational)は最大1MBで、ログ全体で最も古いイベントは10月20日17:52でした。最も古い失敗の記録も同じ時刻で、10月22日までの約2日分でした(2026年10月25日に確認)。
イベントビューアーで失敗ログオンを調べる
ぶるすなさんまず、画面で1件ずつ見る方法です。件数が少ない時や、1件の中身を読みたい時に向いています。
見たい記録は3か所に分かれます。次の図で、どのログに何が残るかを確認してください。

こっちゃんログによって、数える単位が違うんだね。
ぶるすなさんそうなんだ。IDごとに意味が違うから、足し合わせないのが約束だよ。表で整理します。
| 記録 | 場所 | 意味 | 読むときの注意 |
|---|---|---|---|
| 4625 | Windowsログ → Security | ログオンの失敗(Microsoftの説明) | 「ログオンの種類」「プロセス名」で入口を推測できますが、決めつけません。自分の入力ミスも含まれます |
| Invalid user など | アプリケーションとサービス ログ → OpenSSH → Operational | SSHでの、存在しないユーザー名などの試行 | OpenSSHを入れている場合だけです。文言は版で違うことがあります。4625とは足し合わせません |
| 131 | アプリケーションとサービス ログ → Microsoft → Windows → RemoteDesktopServices-RdpCoreTS → Operational | RDPの接続(TCP)の受付 | 認証を試した回数ではありません。自分の接続も含まれます |
| 140 | 131と同じログ | 運営者の環境では、ユーザー名またはパスワードが違い、接続に失敗した記録として扱いました | 公式の定義は確認できていません。説明文を読んで、意味を確かめてください |
こっちゃん4625を開くと、アカウント名が2か所に出てくるんだね。どっちを見ればいいの?
ぶるすなさん下の「ログオンに失敗したアカウント」が、ログインに使われた名前だよ。上の「サブジェクト」は、失敗を報告した側のアカウントです。
読み間違えやすい欄も含めて、見方を手順にまとめます。
スタートメニューで「イベントビューアー」を検索して、管理者として開きます。左の「Windowsログ」の中の「Security」を選びます。
右側の操作メニューの「現在のログをフィルター」を開き、イベントIDの欄に4625を入れます。記録された日時は、数えたい期間を選びます。
次の欄を読みます。日本語表示では欄の表記が少し違うことがあるため、Microsoftの定義にある英語の欄名も添えます。
①「ログオンに失敗したアカウント」の名前(Account For Which Logon Failed)
②ログオンの種類(Logon Type)
③呼び出し元のプロセス名(Caller Process Name)
④ソースネットワークアドレス(Source Network Address)
⑤失敗の理由を示す状態とサブステータス(Status・Sub Status)
「ソースポート」は相手側が使った番号で、VPS側の3389や22ではありません。ポート番号でRDPとSSHは見分けられません。
「ログオンの種類」は、10がリモートデスクトップ、3がネットワーク、8がNetworkCleartext(ネットワーク経由の一種)です(Microsoftの一覧)。ただしRDPの失敗が3で記録される例もあるため、種類だけで入口を決めつけません。
SSHは、アプリケーションとサービス ログの「OpenSSH」→「Operational」を開きます。
RDPは、「Microsoft」→「Windows」→「RemoteDesktopServices-RdpCoreTS」→「Operational」を開き、イベントIDを131と140に絞ります。
こっちゃん件数が多いと、画面で数えるのは大変そうだね。
ぶるすなさんそうなんだ。そこで次は、PowerShellで期間を決めて数えます。
PowerShellで期間を決めて数える
ぶるすなさんPowerShellなら、期間を決めて、件数や内訳をまとめて数えられます。
VPSの中で、管理者として開いたPowerShellに、コード1から順に貼ってください。貼る前に知っておくことを、枠にまとめます。
運営者のWindows Server VPS(Windows PowerShell 5.1・管理者)で、2026年10月25日にコード1〜5を通しで実行して、エラーなく動くことを確かめました。
コードは、VPSの中で、管理者のPowerShellで実行します。読み取りだけで、設定やログは変更しません。
結果の見方各コードは「状態」を表示します。「読めた」「該当なし(0件)」「読めない(権限不足・ログが無効・ログが無い)」を区別するためです。0件という数字だけを見て安心しません。
件数の上限数えるコードでは、取得数を絞る-MaxEventsを使っていません。使うと、上限で打ち切った数が総数のように見えてしまうためです(最も古い記録を1件見る所だけ使っています)。
エラーエラーを隠す指定(-ErrorAction SilentlyContinueなど)は使わず、読めなかった理由を画面に出します。
時間数万件あると集計に時間がかかります。日数を短くしてから試してください。
コード2とコード3は、送信元アドレス自体は表示しませんが、試されたアカウント名は表示します。コード4とコード5は確認用にアドレスを含む行を表示します。画面を共有するときは注意してください。
コード1:準備(期間・ログの状態・監査設定・時刻)
ぶるすなさんコード1は準備です。数える期間(初期値は7日)を決め、ログを読む関数を作り、Security・OpenSSH・RDPのログの状態、監査設定、消去の記録を表示します。
見るのは、方式(Circularなら上書き)、最も古い記録の日時、監査設定の「ログオン」の行が「失敗」または「成功と失敗」かです。
$start = (Get-Date).AddDays(-7) # 数える期間の開始。日数は変えてください
$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
if (-not $isAdmin) { Write-Host '管理者として開いたPowerShellではありません。Securityログは読めません' }
# ログを読む関数: 結果の状態を $script:logState に残します(件数0と、読めなかったのを区別するため)
function Get-LogEvents {
param([string]$LogName, [int[]]$Id, [datetime]$From)
$script:logState = '読めない'
try { $info = Get-WinEvent -ListLog $LogName -ErrorAction Stop }
catch { Write-Host "[$LogName] ログを開けません(ログが無い・権限不足など): $($_.Exception.Message)"; return }
if (-not $info.IsEnabled) { Write-Host "[$LogName] ログが無効です"; return }
$filter = @{ LogName = $LogName; StartTime = $From }
if ($Id) { $filter.Id = $Id }
try { Get-WinEvent -FilterHashtable $filter -ErrorAction Stop; $script:logState = '読めた' }
catch {
if ($_.FullyQualifiedErrorId -like 'NoMatchingEventsFound*') { $script:logState = '該当なし' }
else { Write-Host "[$LogName] 読み取りに失敗しました: $($_.Exception.Message)" }
}
}
# 件数の多い順に表示する関数
function Show-Top {
param([string]$Title, $Rows, [string[]]$By, [int]$Top = 10)
Write-Host "--- $Title ---"
if ($By) { $g = $Rows | Group-Object -Property $By } else { $g = $Rows | Group-Object }
$g | Sort-Object Count -Descending | Select-Object -First $Top Count, Name | Format-Table -AutoSize | Out-String | Write-Host
}
# ログの方式・大きさ・最も古い記録(古い記録から消える範囲を知るため)
function Show-LogInfo {
param([string]$LogName)
try {
$i = Get-WinEvent -ListLog $LogName -ErrorAction Stop
$o = Get-WinEvent -LogName $LogName -Oldest -MaxEvents 1 -ErrorAction Stop
Write-Host ("[{0}] 方式={1} 最大={2}MB 記録数={3} 最も古い記録={4} 有効={5}" -f $LogName, $i.LogMode, [math]::Round($i.MaximumSizeInBytes / 1MB, 1), $i.RecordCount, $o.TimeCreated, $i.IsEnabled)
} catch { Write-Host "[$LogName] 状態を読めません: $($_.Exception.Message)" }
}
Show-LogInfo 'Security'
Show-LogInfo 'OpenSSH/Operational'
Show-LogInfo 'Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational'
# ログオン関連の監査設定: サブカテゴリ「ログオン(Logon)」の行が「失敗」または「成功と失敗」(Failure / Success and Failure)なら、失敗も記録されます
# 日本語・英語の表示に対応しています。ほかの言語では、auditpol /get /category:* の出力から「ログオン」にあたる行を探してください
auditpol /get /category:* | Select-String -Pattern '^\s+(Logon|ログオン)\s'
# Securityログの消去履歴(イベントID 1102)と、今の時刻・タイムゾーン
$cleared = @(Get-LogEvents -LogName Security -Id 1102 -From ([datetime]'2000-01-01'))
"消去の記録(1102): $($cleared.Count)件 状態: $script:logState"
"今の時刻: $(Get-Date) タイムゾーン: $((Get-TimeZone).Id) 数える期間: $start から"
コード2:失敗ログオン(4625)を数える
ぶるすなさんSecurityログのイベントID 4625を、日別・ログオンの種類とプロセス名・理由・失敗した対象アカウント名で数えます。
プロセス名がsshd.exeならSSH側、という見方で入口の目安が付きます。理由は、ユーザー名が存在しない(0xC0000064)、アカウントが無効(0xC0000072)などを区別できます(Microsoftの一覧)。
$e4625 = @(Get-LogEvents -LogName Security -Id 4625 -From $start)
"失敗ログオン(4625): $($e4625.Count)件 状態: $script:logState"
$rows = foreach ($e in $e4625) {
$p = $e.Properties # 並び順はMicrosoftのイベント定義どおり: 5=失敗した対象アカウント 7=Status 9=SubStatus 10=ログオンの種類 18=プロセス名 19=送信元アドレス
[pscustomobject]@{
Day = $e.TimeCreated.ToString('yyyy-MM-dd')
Type = $p[10].Value
Process = [IO.Path]::GetFileName([string]$p[18].Value)
Status = '{0:X8}/{1:X8}' -f $p[7].Value, $p[9].Value
Target = $p[5].Value
Source = $p[19].Value
}
}
Write-Host '--- 日別 ---'
$rows | Group-Object Day | Sort-Object Name | Format-Table Name, Count -AutoSize | Out-String | Write-Host
Show-Top '入口の目安(ログオンの種類, プロセス名)' $rows @('Type', 'Process')
Show-Top '理由(Status/SubStatus)' $rows @('Status')
Show-Top '失敗した対象アカウント名(上位10)' $rows @('Target')
$srcs = @($rows | Where-Object { $_.Source -and $_.Source -ne '-' } | Select-Object -ExpandProperty Source -Unique)
"送信元アドレスの種類数: $($srcs.Count)(アドレス自体は表示しません)"
コード3:SSH(OpenSSH/Operational)を数える
ぶるすなさんOpenSSHを入れている場合だけ使います。「Invalid user」は存在しないユーザー名での試行、「Failed password for」はパスワード認証の失敗の記録を数えます(存在しない名前への記録を含む版もあるので、2つは足し合わせません)。
Failed passwordが0件でも、実在するアカウントへの試行がないとは言えません。鍵認証の失敗などは、別の文言で記録されるか、ログレベルなどの設定によっては記録されない場合もあります。
文言は版で違うことがあるので、結果が0件の時は、イベントビューアーで説明文の形を見て、文字列を直します。
期間内の記録がまったく無い場合は、OpenSSHを入れていない、ログの出力先がファイルの設定になっている、期間内に何も無かった、などが考えられます。コードが案内を表示します。
$ssh = @(Get-LogEvents -LogName 'OpenSSH/Operational' -From $start)
"OpenSSH/Operational: $($ssh.Count)件 状態: $script:logState"
if ($script:logState -eq '該当なし') { Write-Host 'この期間のOpenSSH/Operationalの記録がありません。OpenSSHを入れていない、ログの出力先がファイルの設定(sshd_configのSyslogFacility)、期間内に記録が無い、などが考えられます。' }
$invalid = @($ssh | Where-Object { $_.Message -cmatch 'Invalid user ' })
$failed = @($ssh | Where-Object { $_.Message -cmatch 'Failed password for' })
"存在しないユーザー名での試行(Invalid user): $($invalid.Count)件 パスワード認証の失敗(Failed password for): $($failed.Count)件(合算しません)"
if ($invalid.Count -gt 0) { $t = $invalid | Sort-Object TimeCreated; "Invalid userの記録の範囲: $($t[0].TimeCreated) から $($t[-1].TimeCreated) まで" }
Write-Host '--- Invalid user の日別 ---'
$invalid | Group-Object { $_.TimeCreated.ToString('yyyy-MM-dd') } | Sort-Object Name | Format-Table Name, Count -AutoSize | Out-String | Write-Host
$names = foreach ($m in $invalid) { if ($m.Message -cmatch 'Invalid user (\S+) from') { $Matches[1] } }
Show-Top '試されたユーザー名(上位10)' $names
$from = foreach ($m in $invalid) { if ($m.Message -cmatch 'Invalid user \S+ from (\S+)') { $Matches[1] } }
"送信元アドレスの種類数: $(@($from | Select-Object -Unique).Count)(アドレス自体は表示しません)"
コード4:RDP(RdpCoreTSの131と140)を数える
ぶるすなさんIDごとに、件数・日別・最新1件の説明文を表示します。期間内に無いIDは「該当なし」と表示します。131には、自分の接続も含まれ、公開IPとそれ以外(Tailscaleなど)は区別しません。
140の説明文がどんな意味か、ここで自分の目で確かめてください。公式の定義を確認できていないためです。
後の実測の表は、公開IPからの接続だけを、ログに残っていた全期間で数えた値です。このコードの初期値(直近7日)の結果とは一致しません。
$rdpLog = 'Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational'
$rdp = @(Get-LogEvents -LogName $rdpLog -Id 131, 140 -From $start)
"RdpCoreTS 131/140 の読み取り状態: $script:logState(IDごとに別に数えます。公開IPとそれ以外は区別しません)"
# IDごとに、件数・日別・最新1件の説明文を表示します(自分の接続も含まれます)。期間内に無いIDは「該当なし」と表示します
if ($script:logState -ne '読めない') {
foreach ($id in 131, 140) {
$sel = @($rdp | Where-Object { $_.Id -eq $id })
if ($sel.Count -eq 0) { "ID ${id}: 該当なし(この期間には記録がありません)"; continue }
"ID ${id}: $($sel.Count)件"
$sel | Group-Object { $_.TimeCreated.ToString('yyyy-MM-dd') } | Sort-Object Name | Format-Table Name, Count -AutoSize | Out-String | Write-Host
$sel | Sort-Object TimeCreated -Descending | Select-Object -First 1 TimeCreated, Id, Message | Format-List | Out-String | Write-Host
}
}
コード5:成功ログオン(4624)を見直す
ぶるすなさんログオンの種類3・8・10の成功を、アカウント別に数え、新しい順に15件表示します。ANONYMOUS LOGONは除いています。名前が$で終わるアカウントも表示に含め、その件数を別に出します(機械用の名前のことが多いですが、断定しません)。
自分が接続した時刻とアカウントに合うか、見覚えのない名前や送信元がないかを確かめます。種類3にはWindowsの通常の通信も含まれるため、時刻と送信元を合わせて見ます。
表示は、アカウント別の上位10組と、新しい順の15件だけです。表示外の記録は確認していません。増やすには、Show-Topの行の末尾に-Top 30を付ける、-First 15の数字を大きくします。
$e4624 = @(Get-LogEvents -LogName Security -Id 4624 -From $start)
"成功ログオン(4624): $($e4624.Count)件 状態: $script:logState"
$ok = foreach ($e in $e4624) {
$p = $e.Properties # 5=対象アカウント 8=ログオンの種類 18=送信元アドレス(Microsoftのイベント定義の並び順)
if (($p[8].Value -in 3, 8, 10) -and ($p[5].Value -ne 'ANONYMOUS LOGON')) {
[pscustomobject]@{ Time = $e.TimeCreated; Type = $p[8].Value; Account = $p[5].Value; Source = $p[18].Value }
}
}
$dollar = @($ok | Where-Object { $_.Account -like '*$' })
'名前が$で終わるアカウントの成功ログオン: {0}件(表示に含めています。機械用の名前のことが多いですが、断定はしません)' -f $dollar.Count
Show-Top '外から入るタイプ(3,8,10)の成功ログオン(種類, アカウント)' $ok @('Type', 'Account')
$ok | Sort-Object Time -Descending | Select-Object -First 15 | Format-Table -AutoSize | Out-String | Write-Host
れおしゃんsshd_1234みたいな名前が出ても、それだけでは侵入とは言えないんだね。
ぶるすなさんそうだよ。sshdは認証の準備のために、sshd_に数字が続く一時的な内部アカウントを作ります(Win32-OpenSSHの開発者の説明)。
名前の見かけだけで判断せず、時刻・送信元・成功の種類と合わせて見てください。
運営者のVPSで数えた結果
ぶるすなさんここからは、運営者が自分で、MT5のFX自動売買に使っているWindows Server VPS(1台)で、2026年10月25日に数えた結果です。読み取りだけの集計で、この作業では設定を変えていません。
先に、条件を表にします。入口を絞る前の記録が中心です。
| 項目 | 内容 |
|---|---|
| 対象 | MT5のFX自動売買に使っているWindows Server VPS(1台) |
| 集計した期間 | 各ログに残っていた範囲の全体です。SSHのInvalid userは10月20日17:52〜22日15:58、Securityの4625は10月17日18:40〜22日15:16、RDPの131は10月16日10:12〜22日15:09。コードの初期値(直近7日)とは期間が違います |
| RDPの数え方 | RDPの131は、公開IPからの接続だけを数えています。コード4は、公開IPとそれ以外を区別しません |
| 入口の状態 | RDP(標準ではない番号のポート・NLA有効)とSSH(22番)が、10月22日の15〜16時台まで、インターネット全体に開いていた。22日に、Tailscaleの範囲だけに制限した |
| SSHの認証 | 鍵認証で運用(パスワードでのSSHログインは使っていない) |
| 時刻 | サーバーのローカル時刻の表示 |
ぶるすなさん日別の件数は、次の図と表のとおりです。
SSHの10月16日〜19日が空欄なのは、0件ではなく、ログに記録が残っていないためです。理由は、上書き・消去・記録を始めた時期などが考えられ、このログだけでは決められません。

| 日付 | SSH:存在しないユーザー名での試行(OpenSSH/Operational) | RDP:接続の受付(131・公開IPから) |
|---|---|---|
| 10月16日 | ログに残っていない | 18回(10:12以降) |
| 10月17日 | ログに残っていない | 31回 |
| 10月18日 | ログに残っていない | 27回 |
| 10月19日 | ログに残っていない | 10回 |
| 10月20日 | 165回(17:52以降) | 21回 |
| 10月21日 | 463回 | 15回 |
| 10月22日 | 345回(15:58まで) | 4回(この日の15〜16時台に入口を絞った) |
| 合計 | 973回(約46時間) | 126回 |
こっちゃん46時間で973回…!
ぶるすなさん数字だけ見ると、驚くよね。でも、この数は、この1台・この期間・この入口での観測だよ。
SSHの送信元は、異なるアドレスで256種類でした。RDPのほうは、標準ではないポートでしたが、接続の受付が10月16〜22日の7日付分(初日と最終日は一部)で126回ありました。
| 見たもの | 結果 | 読むときの注意 |
|---|---|---|
| SSHで試された名前の上位(OpenSSH/Operational) | root 201回、admin 110回、user 103回、ubuntu 102回、debian 50回 | 存在しないユーザー名として記録された名前の順位です |
| SSHのパスワード認証の失敗(Failed password for) | この文字列を含む記録は0件 | 実在するアカウントへの試行全体の有無は、この集計からは判断できません。運営者のSSHは鍵認証で運用しています |
| Securityの4625(10月17日18:40〜10月22日15:16) | 198件(10月25日に残っていた記録)。すべてsshd.exe経由で、RDP経由の4625は0件 | Securityログは上書き方式のため、集計する時刻によって件数が減ります。SSHのログの973回とは、期間も記録の単位も違います |
| 4625の理由の内訳 | アカウント無効116件、存在しない名前66件、名前の形式が不正16件(合計198件) | 存在しない名前の66件は、対象アカウント名が試された名前ではなくFakeUserで記録されていました |
| RDPの140(10月17日01:51〜01:56) | 10件。1つの送信元から集中 | Securityログの最も古い記録より前のため、4625とは突き合わせられません |
| RDPの131とその送信元 | 全127件(Tailscale側を含む最後は10月22日16:06)。うち公開IPから126件で、その記録範囲は10月16日10:12〜22日15:09。公開IPの送信元は42種類 | 「42」は公開IPの異なるアドレスの数で、人数ではありません |
| 入口を絞った後(10月22日16:00以降) | SSHのInvalid userの記録0件、公開IPからのRDP接続の受付(131)0件 | 10月25日に集計した範囲の記録です。遮断が成功した証明ではありません |
れおしゃんSSHの試行は973回、4625は198件。同じSSHの入口でも、ログによって数え方が違うんだね。
ぶるすなさんそうなんだ。973回と198件は、期間も記録の単位も違うので、並べて示すだけで、割合では比べません。
SSHのログに記録された973回のすべてが、4625に出ているわけではありません。入口ごとのログを、別々に見る理由です。
閉じた後の0件も、記録上の話です。遮断できたかどうかは、外部の回線から公開IPへつながらないことで確かめます。
結果から次の行動を選ぶ
りっちゃんそれで、何件なら危ないの? 目安を教えてほしいわ。
ぶるすなさん件数の目安は、示せないんだ。開けている入口、ポート、ログの残る期間で、同じ件数でも意味が変わるからです。
件数より、「結果から何を選ぶか」で整理します。
| 結果 | 考えられること | 次の行動 |
|---|---|---|
| 失敗の記録が多い | 入口がインターネットから見えていて、ログインを試されている可能性があります。件数だけでは、攻撃か自分のミスかは区別できません | 成功ログオンに説明できないものがないか確認します(コード5)。そのうえで入口を絞ります |
| 失敗の記録が少ない・0件 | 記録上は見つからなかったことを示すだけです。期間が短い、監査設定がない、別の入口のログを見ていない場合も0件になります | 監査設定とログの保存期間を確かめます。0件を安全の証明にしません |
| 説明できない成功ログオン・見覚えのないアカウントがある | 先に相談したほうがよい兆候です | 設定を変える前にログを保存し、VPS会社とFX会社に相談します |
| ログが数日分しかない | 上書き・消去・ログを記録し始めた時期などが考えられます | 残っている範囲だけで判断します。必要なら、定期的にログをファイルへ保存します |
予防の基本は、入口をインターネットに出さない構成にすることです(筆者の見方)。
入口を絞る手順RDPとSSHの入口を、Tailscaleの範囲だけに絞る手順と、確認の順番は、Tailscaleの使い方の記事にまとめています。この記事では再掲しません。
ポート番号運営者のVPSのRDPは標準ではないポートでしたが、接続の受付はありました。ポート番号の変更は補助にとどめる、という考え方も上の記事で扱っています。
ロックアウト失敗が続いたアカウントをロックする設定は、総当たりに有効です。一方で、アカウント名を知られていると、相手にロックさせられて自分が締め出されることもあります(Microsoftも説明)。
設定の前に、VPS会社の管理画面のコンソールから実際に入れることに加えて、ロックされるアカウントとは別の管理者による解除、またはVPS会社の復旧手順があるかを確かめます。復旧の方法を確保できなければ、設定を進めません。
入口を閉じても万全ではありません。ログインに使うアカウントの管理や、VPS会社側の事故までは防げません。
よくある質問
失敗ログインの記録が0件なら、安全ですか?
いいえ。0件は「記録上、その期間には見つからなかった」という意味で、安全の証明にはなりません。
監査設定が失敗を記録しない設定だった、古い記録が上書きで消えた、別の入口のログを見ていなかった、という場合も0件になります。運営者のVPSでも、SSHのログに記録された試行のすべてが、Securityの4625に出ているわけではありませんでした。
ログが数日分しか残っていません。どうすればよいですか?
残っている範囲だけで判断し、それより前は「分からない」として扱います。
上書き方式のログは、大きさの上限に達すると古い記録から消えます。最も古い記録の日時を確かめ、必要なら定期的にログをファイルへ保存します。ログの最大サイズを変える場合は、VPS会社の案内も確認してください。
失敗の記録は、自分の入力ミスと攻撃のどちらですか?
件数だけでは区別できません。
見る点は、自分が操作した時刻と合うか、自分が使っていないユーザー名が試されているか、短い間に同じ入口へ続けて来ているか、です。どれも目安で、攻撃かどうかを決める基準ではありません。
ログオンの種類で、RDPとSSHを見分けられますか?
目安にはなりますが、決めつけはできません。
Microsoftの一覧では、種類10がリモートデスクトップ、種類3がネットワーク、種類8がNetworkCleartext(ネットワーク経由の一種)です。
ただしRDPの失敗が種類3で記録される例もあります(NLAが有効な場合の解説)。プロセス名や、OpenSSH・RdpCoreTSのログも合わせて見てください。
まとめ
この記事のポイント
- ログは入口ごとに別。Securityの4625、OpenSSH/Operational、RdpCoreTSの131・140を、足し合わせずに数える
- 数える前に、監査設定・ログの保存期間(上書きで古い記録が消える)・時刻・消去履歴を確かめる
- PowerShellは、VPSの中で管理者として、期間を指定して読み取りだけで数える。「読めた/該当なし/読めない」を区別する
- 運営者の1台では、SSHの試行が約46時間で973回、公開IPからのRDPの接続の受付が10月16〜22日の7日付分で126回、4625は198件(10月25日に残っていた記録)。条件が違うため他とは比べない
- 0件は安全の証明ではなく、件数の多少の目安も示せない。説明できない成功ログオンは、設定を変える前に相談する
- 予防は入口を閉じることが基本。ロックアウトは締め出しにも使われるため、戻れる入口と復旧手順を確保できてから設定する
ぶるすなさんログは、今の入口の状態を教えてくれますが、安全を保証してはくれません。
まずは、コード1で、ログがどのくらい残っているかを確かめるところから始めてみてください。
こっちゃんまずは、最も古い記録がいつか、見てみるね。



りっちゃんVPS会社を替えれば、こういう心配はなくなるのかしら?
ぶるすなさんならない、というのが答えだよ。ログの確認、入口の制限、予備の環境は、どの会社でも自分で行います。
そのうえで、環境を見直すときの選択肢のひとつとして、Hyonixを載せておきます。契約は安全対策の条件ではありません。
※本記事にはプロモーションを含みます。VPSの契約は自己判断で行ってください。環境を替えるだけで安全になるわけではありません。
※本記事は2026年10月25日時点の公開情報と、運営者の1台の集計に基づく一般的な解説です。件数の多少や、侵入の有無を判定するものではありません。ログの確認や設定は自己責任で行い、不安があるときはVPS会社や専門家に相談してください。

