はじめに
VPSでWordPressサイトを運用していると、ふと「自分のサーバー、誰かに入られていないかな?」と不安になることがあります。
実際にわが家のConoHa VPS(KUSANAGI)でも、SSHへのログイン失敗が数百回記録されていました。世界中の攻撃者が、パスワードを総当たりで試してきていたのです。
そこで先日、SSHのポート番号を標準の22番から別の番号に変更しました。この記事では、その後に行った「本当に不正アクセスされていないか」を確認する方法を、コマンドの意味や結果の読み方まで、初心者の方にもわかるようにくわしく解説します。
ポート変更の手順については、別の記事でまとめています。
この記事でわかること
| 確認すること | わかること | 大事さ |
|---|---|---|
| ログイン成功の記録 | 誰かに入られていないか | 一番大事 |
| 今ログインしている人 | 今この瞬間、誰かが中にいないか | 大事 |
| ログイン失敗の記録 | どれだけ狙われているか、どんな攻撃か | 参考 |
| fail2banのブロック状況 | 攻撃者がちゃんとブロックされているか | 参考 |
ポイントは、「失敗」がたくさんあっても、「成功」が自分だけなら入られていないということです。失敗の数に驚く前に、まず成功の記録を確認しましょう。
作業した環境
| 項目 | 内容 |
|---|---|
| サーバー | ConoHa VPS |
| OS | KUSANAGI(AlmaLinux 9) |
| 接続に使うソフト | Windows PowerShell |
| ログインユーザー | root |
| SSHのポート番号 | 22番から別の番号に変更済み(この記事では XXXXX と表記) |
| 攻撃者のブロック | fail2ban を導入済み |
この記事で紹介するコマンドは、すべて「見るだけ」のコマンドです。実行してもサーバーの設定は何も変わらないので、安心して試してください。
また、記事内のIPアドレスは実際のものではなく、説明用に置き換えています。
準備:サーバーにログインする
PowerShellを開いて、いつも通りサーバーにログインします。ポート番号を変更している場合は、-p で番号を指定するのを忘れないでください。
ssh -p XXXXX root@サーバーのIPアドレス行の先頭が「[root@… ~]#」になれば、サーバーの中に入れています。以降のコマンドは、すべてこの状態で実行します。
ステップ0:まず自分のIPアドレスを確認する
ログインの記録を見ても、どれが自分のIPアドレスなのかがわからないと判断できません。最初に確認しておきましょう。
echo $SSH_CLIENT次のように表示されます。
203.0.113.10 60192 XXXXX| 表示 | 意味 |
|---|---|
| 203.0.113.10 | 今接続している自分のPCのIPアドレス |
| 60192 | 自分のPC側で使っている番号(毎回変わるので気にしなくてOK) |
| XXXXX | サーバー側のSSHのポート番号 |
一番左の数字が、自宅のIPアドレスです。メモしておきましょう。
自宅のIPアドレスは変わることがある
家庭用のインターネット回線は、ルーターの再起動などでIPアドレスが自動で変わることがあります。そのため、過去の記録に自宅の別のIPアドレスが残っていることもあります。
同じ回線であれば、最初の2つの数字(203.0 の部分)が同じか似ていることが多いので、判断の目安にしてください。
ステップ1:ログイン成功の記録を見る(一番大事)
「誰かに入られていないか」を確認するには、ログインに成功した記録を見ます。
1-1:過去7日間の成功記録を表示する
journalctl -u sshd --since "7 days ago" | grep "Accepted"長いコマンドに見えますが、3つの部分に分かれています。
| 部分 | 意味 |
|---|---|
| journalctl -u sshd | SSHの記録(ログ)を表示する |
| –since “7 days ago” | 7日前から今までの分だけにする |
| | grep “Accepted” | その中から「Accepted(受け入れた=ログイン成功)」の行だけを取り出す |
「|」(パイプ)は、左のコマンドの結果を、右のコマンドに渡すという記号です。キーボードの「Shift」+「¥」で入力できます。
1-2:結果の読み方
次のような行が表示されます。
9月 17 13:28:10 vm-xxxxxxxx.novalocal sshd-session[837896]: Accepted password for root from 203.0.113.10 port 60192 ssh2| 部分 | 意味 |
|---|---|
| 9月 17 13:28:10 | ログインした日時 |
| vm-xxxxxxxx.novalocal | サーバーの名前 |
| Accepted password | パスワードでのログインに成功した |
| for root | rootユーザーでログインした |
| from 203.0.113.10 | どこからログインしたか(ここが一番大事) |
| port 60192 | 接続元のPC側の番号(気にしなくてOK) |
「from」の後ろのIPアドレスが、すべて自宅のIPアドレスかどうかを確認します。日時が、自分が作業した時間と合っているかも見ておくと安心です。
1-3:件数が多いときはIPアドレスごとに集計する
ログインの回数が多いと、画面が流れてしまって全部を確認できません。わが家でも、上のほうが流れて見えなくなりました。
そんなときは、IPアドレスだけを取り出して、回数を数えるコマンドが便利です。
journalctl -u sshd --since "7 days ago" | grep "Accepted" | awk '{print $11}' | sort | uniq -c| 部分 | 意味 |
|---|---|
| awk ‘{print $11}’ | 各行の11番目の単語(IPアドレスの部分)だけを取り出す |
| sort | 同じIPアドレスが並ぶように並べ替える |
| uniq -c | 同じものをまとめて、回数を数える |
11番目というのは、行をスペースで区切って左から数えた順番です。「9月」が1番目、「17」が2番目…と数えていくと、IPアドレスがちょうど11番目になります。
わが家の結果は次の通りでした。
18 203.0.113.101行だけで、自宅のIPアドレスから18回です。つまり、過去7日間にサーバーへ入ったのは自分だけということがわかりました。
1-4:結果の判断のしかた
| 結果 | 判断 |
|---|---|
| 自宅のIPアドレスが1行だけ | 入ったのは自分だけ。問題なし |
| 2行以上あり、どれも最初の数字が似ている | 自宅のIPアドレスが途中で変わっただけの可能性が高い |
| まったく見覚えのないIPアドレスがある | 要注意。後半の「怪しいIPがあったとき」を参照 |
| 何も表示されない | 7日間ログインしていない、または記録が残っていない |
1-5:もっと前までさかのぼる
「7 days ago」の部分を変えると、見る期間を変えられます。
journalctl -u sshd --since "30 days ago" | grep "Accepted" | awk '{print $11}' | sort | uniq -c| 書き方 | 意味 |
|---|---|
| “today” | 今日の0時から |
| “yesterday” | 昨日の0時から |
| “7 days ago” | 7日前から |
| “30 days ago” | 30日前から |
| “2026-09-17 04:00” | 指定した日時から |
ただし、記録は古いものから自動で消されていくので、あまり昔の分は残っていないこともあります。
ステップ2:ログイン履歴を一覧で見る(last)
ステップ1とは別に、ログインの履歴をシンプルな一覧で見られるコマンドもあります。
last -i | head -20| 部分 | 意味 |
|---|---|
| last | ログインの履歴を新しい順に表示する |
| -i | 接続元を名前ではなくIPアドレスで表示する |
| | head -20 | 最初の20行だけにする |
表示の例です。
root pts/1 203.0.113.10 Thu Sep 17 13:28 still logged in
root pts/0 203.0.113.10 Thu Sep 17 04:21 - 05:02 (00:41)| 表示 | 意味 |
|---|---|
| root | ログインしたユーザー名 |
| pts/0、pts/1 | SSHなどでつないだ画面の番号 |
| 203.0.113.10 | 接続元のIPアドレス |
| still logged in | 今もログイン中 |
| (00:41) | 接続していた時間(この例では41分) |
一番下に「wtmp は ○月○日 から始まっています」と表示されることがあります。これはその日以降の記録しか残っていないという意味です。サーバーを作った日や、記録が整理された日が表示されます。
ステップ3:今ログインしている人を確認する(who)
who今この瞬間、サーバーにつながっている人の一覧が表示されます。
root pts/1 2026-09-17 13:28 (203.0.113.10)自分の接続だけなら問題ありません。PowerShellの窓を複数開いている場合は、その数だけ行が表示されます。
見覚えのない接続がある場合は、今まさに誰かが中にいる可能性があります。後半の「怪しいIPがあったとき」を確認してください。
ステップ4:ログイン失敗の記録を見る(lastb)
ここからは「どれだけ狙われているか」を確認します。ログイン失敗の記録は、lastb(ラストビー)というコマンドで見られます。
4-1:最近の失敗を20件見る
lastb | head -20わが家の結果の一部です。
root ssh:notty 198.51.100.23 Thu Sep 17 03:53 - 03:53 (00:00)
debian ssh:notty 198.51.100.45 Thu Sep 17 03:52 - 03:52 (00:00)
harry ssh:notty 198.51.100.23 Thu Sep 17 03:46 - 03:46 (00:00)
admin ssh:notty 192.0.2.118 Thu Sep 17 03:46 - 03:46 (00:00)
almalinu ssh:notty 192.0.2.118 Thu Sep 17 03:45 - 03:45 (00:00)
ssh:notty 192.0.2.118 Thu Sep 17 03:45 - 03:45 (00:00)
rabbit ssh:notty 192.0.2.210 Thu Sep 17 03:31 - 03:31 (00:00)
test2 ssh:notty 192.0.2.218 Thu Sep 17 03:14 - 03:14 (00:00)| 列 | 意味 |
|---|---|
| 1列目(root、debianなど) | 攻撃者が試したユーザー名 |
| 2列目(ssh:notty) | SSHでの接続で、画面は開かれなかった(=失敗した)という意味 |
| 3列目 | 攻撃者のIPアドレス |
| 4列目以降 | 失敗した日時 |
記録は新しい順に並んでいます。一番上が、最後に失敗した記録です。
4-2:記録から読み取れる攻撃の特徴
| 試された名前 | 攻撃者の狙い |
|---|---|
| root | サーバーの管理者。入れれば何でもできるので一番狙われる |
| admin | よくある管理者の名前 |
| debian、almalinu | OSをインストールしたときの初期ユーザー名 |
| test2、harry、rabbit | ありがちな名前の総当たり |
どれも人が手で打っているのではなく、自動の攻撃プログラムが、よくある名前とパスワードを片っ端から試しているものです。
「almalinu」と途中で切れている理由
lastbのユーザー名の欄は8文字までしか表示されないため、「almalinux」が途中で切れて「almalinu」になっています。AlmaLinuxの初期ユーザー名を狙った攻撃です。
ユーザー名が空欄の行について
ユーザー名が表示されていない行は、ユーザー名を送らずに接続だけ試した記録です。サーバーが動いているかを調べる、下見のような接続です。
4-3:失敗の合計回数を数える
lastb | grep -c "ssh:"「ssh:」を含む行の数、つまりSSHのログイン失敗の合計回数が数字で表示されます。
数日後にもう一度実行して、数字の増え方を比べると、対策の効果がわかります。
4-4:攻撃の多いIPアドレス上位10件
lastb | awk '{print $3}' | sort | uniq -c | sort -rn | head -10| 部分 | 意味 |
|---|---|
| awk ‘{print $3}’ | 3列目(IPアドレス)だけを取り出す |
| sort | uniq -c | 同じIPアドレスをまとめて回数を数える |
| sort -rn | 回数の多い順に並べ替える |
| head -10 | 上位10件だけ表示する |
左の数字が失敗回数、右がIPアドレスです。同じIPアドレスから何十回も来ていれば、しつこく狙われているということです。
ユーザー名が空欄の行は列がずれるため、まれにIPアドレス以外の文字が混ざることがありますが、大まかな傾向を見るには十分です。
4-5:狙われたユーザー名上位10件
lastb | awk '{print $1}' | sort | uniq -c | sort -rn | head -104-4の「$3」を「$1」(1列目=ユーザー名)に変えただけです。rootが上位に来ることが多く、rootのパスワードを強くしておくことの大切さがよくわかります。
ステップ5:対策の効果を確認する
ポート番号を変更した場合は、変更した後に失敗があるかどうかで効果を確認できます。
5-1:変更した時刻以降の失敗だけを見る
journalctl -u sshd --since "2026-09-17 04:00" | grep -E "Failed|Invalid"日時の部分は、自分がポートを変更した時刻に置き換えてください。
| キーワード | 意味 |
|---|---|
| Failed | パスワードが間違っていた |
| Invalid | 存在しないユーザー名で試された |
「grep -E」を使うと、「Failed または Invalid」のように複数のキーワードをまとめて探せます。
5-2:結果の判断
| 結果 | 判断 |
|---|---|
| 何も表示されない | 新しいポート番号はまだ攻撃者に見つかっていない |
| 何か表示される | 新しい番号を見つけた攻撃者がいる。fail2banがブロックするので慌てなくてOK |
わが家の結果
lastbで最近の失敗を見たところ、一番新しい失敗が、22番を閉じた直後の03時53分でした。
確認したのは13時過ぎだったので、22番を閉じてから約9時間半、ログイン失敗が1件もありませんでした。
作業する前は、数分おきに攻撃が来ていたので、ポート変更の効果がはっきりと出ています。
ステップ6:fail2banのブロック状況を確認する
fail2banを導入している場合は、ブロックの状況も確認しておきましょう。
fail2ban-client status sshd表示の例です。
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd + _COMM=sshd-session
`- Actions
|- Currently banned: 29
|- Total banned: 29
`- Banned IP list: 192.0.2.118 198.51.100.23 ...| 項目 | 意味 |
|---|---|
| Currently failed | 今、見張っている最中の失敗の数(ブロックされる前の状態) |
| Total failed | fail2banを起動してからの失敗の合計 |
| Currently banned | 今ブロックしているIPアドレスの数 |
| Total banned | fail2banを起動してからブロックした合計 |
| Banned IP list | ブロック中のIPアドレスの一覧 |
「Total failed」や「Total banned」は、fail2banを再起動すると0から数え直しになります。わが家では、設定を変えて再起動した直後だったので、失敗は0でした。
もし自分がブロックされてしまったら
自分でパスワードを何度も間違えると、自宅のIPアドレスがブロックされてしまうことがあります。そのときは、ConoHaの管理画面の「コンソール」からログインして、次のコマンドでブロックを解除できます。
fail2ban-client set sshd unbanip 自宅のIPアドレス怪しいIPアドレスがあったとき
ログイン成功の記録や、whoの結果に見覚えのないIPアドレスがあった場合の対応です。
まずは落ち着いて確認する
次のような場合は、自分自身の接続である可能性があります。
| よくあるケース | 確認のしかた |
|---|---|
| 自宅のIPアドレスが途中で変わった | 最初の数字が今のIPアドレスと似ているか見る |
| スマホや外出先から接続した | その日時に自分が接続したか思い出す |
| ConoHaのコンソールや管理ツールを使った | その日時に管理画面で作業したか思い出す |
IPアドレスは、「IPアドレス 検索」などで出てくるWebサービスで調べると、どの国の、どの会社の回線かがわかります。自分が使っているプロバイダ名が出てくれば、自分の接続と考えてよいでしょう。
本当に心当たりがない場合
すぐにrootのパスワードを変更してください。
passwd新しいパスワードを2回入力します。入力中は画面に何も表示されませんが、ちゃんと入力されています。
そのうえで、次の点も確認しておきましょう。
- そのIPアドレスでいつログインされたか(ステップ1のコマンドで確認)
- ホームページが書き換えられていないか
- 見覚えのないファイルやユーザーが増えていないか
自分で判断が難しい場合は、サーバー会社のサポートや専門家に相談することも検討してください。
おすすめの定期チェック
毎回すべてのコマンドを実行する必要はありません。わが家では、次のペースで確認することにしました。
| タイミング | 確認すること | コマンド |
|---|---|---|
| 週に1回 | 知らないIPアドレスからログインされていないか | ステップ1-3の集計コマンド |
| 週に1回 | 攻撃の増え方 | lastb | grep -c “ssh:” |
| 気になったとき | 最近の攻撃の様子 | lastb | head -20 |
| 気になったとき | ブロックの状況 | fail2ban-client status sshd |
週1回チェック用のコマンドまとめ
次の2つだけ覚えておけば、まずは十分です。
journalctl -u sshd --since "7 days ago" | grep "Accepted" | awk '{print $11}' | sort | uniq -clastb | grep -c "ssh:"1つ目で自宅のIPアドレスだけなら安心、2つ目で前回からの増え方を見る、という使い方です。
よくある疑問とトラブル
| 疑問・症状 | 答え・解決法 |
|---|---|
| ログイン失敗が何百回もあって怖い | 失敗は「入れなかった」記録です。成功の記録が自分だけなら入られていません |
| 成功の記録で画面が流れて全部見えない | ステップ1-3のIPアドレスごとの集計コマンドを使う |
| lastbで「Permission denied」と出る | rootでログインしているか確認する(一般ユーザーでは見られません) |
| lastbのユーザー名が途中で切れている | 表示が8文字までのためです。攻撃の内容には影響ありません |
| lastbでユーザー名が空欄の行がある | ユーザー名を送らずに接続だけ試した下見の記録です |
| 「wtmp は ○月○日 から始まっています」と出る | その日以降の記録しか残っていないという意味です |
| 古い日付の記録が出てこない | 記録は古いものから自動で消されるため、残っていないことがあります |
| fail2banの回数が0になっている | fail2banを再起動すると0から数え直しになります |
| サーバーにログインできない | ポート番号を変えている場合は、ssh -p XXXXX の -p を付け忘れていないか確認する |
おわりに
ログイン失敗の記録を初めて見たときは、その数の多さにびっくりしました。しかし、確認するべきなのは「成功の記録が自分だけかどうか」です。そこさえ押さえておけば、必要以上に怖がることはありません。
今回紹介したコマンドは、どれも見るだけのものなので、気軽に試せます。週に1回、コーヒーを飲みながらサーバーの様子をのぞく習慣をつけておくと、いざというときにも落ち着いて対応できます。
次のステップとしては、パスワードの代わりに鍵ファイルでログインする「鍵認証」に挑戦すると、さらに安全になります。





コメント