SSHとは?
SSHプロトコルまたはSecure Shellプロトコルとは、公共の不安定なネットワーク上で、1つのコンピュータシステムから別のシステムへ安全に接続するために設計された仕組みです。このプロトコルは、通信のやり取り方法を定めたセッション枠組みを確立することで双方を接続します。SSHはアプリレベルのプロトコルであり、OSIモデルの第7層に位置します。
SSHは物理的な接続を必要とせず、インターネットを介して接続できるため、遠隔からサーバーを管理するシンプルで使いやすい方法です。
SSHプロトコルは90年代に開発され、暗号化なしでデータを送信するTelnetの代替として誕生しました。安全性のない送信は非常に危険で、不安定なネットワーク上で平文を送るのと変わらず、パケットスニファーを用いれば誰でも通信内容に覗き込む恐れがありました。
SSHは、以下のものを転送できる特別な仕組みです:
将来的には、新たな技術革新により、Secure Shellプロトコルでさらに多くのユースケースが許可されるでしょう。
SSHプロトコルは、フィンランドの大学生タトゥ・ユロネンが、大学での秘密鍵盗聴攻撃に対応するために設計・開発しました。現行システムは、後の改良版を前提にしています。彼は、平文通信の欠陥と、それが安全なデータ転送を妨げる理由を検証しました。このプロトコルは、データの暗号化と安全性に重点を置くよう設計されました。
タトゥが最初に開発したSSHプロトコルは、数年間フリーウェアとして公開され、自由な認証方式を採用していました。しかし、利用条件の制限や商用通信路の確立が進むにつれ、彼の実装とは異なるバージョンが登場しました。最も有名なバージョンであるOSSHは、スウェーデンの著名な開発者ビョルン・グロエンヴァルによって作られました。
ここでは、SSHプロトコルがデータ転送を確実に行い、盗聴を防ぐ仕組みについて説明します。SSHは、データを一連の小さなパケットに分割して送信します。通常のパッケージ転送と同様、パケットの先頭には以下の情報が含まれます:
パケットの長さは、そのサイズ(大きさや小ささ)を示します。次に、パディング量がパケットに割り当てられた余分なデータの長さを伝えます。その後、送信するデータであるペイロードが続き、さらに後にパディングが付加されます。パディングは無関係なバイト列であり、ペイロードと一緒に暗号化されます。
この処理は、データに意味のない情報を加えることで解析を困難にするためのものです。最後に、メッセージ認証コードが付加され、データができるだけ安全に保たれ、改ざんされないようにしています。
ペイロードは通常、標準的な圧縮アルゴリズムで圧縮され、その後、メッセージ認証コードとパケット長を除く全体が暗号化されます。暗号化されたパケットはサーバーから送信され、サーバー側で復号化および解凍されることで、内部のデータが伝達されます。これが、接続を介して送信される各パケットで採用される暗号化と解凍のプロセスです。
SSHは、データ転送時に複数の暗号化方式を採用しています。Secure Shellプロトコルで利用される代表的な3つの手法は以下の通りです:
対称暗号は、データ転送の安全性を確保するための基本的な方式です。この方式では、一つの鍵を用いてサーバーから送信されるメッセージを暗号化し、同じ鍵で受信側で復号化します。共有鍵暗号とも呼ばれます。
送信側と受信側は、同一の鍵を利用してメッセージの暗号化と復号化を行います。この方式では、各SSHセッションで一意の鍵が生成され、ネットワーク全体の通信が暗号化されるため、組織内の攻撃を防ぐのに役立ちます。もし誰かがペイロードを取得したとしても、単一の鍵だけでは復号化は困難です。
この方式の一般的な課題は、共通鍵の安全な交換です。第三者が共通鍵の交換中に割り込むと、鍵を入手され、ペイロードの内容にアクセスされる恐れがあります。これを防ぐため、鍵交換アルゴリズムが利用されます。
鍵交換アルゴリズムは、不正な第三者に邪魔されることなく秘密鍵を交換する有効な方法です。両端末が情報を交換し、その情報をもとに暗号化・復号化用の鍵を自動生成します。ただし、鍵交換アルゴリズムが正しく機能するには、対称暗号による保護が前提となります。
非対称暗号は、対称暗号に比べやや複雑な方式です。この手法では、暗号化と復号化に別々の二つの鍵を用います。公開鍵と秘密鍵の組み合わせにより、公開鍵は広く提供され、秘密鍵は共有されません。これらを合わせて鍵ペアと呼びます。公開鍵で暗号化されたメッセージは、秘密鍵でのみ復号化できます。秘密鍵はSSHクライアント側に、公開鍵はSSHサーバー側に保管されます。
接続時に公開鍵が提供されると、その鍵を使って暗号化されたメッセージが送信され、受信側は秘密鍵でのみそのメッセージを復号化できます。第三者が公開鍵を入手しても、秘密鍵が安全であればメッセージの解読は困難です。
SSHプロトコルは、鍵交換プロセスなど複数の方法で安全性を確保しています。例えば、鍵交換プロセスは対称暗号方式による安全な通信路を確立するために利用されます。また、キーボード・インタラクティブ認証を用いることで、パスワードを使わずにSSHサーバーへログインすることも可能です。交換処理により、暗号化と復号化に用いる鍵が生成されます。
これらの仕組みにより、一時的な公開鍵と秘密鍵が生成され、一般的な鍵は交換された後、両端末で新たな対称鍵が自動的に作られ、通信に使用されます。この鍵更新はDiffie Hellman鍵交換によって実現されます。Diffie Hellman鍵交換の初期段階では、双方が公開鍵生成に用いる共通パラメータに合意する必要があります。
非対称接続が確立した後、サーバーはクライアントの公開鍵を使用してチャレンジを生成し、それをクライアントに送信します。クライアントが正しく復号化し応答できれば、秘密鍵を保持していることが確認され、SSHセッションが確立されます。
ハッシュは、SSH接続に用いられるもう一つの暗号技術です。ハッシュを利用することで、データパケットの署名や要約を生成できます。この方式は一方向性で、元のデータに戻すことは想定されていません。しかし、どのように役立つのでしょうか?
第三者がクライアントまたはサーバーへの攻撃に成功した場合、ペイロードの内容が改竄される恐れがあります。SSHでは、HMAC(ハッシュベースメッセージ認証コード)を用いて、メッセージが完全かつ改竄されていないことを保証します。ハッシュ処理では、送信される各メッセージにMACが付加されます。MACは、対称鍵、パケットシーケンス番号、送信メッセージの内容から生成され、これらの要素がハッシュ処理の入力となり、結果としてランダムな文字列が作られ、サーバーへ送信されます。
SSHが提供する機能の一部は以下の通りです:
Secure Shellプロトコルは、ターミナルセッションの実行においてTelnetの代替として用いられます。SSHは、スクリプトなど他のプログラムと連携することで、リモートシステム上のデータやインターネット資源へアクセスする機能も提供します。
ほとんどのサーバーファームでは、Unix、Linux、Mac各サーバーに標準搭載されています。SSH接続は、ローカルマシンとリモートホスト間での安全なリモートアクセス、リモートでのコマンド実行、ソフトウェアパッチやアップデートの送信、その他の管理や制御タスクに利用されています。
また、ローカルとリモート間で安全な通信チャネルを構築するため、SSHはスイッチ、サーバー機器、仮想化プラットフォーム、OS、クラウド管理、ファイル転送アプリなどの運用・管理にも使われます。SSHは、サーバーとの接続、設定変更、ファイル転送、ログアウトなどを、ツールやターミナル経由で実行できます。SSHキーは、サーバーへのアクセスの自動化に利用され、スクリプトやCI/CD、デプロイ用ツールでも頻繁に使用されます。
シングルサインオン(SSO)機能により、クライアントは毎回パスワードを入力せずに各サービス間を移動できます。SSHは、暗号化通信のみならず、管理ツールやアクセス制御の面でも重要な役割を果たしており、全通信が暗号化されるため、ファイル転送、ウェブ閲覧、コマンド実行などの操作が安全に保たれます。
SSHにはグラフィカルな実装もありますが、基本的にはコマンドラインまたは他のプログラムの一部として動作します。単にsshコマンドを実行すると、対象ホストやユーザーIDなどの指定がないため、SSHコマンドのオプション一覧が表示されます。
最も基本的なSSHコマンドは、プログラムと対象のホスト名またはIPアドレスを指定して起動する方法です:
ssh server.example.org
このコマンドは対象の server.example.org へ接続を試み、対象ホストは実行中のユーザーアカウントのパスワード入力を求めます。例えば、使用中のユーザーIDが smith であれば、リモートホストは smith アカウントのパスワードを要求します。
通常、リモートホストのユーザーIDは異なるため、接続時に対象のユーザーIDを明示する必要があります。例えば:
ssh remote_host_userID@server.example.org
また、SSHはコマンドラインからリモートホスト上で単一のコマンドを実行し、その後自動的に切断することも可能です。例えば:
ssh example.org ls
このコマンドは、リモートホスト上の現在のディレクトリ内の全内容を表示する Unix の ls コマンドを実行します。この例は単純なものですが、SSHを利用してリモートホスト上でより複雑なコマンドを実行できることを示しています。例えば、特定のリモートホストがファイルにアクセスした後、サーバーを停止するというアクションを組み込んだコマンドも作成可能です。
SSHトンネリング(ポート転送とも呼ばれる)は、クライアントがローカルマシンとリモートホスト間に安全な通路を確立する仕組みです。SSHポート転送により、ネットワークトラフィックが特定のポートやIPアドレスにルーティングされ、リモートホストがローカルアプリから直接利用できるようになります。対象はリモートのSSHサーバーである場合や、さらに別のリモートホストに転送される場合もあります。
Telnetは、FTPと並んで主要なインターネットプロトコルの一つで、リモートホスト上でのターミナルエミュレーションセッションの開始と維持に利用されます。SSHとTelnetは類似していますが、最大の違いは、SSHが公開鍵暗号を用いてエンドポイントの認証を行い、通信コマンドと出力を暗号化する点にあります。
Telnetは基本的にターミナルエミュレーションに利用されますが、SSHはログインコマンドの実行などターミナルエミュレーションに留まらず、SSH File Transfer Protocol (SFTP) やトンネリングを通して、より豊富なファイル転送なども可能です。
トランスポート層セキュリティ (TLS) プロトコルは、Secure Sockets Layer (SSL) の後継として、トランスポート層での通信を安全に行うために設計されました。SSHはトランスポート層上またはその上で動作しますが、両者には大きな違いがあります。どちらも公開鍵/秘密鍵を用いた認証を行いますが、TLSではサーバーのみが鍵ペアによって認証されます。一方、SSHは、リモートマシンからローカルマシンへの接続と、その逆方向の接続で、それぞれ別の鍵ペアを用いて認証を行います。
また、TLSでは認証なしでの暗号化や、暗号化なしでの認証が可能ですが、SSHは全ての接続において暗号化と認証を行います。SSHは、ITや情報セキュリティ担当者に、安全なリモートSSHクライアント管理の仕組みを提供します。
確かに、SSHは非常に安全な方式です。APIセキュリティも強固で、貴社のネットワークを守るための堅固なファイアウォールとなります。しかし、APIキーはクライアントに渡されるため、システム侵入のリスクが伴います。一方、SSHキーは鍵ペア方式を用いるため、より安全です。詳しくはAPI Security Tutorialをご参照ください。
最新情報を購読