Ubuntu 24.04で再構築したさくらVPSの、初期セキュリティ設定の記録。 ポート22のまま放置すると数時間後にはbotnetからのSSHログイン試行ログが流れ始めるので、 最初にやっておきたい範囲をまとめた。

ゴール

  • rootでの直接ログインを禁止する
  • SSHポートを 51022 に変更する
  • ufwでポート 51022、80、443 以外を閉じる
  • fail2banで失敗ログイン回数の多いIPを自動BAN
  • パスワードログインを禁止して鍵認証のみにする
01root直ログイン禁止
→
02SSHポート変更
→
03ufwで絞る
→
04fail2ban導入
→
05鍵認証のみ

1. rootログインの禁止

まずは作業用ユーザー(ubuntu)でログインしている状態で、 /etc/ssh/sshd_config を編集する。

sudo vi /etc/ssh/sshd_config

以下の行を確認・追加する:

PermitRootLogin no

これでrootでの直接ログインは不可になる。 作業はあくまで ubuntu ユーザー+sudo で行う前提。

2. SSHポートを 51022 に変更

デフォルトの22番ポートはbotからのスキャンが激しいので、ハイポートに移す。 完全な防御にはならないが、ログ汚染は劇的に減る。

# /etc/ssh/sshd_config
Port 51022

Ubuntu 24.04 の ssh.socket 問題

ここで Ubuntu 24.04 特有のハマりどころ がある。 24.04ではSSHが ssh.service ではなく ssh.socket 経由で起動するようになっており、 sshd_config の Port ディレクティブだけでは反映されないケースがある。

手っ取り早いのは、socketを無効化してserviceに戻す方法:

sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service
sudo systemctl restart ssh

あるいは、ssh.socket の ListenStream 側を 51022 に書き換える方法でもよい。 どちらにしても、変更後に必ず 別のターミナルで新しいポートからログインできるか を確認してから、 既存セッションを閉じること。これを忘れると締め出されて再インストールに戻る。

3. ufwで必要なポートだけ開ける

Ubuntuの簡易ファイアウォール ufw で、必要なポートだけ許可する。

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 51022/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

ポイントは 22 を許可しないこと。 古い感覚で ufw allow OpenSSH をやると22が開いてしまうので注意。

4. fail2banの導入

ポートを変えても、ハイポートをスキャンしてくるbotは存在する。 失敗ログインが続くIPを一定期間BANする fail2ban を入れる。

sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

/etc/fail2ban/jail.local を編集して、SSHのjailを有効化&ポートを合わせる:

[sshd]
enabled = true
port    = 51022
maxretry = 5
bantime  = 1h
findtime = 10m
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

しばらく運用していると、自動BANされたIPが fail2ban-client status sshd で確認できるようになる。 どの国からのアクセスが多いかは見ていて少し面白い。

5. パスワードログインの禁止

最後に、パスワードログイン自体を禁止 して鍵認証のみにする。 これは公開鍵が ~/.ssh/authorized_keys に登録され、 そこからログインできることを 必ず先に確認してから 行う。

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
sudo systemctl restart ssh

ここまでやって初めて、ようやく「人類のSSHは入れて、bot系のSSHはほぼ門前払い」という状態になる。

動作確認チェックリスト

  • ssh -p 51022 ubuntu@<IP> で鍵ログインできる
  • ssh ubuntu@<IP>(ポート22)は接続不可
  • ssh root@<IP> -p 51022 はログイン拒否される
  • ssh ubuntu@<IP> -p 51022 -o PreferredAuthentications=password はパスワード入力できない
  • sudo ufw status で 22 が表示されない
  • sudo fail2ban-client status sshd が動いている

この状態にできたら、ようやく Nginxによる静的サイト配信 に進める。