WEB公開したらやっておきたいSSHセキュリティ|公開鍵認証・fail2ban・SSHポート変更

WEB公開したサーバーで行っておきたいSSHのセキュリティ対策を解説します。パスワード認証を無効化して公開鍵認証にする方法から、fail2banの導入、SSHポートの変更まで、実際の設定手順を紹介します。

※本記事は広告を含みます

初めに

どうも、職業エンジニアです。
最近はAIの進歩によって、ホームページやWEBサービスの公開ハードルが一気に下がっています。これ自体はまあ良いことだと思っているのですが、同時にセキュリティ周りの事故が多く起こっているのもまた事実。
という訳で今回は、不正アクセス対策としてSSHセキュリティ周りでやっておくべきことを解説していきたいと思います。

まずはSSH接続を「公開鍵認証」のみにする

fail2banを導入する前に、まずやるべきは「パスワード認証を完全に禁止し、秘密鍵を持つクライアントだけがSSHログインできるようにする」ことです。

パスワード認証が生きたままだと、辞書攻撃や総当たり攻撃を受け続けるリスクが残ります。公開鍵認証のみにすることで、SSHのパスワード総当たり攻撃による侵入を防げます。

⚠️
必ず「手元で秘密鍵を使ったログインが成功している状態」を確認してからパスワード認証を無効化してください。鍵の準備ができていない状態で無効化すると、サーバーへ入れなくなります!

1. SSH設定ファイルを開く

サーバー側のSSH設定ファイルを編集します。

sudo nano /etc/ssh/sshd_config

2. パスワード認証を禁止し、公開鍵認証を有効化する

ファイル内の設定項目を探し、以下のように書き換えます(行頭の # は消して有効化します)。

# 公開鍵認証を許可する
PubkeyAuthentication yes

# パスワード認証を完全に無効化する
PasswordAuthentication no

# 空のパスワードを許可しない
PermitEmptyPasswords no

書き換えたら、保存してエディタを閉じます。

3. 設定ファイルの構文チェック

設定にミス(タイポなど)がないか、テストコマンドで確認します。

sudo sshd -t

※何もエラーが表示されずにプロンプトが戻ってくれば設定は正常です。

4. SSHデーモンを再起動する

設定を反映させます。

sudo systemctl restart ssh
ℹ️
このコマンドを実行しても、今作業しているSSH接続は切断されません。そのまま開いておきましょう

5. 現在の画面を閉じずに別ウィンドウでテスト

万が一設定ミスで締め出されるのを防ぐため、現在のターミナル画面は命綱として開いたままにしましょう。

別のターミナルウィンドウ(Tera Term等)を新しく立ち上げ、以下を確認します。

  1. 秘密鍵を指定した接続: ログインできること

  2. パスワード認証での接続試行: 接続が拒絶(Permission denied (publickey) など)されること

鍵による接続が確認できて初めて、SSHのパスワード認証による総当たり攻撃を防げる状態になります。最低限これだけはやっておきましょう!

fail2banのインストールと初期設定

次に、fail2banの設定を行っていきます。公開鍵認証をしただけでもかなりの効果があるのですが、

  • 運用の安定性
  • リソース保護
  • 多層防御

などの観点から設定しておくことをお勧めします。

そもそも「fail2ban」ってなに?

fail2ban(フェイル・ツー・バン)は、Linuxサーバー上で動作する侵入防止ツールです。

仕組みは非常にシンプルかつ強力です。

  1. ログを常時監視する

    SSHの認証ログ(/var/log/auth.log など)を常時監視し、ログイン失敗の記録をカウントします。

  2. しきい値を超えたらIPを特定する

    「10分間に5回ログインを失敗した」といった条件を満たしたアクセス元IPアドレスをBan対象とします。

  3. ファイアウォールにルールを動的に追加して遮断する

    そのIPからの通信を一時的(例: 24時間や1週間)にドロップ(拒否)し、サーバーへのアクセスそのものを遮断します。

  4. 設定時間が過ぎたら自動で解除(Unban)する

    管理者が毎回手動でブロックを解除する必要はありません。

1. インストール

まずはパッケージを最新化して、fail2banをインストールします。

Bash

sudo apt update
sudo apt install -y fail2ban

2. 設定ファイルの作成

fail2banのデフォルト設定は /etc/fail2ban/jail.conf に書かれていますが、このファイルを直接編集するのはアンチパターンです。パッケージのアップデート時に上書きされてしまうためです。

必要な設定だけを書いた jail.local を新規作成するのが一番よいかなと思います。

sudo nano /etc/fail2ban/jail.local

3. おすすめの基本パラメータ設定

設定ファイル内の [DEFAULT] セクションにある、以下の3つの主要パラメータを調整します。

[DEFAULT]
# 攻撃者を締め出す時間(秒単位、または 1d, 1w などの指定も可)
bantime = 1d

# 不審なアクセスをカウントする監視ウィンドウ期間
findtime = 10m

# 期間内に何回失敗したらBanするか
maxretry = 5

# 絶対にBanされたくない自分の固定IP等があればスペース区切りで指定
# ignoreip = 127.0.0.1/8 ::1 自分の固定IP
  • bantime: 初期の10分だとボットは諦めずに再アタックしてくるため、実運用では 1日(1d または 86400)以上 に伸ばしておくのがおすすめです。

  • ignoreip: 自宅やオフィスのIPが固定なら、ここに追記しておくと作業ミスで自分が締め出される悲劇を防げます。

4. SSH監視([sshd] セクション)の有効化

下へスクロールしていくと [sshd] というセクションがあります。ここを以下のように設定(または追記)します。

[sshd]
enabled = true
port    = ssh
💡
後述する「ポート変更」を行うまでは、port = ssh(デフォルトの22番を見る設定)のままでOKです。

編集が終わったら、保存してエディタを閉じます。

5. サービスの起動と自動起動の有効化

設定を反映させ、サーバー再起動時にも自動で立ち上がるようにします。

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

6. 動作確認

以下のコマンドを叩いて、SSHの監視が正常に動いているか確認します。

sudo fail2ban-client status sshd

正常に動いていれば、以下のようなステータスが表示されます。

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  `- Total failed:     0
`- Actions
   |- Currently banned: 0
   `- Total banned:     0
   `- Banned IP list:

これでfail2banの配備は完了です。
設定後はたまに上記の確認コマンドを投げて様子を見てみましょう。自分の予想以上にボットによる攻撃が多く行われているのが分かるはず。。!

SSHポート変更とfail2ban追従の手順

上記でfail2banの設定は完了した訳ですが、デフォルトポートままだとかなりボットによる攻撃が多く、ログにノイズが乗ってしまいます。なので、できる限りアクセスされないようにSSHポートを変更してしまうのをお勧めします。

⚠️
手順の順序を間違えると「作業中の自分自身がサーバーから締め出される(完全にアクセス不能になる)」ので注意!

1. OSのファイアウォール(UFW)で新ポートを先に許可

ℹ️
この手順はUFWを利用している環境を前提としています。VPS事業者側のファイアウォールやセキュリティグループを利用している場合は、そちらでも新しいSSHポートを許可してください。

SSHの設定を変える前に、新しいポートの通行を許可します。UFWについてはまた別途記事にしようと思います。

sudo ufw allow 65432/tcp
sudo ufw status
ℹ️
65432の部分はこの値でなくても大丈夫です。49152〜65535などの未使用ポートから選んでもよいでしょう。ただし、ポート番号そのものによってSSHの認証強度が高くなるわけではありません。また、SSH接続元を固定IPに限定できる環境では、UFWなどでSSHポートへのアクセス元を限定することで、さらに攻撃面を減らせます。

SSHの設定変更(sshd_config)

設定ファイルを開き、ポート番号を指定します。

sudo nano /etc/ssh/sshd_config

#Port 22 となっている箇所を見つけ、コメントアウト(#)を外して、先ほど許可した新ポートを指定します。

Port 65432

fail2banの監視ポートも追従させる

fail2banの設定(jail.local)を開き、[sshd] セクションの監視対象ポートを新しい番号に変更します。

sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port    = 65432

各種サービスの再起動

以下のコマンドで設定を反映します。なお、このコマンドを実行しても、現在接続中のSSHセッションは切断されません。そのまま開いておきましょう。

sudo sshd -t
sudo systemctl restart ssh
sudo systemctl restart fail2ban

現在の画面を閉じずに別ウィンドウで接続テスト

現在のターミナル画面は命綱として開いたまま放置し、別のウィンドウを新しく立ち上げて新ポート(65432)でログインできるかをテストします。

無事にログインが成功したら、元のターミナルで古い22番ポートのルールを削除して塞ぎます。

# ルールを番号付きで確認
sudo ufw status numbered

# 該当する22番(OpenSSH)のルール番号を大きい方から順に削除
sudo ufw delete <番号>

これでSSHポートの変更は完了です。

まとめ

今回は以下の作業をすることでSSHポートのセキュリティ対策を実施しました。

  1. SSH公開鍵認証: SSHのパスワード認証を無効化し、パスワード総当たりによる侵入を防ぐ

  2. fail2ban: 繰り返し認証に失敗するアクセス元を自動的に一時ブロックする

  3. SSHポートの変更: 22番ポートを狙った自動スキャンやログイン試行を減らし、ログのノイズを抑える

このような多層防御を敷いておくことで、不要なログイン試行を減らし、SSHへの不正アクセス対策を強化できます。

特に個人で運用しているWEBサービスでは、セキュリティ上のリスクを自分で負うことになります。最低限、SSHの認証設定くらいはきちんとやっておくことをおすすめします。

最後に

ここまで書いておいてなんですが、筆者はインフラエンジニアではないのでこれらを仕事で設定したことはありませんww

プライベートではこの辺も自分で設定しなきゃいけないので、非常に面倒くさいですね!まあこれも勉強だと思えばいいか。。