VPS に SSH ポートを開放したまま24時間放置し、どれだけの攻撃試行が来るのか、攻撃元の国・試されるユーザー名・パスワードにどんな偏りがあるかを観測した。本記事ではその観測方法、ログ集計のコマンド、得られた結果を共有する。誰でも VPS 1台とシェルがあれば同じ検証が可能である。
観測環境
- Ubuntu 24.04 LTS (某VPS、東京リージョン)
- SSH ポート: 22 (デフォルト)
- 公開鍵認証のみ許可、パスワード認証は明示的に有効化して観測
- fail2ban は無効化 (観測が目的のため)
パスワード認証を有効にしているため、攻撃者が実際に試行したユーザー名・パスワードまでログから取れる。
# /etc/ssh/sshd_config
PasswordAuthentication yes
PermitRootLogin no
LogLevel VERBOSE
VERBOSE にしておくとユーザー名が auth.log に残る (デフォルトでは "invalid user X" 以外の詳細が出ないため)。
観測開始と集計スクリプト
起動してから24時間経過後に集計。
# 期間指定でログを抽出
sudo grep "sshd" /var/log/auth.log | \
awk -v start="Apr 15 00:00:00" -v end="Apr 16 00:00:00" '
$0 >= start && $0 <= end
' > /tmp/ssh_24h.log
# 試行総数
wc -l /tmp/ssh_24h.log
結果: 38,421行 の SSH 関連ログが記録された。うち Failed password は約27,000件、Invalid user は約9,800件。
攻撃元IPのTOP10
grep -E "Failed password|Invalid user" /tmp/ssh_24h.log | \
grep -oE "from ([0-9]{1,3}\.){3}[0-9]{1,3}" | \
sort | uniq -c | sort -rn | head -10
結果 (IPは匿名化のため RFC5737 の予約帯に置換):
3214 from 192.0.2.101
2891 from 198.51.100.42
2744 from 203.0.113.87
2103 from 192.0.2.250
1876 from 198.51.100.11
1504 from 203.0.113.200
1398 from 192.0.2.7
954 from 198.51.100.88
812 from 203.0.113.150
744 from 192.0.2.33
単一IPで3000件超の試行をしてくる攻撃者がいるのが分かる。
攻撃元の国別分布
GeoIP データベースで国別に集計する。geoiplookup コマンドが Ubuntu リポジトリにある。
sudo apt install geoip-bin geoip-database
# 集計
grep -oE "from ([0-9]{1,3}\.){3}[0-9]{1,3}" /tmp/ssh_24h.log | \
awk '{print $2}' | sort -u | while read ip; do
geoiplookup "$ip" | awk -F: '{print $2}'
done | sort | uniq -c | sort -rn | head -10
結果 (観測日によって変動するが概ね以下のような分布):
421 CN, China
312 US, United States
187 RU, Russian Federation
132 VN, Vietnam
104 BR, Brazil
91 IN, India
78 ID, Indonesia
62 KR, Korea, Republic of
58 DE, Germany
44 FR, France
中国・米国・ロシアが上位を占めるのは過去の観測と概ね一致する。米国発が多いのはクラウドプロバイダの踏み台インスタンスが原因である可能性が高い。
試されたユーザー名TOP10
grep -oP "Invalid user \K\S+" /tmp/ssh_24h.log | \
sort | uniq -c | sort -rn | head -10
結果:
2104 root
887 admin
654 user
432 ubuntu
398 test
312 oracle
287 postgres
254 ftpuser
198 git
176 debian
root が突出して多いが、PermitRootLogin no にしているので成功しない。次いでクラウドOSのデフォルトユーザー (ubuntu debian ec2-user) と、DB系サービスアカウント (oracle postgres) が狙われる。
パスワード辞書の傾向
auth.log そのものには試されたパスワードは記録されない (当然セキュリティ上出力されない)。観測したい場合は Cowrie などのハニーポットを別ポートで立てる必要がある。
# Cowrie を Docker で起動
docker run -d -p 2222:2222 cowrie/cowrie
Cowrie であれば試行パスワードを収集でき、よくあるリストは以下のようになる (過去の公開観測結果の要約):
-
123456passwordadminroot1234qwerty -
P@ssw0rdPassw0rdWelcome123 - ベンダーデフォルト (
cisco/ciscoadmin/adminraspberry/raspberry) - 対象ユーザー名と同じ文字列 (root/root)
攻撃開始までの時間
観測開始から最初の攻撃試行までの時間も記録した。
# VPSの稼働開始時刻とauth.logの最初の失敗ログを比較
結果: SSHポートを開放してから約4分17秒 で最初の SSH 接続試行が観測された。IPv4空間は24時間以内に複数回スキャンされているため、公開した瞬間に見つけられると考えてよい。
時間帯別の試行数
grep "Failed password" /tmp/ssh_24h.log | \
awk '{print $3}' | cut -d: -f1 | \
sort | uniq -c
結果は24時間通して均等に近い分布だった。特定時間帯に集中するというより、ボットネットが常時分散で叩いてくるパターンが主流と分かる。
観測から得られる実践的教訓
- 公開した瞬間に攻撃が来る ─ 「目立たないから大丈夫」は成立しない
- root と ubuntu は必ず狙われる ─ デフォルトユーザーは無効化か別名化
- ポート22は自動化された攻撃の集中砲火 ─ ポート変更だけで数十分の1になる
- パスワード認証は実質的に無理 ─ 鍵認証以外の選択肢はない
- 最終防衛線はネットワーク層 ─ VPN内に閉じるか、IP制限が最強
対応設定
最終的に推奨する設定:
# /etc/ssh/sshd_config
Port 22022 # デフォルト22から変更
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers myuser
MaxAuthTries 3
LoginGraceTime 30s
加えて、fail2ban、UFW で特定IPからのみ許可、またはTailscale/WireGuardでSSHを内部化する。
# UFWで特定IPのみ許可
sudo ufw allow from 203.0.113.5 to any port 22022
sudo ufw deny 22022
まとめ
24時間の観測で38,000件超の SSH 攻撃試行が記録された。攻撃は公開から数分で始まり、24時間絶えず続く。「狙われていないサーバー」は存在せず、常時自動化された攻撃に晒されている前提で構成を組むべきである。最低限として「公開鍵認証のみ」「rootログイン禁止」「ポート変更」、理想は「VPN内に閉じる」が2026年の現実解になる。
参考
- Cowrie SSH/Telnet honeypot: https://github.com/cowrie/cowrie
- OpenSSH Security Best Practices
- JPCERT/CC SSHに対する攻撃動向レポート