Linux VPS で SSH ポート番号と root パスワードを安全に変更する方法
SSH を 22 番ポートから移しても本気の攻撃者は防げませんが、ログに溜まる自動スキャンの大半は消えます。また新しいサーバーでは、まず root パスワードを変更するのが基本です。このガイドでは、締め出されずに Linux VPS の SSH ポートと root パスワードを変更する方法を説明します。sshd_config の編集、Rocky Linux / AlmaLinux での SELinux ラベル付け、ファイアウォールの開放、Ubuntu 22.10・24.04 の ssh.socket への対応、そして問題発生時の VNC コンソールからの復旧までを扱います。JUSTG のクラウドサーバー・専用サーバー上の Debian、Ubuntu、CentOS 7、Rocky/AlmaLinux 8・9 が対象です。
ステップ1:root パスワードを変更
通常どおり接続できるうちに最初に行います。VNC コンソールで復旧する際に入力するのもこの root パスワードなので、パスワードマネージャーに保存しておきましょう。16 文字以上のランダムな文字列を推奨します。
# Generate a random 24-character password (optional)
openssl rand -base64 18
# Set the new root password (type it twice)
passwd root
別アカウントのパスワードを変える場合は passwd ユーザー名 を実行します。
ステップ2:新しい SSH ポート番号を決める
1024~49151 の範囲で未使用のポート(例:2222 や 22022)を選び、他のサービスが使っていないことを確認します。以下では 2222 を例にします。
# Nothing should be listening on the new port yet
ss -tlnp | grep ':2222' || echo "port 2222 is free"
ステップ3:sshd_config に新しいポートを追加
バックアップを取ってから、旧ポートと新ポートの両方で待ち受けるよう設定します。作業中は 22 番を残しておくことで、後のステップで失敗しても締め出されません。
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
nano /etc/ssh/sshd_config
# Replace the "#Port 22" line with BOTH ports during the change:
Port 22
Port 2222
ステップ4:SELinux で SSH ポートを許可(Rocky Linux / AlmaLinux / CentOS)
Red Hat 系では、SELinux が ssh_port_t ラベルの付いたポートにしか sshd のバインドを許可しません。この手順を省くと「Permission denied」のバインドエラーで sshd が新ポートで起動しません。Debian / Ubuntu は標準で SELinux を使わないため不要です。
# Rocky Linux / AlmaLinux 8, 9
dnf install -y policycoreutils-python-utils
# CentOS 7
yum install -y policycoreutils-python
semanage port -a -t ssh_port_t -p tcp 2222
semanage port -l | grep ssh_port_t
ステップ5:ファイアウォールで新しい SSH ポートを開放
# Debian / Ubuntu with UFW
ufw allow 2222/tcp
ufw status
# CentOS / Rocky / AlmaLinux with firewalld
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
firewall-cmd --list-ports
ステップ6:SSH を再起動(Ubuntu 22.10 以降・24.04 の ssh.socket 対応)
構文を確認してからサービスを再起動します。現在のセッションは切れません。
sshd -t # syntax check, no output = OK
# Debian, Ubuntu 22.04 and older
systemctl restart ssh
# CentOS / Rocky / AlmaLinux
systemctl restart sshd
# Confirm sshd is listening on both ports
ss -tlnp | grep sshd
Ubuntu 22.10 以降は systemd のソケットアクティベーションで SSH を起動します。待ち受けポートは ssh.socket が管理しているため、ssh を再起動するだけではポートは変わりません。バージョンに合った方法を使ってください。
# Is socket activation in use?
systemctl is-active ssh.socket
# Ubuntu 24.04 (and 23.10+): the Port lines in sshd_config are read
# by a systemd generator, so reload and restart the socket
systemctl daemon-reload
systemctl restart ssh.socket
# Ubuntu 22.10 / 23.04: add the ports to a socket override instead
mkdir -p /etc/systemd/system/ssh.socket.d
cat > /etc/systemd/system/ssh.socket.d/listen.conf <<'EOF'
[Socket]
ListenStream=
ListenStream=22
ListenStream=2222
EOF
systemctl daemon-reload
systemctl restart ssh.socket
# Alternative on any of these Ubuntu releases: go back to the classic service
systemctl disable --now ssh.socket
systemctl enable --now ssh.service
ステップ7:2 つ目のセッションで新しい SSH ポートをテスト
# From a SECOND terminal on your computer
ssh -p 2222 [email protected]
# Optional ~/.ssh/config entry so you can just type "ssh myvps"
Host myvps
HostName 203.0.113.40
Port 2222
User root
「Connection timed out」はファイアウォールがまだ遮断している可能性が高く、「Connection refused」は sshd がそのポートで待ち受けていない状態です。SELinux、ssh.socket、ss -tlnp を確認しましょう。
ステップ8:22 番ポートを閉じる
新ポートで問題なく入れたら、SSH 設定とファイアウォールから旧ポートを削除し、もう一度再起動して新しいターミナルで再テストします。
# Remove "Port 22" from sshd_config (and from listen.conf on Ubuntu 22.10/23.04)
sed -i '/^Port 22$/d' /etc/ssh/sshd_config
sshd -t && systemctl restart sshd # use "ssh" on Debian/Ubuntu
# Ubuntu 22.10+ with ssh.socket: systemctl daemon-reload && systemctl restart ssh.socket
# UFW
ufw delete allow 22/tcp
ufw delete allow OpenSSH
# firewalld
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
ステップ9:VNC コンソールでロールバック
締め出された場合でも、VNC コンソールはネットワークや SSH を経由しないため使えます。JUSTG クライアントエリア → 製品とサービス → 対象の VPS → 管理パネルからコンソールを開いてください。見つからない場合はチケットでお問い合わせください。ステップ1 の root パスワードでログインし、設定を元に戻します。
# In the VNC console, logged in as root
cp /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config # or re-add "Port 22"
ufw allow 22/tcp # Debian / Ubuntu
firewall-cmd --add-service=ssh # CentOS / Rocky / AlmaLinux (runtime)
systemctl restart ssh || systemctl restart sshd
よくある質問
SSH ポートを変えればサーバーは安全になりますか?
ボットによるログのノイズは減りますが、それだけでは本当の防御になりません。SSH 鍵認証、パスワード認証の無効化、ファイアウォールと組み合わせてください。
sshd_config を変えたのに Ubuntu 24.04 が 22 番で待ち受けています。
ssh.socket がポートを握っているためです。systemctl daemon-reload の後に systemctl restart ssh.socket を実行するか、ステップ6 のとおりソケットを無効にして ssh.service を使ってください。
Rocky Linux でポート変更後に sshd が起動しません。
原因はほぼ SELinux です。journalctl -u sshd -n 20 でバインドエラーが出ていれば、semanage port -a -t ssh_port_t -p tcp 2222 でポートを追加して再起動します。
SSH ポート変更後も接続できない場合は、https://www.justg.com/submitticket.php からチケットを送信してください。JUSTG テクニカルサポートが対応いたします。