RSA公開鍵と秘密鍵のペアを備えた2台のサーバーがあります。
内部通信にはまだCAを使用していないため、CAなしで鍵を交換する必要があります。
2つのサーバー間の信頼を確立する必要があります。最初のサーバーから2番目のサーバーに公開キーをコピーし、2番目のサーバーから最初のサーバーに公開キーをコピーする必要があります。
これはDiffie–Hellman鍵交換ではないことに注意してください("Diffie-Hellman Key Exchange" in plain English)。
最も簡単な方法は、公開鍵をあるサーバーから別のサーバーに手動でコピーすることです。
追加のオプションは、次の自家製フローを使用することです。
フローを改善するための提案はありますか?
自家製フローは通常セキュリティに悪いので、いくつかのベストプラクティスフローがありますか?
これは、多くの不要なオーバーヘッドを意味します。以下をお勧めします:
したがって、あなたはwillが実際にPKIを使用します。
将来、real(一般的に知られている)CAから証明書を取得する場合、必要なことは、独自の自己署名CA証明書を(自己署名も)に置き換えることだけです。 real CAの証明書。
いいえ、解決策は良いとは思いません。それを見てみましょう:
交換がどのように機能するかは特定しませんでしたが、トークンを単純なAPI認証トークンとして使用しても、 [〜#〜] mitm [〜#〜] 攻撃を防ぐことはできません。
2つのサーバー間の通信で、攻撃者は次のことができます。
または視覚化:
A ------ token -----> E -- authenticate with token --> B
A <-- fake pkeyB ---- E <------ real pkeyB ----------- B
A --- real pkeyA ---> E ------- fake pkeyA ----------> B
あなたは 対称鍵暗号 を望んでいるようです、おそらく Kerberos のようなものです。しかし、あなたが説明するユースケースでは、キーを手動でコピーするのが最も簡単に見えます(または、キーを安全に交換せずに、受信したキーのフィンガープリントを手動でチェックします)。
信頼できないネットワークによって分離された2つのサーバー間で初期信頼を確立する唯一の方法は、手動で行う必要があります1 ステップ。これは、手動でコピーするか、キーを信頼する前にキーが正しく送信されたかどうかを手動で比較することで実現できます。手動による比較は、通常、キーフィンガープリントを使用して行われます。これは、コピーされたファイルのセキュアハッシュ(SHA-256など)を比較することでも実行できます。
他の方法もありますが、2つのサーバー間で情報の一部を転送する必要があります。それを回避する方法はありません。数学的に証明できます。信頼できない接続を介してキーをコピーし、指紋を手動で比較することは、私の意見では最も簡単な方法であり、またかなり標準的です。
サーバーのネットワークでは、ネットワークに追加されたサーバーごとに1つのキーを転送するだけでよいことに注意してください。Nサーバーのネットワークでは、このような操作は合計でN-1回行われます。相互の鍵を信頼するサーバーA、B、CのネットワークにサーバーXを追加する場合は、XとAの間に初期信頼を確立するだけで済みます。たとえば、AとXの信頼関係を確立できます。キー署名によって確立されます。
1 ここでは、単語manualを使用して簡単にしました。基本的には、信頼できるチャネルを介して、あるパーティ(サーバー)から別のパーティ(サーバー)に情報を送信する必要があるということです。この信頼できるチャネルは、信頼できるケーブル接続である可能性があるため、紙に書き留めたキーフィンガープリントでサーバーに運転するオペレーターである可能性があります。さらに、接続がtrustedになるためには、公開鍵交換のコンテキストで、中間者攻撃に耐性がある必要があるだけです。つまり、接続の整合性を維持する必要があります。メッセージ。接続の盗聴の可能性は、この信頼を損なうことはありません。そのような攻撃者はすべて公開鍵であることを知っているからです。
信頼できるHTTPSサーバーにアクセスできる場合は、サーバー上のすべてのサーバーの公開鍵を投稿し、サーバーにダウンロードします。
HTTPSサーバーが適切に構成されている場合、MitMは公開鍵を変更できず、サーバーは他のすべてのサーバーの公開鍵を安全にダウンロードできます。また、コストが問題になる場合は、Let's Encryptを使用すると、一般向けのSSL証明書を無料で作成できます。
鍵配布の代替手段の1つはDNSです。DNS、つまりDNSレコードで公開され、DNSSECで保護された鍵のフィンガープリントです。これの2つの標準的な例は [〜#〜] sshfp [〜#〜] (SSHホスト鍵の場合)と [〜#〜] dane [〜#〜] ( TLSを使用する任意のサービスの場合)ですが、キーが必要な場合により意味がある場合は、TXTレコードまたは同様のレコードで独自にロールすることができます。
最終的に、これは、信頼できる既存の署名機関(この場合は、DNSルートとDNSSECチェーンからドメインへのチェーン)の必要性を回避するものではありませんが、必要な場合は、Web PKI/CAエコシステムを回避します。 。
公開鍵は暗号化せずに安全に共有できます。特別なレベルのセキュリティが必要な場合は、最初に新しい鍵ペアを生成してthouse一時鍵公開部分を共有し、元の公開鍵を送信して一時鍵を破棄し、元の公開鍵でセッションを再開することを検討してください。
ただし、転送中に一時的および元の公開鍵を置き換えることでMIM攻撃からの安全を確保する必要がある場合は、信頼できるルートストレージを使用するか、ハードコードされた公開鍵を使用してセッションを開始する必要があります。これらの両方の方法で、これらのキーのセキュリティは古くなっており、時々再発行する必要があります。
タスクは、2つのサーバー間でファイルを安全にコピーすることと同じです。
両方のサーバーへのアクセス権があるとすると、両方のサーバーを信頼し、両方のサーバーへのアクセスに使用するチャネルを信頼します(そうでなければ、全体が無意味です)。
サーバーへの接続に使用する手段を使用してファイルをコピーするだけです。
両方のサーバーが何らかの方法で接続されています(そうでない場合、サーバー間の信頼を確立する必要はありません)。おそらく信頼できないが、それらの間のより速い接続によってファイルを転送することもできます。この場合、ユーザーとサーバー間の安全な接続を使用して、元のファイルとコピーのハッシュを計算および比較することにより、転送の結果を確認する必要があります。ファイルが十分に短い場合は、ハッシュではなくファイル自体を比較することもできます。
提案された自社開発フローにはまだCAが必要です。提案されたAPIを安全に呼び出し、MiTMまたはなりすましの攻撃を受けないようにするには、呼び出し先が信頼できることを呼び出し元に確認する必要があります。これにはCAが必要です。
両方のサーバーに安全に接続する方法がすでにある場合は、それを使用してキーを送信します。たとえその方法がサーバーのある場所までドライブしてUSBスティックからキーをロードする場合でも同様です。その安全な方法がそれらにSSHで接続することであり(証明書の警告が表示されない、つまりこれが実際に安全な方法ではないことを意味する場合)、内部通信に利用できるCAにすでにアクセスできます。