web-dev-qa-db-ja.com

サーバー間の安全な通信を行う方法

PHPで2つのWebアプリケーションを備えた2つのサーバーがあります。このサーバーが安全な通信を行うには、私のスコープが必要です。

アプリケーション1でPOSTアプリケーション2を作成する必要がありますが、アプリケーション2ではPOSTがアプリケーション1からのものであることを確認する必要があります。

それを理解する最良の方法はどれですか?

ハッシュキーのようないくつかの代替案を考えて情報を暗号化し、その情報に対して1分のウィンドウを有効にしたので、実際の日付の1分を超える日付の投稿を取得した場合、それは無効な投稿です。

私の最大の心配事は、中間者攻撃です。

13
Guerra

アプリケーション1でPOSTアプリケーション2を作成する必要がありますが、アプリケーション2ではPOSTがアプリケーション1からのものであることを確認する必要があります。

この投稿では、アプリケーション1をClientと呼び、アプリケーション2をServerと呼びます。

始めましょう:

私の最大の心配は、中間者攻撃です。

クライアントがサーバーに接続するときに、クライアントがサーバーのIDを確認し、中間者なしがあることを確認する必要があります。 (MITM)これは、オンラインバンキングやその他の機密操作のために安全な接続を確立しようとするときにブラウザーが直面する問題と同じです。

  • これは標準HTTPS証明書(TLS暗号化を使用)を使用して簡単に保護されます。接続は非対称暗号化を使用して保護されているため、MITMを実行する唯一の方法は、サーバーのファイルシステムから秘密キーを盗むことです。

    証明書は、認証局から数年ごとの更新で発行できます。または、クライアントシステムに保存されている自己署名証明書を無料で作成できます。

現在はサーバーIDがあり、MITMは正常に阻止されました。 クライアントのIDを確認するだけで済みます。続行するにはいくつかの方法があります。 1つ選択

  1. 共有シークレット:クライアントマシンにパスワードを含めるだけで、サーバーはそれが一致することを確認する必要があります。これはクライアントの身元を確認する最も簡単な方法であり、HTTPSのおかげで安全です。

  2. TLS接続の一部としてのクライアント証明書:HTTPSはクライアント証明書の手段を提供しますが、これは必要以上に複雑であることがわかりました。

  3. 暗号化を使用した時刻:独自のRSA秘密鍵と公開鍵を自分で作成します。公開鍵をクライアントに保存すると、サーバーは秘密鍵を使用して復号化します。クライアントは時刻を暗号化し、サーバーはそれが正しいことを確認します。 (範囲内)

  4. チャレンジ/レスポンス:この場合、公開RSAキーはサーバーに保存され、秘密キーはクライアントに保存されます。サーバーはリクエストIDとともにランダムな文字列をクライアントに送信します。クライアントは情報を解読し、一致するリクエストIDで情報を返信できる必要があります。復号化が成功した場合、クライアントIDが検証されます。

    これが他の人よりも優れている点は、攻撃者がサーバーのハッキングとファイルのダウンロードに成功した場合、より高度なハッキングなしではクライアントを偽装できないことです。 (彼はMITMに一歩近づくでしょうが)ソリューション1、2、3では、サーバーのファイルシステムから適切なファイルをダウンロードするだけで、クライアントを偽装するために必要な情報が提供されます。

ソリューション3と4には、リプレイ攻撃に対する保護が最も効果的です。ソリューション1は、リプレイ攻撃防止と互換性がありません。ただし、HTTPSを使用するユースケースでは、リプレイはサーバーファイルシステムのハッキングが成功し、それによってMITMが許可された後にのみ問題になると思います。

ボーナス:

  • IPアドレス:可能であれば、サーバーに、接続が所定のクライアントIPアドレスから発信されていることを確認してもらいます。クライアントIPアドレスが変更されていないことが確認された場合、このボーナス保護は、上記で提供したソリューションへの攻撃に対する多大な保護を提供します。
21
Bryan Field