Ubuntu Serverを構築したあと、最初に見直したい設定の一つがSSHだ。
SSHはサーバーへリモートログインするための重要な入口だ。設定を間違えると外部からの攻撃対象になりやすく、逆に変更手順を誤ると自分自身がサーバーへ接続できなくなる。
この記事では、Ubuntu Server 26.04 LTSでSSHの待ち受けポートを変更し、公開鍵認証でログインできるようにしたうえで、パスワード認証を無効化する手順をまとめる。
なお、SSHポートの変更は攻撃を根本的に防ぐ対策ではない。標準ポートである22番への総当たりアクセスやログノイズを減らす目的として考えるのがよい。本命の対策は、鍵認証を使い、パスワードログインを無効化することだ。
検証環境
この記事の手順は、以下の環境で確認した。
今回の環境は次のとおり。
| 項目 | 値 |
|---|---|
| OS | OS: Ubuntu Server 26.04 LTS |
| SSHサーバー | OpenSSH Server |
| OpenSSH | OpenSSH_10.2p1 |
| 変更後のSSHポート | 2222 |
Ubuntu 26.04では、SSHの待ち受けにssh.socketが使われる。そのため、/etc/ssh/sshd_configや/etc/ssh/sshd_config.d/*.confでPortを変更したあと、ssh.serviceだけを再起動しても待ち受けポートが変わらない場合がある。
Ubuntu 26.04でSSHポートを変える場合は、設定変更後に以下も実行する。
sudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh.service
この点が、従来のUbuntu Server向け手順と大きく違うところだ。
作業前の注意点
SSH設定の変更は、手順を間違えるとリモート接続できなくなる。
作業前に以下を守る。
- 既存のSSH接続は閉じない
- 新しいターミナルから接続確認してから古い接続を切る
- 設定変更後は必ずsudo sshd -tで構文チェックする
- UFWなどのファイアウォールを使っている場合は、SSH再起動前に新しいポートを許可する
- クラウドやVPSの場合は、管理画面側のセキュリティグループでも新しいポートを許可する
物理サーバーや仮想環境でコンソールに入れるならまだ復旧しやすいが、VPSやクラウドでSSHしか入口がない場合は特に注意する。
OpenSSH Serverをインストールする
Ubuntu Serverインストール時にSSHサーバーを入れていない場合は、以下でインストールする。
sudo apt update sudo apt install -y openssh-server
サービスの状態を確認する。
systemctl status ssh.service --no-pager
結果としてactive (running)になっていればよい
ubuntu@ubuntu-2604-autoinstall:~$ systemctl status ssh.service --no-pager
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: active (running) since Wed 2026-05-13 00:48:53 JST; 8min agUbuntu 26.04では、待ち受けポートは主にssh.socket側で確認する。
sudo ss -tlnp | grep ssh
初期状態では、以下のように22番で待ち受けていればSSHサーバーは動作している。
ubuntu@ubuntu-2604-autoinstall:~$ sudo ss -tlnp | grep ssh
[sudo: authenticate] Password:
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1299,fd=3),("systemd",pid=1,fd=102))
LISTEN 0 4096 [::]:22 [::]:* users:(("sshd",pid=1299,fd=4),("systemd",pid=1,fd=104))接続できるかも確認しておく。
ssh ユーザー名@サーバーIP
例:
ssh ubuntu@192.168.1.100
現在のSSH設定をバックアップする
設定変更前にバックアップを取る。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
Ubuntuでは、/etc/ssh/sshd_config本体を直接編集することもできる。ただし、カスタム設定は/etc/ssh/sshd_config.d/配下に分けて置く方が管理しやすい。
今回は以下のファイルを作成する。
/etc/ssh/sshd_config.d/00-custom.conf
最小構成の Ubuntu Server だと nano や vi が入っていないことがある。
vi 系を使いたいなら、一般的には vim を入れる。sudo apt update
sudo apt install -y vim
ファイルを作成する。
sudo vi /etc/ssh/sshd_config.d/00-custom.conf
ここで99-custom.confではなく00-custom.confにしているのは、Ubuntu環境では50-cloud-init.confなどの設定ファイルが先に存在することがあるためだ。
OpenSSHでは、多くの設定項目について「最初に読み込まれた値」が優先される。たとえば50-cloud-init.confにPasswordAuthentication yesがある環境では、99-custom.confにPasswordAuthentication noを書いても反映されない。
SSHのポートを変更する
00-custom.confに以下を記載する。
Port 2222
保存したら、設定の構文チェックを行う。
sudo sshd -t
何も表示されなければ構文エラーはない。
現在の有効設定を確認する場合は、以下を使う。
sudo sshd -T | grep '^port '
以下のように表示されれば、OpenSSHの設定としては2222番が有効になっている。
port 2222
ただし、Ubuntu 26.04ではこれだけでは実際の待ち受けポートが変わらない場合がある。次の手順でssh.socketへ反映する。
ssh.socketへポート変更を反映する
Ubuntu 26.04では、SSHの待ち受けにssh.socketが使われる。
Portを変更したら、以下を実行する。
sudo systemctl daemon-reload
sudo systemctl restart
ssh.socket sudo systemctl restart ssh.service
待ち受けポートを確認する。
sudo ss -tlnp | grep 2222
以下のように2222で待ち受けていれば成功だ。
ubuntu@ubuntu-2604-autoinstall:~$ sudo ss -tlnp | grep 2222
LISTEN 0 4096 0.0.0.0:2222 0.0.0.0:* users:(("sshd",pid=2766,fd=3),("systemd",pid=1,fd=66))
LISTEN 0 4096 [::]:2222 [::]:* users:(("sshd",pid=2766,fd=4),("systemd",pid=1,fd=67))
ubuntu@ubuntu-2604-autoinstall:~$ssh.socket側でも確認できる。
systemctl status ssh.socket --no-pager
ubuntu@ubuntu-2604-autoinstall:~$ systemctl status ssh.socket --no-pager
● ssh.socket - OpenBSD Secure Shell server socket
Loaded: loaded (/usr/lib/systemd/system/ssh.socket; enabled; preset: enabled)
Drop-In: /run/systemd/generator/ssh.socket.d
mqaddresses.conf
Active: active (running) since Wed 2026-05-13 01:05:39 JST; 37s ago
Invocation: f54348cdcbf54356ad02f968deb70548
Triggers: ● ssh.service
Listen: 0.0.0.0:2222 (Stream)
[::]:2222 (Stream)
Tasks: 0 (limit: 4030)
Memory: 12K (peak: 256K)
CPU: 669us
CGroup: /system.slice/ssh.socket
May 13 01:05:39 ubuntu-2604-autoinstall systemd[1]: Listening on ssh.socket - OpenBSD Secure Shell server socket.
ubuntu@ubuntu-2604-autoinstall:~$Listen: 0.0.0.0:2222やListen: [::]:2222が表示されていれば、socket側にも反映されている。
ファイアウォールで新しいポートを許可する
UFWを使っている場合は、新しいSSHポートを許可する。
sudo ufw allow 2222/tcp
UFWの状態を確認する。
sudo ufw status
以下のように2222/tcpが許可されていればよい。
ubuntu@ubuntu-2604-autoinstall:~$ sudo ufw status
Status: active
To Action From
-- ------ ----
2222/tcp ALLOW Anywhere
2222/tcp (v6) ALLOW Anywhere (v6)まだ接続確認が終わるまでは、既存の22番ポートは閉じない方が安全だ。
新しいポートでSSH接続する
別のターミナルを開き、新しいポートで接続できるか確認する。
ssh -p 2222 ユーザー名@サーバーIP
例:
ssh -p 2222 ubuntu@192.168.1.100
TeraTermを使用している場合はTCPポートに2222を設定する

接続できればポート変更は完了だ。
ここで接続できない場合は、既存のSSH接続を切らずに以下を確認する。
sudo sshd -tsystemctl status ssh.socket --no-pagersystemctl status ssh.service --no-pagersudo journalctl -u ssh.service -n 50 --no-pagersudo ufw statussudo ss -tlnp | grep ssh
SSH鍵を作成する
次に、鍵認証を設定する。
接続元PCでSSH鍵を作成する。すでにSSH鍵を使っている場合は、この手順はスキップしてもよい。
ssh-keygen -t ed25519
今回はPowerShellで実行する
PS C:\Users\kyoro> ssh-keygen -t ed25519以下のように保存先を聞かれたら、通常はそのままEnterでよい。
Enter file in which to save the key (C:\Users\kyoro/.ssh/id_ed25519):パスフレーズも設定しておくと安全性が上がる。
作成されるファイルは主に以下の2つだ。
%USERPROFILE%\.ssh\id_ed25519 秘密鍵 %USERPROFILE%\.ssh\id_ed25519.pub 公開鍵
秘密鍵であるid_ed25519は外部に渡してはいけない。サーバーに登録するのは.pubが付いた公開鍵の方だ。
公開鍵をサーバーへ登録する
PowerShellで公開鍵の内容を確認する
PS C:\Users\kyoro> type ~/.ssh/id_ed25519.pub以下のような表示が出る
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... user@PC出力内容をすべてコピーしUbuntu側で以下コマンドを実行し~/.ssh/authorized_keysに貼り付ける
sudo vi ~/.ssh/authorized_keys
パスワードではなく、秘密鍵でログインできれば成功だ。
鍵認証でログインできるか確認する
新しいターミナルから、鍵認証でログインできるか確認する。
ssh -p 2222 ユーザー名@サーバーIP
TeraTermの場合はIPアドレスとポートを指定して「OK」を押したあとに秘密鍵を指定してログインする。

うまくいかない場合は、詳細ログ付きで接続して原因を見る。
ssh -vvv -p 2222 ユーザー名@サーバーIP
サーバー側では以下でSSHログを確認する。
sudo journalctl -fu ssh.service
よくある原因は以下だ。
- 公開鍵を登録するユーザーを間違えている
- authorized_keysに貼り付けた公開鍵が途中で改行されている
- .sshやauthorized_keysの権限が緩すぎる
- 接続元で別の秘密鍵を使っている
- サーバー側のファイアウォールで新ポートが許可されていない
特定の秘密鍵を指定する場合は-iを使う。
ssh -i ~/.ssh/id_ed25519 -p 2222 ユーザー名@サーバーIP
パスワード認証を無効化する
鍵認証でログインできることを確認してから、パスワード認証を無効化する。
ここを先にやると、自分がログインできなくなる可能性がある。
00-custom.confを編集する。
sudo vi /etc/ssh/sshd_config.d/00-custom.conf
以下のように設定する。
Port 2222
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin noそれぞれの意味は以下の通りだ。
| 設定 | 意味 |
|---|---|
| Port 2222 | SSHの待ち受けポートを2222にする |
| PubkeyAuthentication yes | 公開鍵認証を有効にする |
| PasswordAuthentication no | パスワード認証を無効にする |
| KbdInteractiveAuthentication no | キーボード対話型認証を無効にする |
| PermitRootLogin no | rootユーザーでのSSHログインを禁止する |
設定後、構文チェックする。
sudo sshd -t
有効設定も確認する。
sudo sshd -T | grep -E '^(port|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
以下のようになっていれば意図通りだ。
ubuntu@ubuntu-2604-autoinstall:~$ sudo sshd -T | grep -E '^(port|pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
port 2222
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no問題なければ、socketとサービスへ反映する。
sudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh.service
パスワード認証が無効化されたか確認する
まず、鍵認証でログインできることを確認する。
ssh -p 2222 ユーザー名@サーバーIP
次に、あえてパスワード認証を指定して接続してみる。
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no -p 2222 ユーザー名@サーバーIP
パスワードでログインできなければ、パスワード認証の無効化は成功だ。
PS C:\Users\kyoro> ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no -p 2222 ubuntu@192.168.11.40
ubuntu@192.168.11.40: Permission denied (publickey).
PS C:\Users\kyoro>もしここでまだパスワード認証が有効な場合は、以下を確認する。
sudo sshd -T | grep passwordauthentication ls -l /etc/ssh/sshd_config.d/
50-cloud-init.confなど、00-custom.confより先に読み込まれる設定ファイルがないか確認する。
22番ポートを閉じる
新しいポートでログインでき、鍵認証も問題ないことを確認したら、必要に応じて22番ポートを閉じる。
Ubuntu 26.04でPort 2222だけを指定した場合、ssh.socketの待ち受けは2222番に切り替わるため、22番は待ち受けなくなる。
UFWを使っていて、22番を明示的に許可していた場合は削除する。
sudo ufw delete allow 22/tcp
状態を確認する。
sudo ufw status
ただし、クラウド環境ではUFWだけでなく、クラウド側のセキュリティグループやファイアウォール設定も確認する。
最終的な設定例
今回のサーバー側設定は以下の通りだ。
port 2222
permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no設定変更後は必ず以下を実行する。
sudo sshd -t sudo systemctl daemon-reload sudo systemctl restart ssh.socket sudo systemctl restart ssh.service
トラブルシューティング
SSHの待ち受けポートが22番のまま
Ubuntu 26.04ではssh.socket側に変更が反映されていない可能性がある。
以下を実行する。
sudo sshd -tsudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh.service
その後、待ち受けを確認する。
systemctl status ssh.socket --no-pager sudo ss -tlnp | grep ssh
SSHサービスが起動しない
構文エラーの可能性が高い。
sudo sshd -t
ログも確認する。
sudo journalctl -u ssh.service -n 100 --no-pager
新しいポートで接続できない
待ち受けポートを確認する。
sudo ss -tlnp | grep 2222
ファイアウォールも確認する。
sudo ufw status
クラウドやVPSの場合は、管理画面側のセキュリティグループで新しいポートが許可されているか確認する。
鍵認証できない
サーバー側で権限を確認する。
ls -ld ~/.ssh ls -l ~/.ssh/authorized_keys
目安は以下だ。
~/.ssh 700 ~/.ssh/authorized_keys 600
修正する場合は以下を実行する。
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
接続元で秘密鍵を指定して試す。
ssh -i ~/.ssh/id_ed25519 -p 2222 ユーザー名@サーバーIP
パスワード認証を無効化したのにまだ有効
設定ファイルの読み込み順を確認する。
ls -l /etc/ssh/sshd_config.d/ sudo sshd -T | grep passwordauthentication
Ubuntu環境では、50-cloud-init.confに以下のような設定が入っていることがある。
PasswordAuthentication yes
OpenSSHでは先に読み込まれた値が優先されるため、99-custom.confにPasswordAuthentication noを書いても上書きできない。
この記事では、より早く読み込まれる00-custom.confを使っている。
パスワード認証を無効化したら入れなくなった
既存のSSH接続が残っている場合は、設定を戻す。
sudo vi /etc/ssh/sshd_config.d/00-custom.conf
一時的に以下のように戻す。
PasswordAuthentication yesKbdInteractiveAuthentication yes
構文チェックして反映する。
sudo sshd -tsudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh.service
既存接続もなく、コンソールにも入れない場合は、VPSやクラウドの管理画面からコンソール接続・レスキューモード・スナップショット復元などを使う必要がある。
まとめ
Ubuntu Server 26.04でSSHを最低限安全に使うなら、以下の流れで設定する。
- OpenSSH Serverをインストールする
- SSH設定をバックアップする
- /etc/ssh/sshd_config.d/00-custom.confを作成する
- SSHポートを変更する
- systemctl daemon-reloadとssh.socket再起動でポート変更を反映する
- ファイアウォールで新ポートを許可する
- 新ポートで接続確認する
- SSH鍵を作成する
- 公開鍵をサーバーへ登録する
- 鍵認証でログインできることを確認する
- パスワード認証を無効化する
ポート変更だけではセキュリティ対策としては弱い。
実運用では、鍵認証、パスワード認証の無効化、rootログイン禁止、ファイアウォール設定、ログ確認までセットで考えるのがよい。
参考
- Ubuntu Server documentation – OpenSSH server: https://ubuntu.com/server/docs/how-to/security/openssh-server/
- man sshd_config
- man ssh
- man systemd.socket
