web-dev-qa-db-ja.com

シンプルで安全なAPI認証システム

他のウェブサイト/アプリが自分のウェブサイトのデータベースの一部にアクセスするための単純なREST JSON APIを持っています(PHPゲートウェイを介して)。基本的に、サービスは次のように機能します。 :example.com/fruit/orangeを呼び出すと、サーバーはオレンジに関するJSON情報を返します。問題は次のとおりです。このサービスへのアクセスを許可するWebサイトのみが必要です。シンプルなAPIキーシステムを使用すると、どのWebサイトでもコピーすることでキーをすばやく取得できます。承認されたWebサイトの(潜在的に)クライアント側コードからのキー。OAuthを見ましたが、私が行っていることには少し複雑なようです。解決策は?

35
Russ

OAuthを使用する必要があります。

実際には2つのOAuth仕様、3本足バージョンと2本足バージョンがあります。3本足バージョンが最も注目を集めているバージョンであり、それは使用したいもの。

幸いなことに、2脚バージョンは希望どおりに動作し、アプリケーションが共有秘密鍵を介して別のアクセスを許可できるようにします(AmazonのWebサービスモデルと非常によく似ており、HMAC-SHA1署名方式を使用します)または公開/秘密鍵システムを介して(署名方法:RSA-SHA1を使用)。悪いニュースは、まだ3本足バージョンほど十分にサポートされていないことです。そのため、今の場合よりも少し多くの作業を行う必要があるかもしれません。

基本的に、2本足のOAuthは、現在の日付、「nonce」と呼ばれる乱数、およびのパラメータを含むいくつかのフィールドに「署名」(ハッシュを計算)する方法を指定するだけです。これにより、Webサービスへのリクエストを偽装することが非常に難しいになります。

OAuthは、ゆっくりではありますが確実にこの種の標準として受け入れられるようになっています。OAuthを採用すれば、利用可能なさまざまなライブラリを活用できるため、長期的には最善を尽くすことができます。

最初にやりたいと思うよりも手の込んだものですが、良いニュースは、多くの人がそれに多くの時間を費やしているので、何も忘れていないことを知っているということです。良い例は、ごく最近、TwitterがOAuthコミュニティが現在閉鎖に取り組んでいるセキュリティのギャップを発見したことです。独自のシステムを発明した場合は、すべてを把握する必要があります。これは自分で。

幸運を!

クリス

28
Chris Harris

OAuthはここでの解決策ではありません
OAuthは、エンドユーザーがいて、サードパーティのアプリがエンドユーザーのパスワードを処理しないようにしたい場合です。 OAuthを使用する場合: http://blog.apigee.com/detail/when_to_use_oauth/

単純なapi-keyを探します。
さらに安全なソリューションが必要な場合は、追加の対策を講じてください。

詳細は次のとおりです http://blog.apigee.com/detail/do_you_need_api_keys_api_identity_vs._authorization/

21

誰かのクライアント側のコードが危険にさらされた場合、彼らは新しいキーを取得する必要があります。彼らのコードが公開されている場合、あなたができることはあまりありません。

ただし、許可されたサーバーのIPアドレスを特定のキーに対してシステムに登録するように要求することで、より厳密にすることができます。これは余分なステップを追加し、やり過ぎかもしれません。

「単純なAPIキー」を使用することの意味はわかりませんが、秘密キー(クライアントとサーバーにのみ認識される)を持つある種の認証を使用してから、データに対してある種のチェックサムアルゴリズムを実行する必要があります。クライアントが実際にあなたが思っている人であり、データが転送中に変更されていないことを確認してください。 Amazon AWS はこれを行う方法の良い例です。

クライアント側でコードが危険にさらされていないことを保証するのは少し厳しいかもしれません。クライアントのデータのセキュリティについて、クライアントに責任を負わせるのは合理的だと思います。もちろん、これは、攻撃者がそのクライアントのアカウントを台無しにすることしかできないことを前提としています。

おそらく、特定のアカウントに対してどのIP要求が送信されているかをログに記録し、新しいIPが発生した場合は、アカウントにフラグを付け、クライアントに電子メールを送信して、そのIPを承認するように依頼できます。多分そのようなことがうまくいくかどうかはわかりません。

4
Kekoa

基本的に、IPによるアクセスを制限するか、APIキーを使用するかの、2つのオプションがあります。どちらのオプションにも、プラス面とマイナス面があります。

IPによる制限
これは、サービスへのアクセスを制限するための便利な方法です。特別な認証機能の実装を強制することなく、サービスへのアクセスを許可するサードパーティサービスを正確に定義できます。ただし、この方法の問題は、サードパーティのサービスがたとえば完全にJavaScriptで記述されている場合、受信リクエストのIPはサードパーティのサービスのサーバーIPではなく、リクエストが行われるときのユーザーのIPになることです。サーバーではなく、ユーザーのブラウザによって。したがって、IP制限を使用すると、クライアント駆動型アプリケーションを作成できなくなり、すべての要求が適切なアクセス権でサーバーを通過するようになります。 IPアドレスもスプーフィングされる可能性があることに注意してください。

APIキー
APIキーの利点は、既知のIPのリストを維持する必要がなく、APIキーのリストを維持する必要があることですが、それらの維持を自動化する方が簡単です。基本的にこれがどのように機能するかは、ユーザーIDとシークレットパスワードなどの2つのキーがあることです。サービスへの各メソッドリクエストは、リクエストパラメータ、ユーザーID、およびこれらの値のハッシュで構成される認証ハッシュを提供する必要があります(ここで、秘密のパスワードはハッシュソルトとして使用されます)。このようにして、アクセスの認証と制限の両方を行うことができます。これに伴う問題は、サードパーティのサービスがクライアント駆動型(JavaScriptやActionScriptなど)として記述されている場合、誰でもコードからユーザーIDとシークレットソルトの値を解析できることです。

基本的に、具体的に定義した少数のサービスのみがサービスへのアクセスを許可されるようにしたい場合は、IP制限を使用して、サーバー経由ですべてのリクエストをルーティングするように強制するしかありません。 APIキーを使用する場合、これを強制する方法はありません。

2
Kim L

IPのセキュリティの生成はすべて、接続する前にユーザーに大きなバグをもたらすようです。 Symbian 60sは、複数のユーザーの真っ只中にトレースされていない、信頼性が高く安全な信号を残すための最大限の機能を備えています(Opera Handler UI 6.5、Opera Mini v8 and 10)コード化されたUIとともに、完全に満たされたネットワーク設定。より高速なリンク方法を作成する発見可能な方法が最終的に得られたときに、他の機能を制限する理由。より識別されたアカウントを維持し、その「真のアカウント」を適切に監視する-順調に進んでいます-請求書の支払いを遵守し、ユーザーの残高が期限切れになっていないかどうかを知ることで、人気のある/署名されたモバイル業界へのインターネット信号のより高速なリンクが作成されます。サイトにアクセスする前にハードセキュリティ機能を作成する理由、彼らのアカウントは毎月すべての接続の問題を消去する可能性がありますか?モバイルのすべてのユーザーは、未払いの請求書がある場合、「接続する」機能を持ってはなりません。「ALL inOne」を提供しないのはなぜですか? OS、(おそらく電子メールアカウント)代わりに、支払いを行っているかどうかにかかわらず、「監視機能」を使用します(パスワードの問題が懸念されます-他の部門に提供する必要があります)。そして、「そうでない」場合は、アカウントと他のリンク機能を正確にオフにします。彼らはそれぞれ、毎日どこに夢中になるかについて独自の関心を持っています。未払いの請求のためにロック/オフにすると、再購読を開始し、より責任のあるユーザーになるためにさらに懲戒し、さらには期限切れになる可能性があります。維持されていない場合はアカウント。ネットワークプロバイダーとのコラボレーションにより、識別された「真のアカウント」を毎月監視またはアクセスすると、データサービスを表示するためにユーザーの「名前」と「パスワード」、「場所」、「許可」を常に要求するのではなく、プライバシーが向上します。 IPはすでに最初のIDまたは「ユーザーの場所の検索」としてマークされているため、ブラウザの事前検索に配置する必要はないようです。「データの取得」または「データの処理」を使用してみませんか。

0
Marlon