SSH暗号化および接続プロセスの理解
紹介
SSH、またはセキュアシェルは、安全なプロトコルであり、リモートサーバーを安全に管理する最も一般的な方法です。複数の暗号化技術を使用して、SSHは二者間で暗号的に保護された接続を確立し、一方の認証を他方に行い、コマンドや出力を往復させるためのメカニズムを提供します。
このガイドでは、SSHが使用する基本的な暗号化技術と、安全な接続を確立するために使用される方法を検討します。この情報は、さまざまな暗号化の層と接続を形成し、両者を認証するために必要な異なる手順を理解するのに役立ちます。
対称暗号、非対称暗号、およびハッシュの理解
情報の伝達を確保するために、SSHは取引のさまざまなポイントで異なる種類のデータ操作技術を採用しています。これには対称暗号化、非対称暗号化、ハッシュ化の形式が含まれます。
対称暗号化
データを暗号化および復号化するコンポーネントの関係は、暗号化スキームが対称式か非対称式かを決定します。
対称暗号は、一つの鍵を使って相手にメッセージを暗号化し、さらに他の参加者から受け取ったメッセージを復号化することができる暗号化の一種です。これは、鍵を持っている人なら誰でも、他の鍵を持っている人にメッセージを暗号化して復号化できることを意味します。
このタイプの暗号化方式は、一般的に「共有秘密」暗号または「秘密鍵」暗号と呼ばれます。通常、すべての操作に使用される単一の鍵、または関係が発見可能で反対の鍵を導き出すことが trivial な対となる鍵のペアが存在します。
対称鍵はSSHによって接続全体を暗号化するために使用されます。一部のユーザーが仮定するように、作成できる公開鍵/秘密鍵の非対称鍵ペアは認証にのみ使用され、接続を暗号化するためには使用されません。対称暗号化により、パスワード認証でもスヌーピングから保護されることができます。
クライアントとサーバーの両方がこのキーを確立するために貢献し、結果として得られる秘密は外部の関係者には決して知られません。秘密鍵は、鍵交換アルゴリズムとして知られるプロセスを通じて作成されます。この交換により、サーバーとクライアントは特定の公開データを共有し、それを特定の秘密データで操作することによって、独立して同じ鍵に到達します。このプロセスについては後ほど詳しく説明します。
この手順によって作成された対称暗号鍵はセッションベースであり、サーバーとクライアント間で送信されるデータの実際の暗号化を構成します。これが確立されると、残りのデータはこの共有された秘密で暗号化する必要があります。これはクライアントの認証の前に行われます。
SSHは、Advanced Encryption Standard(AES)、Blowfish、3DES、CAST128、Arcfourなど、さまざまな対称暗号システムを使用するように構成できます。サーバーとクライアントは、サポートされている暗号のリストを優先順位に従って決定できます。クライアントのリストからサーバーで利用可能な最初のオプションが、双方向の暗号アルゴリズムとして使用されます。
Ubuntu 20.04では、クライアントとサーバーの両方が次のようにデフォルト設定されています。
chacha20-poly1305@openssh.comaes128-ctraes192-ctraes256-ctraes128-gcm@openssh.comaes256-gcm@openssh.comこれは、2台のUbuntu 20.04マシンが相互接続している場合(設定オプションを通じてデフォルトの暗号を上書きしない限り)、常に接続を暗号化するためにchacha20-poly1305@openssh.com暗号を使用することを意味します。
非対称暗号
非対称暗号は、データを一方向に送信するために2つの関連付けられたキーが必要であるため、対称暗号とは異なります。これらのキーの一つはプライベートキーとして知られており、もう一つはパブリックキーと呼ばれています。
公開鍵は、あらゆる関係者と自由に共有できます。それは対応する秘密鍵と関連していますが、秘密鍵は公開鍵から生成することはできません。公開鍵と秘密鍵の間の数学的関係により、公開鍵はメッセージを暗号化することができ、これは秘密鍵のみが復号化できるものです。これは一方向の機能であり、公開鍵は書き込むメッセージを復号化する能力を持たず、また秘密鍵が送信するものを復号化することもできません。
プライベートキーは完全に秘密に保たれ、他の党と共有されることは決してあってはなりません。これは、公開鍵パラダイムが機能するための重要な要件です。プライベートキーは、関連する公開鍵を使用して暗号化されたメッセージを解読できる唯一のコンポーネントです。この事実により、これらのメッセージを解読できるいかなるエンティティも、プライベートキーを制御していることを示しています。
SSHは、いくつかの異なる場所で非対称暗号化を使用します。セッションを暗号化するために使用される対称暗号化を設定するための最初の鍵交換プロセス中に、非対称暗号化が使用されます。この段階では、双方が一時的な鍵ペアを生成し、対称暗号化に使用される共有秘密を生成するために公開鍵を交換します。
SSHでの非対称暗号化の一般的な使用法は、SSHキーに基づく認証から来ています。SSHキーのペアは、クライアントがサーバーに認証するために使用できます。クライアントはキーのペアを作成し、その後、アクセスしたいリモートサーバーに公開鍵をアップロードします。これは、リモートサーバーのユーザーアカウントのホームディレクトリ内にある~/.sshディレクトリ内のauthorized_keysというファイルに配置されます。
対称暗号化がサーバーとクライアント間の通信を保護するために確立された後、クライアントはアクセスを許可されるために認証する必要があります。サーバーはこのファイル内の公開鍵を使用して、クライアントへの挑戦メッセージを暗号化できます。クライアントがこのメッセージを復号できたことを証明できれば、それは関連する秘密鍵を所有していることを示しています。その後、サーバーはクライアントのために環境を設置できます。
ハッシング
SSHが利用するデータ操作の別の形式は、暗号学的ハッシュです。暗号学的ハッシュ関数は、一連の情報の簡潔な「署名」または要約を作成する方法です。それらの主な特徴は、決して逆にすることを意図していない、予測可能に影響を与えることがほぼ不可能である、そして実質的にユニークであることです。
同じハッシュ関数とメッセージを使用すると、同じハッシュが生成されるべきです。データの任意の部分を変更すると、まったく異なるハッシュが生成されるはずです。ユーザーは与えられたハッシュから元のメッセージを復元することができてはいけませんが、与えられたメッセージが与えられたハッシュを生成したかどうかを判断することはできるべきです。
これらの特性により、ハッシュは主にデータの整合性を確保する目的と、通信の真正性を検証するために使用されます。SSHでの主な使用方法は、HMAC、つまりハッシュベースのメッセージ認証コードです。これらは、受信したメッセージテキストが完全で改ざんされていないことを保証するために使用されます。
前述の対称暗号の交渉の一部として、メッセージ認証コード(MACアルゴリズム)が選択されます。このアルゴリズムは、クライアントの受け入れ可能なMACの選択リストを通じて選定されます。このリストの中でサーバーがサポートする最初のものが使用されます。
暗号化後に交渉された各メッセージは、他の当事者がパケットの整合性を確認できるようにMACを含む必要があります。MACは、対称的な共有秘密、メッセージのパケットシーケンス番号、および実際のメッセージ内容から計算されます。
MAC自体はパケットの最終部分として対称的に暗号化された領域の外に送信されます。研究者たちは一般的に、データを最初に暗号化し、その後にMACを計算するこの方法を推奨しています。
SSHの仕組みを理解する
あなたはおそらくSSHの仕組みについて基本的な理解を持っているでしょう。SSHプロトコルは、クライアント-サーバーモデルを使用して二者を認証し、彼らの間のデータを暗号化します。
サーバーコンポーネントは、指定されたポートで接続を待機します。これは、安全な接続の交渉、接続する当事者の認証、および資格情報が受け入れられた場合に正しい環境を生成する責任があります。
クライアントは、サーバーとの初期のトランスミッションコントロールプロトコル(TCP)ハンドシェイクを開始し、安全な接続を交渉し、サーバーのIDが以前に記録された情報と一致することを確認し、認証用の資格情報を提供する責任があります。
SSHセッションは2つの別々の段階で確立されます。最初の段階は、将来の通信を保護するための暗号化を合意し確立することです。2番目の段階は、ユーザーを認証し、サーバーへのアクセスを許可すべきかどうかを確認することです。
セッションのための暗号化の交渉
クライアントによってTCP接続が確立されると、サーバーはサポートしているプロトコルバージョンを応答します。クライアントが受け入れ可能なプロトコルバージョンのいずれかに一致することができれば、接続は続行されます。サーバーはまた、クライアントがこのホストが意図されたものであるかどうかを確認するために使用できる公開ホストキーも提供します。
この時点で、両当事者は、ディフィー・ヘルマンアルゴリズムと呼ばれるもののバージョンを使用してセッションキーを交渉します。このアルゴリズム(およびそのバリアント)は、各当事者が自分のプライベートデータを相手のシステムからのパブリックデータと組み合わせて、同一の秘密のセッションキーを得ることを可能にします。
セッションキーは、セッション全体を暗号化するために使用されます。この手続きのために使用される公開鍵と秘密鍵のペアは、クライアントをサーバーに認証するために使用されるSSH鍵とは完全に別のものです。
この古典的なDiffie-Hellmanの手続きの基礎は次の通りです:
- 両者は大きな素数に合意し、それがシード値として使われます。
- 両当事者は、事前に定義された方法で値を操作するために使用される暗号化生成器(通常はAES)に合意します。
- それぞれの当事者は、他の当事者に秘密にする別の素数を考え出します。この数は、このやり取りのための秘密鍵として使用されます(認証に使用される秘密SSH鍵とは異なります)。
- 生成された秘密鍵、暗号化生成器、共有された素数は、秘密鍵から導出される公開鍵を生成するために使用されますが、これは相手と共有することができます。
- 両方の参加者は、その後、自分たちの生成した公開鍵を交換します。
- 受信側のエンティティは、自身の秘密鍵、相手側の公開鍵、および元の共有素数を使用して、共有秘密鍵を計算します。これは各党が独立して計算しますが、逆の秘密鍵と公開鍵を使用することで、同じ共有秘密鍵が得られます。
- 共有された秘密は、その後のすべての通信を暗号化するために使用されます。
このプロセスは、各当事者が共有された秘密の生成に平等に参加できるようにし、一方の端が秘密を制御することを許さない。さらに、情報を安全でないチャネルで送信することなく、同一の共有秘匿を生成するという目的を達成する。この後の接続に使用される共有秘匿暗号化は、バイナリパケットプロトコルと呼ばれる。
生成された秘密は対称鍵であり、メッセージを暗号化するために使用される鍵が、反対側でそれを復号化するためにも使用できることを意味します。これの目的は、外部の者によって解読できない暗号化トンネルで、すべてのさらに進んだ通信を包むことです。
セッションの暗号化が確立された後、ユーザー認証ステージが始まります。
ユーザーのサーバーアクセスの認証
次のステップは、ユーザーの認証とアクセスの決定です。サーバーが受け入れるものに基づいて、いくつかの認証方法を使用できます。
一般的な方法は パスワード認証 です。これは、サーバーがクライアントにログインしようとしているアカウントのパスワードを要求する時のことを指します。パスワードは交渉された暗号化を通じて送信されるため、外部の関係者からは安全です。
パスワードは暗号化されるものの、この方法はパスワードの複雑さに制限があるため、一般的には推奨されません。自動化スクリプトは、他の認証方法と比較して、通常の長さのパスワードを非常に簡単に破ることができます。
最も人気があり推奨される代替手段は、SSHキーのペアの使用です。SSHキーのペアは非対称鍵であり、関連する2つの鍵は異なる機能を果たします。
公開鍵はデータを暗号化するために使用され、プライベート鍵のみで復号化できます。公開鍵は自由に共有できます。なぜなら、プライベート鍵のために暗号化できるものの、公開鍵からプライベート鍵を導き出す方法は存在しないからです。
SSHキー ペアを使用した認証は、前のセクションで説明したように対称暗号化が確立された後に始まります。手順は次のようになります:
- クライアントは、サーバーに認証したいキーペアのIDを送信することから始めます。
- サーバーは、クライアントがログインしようとしているアカウントの
authorized_keysファイルを確認して、キーIDを探します。 - ファイルに一致するIDを持つ公開鍵が見つかった場合、サーバーはランダムな数を生成し、その公開鍵を使用して数を暗号化します。
- サーバーはクライアントにこの暗号化されたメッセージを送信します。
- もしクライアントが実際に関連する秘密鍵を持っているなら、その鍵を使用してメッセージを復号化し、元の番号を明らかにすることができます。
- クライアントは、通信を暗号化するために使用されている共有セッションキーと復号化された番号を組み合わせ、この値のMD5ハッシュを計算します。MD5は、128ビットのハッシュ値を生成するためにハッシュ関数を使用するメッセージダイジェストアルゴリズムです。
- その後、クライアントはこのMD5ハッシュを暗号化された数のメッセージへの回答としてサーバーに送信します。
- サーバーは、クライアントに送信した同じ共有セッションキーと元の番号を使用して、自分自身でMD5値を計算します。サーバーは自分の計算結果をクライアントから返送されたものと比較します。これらの2つの値が一致すると、クライアントが秘密鍵を所持していたことが証明され、クライアントが認証されます。
要するに、鍵の非対称性により、サーバーは公開鍵を使用してクライアントにメッセージを暗号化できます。その後、クライアントはメッセージを正しく復号することで、秘密鍵を保持していることを証明できます。このモデルでは、使用される2種類の暗号化(対称共有秘密鍵と非対称公開/秘密鍵)は、それぞれ特有の強みを活かすことができます。
結論
SSHの接続交渉手順と動作している暗号化の層について学ぶことで、リモートサーバーにログインするときに何が起こっているのかをよりよく理解できます。これで、さまざまなコンポーネントとアルゴリズムの関係を認識し、これらのすべての要素がどのように組み合わさっているかを理解できるようになります。SSHの詳細については、以下のガイドをご覧ください。
- LinuxサーバーでSSHキー認証を設定する方法
- リモートサーバーに接続するためのSSHの使い方
- さまざまなオペレーティングシステムのためのSSHキーの設定方法
- SSHの基本: SSHサーバー、クライアント、およびキーとの作業
