skip to content
barorin&

SSHのポート変更とセッション維持まとめ|sshd_config・nohup・screen

/ 8 min read

Table of Contents

はじめに

サーバーを公開すると、22番ポートには当たり前のように総当たり攻撃が来ます。ポート番号を変えるだけで攻撃ログは劇的に減るので、最初にやっておく価値があります。

あわせて、SSHを切ってもプロセスを動かし続ける方法もまとめました。どちらもサーバー運用の最初に必要になる話です。

SSHのポート番号を変更する

絶対に守る手順

作業の順序を間違えると、自分がサーバーに入れなくなります。クラウドのコンソールから復旧できない構成だと、インスタンスを作り直すことになりかねません。次の順序を必ず守ってください。

  1. ファイアウォールで新しいポートを開ける(22番はまだ閉じない)
  2. sshd_config新しいポートを追加する(Port 22 は残す)
  3. sshdを再起動する
  4. 今のセッションは切らずに、別のターミナルから新ポートで接続できるか確認する
  5. 接続できたら、22番を閉じる

要は「新しい入口を作って、通れることを確かめてから、古い入口を閉じる」という順序です。

sshd_config の編集

Terminal window
$ sudo vim /etc/ssh/sshd_config

Port 22 の行を残したまま、新しいポートを追記します。

Terminal window
Port 22
Port 50022

設定を反映します。

Terminal window
# Ubuntu
$ sudo systemctl restart ssh
# Amazon Linux など
$ sudo systemctl restart sshd.service

疎通確認は、今つながっているセッションを維持したまま別のターミナルから行います。

Terminal window
$ ssh -p 50022 ユーザー名@サーバーのIP

つながることを確認できたら、sshd_config から Port 22 を削除して再起動し、ファイアウォールの22番も閉じます。

AWS Lightsail の場合

管理画面の ネットワーキング からポートを追加します。

  • アプリケーション: カスタム
  • プロトコル: TCP
  • ポートまたは範囲: 任意のポート番号

新ポートでの接続を確認したら、ネットワーキングから22番を削除します。

GCE の場合

VPCネットワーク > ファイアウォール でルールを作成します。

  1. 新しいポートを許可するファイアウォールルールを作り、VMインスタンスのネットワークタグに付与する
  2. SSHで接続し、sshd_config にポートを追加して再起動する
  3. 新しいポートで接続できることを確認する
  4. 22番を拒否するルールをネットワークタグに追加する
  5. 22番で接続できないことを確認して完了

GCEはネットワークタグでルールを出し分けられるので、タグの付け外しで切り替えられます。

SSHを切ってもコマンドを動かし続ける

SSHセッションを閉じると、そこで起動したプロセスは通常終了してしまいます。継続させる方法は主に2つあります。

nohup:起動して放置する

コマンドの前に nohup、末尾に & を付けます。

Terminal window
$ nohup streamlit run app.py &
  • nohup: ログアウト時のハングアップシグナルを無視する
  • &: バックグラウンドで実行する

標準出力は自動的に nohup.out に書き出されます。出力先を指定したいときは明示します。

Terminal window
$ nohup streamlit run app.py > /var/log/app.log 2>&1 &

プロセスを止めるときは、PIDを調べて終了させます。

Terminal window
# PIDを確認する
$ ps -ef | grep streamlit
# 終了させる
$ kill PID

screen:あとから作業を再開する

対話的な作業を続きから再開したい場合は screen が便利です。

Terminal window
# 新しいスクリーンを作る
$ screen
# (この中でスクリプトを実行する)
# スクリーンから抜ける(プロセスは動き続ける)
Ctrl + A を押してから D

戻るときは、動いているスクリーンを確認してから入り直します。

Terminal window
# 一覧を表示
$ screen -ls
# 指定したスクリーンに戻る
$ screen -r スクリーンID

終了させる方法は2つあります。

Terminal window
# スクリーンの中から
$ exit
# スクリーンの外から
$ screen -X -S スクリーンID quit

名前を付けておくと、複数動かしていても分かりやすくなります。

Terminal window
$ screen -S batch
$ screen -r batch

どちらを使うか

nohup screen
用途 起動して放置する あとから作業を再開する
画面の復帰 できない できる
対話的な操作 向かない 向く

長時間かかるバッチを流しておくだけなら nohup、途中経過を見ながら作業したいなら screen という使い分けになります。

おわりに

ポート変更は単純な作業に見えますが、順序を間違えたときの被害が大きい作業でもあります。「新しい入口を確認してから古い入口を閉じる」を徹底すれば、締め出されることはありません。作業中は接続済みのセッションを閉じないでおく、というのも地味ですが効果的な保険です。

この記事を書いた人

barorinのプロフィール画像

barorin公認会計士

会計とITの二足のわらじで働く公認会計士です。Pythonを中心に、会計・監査の実務で実際に使っているコードや、Ubuntu・Raspberry Piの設定メモを書いています。