セキュリティ · 1 min read · Dec 28, 2025
LinuxのためのOpenSSHセキュリティ強化ガイド

SSHは、Linuxプラットフォーム上でのシステム管理に最も広く使用されているプロトコルの1つです。Unix、Linux、MacOSに基づく多くのオペレーティングシステムで利用可能です。これはクライアント-サーバーモデルに基づいており、1台のマシンがサーバーコンポーネントを実行し、もう1台がクライアントツールを使用してアクセスします。
SSHはどのように機能しますか?
クライアント(ssh)は、サーバーにリクエストを送信することによって接続を開始します。サーバーは、サーバーデーモン(sshd)を使用して、受信リクエストを待機します。サーバーは、自身を接続しようとしているクライアントに認証するために公開鍵を使用します:
このようにして、クライアントは正しいSSHサーバーに接続していることを確認できます。これが完了すると、クライアントはサーバーにアクセスできます。Windowsクライアントを使用している場合は、puttyなどのツールを使用してサーバーに接続する必要があります。クライアントとサーバーは同じシステムにインストールできます。これは、クライアントツールを使用して他のマシンにアクセスするか、システム自体が他の人によってアクセスされるサーバーになることを意味します。その場合、設定ファイルは同じディレクトリに配置されますが、少し異なる名前になります。ディレクトリの場所は「/etc/ssh」で、sshクライアント設定ファイルの名前は「ssh_config」、サーバーの設定ファイルの名前は「sshd_config」です:

システムに両方のファイルがある場合は、どのファイルを構成する必要があるかを賢く選択する必要があります。ほとんどの場合、セキュリティのために構成する必要があるのはサーバーです。これは、システムへの潜在的なアクセスの扉を開くからです。
まず、サーバー上のSSHデーモンまたはsshdのステータスを確認します。この方法で、実行中であり、ブート時に自動的に開始されるように有効になっているかどうかを確認できます。以下のコマンドでsshdのステータスを確認します:
$ systemctl status ssh.service
または、以下のコマンドを使用します:
$ systemctl status sshd.service

スクリーンショットから、サービスがアクティブで有効であることがわかります。過去6時間にわたって実行されています。右矢印を押してターミナルビューを展開すると、デフォルトのポート22でリッスンしていることに気付くでしょう。
時々、SSH自体を使用してリモートシステムのSSH設定ファイルを変更することがあります。その場合、再起動コマンドの代わりにリロードコマンドを使用する必要があります。この方法で、切断される可能性が低くなります。
ベストプラクティスを使用したSSHの構成
SSHサーバーの設定を構成する時が来たと思います。SSH設定ファイルに手を加える前に、デフォルト設定のファイルのバックアップを作成する必要があります:
$ sudo cp /etc/ssh/sshd_config ~/sshd_config.bkp
バックアップを実行した後、メインファイルを弄ってSSHが壊れてしまった場合でも、バックアップファイルを使用して元に戻すことができることが保証されます。
1. デフォルトポートの変更
sshdデーモンはデフォルトでサーバーのポート22でリッスンします。この値を他の番号に変更することをお勧めします。これは、スクリプトを使用した自動攻撃の範囲を減らすためです。このアプローチは、曖昧さによるセキュリティと呼ばれます。これを行うには、以下のファイルを開き、「#Port 22」というテキストを含む行を探します:
$ sudo nano /etc/ssh/sshd_config
「#Port 22」の行のコメントを解除し、「22」をシステムで使用されていない他のポート番号に変更します。私たちはそれを「222」に変更し、サービスを再起動しました。次に、オプション「-p」を使用して新しいポートを指定してsshコマンドを使用します:
$ ssh user@system_ip -p 222
2. ルートユーザーとしてのログインを無効にする
ルートは、システム上のすべてのリソースにアクセスできるLinuxシステムの最上位ユーザーです。厳密なルートアクセスが必要ない場合は、サーバーでのルートログイン機能を無効にするべきです。これを行うには、上記のファイルを開きます:
$ sudo nano /etc/ssh/sshd_config
そして、「PermitRootLogin」パラメータを「no」に設定します。これにより、サーバーはルートアカウントをターゲットにしたランダムな攻撃から保護されます。デフォルトオプションは「prohibit-password」で、これは公開鍵認証に基づくログインを許可しますが、パスワードベースのログインを拒否します。
3. プロトコルバージョンの設定
SSHの古いプロトコルバージョンは1で、SSH2と比較して安全性が低く、異なるネットワーキング実装を持ち、互換性もありません。サーバーでどのプロトコルバージョンがアクティブかを確認するには、再度sshd_configファイルを開き、「Protocol」という行を探します:
$ cat /etc/ssh/sshd_config | grep ‘Protocol’
出力が空の場合、OpenSSHはおそらくバージョン2を使用しています。これは私たちのケースでもそうでした。別の方法は、netcatコマンドユーティリティを使用することです:
$ nc localhost 22
サンプル出力:
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4
出力から、SSH2がシステムでアクティブであることがわかります。
リモートサーバーがどのプロトコルバージョンを実行しているかを確認するには、-Q(クエリ)オプションを使用してsshクライアントで接続してみてください:
$ ssh -Q protocol-version user@server_name

上の画像は、Kali LinuxからUbuntu sshサーバーにアクセスする際のSSHバージョン2を示しています。
4. パスワードの複雑さ
弱いパスワードは常に悪用される可能性があるため、空のパスワードは悪用される可能性が高くなります。したがって、sshd_configファイルではPermitEmptyPasswordsオプションを「no」に設定する必要があります。同様に、間違ったパスワードでのログイン試行回数を制限して、ブルートフォース攻撃の可能性を減らす必要があります。これは、MaxAuthTriesオプションを3のような小さな値に設定することで実現できます。

上の画像から、MaxAuthTriesの値を3に設定すると、3回の間違ったパスワードの後にSSHが拒否されることがわかります。もう1つの重要なセキュリティ側面は、ログインに公開鍵認証を使用することです。鍵ベースの認証モデルは、ブルートフォース攻撃に対して脆弱性が低くなります。同様に、SSHサーバーをさらに強化するためにPAM認証モジュールを使用することもできます。
結論
このガイドでは、SSHサーバーを保護するための最も重要なポイントをカバーし、それらを4つの主要なポイントにまとめようとしました。このガイドは完全なものではありませんが、SSHサーバーをさらに強化するための他の領域を見つけることもできます。例えば、SSHを介してシステムを使用するユーザーに警告するバナーを追加することができます。また、パスワードでのログインを拒否し、パスワードなしのログインのために鍵ベースの認証を使用することもできます。もう1つの興味深い点は、SSHユーザーの数と接続時間を制限できることです。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。