REST Apiをセキュリティで保護する方法の知識は、Api自体を記述するのと同じくらい重要です。 ほとんどのREST ApiはHTTPプロトコルベースであり、インターネットに接続しているユーザーはそれらにアクセスでき、悪いユーザーもアクセスできます。 ビジネスを保護するために安全なApiを記述することは非常に重要です。
RESTful Apiの保護を開始する前に、開発者としての選択肢が何であるかを理解しましょう。 私達のusecaseのためのよい適合は何ですか。
Table of Contents1. Authentication vs. Authorization2. Four Ways to Secure RESTful Web Services- BASIC Authentication- DIGEST Authentication- Client CERT Authentication- OAUTH2 API Keys3. RESTful Web Services Security Implementations- Using SecurityContext- Using Annotations4. Best Practices
主な議論に飛び込む前に、認証とは何か、承認とは何かについての事実をまっすぐにしましょう。
平易な英語では、認証は、”ユーザーが本当に彼が主張する人である”ことを確認するプロセスです。 技術的には、ユーザー名/パスワードまたは指紋スキャン、セキュリティトークン、セキュリティ質問またはSSOログインから受信したSAMLトークンなどの同様のメカニ ユーザーを他のユーザーから識別できるものが必要です。
ユーザーがシステム内に入ると、承認とは、”ユーザーが何をすることが許可されているか”と、彼が何ではないかを決定するルールを指します。 承認は、システム管理者によるアクセス許可の入門的な設定と、ユーザーがシステムにアクセスするときに既に設定されているアクセス許可値のチェッ
RESTfulなwebサービスを保護するときは、両方の要因に注意する必要があります。 二つの概念は完全に直交し、独立していますが、両方ともセキュリティ設計の中心であり、どちらか一方を正しく取得できないと、侵害されたシステムの可能性が高くなります。.
RESTful Webサービスを保護する4つの方法
JavaでRESTful APIを保護するには、複数の方法があります。 のは、4つの最も人気のある選択肢を通過してみましょう:
2.1。 基本認証
これは、すべての技術の中で最も簡単で、おそらく最もよく使用されています。 あなたはログイン/パスワードフォームを使用します–それは基本認証のみです。 ユーザー名とパスワードを入力してフォームをサーバーに送信すると、アプリケーションはユーザーとしてあなたを識別します–システムの使用が許可されています–
このセキュリティ実装の主な問題は、資格情報がクライアントからサーバーに単純な方法で伝播されることです。 認証情報は、転送中にBase64でエンコードされるだけですが、暗号化されたりハッシュされたりすることはありません。 このようにして、どのスニファでもネットワーク経由で送信されたパッケージを読むことができます。
HTTPSは、通常、Webサーバーとの会話を完全に暗号化する基本認証よりも優先されるか、またはそれと組み合わせて使用されます。 最良の部分は、誰もが基本的な認証が行われていることを外部から推測することさえできないということです。
2.2. ダイジェスト認証
この認証方法は、ハッシュアルゴリズムを使用して、ユーザーが入力したパスワード(パスワードハッシュと呼ばれる)をサーバーに送信する前に暗号化します。 これは、明らかに、ユーザーのパスワードが簡単にそれを傍受誰でも読むことができるプレーンテキストで移動する基本的な認証方法よりもはるかに安全
続きを読む:暗号化されたパスワードを生成
javaには多くのハッシュアルゴリズムがあり、MD5、SHA、BCrypt、SCrypt、Pbkdf2Withhmacsha1アルゴリズムなどのパスワードセキ
このパスワードハッシュが生成され、データベースに保存されると、元のパスワードに戻すことはできません。 ユーザーがアプリケーションにログインするたびに、パスワードハッシュを再度再生成し、データベースに格納されているハッシュと一致する必要があります。 したがって、ユーザーがパスワードを忘れた場合は、一時的なパスワードを送信し、新しいパスワードで変更するように依頼する必要があります。 まあ、それは今、一般的な傾向です-日。
2.3. クライアント証明書認証
これは、証明書を介してサーバーとクライアントの間で信頼契約が確立されるメカニズムです。 認証のために提示された証明書が正当であることを確認するために設立された代理店によって署名されなければなりません(CAと呼ばれます)。
この手法を使用すると、クライアントは保護されたリソースにアクセスしようとすると、ユーザー名やパスワードを提供する代わりに、証明書をサーバーに提 証明書には、一意の秘密鍵と公開鍵のペアに加えて、セキュリティ資格情報を含む認証のためのユーザー情報が含まれています。 次に、サーバーは、ユーザーがCAを介して正当であるかどうかを判断します。 さらに、ユーザーがリソースへのアクセス権を持っているかどうかを確認する必要があります。 このメカニズムは、クライアントのidを盗むことを防ぐための安全なチャネルがないため、通信プロトコルとしてHTTPSを使用する必要があります。
セキュリティ証明書を生成するための完全なチュートリアルは、公式のoracle docsにあります。
2.4. Oauth2API Keys
facebook統合やtwitter認証など、クラウドを介して他のアプリケーションと相互作用するアプリケーションを開発したことがある場合。 その後、あなたはすでにこれを使用しています。 彼らはあなたを正しく識別するためにAPIキーとAPI secretを提供する必要があります。 これらのAPIキーと秘密は、推測することが不可能なランダムにエンコードされた文字列です。
それがどのように機能するかを理解するために、Flickr(写真共有アプリケーション)を使用していて、REST APIを使用して写真の一部を投稿したいとしましょう。 Flickr docsに記載されているように要求をビルドしてから送信します。
そして、リクエストを受信すると、Flickrはユーザーに属する秘密鍵でAPIキーから情報を読み取ることによってユーザーを認証します。 これらの検証が成功すると、サーバーはクライアントに応答を配信します。 したがって、私たちは最近Flickrの中に投稿されたすべての写真で応答を取得します。
お気づきのように、この方法では、プロバイダのAPIを使用して簡単にアプリケーションを作成できます。 また、プロバイダはあなたが認証し、公開情報にアクセスすることを可能にします。
誰かが迷惑トラフィックやポリシー違反の送信などの契約を拒否し始めた場合、プロバイダはAPIキーを撤回し、Apiの悪用を防止します。
REST APIセキュリティ実装
上記の概念とは別に、通常は以下の方法を使用してRESTful Apiを社内で保護する必要があります。
3.1. JAX-RS SecurityContextインスタンス
javax.ws.rs.core.SecurityContext
インタフェースは、要求のセキュリティ関連情報へのアクセスを提供し、javax.servlet.http.HttpServletRequest
と非常によく似ています。
SecurityContextにアクセスするには、javax.ws.rs.core.Context
アノテーションを使用して、クラスフィールド、セッターメソッド、またはメソッドパラメータにインスタンスを注入します。sc.isUserInRole()
は、ユーザーの承認をチェックするために使用されます。
3.2. メソッド-レベル認可のJAR-RSアノテーション
この手法は、エンタープライズ–アプリケーションで広く使用されており、特定の操作で使用される認証された JAX-RSは、この目的のために以下の注釈を提供します。
- @PermitAll
- @DenyAll
- @RolesAllowed
アノテーションの使用例は次のようになります:
続きを読む : JAX-RS認証および認可の例
REST APIセキュリティのベスト-プラクティス
RESTful webサービスのセキュリティを設計する際の重要なポイントをいくつかメモ
- 通信全体が常に暗号化されるように、HTTPSプロトコルのみを使用してください。
- クエリパラムとして認証資格情報またはAPIキーを送信しないでください。 彼らはURLに表示され、簡単に記録または追跡することができます。
- 常に最も難しい暗号化レベルを使用します。 それはより多くの自信を持つのに役立ちます。
- RESTful webサービスによって公開されるリソースについては、PUT、POST、およびDELETE要求がクロスサイト要求偽造から保護されていることを確認することが重要です。
- サーバーメソッドで受信した入力データを常にできるだけ早く検証します。 プリミティブデータのみを入力パラメータとして可能な限り使用します。
- すでに大規模なコミュニティによってテストされているため、フレームワーク提供の検証機能に依存しています。
組織内でRESTfulなwebサービスを保護する方法についてのあなたの考えと経験を教えてください。
幸せな学習!!