Ubuntu 24.04で再構築したさくらVPSの、初期セキュリティ設定の記録。 ポート22のまま放置すると数時間後にはbotnetからのSSHログイン試行ログが流れ始めるので、 最初にやっておきたい範囲をまとめた。
ゴール
- rootでの直接ログインを禁止する
- SSHポートを
51022に変更する - ufwでポート
51022、80、443以外を閉じる - fail2banで失敗ログイン回数の多いIPを自動BAN
- パスワードログインを禁止して鍵認証のみにする
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による静的サイト配信 に進める。