はじめに
この実験では、キー認証と設定の強化を通じて、OpenSSH で SSH セキュリティを強化するための重要な技術を学びます。パスワード認証を安全なキーペアに置き換え、root ログインを無効にし、デフォルトのポートを変更してブルートフォース攻撃を軽減する方法を実践します。
実践的な演習では、暗号化キーの生成、適切なファイルパーミッションの設定、および安全な SSH 設定のテストを行います。また、SSH サービスの管理とセキュリティ設定の検証に必要な重要なコマンドも学びます。
OpenSSH をインストールする
このステップでは、LabEx の仮想マシン (VM) に OpenSSH サーバーパッケージをインストールします。OpenSSH (Open Secure Shell) は、SSH プロトコルの無料でオープンソースの実装で、信頼できない 2 つのホスト間で、不安全なネットワークを介して安全な暗号化通信を提供します。これは、リモートサーバー管理や安全なファイル転送に使用される標準的なツールです。
始める前に、SSH がクライアント - サーバーモデルで動作することを理解することが重要です。サーバー (ここでインストールするもの) は着信接続を待ち受け、クライアント (ローカルマシンのターミナルなど) はそれに接続します。すべての通信は暗号化されており、認証情報とデータを保護します。
LabEx VM は Docker コンテナを使用しており、systemctl は利用できません (Docker コンテナは通常、完全なオペレーティングシステムではなく単一のプロセスを実行します)。そのため、SSH デーモンの管理には service コマンドを使用します。これは systemctl のシンプルな代替手段で、コンテナ化された環境でもうまく機能します。
OpenSSH をインストールするには、以下の手順に従ってください。
まず、最新バージョンを取得できるように、パッケージリストを更新します。これにより、Ubuntu のリポジトリから最新のパッケージ情報が取得されます。
sudo apt updateOpenSSH サーバーパッケージをインストールします。
-yフラグを使用すると、インストール中のプロンプトを自動的に承認します。sudo apt install -y openssh-serverインストール後、SSH サービスが実行中かどうかを確認します。
statusコマンドを使用すると、サービスがアクティブで接続を待ち受けているかどうかがわかります。service ssh statusサービスがアクティブ (実行中) であることを示す出力が表示されるはずです。実行されていない場合は、次のステップで起動します。
サービスが実行されていない場合 (ステータス出力で「inactive」と表示される)、手動で起動します。
service ssh startSSH がデフォルトのポート (22) で待ち受けていることを確認します。
netstatコマンドはネットワーク接続と待ち受けポートを表示し、grepは SSH 関連のエントリをフィルタリングします。sudo netstat -tulnp | grep sshd次のような出力が表示され、SSH がすべてのネットワークインターフェイス (0.0.0.0) のポート 22 で待ち受けていることがわかります。
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
鍵認証を設定する
このステップでは、SSH のキーベース認証を設定します。これは、従来のパスワード認証よりも高いセキュリティを提供します。推測やブルートフォース攻撃の対象となりうるパスワードとは異なり、キー認証では一対の暗号化キーを使用します。一方は秘密に保持する秘密鍵、もう一方はサーバーと共有する公開鍵です。
SSH サーバーに接続するとき、サーバーは数学的アルゴリズムを使用して、サーバーに保存されている公開鍵に対応する秘密鍵を持っていることを検証します。この方法は、セットアップ後にはより安全で便利です。
これらのキーを段階的に作成して設定しましょう。
まず、新しい SSH キーペアを生成します。このコマンドは、
~/.sshディレクトリに 2 つのファイルを作成します。ssh-keygen -t rsa -b 4096 -f ~/.ssh/labex_key -N ""-t rsaはキーのタイプ (RSA アルゴリズム) を指定します。-b 4096は強力な 4096 ビットのキーを作成します。-fはキーペアのファイル名を設定します。-N ""はパスフレーズを設定しないことを意味します (実験の簡略化のため)。
これで以下のファイルができます。
- 秘密鍵:
~/.ssh/labex_key(これは決して共有しないでください!) - 公開鍵:
~/.ssh/labex_key.pub(これをサーバーと共有します)
適切なファイルパーミッションは SSH セキュリティに不可欠です。これらのコマンドは、あなただけがキーにアクセスできるようにします。
chmod 700 ~/.ssh chmod 600 ~/.ssh/labex_key chmod 644 ~/.ssh/labex_key.pub次に、公開鍵を SSH がチェックする特別な
authorized_keysファイルに追加することで、キーを承認します。cat ~/.ssh/labex_key.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys次に、SSH サーバー自体を設定します。メインの設定ファイルを編集します。
sudo nano /etc/ssh/sshd_config次の重要な設定を見つけて変更します。
PubkeyAuthentication yes PasswordAuthentication noこれは SSH に以下のことを指示します。
- キー認証を許可する (デフォルトで有効ですが、確認すると良いです)
- パスワードログインを無効にする (キーベースのアクセスのみを強制する)
設定を変更した後は、必ず SSH サービスを再起動します。
service ssh restart最後に、すべてが正常に動作することを確認しましょう。新しいキーを使用して自分のマシン (localhost) に接続してみます。
ssh -i ~/.ssh/labex_key localhost-iフラグは使用する秘密鍵を指定します。成功すると、パスワードプロンプトなしですぐにログインできます。これにより、キー認証が正しく動作していることが確認できます。
root ログインを無効化する
このステップでは、SSH を通じた直接のルートログインを無効にします。これは、ルートアカウントがシステムの全権限を持っているため、ハッカーの主要な標的となるから重要です。ルートログインを無効にすることで、攻撃者にユーザー名とパスワードの両方を推測させることになり、ブルートフォース攻撃をはるかに困難にします。
この変更後にルート権限が必要になった場合は、まず通常のユーザーアカウントでログインし、その後 sudo を使用して管理タスクを実行します。これにより、攻撃者が 2 つのアカウントを侵害する必要があるため、追加のセキュリティ層が形成されます。
SSH の設定を変更しましょう。
まず、テキストエディタで SSH のメイン設定ファイルを開きます。ここでは nano を使用しますが、使い慣れたエディタを使用して構いません。
sudo nano /etc/ssh/sshd_configPermitRootLoginと書かれた行を探します (通常は 32 行目付近)。見つからない場合は、追加する必要があります。この行を次のように変更または追加します。PermitRootLogin noこのファイルを編集している間に、この変更と相性の良い追加のセキュリティパラメータを設定しましょう。
StrictModes yes MaxAuthTries 3 LoginGraceTime 60StrictModesはセキュリティのためにファイルパーミッションをチェックします。MaxAuthTriesはログイン試行の失敗回数を制限します。LoginGraceTimeはログインに許可される時間を設定します。
nano で変更を保存するには、次のキーを押します。
- Ctrl+O で書き出します。
- Enter で確認します。
- Ctrl+X で終了します。
変更を有効にするには、SSH サービスを再起動します。
service ssh restart変更が機能していることをテストするために、ルートとして SSH で接続してみましょう (これは失敗するはずです)。
ssh root@localhost「Permission denied (publickey)」のようなエラーが表示されるはずです。これは、セキュリティ対策が正しく機能していることを意味します。これ以降、通常のユーザーアカウントを使用してログインする必要があります。
デフォルトポートを変更する
このステップでは、SSH のデフォルトポートを 22 から任意のポート(この例では 2222)に変更します。多くの自動化されたボットや攻撃者が標準ポート 22 で SSH サーバーをスキャンしているため、これは重要なセキュリティ対策です。標準外のポートに変更することで、自動スキャンからサーバーを見つけにくくします。
変更を行う前に、まず現在の SSH ポート設定を確認しましょう。これにより、既存の設定を理解することができます。
sudo grep -i port /etc/ssh/sshd_config
通常、出力に #Port 22 が表示されます。# 記号はこの行がコメントアウトされていることを意味するため、SSH は現在デフォルトのポート 22 を使用しています。
次に、SSH の設定ファイルを編集します。初心者に使いやすい nano テキストエディタを使用します。
sudo nano /etc/ssh/sshd_config
ファイル内で #Port 22 を含む行を探します。ここで 2 つの変更を行う必要があります。
#を削除して行のコメントアウトを解除します(これにより設定が有効になります)。- ポート番号を 22 から 2222 に変更します。
変更後の行は次のようになります。
Port 2222
この変更を行った後、nano でファイルを保存するには、次のキーを押します。
- Ctrl+O(ファイルを書き出す)
- Enter(ファイル名を確認する)
- Ctrl+X(エディタを終了する)
変更を有効にするには、SSH サービスを再起動する必要があります。
service ssh restart
SSH がデフォルトポートではなく新しいポート(2222)で待機していることを確認しましょう。
sudo netstat -tulnp | grep ssh
出力には SSH がポート 2222 で待機していることが表示されるはずです。まだポート 22 が表示される場合は、設定ファイルの変更を再度確認してください。
最後に、任意のポートを使用して SSH に接続することで、新しい設定をテストします。ここでは -p フラグでポートを指定する必要があることに注意してください。
ssh -p 2222 -i ~/.ssh/labex_key localhost
正常に接続した後は、Ctrl+D を押して SSH セッションを終了できます。以降、SSH サーバーに接続する際には常にこの任意のポートを指定する必要があることを忘れないでください。
強化設定のテスト
この最後のステップでは、あなたが実施したすべてのセキュリティ強化対策を検証します。テストは、SSH サーバーが適切に設定され、安全であることを確保するために重要です。サーバー側の設定とクライアント側の接続試行の両方を調べます。
まず、サーバー上の現在の SSH 設定を確認しましょう。これにより、前に行った変更が有効になっていることが確認できます。
まず、現在のすべての SSH 設定を検証します。
sudo sshd -T | grep -E 'port|permitrootlogin|passwordauthentication|pubkeyauthentication'sshd -Tコマンドは実際のランタイム設定を表示します。重要なセキュリティパラメータをフィルタリングしています。次のような出力が表示されるはずです。port 2222 permitrootlogin no passwordauthentication no pubkeyauthentication yesこの出力は、SSH がポート 2222 で実行されていること、ルートログインが無効になっていること、パスワード認証がオフになっていること、および公開鍵認証が有効になっていることを確認します。
次に、クライアントの観点から接続をテストしましょう。
鍵認証による正常な接続をテストします。
ssh -p 2222 -i ~/.ssh/labex_key localhost "echo 'Key auth successful'"これは、あなたの秘密鍵を使用して接続を試みます(
-iフラグで鍵ファイルを指定します)。接続に成功すると、サーバー上で単純な echo コマンドが実行されます。次のような出力が表示されるはずです。Key auth successfulルートログイン試行の失敗をテストします。
ssh -p 2222 root@localhost 2>&1 | grep -i "permission denied"これはルートとしてログインを試みますが、ルートログインを無効にしているため失敗するはずです。コマンドは予想されるエラーメッセージをフィルタリングします。
パスワード認証試行の失敗をテストします。
ssh -p 2222 -o PreferredAuthentications=password -o PubkeyAuthentication=no localhost 2>&1 | grep -i "permission denied"ここでは、パスワード認証を強制的に試みます(設定で無効にしています)。これにより、パスワード認証が適切にブロックされていることを検証します。オプションで明示的に鍵認証を無効にしています。
最後に、サーバーのネットワーク状態を確認しましょう。
アクティブな SSH 接続を確認します。
sudo netstat -tulnp | grep 2222これはすべての待機ポートを表示し、任意の SSH ポート(2222)にフィルタリングします。
sshdがこのポートで待機していると表示されるはずです。SSH サービスの状態を確認します。
service ssh statusSSH サービスが正常に実行されていることを確認します。出力にはサービスがアクティブであることが示されるはずです。
まとめ
この実験では、OpenSSH の SSH セキュリティを実践的な設定を通じて強化する方法を学びました。演習では、OpenSSH サーバーのインストール、その状態の確認、および適切なパーミッション設定を伴う鍵ベースの認証の実装がカバーされています。
また、ルートログインの無効化や SSH のデフォルトポートの変更など、重要なセキュリティ強化技術を探索しました。これらの対策は、システムの機能を維持しながら、ブルートフォース攻撃や自動スキャンに対する脆弱性を効果的に低減します。


