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は1995年に、フィンランドの研究者Tatu Ylönen氏が、自分の大学のネットワークで起きたパスワード盗聴事件をきっかけに開発したのが始まりとされています。その後、プロトコルは改良されてSSH-2へと発展し、2006年にIETFがRFC 4251〜4254として標準化しました。現在広く使われているOpenSSHはSSH-2に対応しており、古いSSH-1は安全性の問題から使用が推奨されていません。

鍵の種類:RSA、Ed25519など

公開鍵認証で使う鍵には、RSA、ECDSA、Ed25519などの種類があります。近年はEd25519が、鍵が短く処理も高速で、安全性も高いとして新規作成の第一候補にされることが多く、鍵の作成は「ssh-keygen -t ed25519」のようなコマンドで行います。RSAを使う場合は、十分な鍵長(一般に3072ビット以上が推奨されることが多い)を選びます。古いシステムが新しい鍵タイプに対応していないことがあるため、接続先の対応状況の確認も必要です。

ssh-agentでパスフレーズ入力の手間を減らす

秘密鍵にパスフレーズを付けると、接続のたびに入力する手間が生じます。そこで、ssh-agentという常駐プログラムに鍵を一度だけ読み込ませておけば、そのセッション中はパスフレーズを再入力せずに接続できます。OSによっては、キーチェーンや資格情報マネージャと連携して自動化することも可能です。安全性と利便性を両立させる、ごく標準的な使い方です。

踏み台サーバー(ジャンプホスト)を経由する接続

セキュリティ上、社内のサーバーに直接インターネットから接続させず、外部に公開した1台の踏み台サーバーを経由させる構成がよく使われます。OpenSSHでは「ssh -J 踏み台 接続先」や、設定ファイルのProxyJumpを使うことで、踏み台を経由した接続を1コマンドで行えます。踏み台に管理を集中させることで、アクセスログの監視や許可する鍵の管理が行いやすくなります。

鍵ファイルのアクセス権限でよくある失敗

秘密鍵のファイルが他のユーザーから読み取れる設定になっていると、OpenSSHは「unprotected private key file」という警告を出して鍵の使用を拒否します。一般的には、~/.sshディレクトリを自分だけがアクセスできる設定(700)にし、秘密鍵を自分だけが読み書きできる設定(600)にしておきます。サーバー側のauthorized_keysの権限が緩すぎる場合も、公開鍵認証が失敗する原因になります。

サーバー側で行いたい基本的な設定

sshd_configでは、パスワード認証を無効にして公開鍵認証のみにする、rootユーザーでの直接ログインを禁止する、ログインを許可するユーザーを限定する、といった設定が基本的な対策として挙げられます。さらに、短時間に失敗を繰り返したIPアドレスを一時的に遮断するfail2banのようなツールを併用する運用も一般的です。設定を変更するときは、現在の接続を維持したまま別の端末から新しい設定でログインできるか確認してから切断しましょう。

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

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

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

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

SCPとSFTP、FTPとの違い

SCPやSFTPはSSHの暗号化された接続上でファイルを転送する仕組みです。昔ながらのFTPは、認証情報を含む通信を暗号化しないまま送るため、現在では安全が求められる用途にはあまり使われません。なお、SCPは従来のプロトコルに構造的な弱点があったことから、近年のOpenSSHではSFTPの仕組みを内部で使う方向に変わってきています。ファイル転送が目的なら、SFTPやrsync over SSHを選ぶのが無難です。

接続できないときの確認手順

接続に失敗したときは、まずサーバーのアドレスとポート番号が正しいか、ファイアウォールやクラウドのセキュリティグループで22番ポート(または変更後のポート)が許可されているかを確認します。次に、「ssh -v」とオプションを付けて詳細ログを表示すると、どの段階で失敗しているかが分かります。公開鍵認証が通らない場合は、ユーザー名、鍵の指定、権限の設定を順に見直すのが近道です。

よくある質問

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

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

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

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

SSHの鍵をなくしてしまった場合はどうなりますか?

秘密鍵を紛失しても、別の鍵ペアを作成し、パスワード認証やコンソールなど別の手段でサーバーにログインして、新しい公開鍵をauthorized_keysに追加すれば再び接続できます。ただし、紛失した鍵が第三者の手に渡った可能性がある場合は、古い公開鍵をサーバーから削除することが重要です。クラウドによっては、管理画面から鍵を差し替える機能も用意されています。

同じ鍵を複数のサーバーで使い回してもいいですか?

技術的には可能ですが、1つの鍵が漏れたときの影響範囲が大きくなります。用途ごと、または端末ごとに鍵を分けておけば、問題が起きたときに特定の鍵だけを無効にできます。管理の手間とのバランスを考えて決めましょう。

Windowsでもsshコマンドは使えますか?

最近のWindowsにはOpenSSHクライアントが標準で組み込まれていることが多く、コマンドプロンプトやPowerShellからsshコマンドを使えます。利用できない場合は、設定のオプション機能からOpenSSHクライアントを追加するか、PuTTYなどの専用ソフトを利用する方法があります。