はじめに
ConoHa VPS(KUSANAGI)でWordPressサイトを運用していたところ、SSHへのログイン失敗が数百回も記録されていました。世界中の攻撃者が、パスワードを総当たりで試してきているのです。
fail2ban(攻撃者を自動でブロックする仕組み)が動いていたので侵入はされていませんでしたが、毎日ドアをガチャガチャされている状態は気持ちのいいものではありません。
そこで今回は、SSHのポート番号を標準の22番から別の番号に変更しました。この記事では、その手順を初心者の方でもわかるように、実際につまずいた点も含めてていねいに解説します。
なぜポート番号の変更を選んだのか
SSHの守りを固める方法は、主に次の3つがあります。
| 方法 | 内容 | 難しさ |
|---|---|---|
| IPアドレス制限 | 自宅のIPアドレスからしか接続できないようにする | かんたん |
| ポート番号の変更 | SSHの入り口の番号を22番から別の番号に変える | ふつう |
| 鍵認証 | パスワードの代わりに、PCに保存した鍵ファイルでログインする | ちょっと手間 |
一番かんたんなのはIPアドレス制限ですが、わが家の回線はIPアドレスがちょこちょこ自動で変わるタイプでした。IPが変わるたびに設定を直す必要があるので、今回は見送りました。
鍵認証は一番安全ですが手順が多いので、まずはポート番号の変更から取り組むことにしました。
ポート番号の変更とは?
サーバーには、用途ごとに番号のついた「入り口」があります。
| 番号 | 用途 |
|---|---|
| 22番 | SSH(サーバーの操作) |
| 80番 | http(ホームページの表示) |
| 443番 | https(ホームページの表示・暗号化あり) |
SSHの入り口は22番が標準と決まっているので、攻撃者はまず22番を狙ってきます。そこで入り口を別の番号に移してしまえば、攻撃のほとんどは「入り口が見つからない」状態になります。
家に例えると、玄関の場所を誰も知らない場所に移すようなイメージです。
ただし、ポート変更だけで完全に安全になるわけではありません。番号を調べ上げてくる攻撃者もいるので、fail2banやパスワードの強化と組み合わせて使うのが基本です。
作業した環境
| 項目 | 内容 |
|---|---|
| サーバー | ConoHa VPS |
| OS | KUSANAGI(AlmaLinux 9) |
| 接続に使うソフト | Windows PowerShell(SSH)、WinSCP(ファイル転送) |
| ログインユーザー | root |
いちばん大事な注意点:締め出されないために
SSHの設定を間違えると、自分もサーバーに入れなくなることがあります。これを「締め出し」と呼びます。今回は次の3つのルールで、締め出しを防ぎながら進めました。
ルール1:いきなり22番を閉じない
最初は22番と新しい番号の両方で入れるようにして、新しい番号で入れることを確認してから22番を閉じます。
ルール2:作業中はPowerShellの窓を閉じない
SSHの設定を変えて再起動しても、すでにつながっている窓は切れません。影響を受けるのは「これから新しく入る接続」だけです。
つまり、窓を開いたままにしておけば、設定を間違えても中から直せます。家の鍵を交換するとき、新しい鍵で開くのを確かめるまで家族を1人中に残しておくのと同じです。
今回は最終的に3つの窓を開いていました。
| 窓 | 役割 |
|---|---|
| 1つ目(22番で入った窓) | 最初からの予備。何があっても残しておく保険 |
| 2つ目(新しい番号で入った窓) | 新しい番号で入れることの確認と、実際の作業用 |
| 3つ目(22番を閉じた後に開いた窓) | 新しい設定でも本当に入れるかの最終確認 |
ルール3:最後の手段を知っておく
万一締め出されても、ConoHaの管理画面にある「コンソール」からブラウザ経由でサーバーを操作できます。これがあるので、落ち着いて作業できます。
作業の全体の流れ
ポート番号の変更は、3か所の壁とSSH本体の設定を変える作業です。
| 手順 | 内容 |
|---|---|
| 手順1 | サーバーの状態を確認する |
| 手順2 | 新しいポート番号を決める |
| 手順3 | ConoHaのセキュリティグループで新しい番号を開ける |
| 手順4 | サーバーの壁(firewalld)で新しい番号を開ける |
| 手順5 | SSHを22番と新しい番号の両方で待ち受けるようにする |
| 手順6 | 新しい番号でログインできるか確認し、WinSCPも切り替える |
| 手順7 | 22番を3か所すべてで閉じる |
| 手順8 | fail2banに新しい番号を見張ってもらう |
この記事では、新しいポート番号を「XXXXX」と書いています。コマンドを実行するときは、XXXXXの部分を自分で決めた番号に置き換えてください。同じく「サーバーのIPアドレス」の部分も、自分のサーバーのIPアドレスに置き換えてください。
手順1:サーバーの状態を確認する
まずはPowerShellからいつも通りサーバーにログインして、今の状態を確認します。見るだけのコマンドなので、何も変わりません。
getenforcefirewall-cmd --statefirewall-cmd --list-servicesfirewall-cmd --list-portsss -tlnp | grep sshdそれぞれ、次のことを確認しています。
| コマンド | 確認していること | わが家の結果 |
|---|---|---|
| getenforce | SELinux(サーバーの見張り番)の状態 | Permissive |
| firewall-cmd –state | サーバーの壁(firewalld)が動いているか | running |
| firewall-cmd –list-services | 壁で許可しているサービス | cockpit dhcpv6-client http https ssh |
| firewall-cmd –list-ports | 壁で許可しているポート番号 | 443/udp |
| ss -tlnp | grep sshd | SSHが今どの番号で待ち受けているか | 22番 |
SELinuxについて
SELinuxがPermissiveの場合は「警告だけで止めない」モードなので、ポート変更で邪魔をしてきません。
Enforcingと表示された場合は、SELinuxにも新しい番号を教える追加の設定が必要です。この記事の手順だけではSSHが起動しないことがあるので注意してください。
firewall-cmd –list-all は使わないほうが見やすい
最初は firewall-cmd --list-all で一覧を見ようとしたのですが、fail2banがブロックした攻撃者のIPアドレスがずらっと並んで、画面が流れて何も読めませんでした。上のように項目ごとに分けて確認するのがおすすめです。
ちなみに443/udpは、ホームページの表示を速くする仕組み(HTTP/3)用なので、そのままで問題ありません。
手順2:新しいポート番号を決める
ポート番号は基本的に好きな数字で大丈夫ですが、次のルールを守ってください。
| ルール | 理由 |
|---|---|
| 1024以上にする | 1023以下はシステムで使う番号として予約されているため |
| ほかのソフトが使っていない番号にする | 同じ番号を2つのソフトで使うことはできないため |
| 2222や22222のような番号は避ける | 「22の代わり」としてよく使われるので、攻撃者も狙ってくるため |
| ゾロ目や連番は避ける | 推測されやすいため |
攻撃者のスキャンは小さい番号から順に調べることが多いので、49152〜65535の5桁の中から選ぶと、より見つかりにくくなります。
その番号が空いているか確認する
ss -tlnp | grep XXXXX何も表示されなければ空いています。何か表示された場合は、別の番号にしましょう。
手順3:ConoHaのセキュリティグループで新しい番号を開ける
ConoHa VPSには、サーバーの外側に「セキュリティグループ」というもう一枚の壁があります。ここで新しい番号を開けないと、サーバー側で設定しても外から届きません。
3-1:新しいセキュリティグループを作る
既存の「IPv4v6-SSH」(22番用)は、この時点では触らずにそのままにしておきます。新しい番号専用のグループを別に作ります。
- ConoHaの管理画面にログインする
- 左メニューの「セキュリティ」から「セキュリティグループ」を開く
- 新しいグループを追加し、名前を「SSH-newport」などわかりやすい名前にする
作成すると、名前の後ろに日付が自動で付くことがありますが、そのままで問題ありません。
3-2:グループにルールを追加する
作ったグループを開き、ルール一覧の下にある「+」ボタンからルールを追加します。
| 項目 | 1つ目のルール | 2つ目のルール |
|---|---|---|
| 通信方向 | IN | IN |
| イーサタイプ | IPv4 | IPv6 |
| プロトコル | TCP | TCP |
| ポート範囲 | XXXXX | XXXXX |
| IP/CIDR | 0.0.0.0/0 | ::/0 |
プロトコルは必ず「全て」から「TCP」に変更してください。「全て」のまま送信元を全開にすると、サーバーのすべてのポートが世界中に開いてしまいます。
ポート範囲の入力欄が見当たらない場合
プロトコルが「全て」のままだと、ポート範囲の入力欄は表示されません。TCPを選ぶと入力欄が出てきます。
「範囲」という名前ですが、1つだけ開けるときは番号を1つ入れるだけでOKです(開始と終了の2つの欄がある場合は、両方に同じ番号を入れます)。
IP/CIDRについて
入力欄に薄く表示されている「203.0.113.0/24」は記入例なので、消してから入力します。0.0.0.0/0は「IPv4のすべての相手」、::/0は「IPv6のすべての相手」という意味です。
画面右上に表示される「My IP」は今の自宅のIPアドレスですが、わが家はIPが変わるので今回は使いませんでした。
最初からある「Out」のルールについて
グループを作ると、通信方向「Out」のルールが2つ最初から入っています。これはサーバーから外への通信を許可するものなので、そのままにしておきます。
3-3:グループをサーバーに紐づける
作ったグループは、サーバーに付けて初めて効きます。ここを忘れやすいので注意してください。
- 左メニューの「サーバー」を開く
- 一覧から対象のサーバーのネームタグ(青い文字)をクリックする
- 詳細画面を下にスクロールして「ネットワーク情報」を探す
- 「セキュリティグループ」の横にある鉛筆マークを押す
- 一番下の「+」を押し、増えた欄で作ったグループを選ぶ
- 「保存」を押す
すでに付いているグループは絶対に外さないでください。特に「IPv4v6-Web」を外すと、ホームページが表示されなくなります。
サーバー名が見つからない場合
PowerShellの画面に表示されるサーバー名(vm-から始まる名前)と、ConoHaの管理画面に表示される名前(ネームタグ)は別物です。管理画面では「vps-作成日時」のような名前になっていることが多いので、IPアドレスの列で見分けると確実です。
なお、サーバー画面を開いたときに「25番ポートの制限」や「セキュリティグループについて」というお知らせが出ることがありますが、今回の作業には関係ないので閉じて大丈夫です。
手順4:サーバーの壁(firewalld)で新しい番号を開ける
サーバーの内側にも壁があるので、こちらでも新しい番号を開けます。
firewall-cmd --add-port=XXXXX/tcpfirewall-cmd --permanent --add-port=XXXXX/tcp| コマンド | 意味 |
|---|---|
| –add-port | 今すぐ開ける(再起動すると元に戻る) |
| –permanent –add-port | 再起動しても開いたままにする |
どちらも「success」と表示されれば成功です。確認は次のコマンドで行います。
firewall-cmd --list-ports「XXXXX/tcp」が表示されていればOKです。
なぜ firewall-cmd –reload を使わないのか
ネットでよく見かける手順では、–permanentで設定した後に firewall-cmd --reload を実行します。
しかし、reloadを実行するとfail2banがブロックした攻撃者のリストが消えてしまうことがあります。そこで今回は「今すぐ開ける」と「ずっと開ける」の2つのコマンドに分けて実行し、reloadを使わずに済ませました。
手順5:SSHを22番と新しい番号の両方で待ち受ける
5-1:今の設定を確認する
まず、今の設定ファイルにポート番号が書かれているかを調べます。
grep -i "^port" /etc/ssh/sshd_config /etc/ssh/sshd_config.d/*.conf何も表示されなければ、設定ファイルには書かれておらず、標準の22番で動いている状態です。わが家もこの状態でした。
5-2:ポート番号だけを書いたファイルを作る
元の設定ファイル(sshd_config)は触らずに、ポート番号だけを書いた小さなファイルを別に作ります。こうしておくと、失敗してもそのファイルを消すだけで元に戻せます。
printf "Port 22\nPort XXXXX\n" > /etc/ssh/sshd_config.d/10-port.conf「22番と新しい番号の両方で待ち受けて」という内容です。22番を残しているので、この段階では締め出される心配はありません。
中身を確認します。
cat /etc/ssh/sshd_config.d/10-port.conf「Port 22」と「Port XXXXX」の2行が表示されればOKです。
5-3:設定に間違いがないかチェックする
sshd -t何も表示されなければ合格です。
エラーが出た場合は、次の再起動に進まないでください。間違った設定のまま再起動すると、SSHが起動しなくなることがあります。
5-4:SSHを再起動する
systemctl restart sshd再起動しても、今つながっている窓は切れません。
5-5:待ち受けている番号を確認する
ss -tlnp | grep sshd22番と新しい番号が、それぞれ2行ずつ(合計4行)表示されれば成功です。2行ずつなのは、IPv4(0.0.0.0)とIPv6([::])の両方で待ち受けているためです。
手順6:新しい番号でログインできるか確認する
6-1:PowerShellで新しい番号から入る
今の窓は開いたまま、PowerShellをもう1つ新しく開いて次のコマンドを実行します。
ssh -p XXXXX root@サーバーのIPアドレス「-p XXXXX」が「XXXXX番の入り口から入る」という指定です。
つまずいたポイント:先にいつものログインをしてしまった
実はここで3回ほど失敗しました。新しい窓を開いたあと、いつものクセで先に次のコマンドでサーバーにログインしてしまったのです。
ssh root@サーバーのIPアドレスそして、ログインした後の画面で新しい番号のコマンドを実行していました。
sshは「サーバーの中に移動する」コマンドです。ログインした後に打ったコマンドは、すべてサーバーの中で実行されます。
| 順番 | 打ったコマンド | どこで動くか |
|---|---|---|
| 1 | ssh root@サーバーのIPアドレス | PCから22番でサーバーに入る |
| 2 | ssh -p XXXXX root@サーバーのIPアドレス | サーバーの中から、サーバー自身に接続しようとする |
これだと「サーバーから自分自身へ」の接続になり、自宅のPCから新しい番号で入れるかの確認になりません。
正しくは、新しい窓を開いたら、いつものログインはせずに「ssh -p XXXXX …」だけを最初に打ちます。
今どこにいるかは、行の先頭で見分けられます。
| 行の先頭 | 今いる場所 |
|---|---|
| [root@vm-xxxxxxxx ~]# | サーバーの中 |
| PS C:\Users\ユーザー名> | 自分のPC |
サーバーの中にいる場合は、exit と入力してサーバーから抜け、「PS C:\Users\…>」の状態でコマンドを実行してください。
なお、途中で「Are you sure you want to continue connecting」と聞かれた場合は、サーバーの中にいるときは no と答えて止めます。「Host key verification failed.」と表示されますが、接続を止めただけなのでエラーではありません。
「Are you sure you want to continue connecting」と聞かれたら
接続するときに、次のような質問が出ることがあります。
Are you sure you want to continue connecting (yes/no/[fingerprint])?PCにとって「新しい番号のこのサーバー」が初めてなので、念のため確認しているだけです。自分のPCから接続している場合は yes と入力して進めます。
なお、すでに22番で何度も接続しているPCでは、この質問が出ずにいきなりパスワードを聞かれることもあります。どちらでも問題ありません。
パスワードを入力して、KUSANAGIのロゴと「[root@… ~]#」が表示されれば、新しい番号でのログイン成功です。
パスワード入力の画面まで進んだ時点で、ConoHaの壁もサーバーの壁も通れていることがわかります。
6-2:WinSCPの接続先を切り替える
WinSCPもSSHの仕組みを使って接続しているので、ポート番号を変える必要があります。
- WinSCPを起動する
- いつも使っているサーバーを選んで「編集」を押す
- 「ポート番号」を22から新しい番号に変える
- 「保存」を押してから「ログイン」を押す
「サーバーのホスト鍵が不明です」のような警告が出たら、「はい」または「承認」を押して進めます。
6-3:本当に新しい番号でつながっているか確認する
WinSCPは、保存を押し忘れて22番のままつながっているということがよくあります。画面を見ただけでは区別できないので、サーバー側で確認します。
ss -tnp | grep ":XXXXX"「ESTAB」で始まる行が表示されます。これは「新しい番号から入ってきている接続」の一覧です。
PowerShellとWinSCPの両方を新しい番号でつないでいれば、2行以上表示されます。行の中に自宅のIPアドレスが表示されていることも確認しておきましょう。1行しか出ない場合は、WinSCPのポート番号設定をもう一度確認してください。
手順7:22番を閉じる
新しい番号で入れることを確認できたので、いよいよ22番を閉じます。閉じる場所は3か所です。
7-1:SSH本体を新しい番号だけにする
作業は、新しい番号で入った窓で行うのがおすすめです。「新しい入り口で入って作業できる」ことの確認にもなります。22番で入った窓は、予備として残しておきます。
設定ファイルを新しい番号だけに書き換えます。
printf "Port XXXXX\n" > /etc/ssh/sshd_config.d/10-port.confcat /etc/ssh/sshd_config.d/10-port.conf「Port XXXXX」の1行だけになっていればOKです。設定をチェックして、再起動します。
sshd -tsystemctl restart sshdss -tlnp | grep sshd新しい番号の2行だけになり、22番の行が消えていれば成功です。
7-2:新しい窓からもう一度ログインする
ここがとても大事です。先ほど新しい番号で入った窓は、22番を閉じる前につながった接続です。閉じた後の設定で本当に入れるかは、新しく接続してみないとわかりません。
普通のPowerShellをもう1つ開いて、もう一度ログインします。
ssh -p XXXXX root@サーバーのIPアドレスログインできれば、締め出しの心配はなくなります。
7-3:サーバーの壁(firewalld)から22番を消す
firewall-cmd --remove-service=sshfirewall-cmd --permanent --remove-service=ssh開けたときと同じく、reloadは使いません。確認します。
firewall-cmd --list-services「ssh」が消えていれば成功です。
httpとhttpsが残っていることも必ず確認してください。この2つが消えると、ホームページが表示されなくなります。
7-4:ConoHaのセキュリティグループから22番を外す
- ConoHaの管理画面で対象のサーバーを開く
- 「ネットワーク情報」の「セキュリティグループ」の鉛筆マークを押す
- 「IPv4v6-SSH」の行の右にあるゴミ箱マークを押す
- 残りのグループを確認して「保存」を押す
わが家では、保存後に次の4つが残りました。
| グループ名 | 役割 |
|---|---|
| IPv4v6-KUSANAGI_manager | KUSANAGIの管理用 |
| default | 基本設定 |
| IPv4v6-Web | ホームページの表示用(http・https) |
| SSH-newport | 新しいSSHの番号用 |
ゴミ箱を押す行を間違えないように注意してください。また、左メニューのセキュリティグループ一覧から「IPv4v6-SSH」そのものを削除するのではなく、このサーバーから外すだけです。
作業が終わったら、ブラウザでホームページが普通に表示されるかも確認しておきましょう。
手順8:fail2banに新しい番号を見張ってもらう
見落としがちですが、とても大事な手順です。
fail2banは、何も設定しなければ「ssh(22番)」への攻撃者をブロックする設定になっています。このままだと、新しい番号を見つけた攻撃者が来てもブロックが効きません。
8-1:設定ファイルの場所を調べる
ls /etc/fail2ban/jail.d/grep -rn "sshd\|port" /etc/fail2ban/jail.local /etc/fail2ban/jail.d/ 2>/dev/nullわが家では、jail.local の1行目に「[sshd]」があり、「port =」の行はどこにもありませんでした。つまり、標準の22番を見張っている状態です。
8-2:今の中身を確認する
cat /etc/fail2ban/jail.localわが家の中身は次の通りでした。
[sshd]
enabled = true
bantime = 86400
findtime = 600
maxretry = 5| 項目 | 意味 |
|---|---|
| enabled = true | SSHの見張りを有効にする |
| bantime = 86400 | ブロックする時間(86400秒=1日) |
| findtime = 600 | 失敗を数える期間(600秒=10分) |
| maxretry = 5 | この回数失敗したらブロックする |
つまり「10分以内に5回失敗したら1日ブロック」という設定です。
8-3:バックアップを取ってから書き換える
cp /etc/fail2ban/jail.local /etc/fail2ban/jail.local.bak次の内容をまとめてコピーして貼り付け、Enterを押します。port = XXXXX の1行を足しただけで、ほかは元のままです。
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = XXXXX
bantime = 86400
findtime = 600
maxretry = 5
EOF元の設定が違う場合は、自分の設定に「port = XXXXX」の1行を足した内容にしてください。
8-4:設定をチェックして再起動する
fail2ban-client -t「OK: configuration test is successful」と表示されれば合格です。
systemctl restart fail2banつまずいたポイント:再起動に時間がかかる
fail2banは再起動のときに、ブロック中の攻撃者を1件ずつ壁に登録し直すため、件数が多いと少し時間がかかります。慌ててCtrl+Cを押さずに、しばらく待ちましょう。
また、再起動した直後に状態を確認しようとしたところ、次のエラーが出ました。
ERROR Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running?これは「fail2banとまだ話ができない」という意味で、起動の準備が終わる前に話しかけてしまったのが原因でした。SSHの接続やホームページには影響ありません。
本当に動いているかは、次のコマンドで確認できます。
systemctl status fail2ban --no-pager「Active: active (running)」と「Server ready」が表示されていれば、正常に動いています。
8-5:見張りが始まったか確認する
fail2ban-client status sshd「Currently failed」「Currently banned」「Banned IP list」などが表示されれば、新しい番号の見張りが始まっています。わが家では、以前にブロックした攻撃者29件もちゃんと引き継がれていました。
再起動の途中でブロック期間が切れたIPアドレスは一覧から外れることがありますが、22番はもう閉じているので心配いりません。
作業のまとめ
| 場所 | 変更した内容 |
|---|---|
| ConoHaのセキュリティグループ | 新しい番号のグループを追加し、IPv4v6-SSH(22番)を外した |
| サーバーの壁(firewalld) | 新しい番号を開けて、ssh(22番)を閉じた |
| SSH本体 | 新しい番号だけで待ち受けるように変更した |
| fail2ban | 見張る番号を新しい番号に変更した |
| WinSCP | 接続するポート番号を新しい番号に変更した |
これから気をつけること
PowerShellで接続するときは -p を忘れない
ssh -p XXXXX root@サーバーのIPアドレス-p を付け忘れると、閉じた22番に接続しようとして「Connection timed out」になります。入れなくなったと焦る前に、まず -p が付いているか確認しましょう。
ポート番号は必ずメモしておく
新しい番号を忘れると、自分も入れなくなります。パスワードと一緒に安全な場所に控えておきましょう。
困ったときはConoHaのコンソール
万一入れなくなっても、ConoHaの管理画面の「コンソール」からサーバーを操作できます。設定を元に戻したいときは、/etc/ssh/sshd_config.d/10-port.conf を削除してSSHを再起動すれば、標準の22番に戻ります(その場合は壁の22番も開け直す必要があります)。
よくあるトラブルと解決法
| 症状 | 考えられる原因 | 解決法 |
|---|---|---|
| ConoHaでポート範囲を入力する欄がない | プロトコルが「全て」になっている | プロトコルをTCPに変更する |
| 新しい番号で接続するとタイムアウトする | セキュリティグループをサーバーに紐づけていない | サーバーのネットワーク情報からグループを追加する |
| 新しい番号で接続するとタイムアウトする | firewalldで番号を開けていない | firewall-cmd –list-ports で確認する |
| 接続時にyes/noを聞かれる | PCにとって新しい番号のサーバーが初めて | 自分のPCから接続していればyesでOK |
| 新しい番号での接続確認がうまくいかない | 先にいつものsshでログインして、サーバーの中からコマンドを実行している | exitで抜けて、行の先頭が「PS C:\」の状態で実行する |
| WinSCPが本当に新しい番号でつながっているかわからない | 設定の保存忘れ | ss -tnp | grep で接続を確認する |
| fail2banの確認でsocketエラーが出る | 再起動の準備が終わっていない | systemctl status で状態を見て、少し待ってから再確認する |
| ポート変更後にPowerShellで入れない | -p の付け忘れ | ssh -p XXXXX の形で接続する |
おわりに
SSHのポート変更は、ConoHaの管理画面・サーバーの壁・SSH本体・fail2banと、触る場所が多くて最初は難しく感じました。ですが、「22番を残したまま新しい番号を追加する」「窓を閉じずに確認してから閉じる」という順番を守れば、締め出しの心配なく安全に進められます。
作業中にも、22番に対して新しい攻撃が次々と来ていたので、改めて対策の大切さを実感しました。
次のステップとしては、パスワードの代わりに鍵ファイルでログインする「鍵認証」に挑戦すると、さらに安全になります。





コメント