LinuxサーバーでのSSHセキュリティ強化のためのベストプラクティス
Secure Shell (SSH)は、事実上すべてのLinuxサーバーにおけるリモート管理の根幹です。非常に強力で、通常は初期設定のままでも安全ですが、SSHはブルートフォース攻撃、辞書攻撃、クレデンシャルスタッフィングを介して不正アクセスを試みる悪意のある攻撃者にとって主要な標的でもあります。
新しいLinuxデプロイメントを保護する上で、SSH構成の強化は最も重要なステップであると言えます。ユーザー名とパスワードによる単純な認証を超え、いくつかの核となるベストプラクティスを実装することで、攻撃対象領域を大幅に縮小し、ログ内のノイズを最小限に抑え、安全な方法を使用する正規のユーザーのみがシステムにアクセスできるようにすることができます。
このガイドでは、あらゆるLinuxディストリビューションでSSHサービスを保護するための不可欠で実用的な手順を、主要な設定ファイルである/etc/ssh/sshd_configに焦点を当てて説明します。
前提条件:設定のバックアップ
SSHデーモンの設定ファイル(sshd_config)に変更を加える前に、バックアップを作成することが重要です。不適切な設定は、サーバーからロックアウトされる原因となる可能性があります。常に変更を徹底的にテストしてください。
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%F)
ファイルを編集した後、サービスを再起動する前に構文をチェックしてください。
sudo sshd -t
テストに合格した場合、安全にSSHサービスを再起動できます(コマンドはディストリビューションによって異なります)。
# systemdを使用するシステムの場合(ほとんどのモダンなディストリビューション)
sudo systemctl restart sshd
1. rootログインを無効にする
rootユーザーとしての直接ログインを許可することは、最大のセキュリティリスクの一つです。攻撃者がパスワードをブルートフォース攻撃で破った場合、システムを即座に完全に制御されてしまいます。その代わりに、非rootユーザーが最初にログインし、sudoを使用して権限を昇格させるべきです。
設定手順
/etc/ssh/sshd_configを開き、PermitRootLoginディレクティブを見つけて、その値をnoに変更します。
# Before:
# PermitRootLogin yes
# After (Best Practice):
PermitRootLogin no
重要事項
rootログインを無効にする前に、
sudo権限を持つ標準ユーザーを少なくとも1人作成し、設定しておくことを確認してください。そうしないと、管理者アクセスができなくなります。
2. 鍵ベースの認証を必須にする
パスワード認証は、ブルートフォース攻撃や辞書攻撃に対して脆弱です。SSH鍵は、公開鍵(サーバー上)と秘密鍵(クライアント上)で構成されており、その極めて高い複雑さと長さにより、大幅に強力なセキュリティを提供します。
A. 鍵の生成とインストール
- 鍵ペアの生成(ローカルクライアントマシンで):
bash ssh-keygen -t ed25519 -C "[email protected]" - 公開鍵のコピー(サーバーへ):
bash ssh-copy-id -i ~/.ssh/id_ed25519 user@your_server_ip
B. パスワード認証の無効化
SSH鍵を使用して正常にログインできることを確認したら、パスワード認証を完全に無効にします。
# パスワードを無効にする
PasswordAuthentication no
# 鍵が有効であることを確認する
PubkeyAuthentication yes
ベストプラクティス: Ed25519やRSA 4096ビットのような強力な鍵タイプを使用してください。秘密鍵は常に強力なパスフレーズで保護してください。
3. デフォルトのSSHポートを変更する(多層防御)
デフォルトのSSHポート(TCPポート22)は、自動ボットによって常にスキャンされています。ポートを高い非標準番号(例:2222、22222、または30000以上)に変更することで、サーバーログのノイズ量を大幅に減らし、一般的なスキャナーから見えなくなります。
設定手順
/etc/ssh/sshd_configで、Portディレクティブを変更します。
# Before:
# Port 22
# After (Example non-standard port):
Port 22222
警告:ファイアウォールの調整が必要です
ポートを変更した場合、新しいポートでのトラフィックを許可するようにファイアウォール(例:
iptables、firewalld、またはAWS Security Groups)を必ず更新する必要があります。これを怠ると、即座に接続が失われます。
firewalldを使用する場合の例(CentOS/RHEL):
sudo firewall-cmd --permanent --add-port=22222/tcp
sudo firewall-cmd --reload
4. 特定のユーザーとグループにアクセスを制限する
厳格なアクセス制御を適用するためには、SSH経由で接続を許可するユーザーやグループを明示的に定義する必要があります。これにより、アカウントが侵害されたり未使用であったりしても、潜在的な侵入点を制限できます。
設定ディレクティブ
sshd_configで、以下のディレクティブのいずれか、または両方を使用します。
- 特定のユーザーを許可する:
config AllowUsers alice bob - 特定のグループを許可する:
config AllowGroups sshaccess admins
これらのディレクティブが存在する場合、明示的にリストされていないユーザーまたはグループはアクセスを拒否されます。
5. より強力なプロトコルと暗号を強制する
最新かつ安全なSSHプロトコル2を使用し、強力な暗号スイートとメッセージ認証コード(MAC)の使用を強制するようにしてください。
設定手順
古くて脆弱なプロトコルが無効になっていることを確認します。
Protocol 2
# 安全でないレガシー認証メソッドを拒否する
HostbasedAuthentication no
IgnoreRhosts yes
最新のSSH実装はデフォルトで適切に設定されていることが多いですが、強力な暗号スイートとMACを明示的に定義することで、ダウングレード攻撃を防ぐことができます。
推奨される最小限のセットは以下の通りです。
Ciphers [email protected],[email protected]
MACs hmac-sha2-512,hmac-sha2-256
6. レート制限と侵入検知を実装する(Fail2Ban)
鍵ベースの認証が導入されていても、ボットによる継続的なプローブはリソースを消費し、ログを乱雑にします。Fail2Banは、ログイン失敗の試行(またはその他の疑わしいアクティビティ)をログから監視し、発信元IPアドレスを一時的または永続的に禁止するようにファイアウォールを動的に調整する重要なツールです。
インストールと設定(一般的な手順)
-
Fail2Banのインストール:
```bash
# Debian/Ubuntu
sudo apt update && sudo apt install fail2banRHEL/CentOS/Fedora
sudo dnf install fail2ban
`` 2. **SSH Jailの設定:** Fail2Banは「jail」と呼ばれる設定を使用します。デフォルトのsshdjailは、SSHサービスでの繰り返しの失敗を/var/log/auth.log`(または同等のログファイル)で監視し、一時的な禁止を自動的に適用するのに非常に効果的です。 -
サービスの実行を確認する:
bash sudo systemctl enable fail2ban sudo systemctl start fail2ban
Fail2Banは自動ブルートフォース攻撃を大幅に軽減し、インターネットに接続されたサーバーには必須と考えられています。
7. その他の重要なSSH強化ディレクティブ
これらのわずかな調整は、セッションを管理し、潜在的な攻撃ウィンドウを減らすのに役立ちます。
| ディレクティブ | 推奨値 | 目的 |
|---|---|---|
ClientAliveInterval |
300 | 300秒(5分)ごとにヌルパケットを送信し、セッションを維持します。 |
ClientAliveCountMax |
3 | 切断されるまでの「生存確認」失敗の最大回数(合計アイドル時間15分)。 |
UsePAM |
yes | 追加のローカルシステムセキュリティポリシーのためにPluggable Authentication Modules (PAM)を有効にします。 |
PermitEmptyPasswords |
no | 空のパスワードを持つユーザーのログインを禁止します(デフォルトでnoであるべきです)。 |
強化チェックリストの概要
このチェックリストを使用して、サーバーが基本的なSSH強化基準を満たしていることを確認してください。
- [ ] 変更を加える前に
sshd_configをバックアップする。 - [ ]
PermitRootLogin noを設定する。 - [ ]
PasswordAuthentication noを設定する(鍵設定後)。 - [ ]
Portを非標準の値に変更する。 - [ ] 新しいポートを許可するようにファイアウォールを更新する。
- [ ] アクセスを制限するために
AllowUsersまたはAllowGroupsを使用する。 - [ ]
Protocol 2を設定する。 - [ ] Fail2Banをインストールして設定する。
- [ ] 再起動する前に
sshd -tで設定をチェックする。
これらのベストプラクティスを実装することで、SSHを潜在的な負債から非常にセキュアなリモート管理チャネルへと変えることができます。