序章

SSH 、またはセキュアシェルは、セキュアプロトコルであり、リモートサーバーを安全に管理するための最も一般的な方法です。 SSHは、多くの暗号化テクノロジを使用して、2つのパーティ間で暗号化された安全な接続を確立し、それぞれの側を他方に認証し、コマンドと出力をやり取りするためのメカニズムを提供します。

このガイドでは、SSHが採用している基本的な暗号化技術と、SSHが安全な接続を確立するために使用する方法について説明します。 この情報は、暗号化のさまざまな層と、接続を形成して両方の当事者を認証するために必要なさまざまな手順を理解するのに役立ちます。

対称暗号化、非対称暗号化、およびハッシュについて理解する

SSHは、情報の送信を保護するために、トランザクションのさまざまなポイントでさまざまな種類のデータ操作技術を採用しています。 これらには、対称暗号化、非対称暗号化、およびハッシュの形式が含まれます。

対称暗号化

データを暗号化および復号化するコンポーネントの関係によって、暗号化スキームが対称か非対称かが決まります。

対称暗号化は、一方のキーを使用して相手方へのメッセージを暗号化し、他の参加者から受信したメッセージを復号化できる暗号化の一種です。 これは、キーを保持している人は誰でも、キーを保持している他の人へのメッセージを暗号化および復号化できることを意味します。

このタイプの暗号化スキームは、「共有秘密」暗号化または「秘密鍵」暗号化と呼ばれることがよくあります。 通常、関係が検出可能であり、反対のキーを導出するのは簡単な場合、すべての操作に使用される単一のキーまたはキーのペアのみがあります。

対称鍵は、接続全体を暗号化するためにSSHによって使用されます。 一部のユーザーが想定していることとは異なり、作成できる公開鍵と秘密鍵のペアは認証にのみ使用され、接続の暗号化には使用されません。 対称暗号化により、パスワード認証でさえスヌーピングから保護できます。

クライアントとサーバーの両方がこのキーの確立に貢献し、結果として生じる秘密が外部の関係者に知られることはありません。 秘密鍵は、鍵交換アルゴリズムと呼ばれるプロセスを通じて作成されます。 この交換により、サーバーとクライアントの両方が、特定の公開データを共有し、それらを特定の秘密データで操作することにより、同じキーに個別に到達します。 このプロセスについては、後で詳しく説明します。

この手順で作成される対称暗号化キーはセッションベースであり、サーバーとクライアント間で送信されるデータの実際の暗号化を構成します。 これが確立されたら、残りのデータをこの共有シークレットで暗号化する必要があります。 これは、クライアントを認証する前に行われます。

SSHは、Advanced Encryption Standard(AES)、Blowfish、3DES、CAST128、Arcfourなどのさまざまな対称暗号システムを使用するように構成できます。 サーバーとクライアントはどちらも、サポートされている暗号のリストを優先順に決定できます。 サーバーで使用可能なクライアントのリストの最初のオプションは、双方向の暗号化アルゴリズムとして使用されます。

Ubuntu 20.04では、クライアントとサーバーの両方がデフォルトで次のようになります。

これは、2台のUbuntu 20.04マシンが(構成オプションを介してデフォルトの暗号をオーバーライドせずに)相互に接続している場合、常にデフォルトで [email protected] それらの接続を暗号化するための暗号。

非対称暗号化

非対称暗号化は、データを一方向に送信するために2つの関連するキーが必要であるため、対称暗号化とは異なります。 これらのキーの1つは秘密キーと呼ばれ、もう1つは公開キーと呼ばれます。

公開鍵は、どのパーティとも自由に共有できます。 ペアの鍵に関連付けられていますが、秘密鍵は公開鍵から派生できません。 公開鍵と秘密鍵の間の数学的関係により、公開鍵は、秘密鍵によってのみ復号化できるメッセージを暗号化できます。 これは一方向の機能です。つまり、公開鍵には、書き込んだメッセージを復号化する機能がなく、秘密鍵が送信する可能性のあるものを復号化することもできません。

秘密鍵は完全に秘密にしておく必要があり、他の当事者と共有しないでください。 これは、公開鍵パラダイムが機能するための重要な要件です。 秘密鍵は、関連付けられた公開鍵を使用して暗号化されたメッセージを復号化できる唯一のコンポーネントです。 この事実のおかげで、これらのメッセージを復号化できるエンティティは、秘密鍵を制御していることを示しています。

SSHは、いくつかの異なる場所で非対称暗号化を使用します。 対称暗号化(セッションの暗号化に使用)の設定に使用される最初の鍵交換プロセスでは、非対称暗号化が使用されます。 この段階では、対称暗号化に使用される共有秘密を生成するために、両方の当事者が一時的な鍵のペアを生成し、公開鍵を交換します。

SSHでの非対称暗号化のよりよく議論されている使用法は、SSHキーベースの認証に由来します。 SSHキーペアを使用して、サーバーに対してクライアントを認証できます。 クライアントはキーペアを作成してから、アクセスしたいリモートサーバーに公開キーをアップロードします。 これは、というファイルに配置されます authorized_keys 以内 ~/.ssh リモートサーバー上のユーザーアカウントのホームディレクトリにあるディレクトリ。

サーバーとクライアント間の通信を保護するために対称暗号化が確立された後、クライアントはアクセスを許可されるように認証する必要があります。 サーバーは、このファイルの公開鍵を使用して、クライアントへのチャレンジメッセージを暗号化できます。 クライアントがこのメッセージを復号化できたことを証明できる場合、クライアントは関連付けられた秘密鍵を所有していることを示しています。 次に、サーバーはクライアントの環境をセットアップできます。

ハッシュ

SSHが利用するデータ操作のもう1つの形式は、暗号化ハッシュです。 暗号化ハッシュ関数は、一連の情報の簡潔な「署名」または要約を作成する方法です。 それらの主な際立った属性は、それらが逆転することを決して意図されておらず、それらが予測可能に影響を与えることは事実上不可能であり、そしてそれらは実質的に独特であるということです。

同じハッシュ関数とメッセージを使用すると、同じハッシュが生成されます。 データの任意の部分を変更すると、まったく異なるハッシュが生成されます。 ユーザーは、特定のハッシュから元のメッセージを生成できない必要がありますが、特定のメッセージが特定のハッシュを生成したかどうかを判断できる必要があります

これらのプロパティを前提として、ハッシュは主にデータの整合性の目的と通信の信頼性を検証するために使用されます。 SSHでの主な用途は、 HMAC 、またはハッシュベースのメッセージ認証コードです。 これらは、受信したメッセージテキストが無傷で変更されていないことを確認するために使用されます。

前に概説した対称暗号化ネゴシエーションの一部として、メッセージ認証コード(MAC)アルゴリズムが選択されます。 アルゴリズムは、クライアントの受け入れ可能なMAC選択のリストを処理することによって選択されます。 サーバーがサポートするこのリストの最初のものが使用されます。

暗号化のネゴシエーション後に送信される各メッセージには、相手がパケットの整合性を検証できるようにMACが含まれている必要があります。 MACは、対称共有シークレット、メッセージのパケットシーケンス番号、および実際のメッセージコンテンツから計算されます。

MAC自体は、パケットの最後の部分として、対称的に暗号化された領域の外に送信されます。 研究者は通常、最初にデータを暗号化してからMACを計算するこの方法を推奨しています。

SSHの仕組みを理解する

SSHがどのように機能するかについてはすでに基本的な知識があります。 SSHプロトコルは、クライアントサーバーモデルを使用して2つのパーティを認証し、それらの間のデータを暗号化します。

サーバーコンポーネントは、指定されたポートで接続をリッスンします。 安全な接続のネゴシエーション、接続側の認証、および資格情報が受け入れられた場合の正しい環境の生成を担当します。

クライアントは、サーバーとの初期伝送制御プロトコル(TCP)ハンドシェイクを開始し、安全な接続をネゴシエートし、サーバーのIDが以前に記録された情報と一致することを確認し、認証するための資格情報を提供する責任があります。

SSHセッションは、2つの別々の段階で確立されます。 1つ目は、将来の通信を保護するために暗号化に同意して確立することです。 第2段階は、ユーザーを認証し、サーバーへのアクセスを許可する必要があるかどうかを確認することです。

セッションの暗号化のネゴシエーション

クライアントによってTCP接続が確立されると、サーバーはサポートするプロトコルバージョンで応答します。 クライアントが許容可能なプロトコルバージョンの1つと一致できる場合、接続は続行されます。 サーバーは公開ホストキーも提供します。これを使用して、クライアントはこれが目的のホストであるかどうかを確認できます。

この時点で、両方の当事者は、Diffie-Hellmanアルゴリズムと呼ばれるバージョンを使用してセッションキーをネゴシエートします。 このアルゴリズム(およびその変形)により、各当事者が自分のプライベートデータを他のシステムからのパブリックデータと組み合わせて、同一の秘密セッションキーに到達することが可能になります。

セッションキーは、セッション全体を暗号化するために使用されます。 手順のこの部分で使用される公開鍵と秘密鍵のペアは、サーバーに対してクライアントを認証するために使用されるSSH鍵とは完全に分離されています。

古典的なDiffie-Hellmanのこの手順の基本は、次のとおりです。

  • 両当事者は、シード値として機能する大きな素数に同意します。
  • 両当事者は、事前定義された方法で値を操作するために使用される暗号化ジェネレーター(通常はAES)に同意します。
  • 独立して、各当事者は、他の当事者から秘密にされている別の素数を考え出します。 この番号は、この対話の秘密鍵として使用されます(認証に使用される秘密SSH鍵とは異なります)。
  • 生成された秘密鍵、暗号化ジェネレータ、および共有素数は、秘密鍵から派生した公開鍵を生成するために使用されますが、これは相手と共有できます。
  • 次に、両方の参加者が、生成された公開鍵を交換します。
  • 受信エンティティは、自身の秘密鍵、相手方の公開鍵、および元の共有素数を使用して、共有秘密鍵を計算します。 これは、反対の秘密鍵と公開鍵を使用して各当事者によって個別に計算されますが、同じ共有秘密鍵になります。
  • 共有シークレットは、その後のすべての通信を暗号化するために使用されます。

このプロセスにより、各パーティは共有シークレットの生成に等しく参加できます。これにより、一方の端がシークレットを制御することはできません。 また、安全でないチャネルを介してその情報を送信することなく、同一の共有シークレットを生成するタスクを実行します。 残りの接続に使用される共有秘密暗号化は、バイナリパケットプロトコルと呼ばれます。

生成された秘密は対称鍵です。つまり、メッセージの暗号化に使用されたのと同じ鍵を使用して、反対側でメッセージを復号化できます。 これの目的は、外部から解読できない暗号化されたトンネルでそれ以降のすべての通信をラップすることです。

セッションの暗号化が確立されると、ユーザー認証段階が始まります。

サーバーへのユーザーのアクセスの認証

次のステップでは、ユーザーを認証し、アクセスを決定します。 サーバーが受け入れるものに基づいて、認証に使用できるいくつかの方法があります。

一般的な方法はパスワード認証です。これは、サーバーがクライアントにログインしようとしているアカウントのパスワードの入力を求める場合です。 パスワードはネゴシエートされた暗号化を介して送信されるため、外部からの安全性が確保されます。

パスワードは暗号化されますが、パスワードの複雑さに制限があるため、この方法は一般的に推奨されません。 自動化されたスクリプトは、他の認証方法と比較して、通常の長さのパスワードを非常に簡単に破ることができます。

最も一般的で推奨される代替手段は、SSHキーペアの使用です。 SSHキーペアは非対称キーです。つまり、関連付けられた2つのキーが異なる機能を果たします。

公開鍵は、秘密鍵でのみ復号化できるデータを暗号化するために使用されます。 公開鍵は暗号化できますが、公開鍵から秘密鍵を取得する方法がないため、自由に共有できます。

SSHキーペアを使用した認証は、前のセクションで説明したように対称暗号化が確立された後に開始されます。 手順は次のようになります。

  • クライアントは、認証に使用するキーペアのIDをサーバーに送信することから始めます。
  • サーバーはチェックします authorized_keys クライアントがキーIDのためにログインしようとしているアカウントのファイル。
  • 一致するIDを持つ公開鍵がファイル内で見つかった場合、サーバーは乱数を生成し、公開鍵を使用して番号を暗号化します。
  • サーバーは、この暗号化されたメッセージをクライアントに送信します。
  • クライアントが実際に関連付けられた秘密鍵を持っている場合、その鍵を使用してメッセージを復号化し、元の番号を明らかにすることができます。
  • クライアントは、復号化された番号と通信の暗号化に使用されている共有セッションキーを組み合わせて、この値のMD5ハッシュを計算します。 MD5は、ハッシュ関数を使用して128ビットのハッシュ値を生成するメッセージダイジェストアルゴリズムです。
  • 次に、クライアントは、暗号化された番号メッセージへの応答として、このMD5ハッシュをサーバーに送り返します。
  • サーバーは、クライアントに送信したものと同じ共有セッションキーと元の番号を使用して、MD5値を独自に計算します。 自身の計算をクライアントが送り返した計算と比較します。 これらの2つの値が一致する場合、クライアントが秘密鍵を所有しており、クライアントが認証されていることを証明します。

つまり、キーの非対称性により、サーバーは公開キーを使用してクライアントへのメッセージを暗号化できます。 クライアントは、メッセージを正しく復号化することにより、秘密鍵を保持していることを証明できます。 使用される2種類の暗号化(対称共有秘密鍵と非対称公開鍵/秘密鍵)はそれぞれ、このモデルの特定の長所を活用できます。

結論

SSHで機能している接続ネゴシエーションの手順と暗号化のレイヤーについて学習すると、リモートサーバーにログインしたときに何が起こっているのかをよりよく理解するのに役立ちます。 これで、さまざまなコンポーネントとアルゴリズムの関係を認識し、これらすべての要素がどのように組み合わされているかを理解できます。 SSHの詳細については、次のガイドをご覧ください。