概要
SSH(Secure Shell)は、リモートのLinuxサーバー管理に不可欠な標準ネットワークプロトコルです。本記事では、Ubuntu環境におけるOpenSSHサーバーの構築からパスワード不要の公開鍵認証、実務ネットワーク接続のためのSSHポートフォワーディング、および必須のセキュリティ強化のポイントまで、ステップバイステップで解説します。
1. OpenSSHサーバーのインストールとサービスの有効化
Ubuntuシステムでリモート接続サービスを提供するために、最新のパッケージリストを更新し、openssh-serverパッケージをインストールします。

インストールしたSSHサービスをブート時に自動起動するよう有効化し、直ちに起動するために systemctl enable --now ssh コマンドを実行します。

SSHサービスデーモン(sshd)が現在アクティブ状態(active (running))で正常に稼働しているか確認します。

SSHのデフォルトポートである22番ポートで受信待機(LISTEN)状態としてネットワーク接続を待機しているか確認するため、ss -tulpn | grep :22 コマンドを実行します。

2. パスワード不要の接続のためのSSH鍵ペアの生成と登録
SSH鍵ファイルを安全に保管するための ~/.ssh ディレクトリを作成し、所有者のみがアクセスできるようにパーミッションを 700 に設定します。

セキュリティとパフォーマンスに優れたEd25519アルゴリズムに基づく鍵ペアが存在しない場合に新規生成するため、test -f ~/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519 コマンドを実行します。
コマンドの実行結果から、秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)が正常に生成されたことが確認できます。

生成された公開鍵の内容を、認証許可リストファイルである ~/.ssh/authorized_keys に追記登録します。

認証鍵リストファイルのセキュリティを維持し、SSHデーモンの厳格な権限チェックを通過させるため、authorized_keys ファイルのパーミッションを 600 に制限します。

生成したEd25519秘密鍵を指定してローカルループバック(127.0.0.1)アドレスへの接続を試み、鍵ベースの認証が正常に動作するか検証します。
コマンドの実行結果として、パスワードの入力なしでローカルの鍵認証接続に成功したメッセージが出力されます。

3. 実務ネットワークトンネリング:SSHポートフォワーディングの実践
Webサーバーの稼働およびHTTPリクエストのテストを行うため、最新のパッケージリストを更新し、curl と python3 パッケージをインストールします。

ポートフォワーディングのテストに使用するWebドキュメントディレクトリを作成し、テスト用HTMLファイルを作成するために mkdir -p /tmp/webroot && echo '<h1>SSH Tunnel Test OK</h1>' > /tmp/webroot/index.html コマンドを実行します。

内部サービスの役割を果たす簡易Webサーバーを8080番ポートでバックグラウンド実行するため、python3 -m http.server 8080 --directory /tmp/webroot >/dev/null 2>&1 & コマンドを実行します。

ローカルの9090番ポートに届くリクエストをSSH暗号化トンネル経由で対象サーバーの8080番ポートへ転送するように、ローカルポートフォワーディングをバックグラウンドで実行します。
コマンド実行後、ターミナルセッションを占有することなくバックグラウンドで安全にポートフォワーディングトンネルが生成されます。

SSHトンネル経由でフォワーディングされたローカルの9090番ポートへHTTPリクエストを送信し、内部Webサーバーへの接続が正常に中継されているか検証します。
コマンドの実行結果として内部8080番Webサーバーのレスポンス内容である <h1>SSH Tunnel Test OK</h1> が出力され、ポートフォワーディングが完璧に動作していることが確認できます。

ポートフォワーディングのテスト完了後、バックグラウンドで動作していたテスト用Webサーバープロセスを安全に終了するため、pkill -f 'http.server 8080' コマンドを実行します。

4. 実務向けSSHサーバーセキュリティ強化設定(sshd_config)
設定変更中に発生するおそれのある万が一の事態に備え、元の設定を保持するために sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak コマンドで設定ファイルをバックアップします。

セキュリティ強化のため、rootアカウントによる直接のリモートログインを全面的に遮断するように sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config コマンドを実行して設定値を変更します。

修正したSSHサーバー設定ファイルに構文エラーやタイプミスがないか事前に安全に検証するため、sudo sshd -t コマンドを実行します。
コマンド実行後にエラーメッセージが一切出力されないことで、設定構文に問題がないことを確認します。

設定ファイルにrootログイン遮断オプション(PermitRootLogin no)が正しく反映されているか確認するため、grep -E '^(PermitRootLogin|PasswordAuthentication)' /etc/ssh/sshd_config || echo '설정 검증 완료' コマンドを実行します。
コマンド実行結果として PermitRootLogin no が正常にヒットし、セキュリティ設定が完璧に適用されていることを確認します。

ここまで、Ubuntu環境におけるSSHの基本接続からポートフォワーディング、必須のセキュリティ設定まで、実務に必要な核心的な内容を整理しました。
ご紹介したセキュリティのベストプラクティスを一つずつ適用し、より安全で効率的なサーバー管理環境を構築してみてください。