SSH(セキュアシェル)プロトコルとは?基礎から解説

サーバー管理者が毎日のように打っているあのコマンド、sshの裏側で実際に何が起きているのかを見ていきましょう。

SSH(セキュアシェル)とは

SSHは、クライアントとサーバーの間の通信区間全体を暗号化するプロトコルで、途中で誰かがトラフィックを傍受しても内容を読み取れないようにします。標準ではTCPの22番ポートを使い、Linux・UNIXサーバーの管理からクラウドインスタンスへの接続、開発者のリモート作業まで、サーバーを扱うほぼすべての場面で標準的に使われています。

なぜTelnetの代わりにSSHを使うのか

SSH以前に広く使われていたTelnetは、ログインIDとパスワードを含むすべてのデータを暗号化せずそのまま送信していました。同じネットワーク区間にいる誰かがパケットを覗くだけでログイン情報やコマンドの内容がそのまま漏れてしまうため、この問題を解決するためにSSHが登場し、今ではリモート管理でTelnetが使われることはほとんどありません。

パスワード認証と公開鍵認証

IDとパスワードでログインする方式のほかに、秘密鍵は自分のコンピューターにだけ置き、公開鍵だけをサーバーに登録してログインする公開鍵認証がより安全な方法として推奨されています。接続時にサーバーが公開鍵で暗号化した値を送り、それを復号できるのは秘密鍵を持つ側だけであるという事実で本人確認を行うため、パスワードを一切送信せずに済み、総当たり攻撃のリスクを大きく減らせます。このためサーバー運用者の中には、パスワードログインを完全に無効化し公開鍵認証のみを許可しているケースも多くあります。

SSHでできること

SSHは単にログインしてシェルコマンドを実行するだけの用途にとどまりません。同じ暗号化された接続の上でファイルをやり取りするSCPやSFTP、リモート側の特定のポートを自分のローカルポートに安全につなぐポートフォワーディング(トンネリング)、SSH鍵認証をそのまま活用するGitリモートリポジトリへのアクセスなど、いずれもSSHプロトコルの上で動作しています。

SSH鍵を管理する際に気をつけたいこと

秘密鍵ファイルには必ず別途パスフレーズを設定しておくべきです。パスフレーズのない鍵は流出した瞬間にそのまま悪用されてしまいます。また、初めて接続するサーバーのホスト鍵のフィンガープリントが見慣れないものとして表示されたとき、安易に受け入れないことも重要で、これは中間者攻撃によって偽のサーバーに接続させられていないかを確認する最低限の安全策です。使わなくなった鍵や流出の疑いがある鍵は、サーバーのauthorized_keysからすぐに削除しましょう。

SSHポートフォワーディング(トンネリング)の考え方

例えば社内ネットワーク内からしかアクセスできないデータベース管理画面があるとします。その社内ネットワークに到達できるサーバーにSSHでログインし、ローカルポートフォワーディングを設定すれば、まるで自分のパソコンから直接そのサービスに接続しているかのように使うことができます。このトラフィックはすでに暗号化されたSSH接続の中を通るため、VPNを別途構築しなくても特定のサービス1つだけを安全に迂回アクセスできる実用的な方法として広く使われています。

初めて接続する瞬間に何が起きているか

初めて新しいサーバーに接続すると、SSHはそのサーバーのホスト鍵のフィンガープリントを表示し、続行する前に確認を求めます。これは中間者攻撃によって知らないうちに偽のサーバーへすり替えられていないかを防ぐための仕組みです。一度受け入れるとそのフィンガープリントはローカルに保存され、以後もし内容が一致しなければ(例えば誰かが接続を傍受している場合など)、黙って接続する代わりに強い警告が表示されるようになります。

SSHを格段に楽にする設定ファイル

毎回長いユーザー名・ホスト名・ポート番号・鍵ファイルを入力する代わりに、~/.ssh/configファイルを使えば各サーバーに短いエイリアスを一度だけ設定しておき、以降は「ssh myserver」と打つだけで接続できます。複数台のサーバーに定期的に接続するようになったら、すぐに元が取れる小さな設定作業です。

よくある質問

SSHの標準ポート(22番)を変えると、より安全になりますか?

ポートを変えても根本的なセキュリティレベルが上がるわけではありませんが、22番ポートを無差別にスキャンして接続を試みる自動化された攻撃を減らす効果はあります。あくまで補助的な対策であり、パスワードログインを無効化して公開鍵認証のみを許可するといった根本的な設定のほうがはるかに重要です。

SSHとVPNは同じものですか?

いいえ、それぞれ目的が異なる技術です。SSHは特定のサーバーやサービスへの接続・トンネリングに焦点を当てているのに対し、VPNは一般的に機器のネットワークトラフィック全体(またはその大部分)を暗号化された経路にルーティングする、より広い範囲を扱う技術です。