はじめに (対象読者・この記事でわかること)
この記事は、Linuxサーバーの管理者やVPSを利用している方、SSHのセキュリティ設定をより細かく制御したい方を対象にしています。SSH接続の柔軟性を高めつつ、特定のポートからのアクセスに対して異なる認証方式やアクセス制限を設けたいと考えている方にとって、この記事は非常に役立つでしょう。
この記事を読むことで、sshd_config ファイルの Match ディレクティブを効果的に利用し、SSHのポートごとに異なる設定(例:パスワード認証の有効/無効、許可ユーザーの指定など)を適用できるようになります。これにより、サーバーのセキュリティレベルを向上させながら、運用上の利便性も確保できるようになるでしょう。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
* Linuxの基本的なコマンド操作(ファイル編集、サービス管理など)
* SSHの基本的な仕組みと接続方法
* sudo コマンドの使用経験
* firewall-cmd または ufw などのファイアウォール設定の基礎知識
なぜSSHポートごとに設定を変えたいのか?:柔軟なセキュリティと運用管理
一般的なSSHサーバーの設定では、sshd_config に記述された内容がすべてのSSH接続に適用されます。しかし、実際の運用では、以下のような特定のニーズが発生することがあります。
- 特定のポートからのアクセスには、より厳しい認証を課したい:例えば、通常利用するポートでは鍵認証のみを許可し、パスワード認証を禁止したい。しかし、緊急時や特定の目的のために、別のポートでは一時的にパスワード認証を許可する必要がある、といったケースです。
- 開発者向け、運用管理者向けなど、ユーザーグループによってアクセス権限や認証方式を変えたい:特定のポートを経由した接続では、特定の開発者グループに限定し、パスワード認証を許可しつつ、シェルへのログイン時に強制的に特定のコマンドを実行させたい、などの要求です。
- セキュリティの多層化:異なるポートに異なるセキュリティポリシーを適用することで、一つの設定ミスがサーバー全体に及ぼす影響を限定し、セキュリティリスクを分散させることができます。例えば、外部に公開するポートと内部のみで利用するポートで設定を分けるなどです。
- 監査やログ管理の容易化:特定のポートからの接続に独自のログ設定やForceCommandを設定することで、そのポート経由の操作をより詳細に追跡・監査することが可能になります。
これらの課題を解決するためには、ポートごとに異なるSSH設定を適用する機能が必要です。OpenSSHの sshd_config に用意されている Match ディレクティブは、まさにこのニーズに応えるための強力な機能となります。次のセクションでは、この Match ディレクティブを使った具体的な設定方法について解説します。
sshd_config の Match ディレクティブでSSHポートごとの設定をカスタマイズする
ここでは、sshd_config の Match ディレクティブを使用して、SSHポートごとに異なる設定を適用する具体的な手順と設定例を解説します。
ステップ1: sshd_config のバックアップと基本設定の確認
まず、設定を変更する前に現在の sshd_config ファイルをバックアップしておきましょう。万が一問題が発生した場合に元に戻せるようにするためです。
Bashsudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak_$(date +%Y%m%d%H%M%S)
次に、sshd_config を編集し、複数のポートでSSHサービスをリッスンするように設定します。通常、デフォルトのSSHポートは22番ですが、ここでは例えば22番と2222番の2つのポートを使用すると仮定します。
sshd_config をテキストエディタで開きます。
Bashsudo vi /etc/ssh/sshd_config
以下の行を見つけるか、追加してください。
Port 22
Port 2222
また、全体に適用したいデフォルトのセキュリティ設定(例:パスワード認証の禁止)があれば、ここで設定しておきます。Match ブロック内の設定は、その Match ブロックの条件に合致した場合にグローバル設定を上書きします。
# 全体設定(Matchブロックで上書きされない限り適用される)
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yes
この段階でSSHサービスを再起動し、新しいポートがリッスンされていることを確認しても良いでしょう。ただし、ファイアウォールの設定を忘れないでください。
ステップ2: Match Port ディレクティブの追加と詳細設定
いよいよ Match ディレクティブを追加して、ポートごとの設定を記述していきます。sshd_config のファイルの末尾に Match ブロックを追加するのが一般的です。Match ブロック内の設定は、そのブロックの条件に合致した場合にのみ適用されます。
今回は、以下のようなシナリオを想定して設定を行います。
- ポート22 (デフォルトポート): 公開鍵認証のみを許可し、パスワード認証は完全に無効化。すべてのユーザーが接続可能。
- ポート2222 (開発者向けポート): 特定のユーザーグループ (
dev_group) に属するユーザーのみが接続可能。パスワード認証も許可するが、アクセス元IPアドレスは特定のネットワーク (192.168.1.0/24) からのみ許可する。
sshd_config の末尾に以下の設定を追加します。
Nginx# --- Matchブロックの設定 --- # ポート2222番に接続した場合の設定 Match Port 2222 # 特定のユーザーグループのみに接続を許可 # まず、対象のグループが存在するか確認・作成してください # sudo groupadd dev_group # sudo usermod -aG dev_group dev_user AllowGroups dev_group # 特定のIPアドレスからの接続のみ許可(複数指定可、CIDR形式も可) # 例: Match Port 2222 Address 192.168.1.0/24,10.0.0.1 # Matchの条件はANDで結合されます。 Address 192.168.1.0/24 # このポートではパスワード認証を許可する(グローバル設定のPasswordAuthentication noを上書き) PasswordAuthentication yes # ルートログインは禁止 PermitRootLogin no # 必要であれば、ForceCommandでログイン時に特定のコマンドを強制実行させることも可能 # ForceCommand /usr/local/bin/my_custom_script.sh
解説:
Match Port 2222: このブロック内の設定は、ポート2222番への接続に対してのみ適用されます。AllowGroups dev_group:dev_groupに属するユーザーのみがSSH接続を許可されます。これ以外のユーザーは、たとえ正しいパスワードや鍵を持っていても接続できません。事前にdev_groupを作成し、該当ユーザーをそのグループに追加しておく必要があります。Address 192.168.1.0/24:192.168.1.0から192.168.1.255までのIPアドレス範囲からのみ接続を許可します。この設定により、外部からの不正アクセスリスクを大幅に低減できます。複数のIPアドレスやネットワークを指定する場合はカンマで区切ります。PasswordAuthentication yes: このポートに限り、パスワード認証を許可します。もしグローバル設定でPasswordAuthentication noとなっていた場合でも、この設定が優先されます。PermitRootLogin no: ポート2222でもルートログインは禁止します。これはセキュリティ上のベストプラクティスです。
ステップ3: ファイアウォールの設定
新しいポート (例: 2222番) を開くためには、ファイアウォールの設定も更新する必要があります。使用しているファイアウォールツールに応じて設定を行ってください。
Firewalld (CentOS/RHEL系):
Bashsudo firewall-cmd --add-port=2222/tcp --permanent sudo firewall-cmd --reload
UFW (Ubuntu/Debian系):
Bashsudo ufw allow 2222/tcp sudo ufw reload
ステップ4: SSHサービスの再起動と動作確認
設定ファイルを保存したら、SSHサービスを再起動して変更を適用します。再起動前に sshd -t コマンドで設定ファイルの構文チェックを行うことを強く推奨します。
Bashsudo sshd -t
上記コマンドで何もエラーが出力されなければ、構文に問題はありません。
Bashsudo systemctl restart sshd sudo systemctl status sshd
サービスが正常に起動していることを確認したら、以下の方法で動作確認を行います。
-
ポート22番への接続確認 (鍵認証のみ)
- 通常のユーザーで、鍵認証を使って接続を試みます。パスワード認証を試みると拒否されるはずです。 ```bash ssh your_user@your_server_ip
または ssh -p 22 your_user@your_server_ip
```
-
ポート2222番への接続確認 (特定ユーザー、パスワード認証)
dev_groupに属するユーザー (dev_user) で、ポート2222番へパスワード認証を使って接続を試みます。bash ssh -p 2222 dev_user@your_server_ipdev_groupに属さないユーザーでポート2222番への接続を試み、拒否されることを確認します。- 許可されていないIPアドレスからポート2222番への接続を試み、拒否されることを確認します。
ハマった点やエラー解決
sshd_configの構文エラー:sshd -tコマンドでエラーが表示された場合、設定ファイルのどこかに誤りがあります。特にMatchブロック内のインデント(スペース)は必須ではありませんが、視認性を高めるため推奨されます。ディレクティブ名や値のスペルミスにも注意しましょう。- SSH接続が全くできなくなった: 最も恐れるべき事態です。これは
sshd_configの設定ミスやファイアウォールの誤設定が原因で起こります。このため、バックアップは非常に重要です。もし完全に接続できなくなった場合は、サーバーのコンソール(VPSならVNCやシリアルコンソール)からログインして設定ファイルを修正する必要があります。 - 新しいポートで接続できない: ファイアウォールが新しいポート (
2222/tcp) をブロックしている可能性が高いです。sudo firewall-cmd --list-allやsudo ufw statusでポートが開放されているか確認してください。 - 期待通りの設定が適用されない:
Matchブロック内のディレクティブが、グローバル設定を正しく上書きしているか確認してください。Matchディレクティブは、指定された条件がすべて満たされた場合にのみ適用されます。条件が複雑な場合は、条件をシンプルに分解してテストすることをお勧めします。 - ログイン時にエラーメッセージが表示される:
/var/log/auth.log(Debian/Ubuntu) や/var/log/secure(CentOS/RHEL) を確認し、SSH関連のログを追跡しましょう。接続試行の拒否理由や認証エラーの詳細が記録されています。
解決策
sshd -tの活用: 設定ファイルを変更したら必ず実行し、構文エラーがないか確認しましょう。- ファイアウォール設定の確認: 新しいポートを開放し、正しく適用されているか確認します。
- ログファイルの参照:
/var/log/auth.logや/var/log/secureはSSH関連のトラブルシューティングに不可欠です。tail -fコマンドでリアルタイムにログを監視しながら接続テストを行うと、何が問題かすぐに把握できます。 - 段階的な変更: 一度に多くの変更を加えるのではなく、小さな変更を加えてはテストするというサイクルを繰り返すことで、問題の原因特定が容易になります。
まとめ
本記事では、sshd_config の Match ディレクティブを使用して、SSHポートごとに異なる設定を適用する方法 を解説しました。
Portディレクティブで複数のポートをlisten可能にすることで、複数の接続経路を用意できます。Match Portディレクティブを活用することで、特定のポートに対してのみ異なる認証方式、アクセスユーザー/グループ、IPアドレス制限などを適用できます。sshd -tでの構文チェックとファイアウォール設定、ログファイルの確認がトラブルシューティングの鍵となります。
この記事を通して、SSHサーバーのセキュリティを向上させつつ、運用上の柔軟性を高める具体的な方法を習得できたことと思います。これにより、特定の開発者グループに限定されたアクセスを提供したり、よりセキュアな管理者用ポートを設置したりすることが可能になり、サーバー運用の安全性と利便性が大きく向上するでしょう。
今後は、Match User や Match Group をさらに活用した細かい制御や、SSHトンネリングと組み合わせた応用例についても記事にする予定です。
参考資料
