web-dev-qa-db-ja.com

REST APIでのリクエスト署名(リクエスト本文のダイジェスト))は必要ですか?

私は現在討論を行っており、これについてのコミュニティの意見は何だったのかと思いました。

  1. REST APIは基本認証(おそらくHTTP)またはOAuthを必要とするだけです)を確認します。

  2. REST APIにも署名が必要です。シークレット、タイムスタンプ、おそらくナンスが含まれています。

  3. REST APIも時々見られます。これには、リクエストパラメータ(特定の方法で組み立てられたもの)も署名に含める必要があります。

3番は全脂肪セキュリティを提供しますが(実際には実際には前者とは間違っていますが)、実装の複雑さが増します-リクエストパラメータを特定の方法で組み立てると、物事を台無しにする大きな機会が生まれ、 APIを「すばやくテスト」するのに別れを告げることができます。

私のセキュリティヘッドは「3番馬鹿で行く」と言いますが、私のユーザビリティヘッドは「これは完全なPITAです。現実の世界では2番で十分です。httpsを介して正しく使用すれば、問題はありません」 。

15
Jamie Edwards

サーバーから、次の2つのことが必要になる場合があります。

  1. リクエストを送信するクライアントが確かに誰であるかを確認するため;
  2. 与えられたリクエストを送信した人が実際に特定のクライアントエンティティであることを第三者に証明できるようにします。

デジタル署名 は、2番目の目標を達成するために多かれ少なかれ必要です。最初の目標では、単純な認証で十分です。 SSL(HTTPS)内で再生されるHTTP「基本認証」で十分です。 「タイプ2」方式は、クライアント証明書に依存する一種の認証です。同様に優れた、有効化が簡単なもう1つの方法は、SSLレベルでクライアント証明書を使用することです(SSLライブラリはnonce-timestamp-signatureビジネス自体を処理します)。

方法1と2のどちらも、訴訟中に使用できる証拠を生み出しません。認証は、適切なクライアントが回線の反対側にあることをサーバーに納得させますが、サーバーは裁判官を納得させることができるものは何も取得しません。そのためには、リクエスト自体の署名、つまり「メソッド3」が本当に必要です。方法3が「より安全」であるということではありません。むしろ、方法3は、特定の場合に役立つ場合とそうでない場合がある追加の機能を提供します。

また、 リプレイアタック が原因である場合でも、署名されたリクエストが認証を完全に置き換えるわけではないことに注意してください。

8
Thomas Pornin

サーバーがHTTPSを使用して(信頼できる証明書のみを使用して)通信される場合、より複雑な方法を使用する直接的な理由はありません。単純な平文パスワードの基本認証で十分で安全です。

通信チャネルがnot信頼されている場合、たとえば、企業の中間者SSLプロキシまたは信頼されていない証明書を許可する場合、リクエストのすべての部分を含めて、「署名」に含める必要があります。何らかの形の再生保護。また、「署名」は認証の秘密を明かしてはなりません。

Thomasがクライアント要求の証明可能性について提起する点は良いものです。ただし、ほとんどのREST APIの「署名」はまったく署名ではありません-証明可能性に向いていない対称認証子です(同じ認証子は計算可能であり、計算可能でなければなりません)サーバーによって)。

そのため、実際にクライアントのクライアント証明書がない限り、クライアントが実際に主張しているのが本人であることを確認する方法はほとんど関係がありません。

1
Nakedible