| プロトコルスタック | |
| 目的 | 安全な接続、リモートアクセス |
|---|---|
| 開発者 | Tatu Ylönen、インターネット エンジニアリング タスク フォース(IETF) |
| 導入 | 1995 (1995年) |
| OSI層 | トランスポート層からアプリケーション層まで |
| ポート | 22 |
| RFC(s) | 4250、4251、4252、4253、4254 |
| インターネットプロトコルスイート |
|---|
| アプリケーション層 |
| トランスポート層 |
| インターネット層 |
| リンク層 |
セキュアシェルプロトコル(SSHプロトコル)は、安全でないネットワーク上でネットワークサービスを安全に操作するための暗号化ネットワークプロトコルです。[ 1 ]その最も注目すべき用途は、リモートログインとコマンドライン実行です。
SSH は、Telnetや、Berkeley Remote Shell (rsh) や関連するrloginおよびrexecプロトコルなどの安全でないリモートUnix シェルプロトコル (パスワードなどの安全でないプレーンテキスト認証方法を使用するもの) の代わりとして、 Unix 系オペレーティング システム向けに設計されました。
Telnetやリモートシェルのようなメカニズムは、リモートコンピュータにアクセスして操作するために設計されているため、これらのコンピュータにアクセスするための認証トークン(ユーザー名とパスワードなど)をパブリックネットワーク経由で安全でない方法で送信すると、第三者がパスワードを入手してTelnetユーザーと同じレベルのリモートシステムへのアクセスを取得する大きなリスクが生じます。セキュアシェルは、たとえ観察者がデータストリーム全体にアクセスできる場合でも、送信内容を観察者から隠すことを目的とした暗号化メカニズムを使用することで、このリスクを軽減します。[ 2 ]
フィンランドのコンピュータ科学者Tatu Ylönenは1995年にSSHを設計し、rshとrloginのそれぞれを安全に置き換える2つのコマンド、 sshとsloginという形で実装を提供しました。その後、このプロトコルスイートの開発は複数の開発者グループによって進められ、いくつかの実装のバリエーションが生まれました。プロトコル仕様では、SSH-1とSSH-2と呼ばれる2つのメジャーバージョンが区別されています。最も広く実装されているソフトウェアスタックはOpenSSHで、1999年にOpenBSD開発者によってオープンソースソフトウェアとしてリリースされました。組み込みシステムを含む、一般的に使用されているあらゆる種類のオペレーティングシステム向けの実装が配布されています。
SSHアプリケーションは、 SSHクライアントインスタンスをSSHサーバーに接続するクライアントサーバーアーキテクチャに基づいています。[ 3 ] SSHは、3つの主要な階層コンポーネントで構成される階層化プロトコルスイートとして動作します。トランスポート層は、サーバー認証、機密性、整合性を提供します。ユーザー認証プロトコルは、サーバーに対してユーザーを検証します。接続プロトコルは、暗号化されたトンネルを複数の論理通信チャネルに多重化します。[ 1 ]
SSHは公開鍵暗号を使用してリモートコンピュータを認証し、必要に応じてユーザーを認証できるようにします。[ 3 ]
SSHはいくつかの方法で使用できます。最も単純な方法は、通信チャネルの両端で自動生成された公開鍵と秘密鍵のペアを使用してネットワーク接続を暗号化し、パスワードを使用してユーザーを認証することです。
ユーザーが公開鍵と秘密鍵のペアを手動で生成する場合、認証は基本的に鍵ペアの作成時に実行され、パスワードを入力せずにセッションが自動的に開始されることがあります。このシナリオでは、公開鍵は、対応する秘密鍵の所有者(所有者は秘密に保持)へのアクセスを許可する必要があるすべてのコンピュータに配置されます。認証は秘密鍵に基づいて行われますが、認証中に秘密鍵がネットワーク経由で転送されることはありません。SSHは、公開鍵を提供する人物が、対応する秘密鍵も所有していることを確認するだけです。
SSH のすべてのバージョンにおいて、未知の公開鍵を有効なものとして受け入れる前に、検証、つまり公開鍵を ID と関連付けることが重要です。検証を行わずに攻撃者の公開鍵を受け入れると、権限のない攻撃者を有効なユーザーとして承認することになります。
Unix系システムでは、承認された公開鍵のリストは通常、リモートログインを許可されたユーザーのホームディレクトリ内のファイルに保存されます~/.ssh/authorized_keys。[ 4 ]このファイルは、所有者とroot以外のユーザーによる書き込みが禁止されている場合にのみSSHによって使用されます。リモート側に公開鍵が存在し、対応する秘密鍵がローカル側に存在する場合、パスワードの入力は不要になります。ただし、セキュリティを強化するために、秘密鍵自体をパスフレーズでロックすることもできます。
-i秘密鍵は標準的な場所から検索することもでき、コマンドライン設定( sshのオプション)でフルパスを指定することもできます。ssh -keygenユーティリティは、公開鍵と秘密鍵を常にペアで生成します。
SSHは通常、リモートコンピュータのシェルまたはコマンドラインインターフェース(CLI)にログインし、リモートサーバー上でコマンドを実行するために使用されます。また、トンネリング、TCPポート転送、X11接続のメカニズムもサポートしており、関連するSSHファイル転送プロトコル(SFTP)またはセキュアコピープロトコル(SCP)を使用したファイル転送にも使用できます。[ 3 ]
SSHはクライアント・サーバーモデルを採用している。SSHクライアントプログラムは通常、sshdなどのSSHデーモンへの接続を確立し、リモート接続を受け入れるために使用される。どちらもmacOS 、 Linuxのほとんどのディストリビューション、OpenBSD、FreeBSD、NetBSD、Solaris、OpenVMSなど、ほとんどの最新のオペレーティングシステムに一般的に搭載されている。特に、Windows 10バージョン1709より前のバージョンのWindowsにはデフォルトでSSHが含まれていないが、複雑さや完全性のレベルが異なるプロプライエタリバージョン、フリーウェアバージョン、オープンソースバージョンが存在していた( SSHクライアントの比較を参照)。2018年に、MicrosoftはOpenSSHのソースコードをWindowsに移植し始め[ 5 ] 、 Windows 10バージョン1709ではOpenSSHの公式Win32ポートが利用可能になった。
UNIX系システムのファイルマネージャ(Konquerorなど)は、 FISHプロトコルを使用して、ドラッグアンドドロップで分割ペインのGUIを提供できます。オープンソースのWindowsプログラムWinSCP [ 6 ]は、 PuTTYをバックエンドとして使用して同様のファイル管理(同期、コピー、リモート削除)機能を提供します。WinSCP [ 7 ]とPuTTY [ 8 ]はどちらも、クライアントマシンにインストールすることなく、USBドライブから直接実行できるようにパッケージ化されています。ChromeOSのCrostiniには、デフォルトでOpenSSHが付属しています。WindowsでSSHサーバーをセットアップするには、通常、設定アプリで機能を有効にする必要があります。
SSHはクラウドコンピューティングにおいて、接続性の問題を解決するために重要であり、クラウドベースの仮想マシンをインターネットに直接公開することによるセキュリティ上の問題を回避することができます。SSHトンネルは、ファイアウォールを通過して仮想マシンへの安全なインターネット経由のパスを提供します。[ 9 ]
IANAはこのプロトコルにTCPポート22、UDPポート22、SCTPポート22を割り当てています。 [ 10 ] IANAは2001年には既にSSHサーバ用の標準TCPポート22を既知のポートの一つとしてリストしていました。 [ 11 ] SSHは接続指向トランスポート層プロトコルとしてTCPではなくSCTPを使用して実行することもできます。[ 12 ]
1995年、フィンランドのヘルシンキ工科大学の研究者であるタトゥ・イロネンは、大学のネットワークでパスワードスニッフィング攻撃を受けたことをきっかけに、プロトコルの最初のバージョン(現在SSH-1と呼ばれている)を設計しました。[ 13 ] SSHの目的は、強力な認証機能も機密性の保証も提供していなかった従来のrlogin、TELNET、FTP [ 14 ]、rshプロトコルを置き換えることでした。彼はポート番号22を選択しました。これはポート23とポート21の間にあるためです。[ 15 ]telnetftp
Ylönenは1995年7月に実装をフリーウェアとしてリリースし、このツールは急速に人気を博しました。1995年末までに、SSHのユーザーベースは50カ国で2万人にまで拡大しました。[ 16 ]
1995年12月、イロネンはSSHの販売と開発を目的としてSSH Communications Security社を設立しました。SSHソフトウェアの初期バージョンは、GNU libgmpなどの様々なフリーソフトウェアを使用していましたが、SSH Communications Security社がリリースした後のバージョンは、次第にプロプライエタリソフトウェアへと進化していきました。
2000年までに利用者数は200万人にまで増加したと推定されている。[ 17 ]
2006年に、「secsh」というワーキンググループで議論された後、[ 18 ] SSHプロトコルの改訂版であるSSH-2が標準として採用されました。[ 19 ]このバージョンではセキュリティが向上し、新機能が追加されましたが、SSH-1との互換性はありません。たとえば、Diffie–Hellman鍵交換などの新しい鍵交換メカニズムや、クライアントとサーバー間でネゴシエート可能なMD5やSHA-1などのメッセージ認証コードによるデータ整合性チェックが改善されています。また、SSH-2ではAESなどのより強力な暗号化方式も追加され、最終的には以前の標準の3DESなどの脆弱で危うい暗号に取って代わりました。[ 20 ] [ 21 ] [ 19 ] SSH-2の新機能には、単一のSSH接続で任意の数のシェルセッションを実行できる機能が含まれます。 [ 22 ] SSH-2はSSH-1よりも優れており人気があったため、libssh(v0.8.0+)、[ 23 ] Lsh [ 24 ] Dropbear [ 25 ]などの実装では、最終的にSSH-2プロトコルのみをサポートするようになりました。
2006年1月、バージョン2.1が確立されてからかなり経ってから、RFC 4253は、2.0とそれ以前のバージョンをサポートするSSHサーバーは、プロトコルバージョンを1.99として識別する必要があることを規定しました。[ 26 ]このバージョン番号は、過去のソフトウェアリビジョンを反映したものではなく、下位互換性を識別するための方法です。
1999年、開発者たちはフリーソフトウェア版の提供を望み、オープンソースライセンスの下で最後にリリースされたオリジナルのSSHプログラムのバージョン1.2.12からソフトウェア開発を再開しました。[ 27 ]これは、Björn GrönvallのOSSHソフトウェアのコードベースとして機能しました。[ 28 ]その後まもなく、OpenBSD開発者はGrönvallのコードをフォークし、OpenBSDリリース2.6に同梱されたOpenSSHを作成しました。このバージョンから、OpenSSHを他のオペレーティングシステムに移植するための「移植性」ブランチが形成されました。[ 29 ]
2005年時点では、OpenSSHは最も人気のあるSSH実装であり、多くのオペレーティングシステムディストリビューションのデフォルトバージョンでした。一方、OSSHは廃止されました。[ 30 ] OpenSSHは引き続きメンテナンスされ、SSH-2プロトコルをサポートしていますが、OpenSSH 7.6リリースではコードベースからSSH-1のサポートが削除されました。
2023年には、従来のSSHに代わるプロトコルが、博士課程の学生であるフランソワ・ミシェルとオリヴィエ・ボナベンチャー教授によってSSH3 [ 31 ] [ 32 ] [ 33 ]という名前で提案され、そのコードはオープンソース化されました。[ 34 ]この新バージョンは、オリジナルのSSH接続プロトコルを実装していますが、 QUIC上で動作するHTTP/3上で動作します。以下のような複数の機能を提供します。
しかし、SSH3という名称については議論が続いており、プロジェクトではより適切な名前に変更することを目指しています。[ 35 ]この議論は、この新しい実装がSSHプロトコルを大幅に改訂するという事実から生じており、SSH3と呼ぶべきではないことを示唆しています。


SSHは、多くのプラットフォーム(ほとんどのUnix系OS(Linux、AppleのmacOSを含むBSD系OS、Solarisなど))で利用可能なプロトコルです。ただし、一部のアプリケーションでは、特定のSSHクライアントまたはサーバーでのみ利用可能な機能、または特定のSSHクライアントまたはサーバーでのみ利用可能な機能が必要となる場合があります。例えば、SSHプロトコルを使用してVPNを実装することは可能ですが、現時点ではOpenSSHサーバーおよびクライアント実装 でのみ利用可能です。
Secure Shell プロトコルは、いくつかのファイル転送メカニズムで使用されます。

SSH プロトコルには、3 つの個別のコンポーネントを持つ階層型アーキテクチャがあります。
このオープンアーキテクチャは非常に柔軟性が高く、SSHをセキュアシェル以外にも様々な用途に使用できます。トランスポート層の機能だけでもトランスポート層セキュリティ(TLS)に匹敵します。ユーザー認証層はカスタム認証方式によって高度に拡張可能で、接続層は多数のセカンダリセッションを単一のSSH接続に多重化する機能を提供します。これはBEEPに匹敵する機能であり、TLSでは利用できません。
1998年、SSH 1.5に脆弱性が発見されました。この脆弱性は、このバージョンのプロトコルで使用されているCRC-32によるデータ整合性保護が不十分であったため、暗号化されたSSHストリームに不正なコンテンツを挿入できるものでした。 [ 42 ] [ 43 ] SSH補償攻撃検出器[ 44 ]として知られる修正がほとんどの実装に導入されました。これらの更新された実装の多くには、攻撃者がSSHデーモン(通常はroot)の権限で任意のコードを実行できる、 新たな整数オーバーフロー脆弱性[ 45 ]が含まれていました。
2001年1月、 IDEAで暗号化されたセッションの最後のブロックを攻撃者が変更できる脆弱性が発見されました。[ 46 ]同月、悪意のあるサーバーがクライアント認証を別のサーバーに転送できる別の脆弱性も発見されました。[ 47 ]
SSH-1には脆弱性をもたらす固有の設計上の欠陥があるため、現在では一般的に廃止されていると考えられており、SSH-1へのフォールバックを明示的に無効にすることでSSH-1の使用を回避する必要があります。最近のサーバーとクライアントのほとんどはSSH-2をサポートしています。[ 47 ]
2008年11月、SSHの全バージョンに理論上の脆弱性が発見されました。この脆弱性により、当時の標準のデフォルト暗号化モードであるCBCを使用して暗号化された暗号文のブロックから最大32ビットの平文を復元できる可能性があります。[ 48 ]最も簡単な解決策は、 CBCモードの代わりにCTR(カウンターモード)を使用することです。これにより、SSHは攻撃に対して耐性を持つようになります。[ 48 ]
2014年12月28日、デア・シュピーゲル誌は内部告発者エドワード・スノーデンが漏洩した機密情報[ 49 ]を公開しました。この情報によると、国家安全保障局(NSA)はSSHトラフィックの一部を解読できる可能性があります。このプロセスに関連する技術的な詳細は明らかにされていません。2017年に実施されたCIAのハッキングツールBothanSpyとGyrfalconの分析では、SSHプロトコルは侵害されていないことが示唆されています[ 50 ] 。
2023年に、現在のほとんどのssh実装に対する新しい中間者攻撃が発見されました。これは発見者によってTerrapin攻撃と名付けられました。 [ 51 ] [ 52 ]ただし、本物のsshセッションを傍受する必要があることでリスクは軽減され、攻撃の範囲は制限されているため、幸運にもほとんどの場合、接続が失敗します。[ 53 ] [ 54 ] ssh開発者は、この攻撃の主な影響はsshのキーストロークタイミング難読化機能を低下させることであると述べています。 [ 54 ]この脆弱性はOpenSSH 9.6で修正されましたが、修正を完全に有効にするには、クライアントとサーバーの両方をアップグレードする必要があります。
IETF「secsh」ワーキング グループによる以下のRFC出版物では、提案されたインターネット標準としての SSH-2 が文書化されています。
プロトコル仕様は、後に次の出版物によって更新されました。
さらに、OpenSSHプロジェクトには、いくつかのベンダー プロトコル仕様/拡張機能が含まれています。
いずれにせよ、osshは古くて時代遅れなので、使用はお勧めしません。