web-dev-qa-db-ja.com

RESTful Webサービスを保護する方法は?

安全な RESTful Webサービス を実装する必要があります。私はすでにGoogleを使用していくつかの研究をしましたが、行き詰っています。

オプション:

TLS(HTTPS)+

考慮すべき選択肢は他にありますか? OAuthの場合、どのバージョンですか?それも重要ですか?これまでに読んだことから OAuth 2. はベアラートークン(つまり署名なし)で 安全でない のようです。

RESTベースの認証 に関する別の非常に興味深い記事を見つけました。

REST AP​​Iを保護...正しい方法

88
Jan Deinhard

別の非常に安全な方法があります。クライアント証明書です。 httpsでサーバーにアクセスしたときにサーバーがSSL証明書を提示する方法を知っていますか?サーバーはクライアントに証明書を要求できるため、クライアントが本人であることを認識できます。クライアントは証明書を生成し、セキュリティで保護されたチャネルを介して提供します(USBキーを使用してオフィスに来るなど-トロイの木馬以外のUSBキーが望ましい)。

あなたがロードする 証明書の公開鍵 クライアント証明書(および必要に応じてその署名者の証明書)をWebサーバーに送信すると、Webサーバーは誰からの接続も受け入れません除く証明書に対応する秘密鍵を持っている人知っている。 HTTPSレイヤーで実行されるため、OAuthなどのアプリケーションレベルの認証を完全にスキップすることもできます(要件によって異なります)。レイヤーを抽象化してローカル認証局を作成し、クライアントからの証明書リクエストに署名することで、「オフィスに入らせる」および「サーバーに証明書をロードする」手順をスキップできます。

首の痛み?絶対に。すべてに良い?いや。非常に安全ですか?うん。

ただし、クライアントが証明書を安全に保持することに依存しており(プライベートキーをオンラインに投稿することはできません)、通常は、ユーザーを登録して接続させるのではなく、クライアントにサービスを販売するときに使用されます。

とにかく、それはあなたが探している解決策ではないかもしれませんが(おそらく正直ではないでしょう)、それは別のオプションです。

58
Tom Ritter

HTTP Basic + HTTPSは、1つの一般的な方法です。

18
pc1oad1etter

OAuthバージョンから選択する場合は、OAuth 2.0に進みます。

OAuthベアラートークンは、安全なトランスポートでのみ使用する必要があります。

OAuthベアラートークンは、会話を暗号化するトランスポートと同じくらい安全または非安全です。 HTTPSはリプレイ攻撃からの保護を処理するため、ベアラートークンがリプレイから保護する必要はありません。

誰かがあなたのベアラートークンを傍受した場合、APIを呼び出すときにあなたになりすますことができるのは事実ですが、そのリスクを軽減する方法はたくさんあります。トークンに長い有効期限を与え、クライアントがトークンをローカルに保存することを期待する場合、トークンに短い有効期限を与え、すべてのセッションでクライアントに新しいトークンの取得を要求する場合よりも、トークンが傍受されて悪用されるリスクが高くなります。トークンを保持しないようにクライアントにアドバイスします。

複数の参加者を通過するペイロードを保護する必要がある場合、HTTPS/SSLはグラフの1つのリンクのみを暗号化するため、HTTPS/SSL以外のものが必要です。これはOAuthの問題ではありません。

ベアラートークンは、クライアントが簡単に取得でき、クライアントがAPI呼び出しに使用しやすく、Google、Facebook、および他の多くのサービスから公開されているAPIを保護するために(HTTPSで)広く使用されます。

9
dthorpe