30

以下の答えはこの質問からのものです。

授与された回答は、実際には質問にまったく対処していません。データ転送のコンテキストで SSL について言及しているだけで、実際の認証については触れていません。

REST API クライアントを安全に認証することについて本当に質問しています。TLS クライアント認証を使用していない限り、SSL だけでは REST API の有効な認証メカニズムにはなりません。クライアント認証なしの SSL はサーバーを認証するだけであり、これはほとんどの REST API には関係ありません。

TLS クライアント認証を使用しない場合は、ダイジェスト ベースの認証スキーム (Amazon Web Service のカスタム スキームなど)、OAuth、または HTTP 基本認証 (ただし SSL のみ) などを使用する必要があります。

したがって、クライアント認証なしで HTTPS を使用することを考えると 、ここでの私の質問は、クライアント SSL 認証を使用しない場合、サーバーは誰と話しているかを実際には知らないというポスターです。ここで私が理解しているのは、サーバーに対してクライアントを認証するためにアクセスするために認証トークンを使用する場合です。次に、そのトークンがサーバーデータベースのユーザーIDとペアになっている場合でも、サーバーは誰がトークンを送信しているかを知りません。

初めに

1-これは本当の問題ですか?特に Https を使用する場合は?(TLS クライアント認証なし)

2-そして最も重要なことは、それが重大なセキュリティ上の欠陥であると仮定した場合です。ポスターが述べたように、Http基本認証はここでどのように役立ちますか? HTTP 基本認証は、エンコードされたユーザー名パスワードをヘッダーで送信するだけです。したがって、クライアントがトークンを受信すると(ユーザー名パスワードを送信した後に)、残りのリクエストで、パスワードの代わりにこのヘッダーでこのトークンを使用し、すべてが突然うまくいきますか?

それでもサーバーはリクエストの送信元を認識していません。おそらく、サーバーはデータベースに一致するユーザーを持つ有効なトークンを持っていますが、実際に誰が送信したかは不明です。(トークンがhttps経由で盗まれ、他の誰かに使用されることはまだ非常に難しいと思いますが!)

この件名を持ち込むたびに、「あなたはトークンを送信しますが、サーバーは誰がトークンを送信したかを知りません。あまり安全ではありません」という返信が返ってきます。リクエストが適切な場所から送信されている場合、そのトークンを持つペアリングされたユーザー (DB から確認) が「本当に正しい」ことを確認できます

または、ここで言っていることは正しくないかもしれません

4

3 に答える 3

77

[ポスターは、クライアントSSL認証サーバーを使用しないと、誰と話しているのか本当にわからないと言っています.

それは私が言ったことではありません:) これは私が言ったことです:

TLS クライアント認証を使用していない限り、SSL だけでは REST API の有効な認証メカニズムにはなりません。

ここでのキーワードはそれだけです。また:

TLS クライアント認証を使用しない場合は、ダイジェスト ベースの認証スキーム (Amazon Web Service のカスタム スキームなど)、OAuth、または HTTP Basic 認証 (ただし SSL のみ) などを使用する必要があります。

つまり、TLS クライアント認証は、REST API クライアントを認証する1 つの方法です。元のSOの質問は特にSSLに関するものだったので、TLSのみに依存している場合、TLSクライアントauthcが唯一の「組み込み」形式の認証であると述べていました。したがって、TLS を使用していて、TLS クライアント認証を利用しない場合は、別の形式の認証を使用してクライアントを認証する必要があります。

REST クライアントを認証する方法は多数あります。TLS クライアント authc はその 1 つにすぎません (TLS 用の唯一の「組み込み」であり、通常は非常に安全です)。ただし、TLS はネットワークレベルのプロトコルであり、ほとんどのエンド ユーザーが構成するには複雑すぎると認識されています。そのため、ほとんどの REST API オファリングでは、HTTP のような使いやすいアプリケーションレベルのプロトコルを選択しています。

したがって、HTTP ヘッダー ルートを使用する場合は、ヘッダー値を使用して REST クライアントを認証する必要があります。

HTTP 認証では、ヘッダーAuthorizationとその値があります (ヘッダー名は、通常は認証に使用され、アクセス制御 (承認) にはあまり使用されないため、かなり残念です)。Authorizationヘッダー値は、サーバーが認証を実行するために使用するもので、(通常) 3 つのトークンで構成されます。

  1. HTTP 認証方式名の後に続く
  2. 空白 (ほとんど常に空白文字)、その後に続く
  3. スキーム固有のテキスト値。

一般的な HTTP 認証スキームの 1 つはBasicスキームです。これは非常に...まあ...基本的なものです:) スキーム固有のテキスト値は、単純に次の計算値です。

String concatenated = username + ":" + raw_password;
String schemeSpecificTextValue = base_64_encode(concatenated.toCharArray());

したがって、対応するヘッダーは次のようになります。

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

サーバーは値を解析する方法を知っています。「ねえ、私はBasicスキームを知っているので、末尾のテキスト値を取得し、base64でデコードし、ユーザー名と送信されたパスワードを取得します。次に、それらの値が保存したものと一致するかどうかを確認できます。 ."

そして、それは本質的にBasic認証です。特に、このスキームにはbase64 でエンコードされた未加工のパスワードが含まれているため、TLS 接続を使用しない限り安全とは見なされません。TLS は (ほとんどの場合) 詮索好きな人がヘッダーを傍受できず (例えば、パケット検査によって)、パスワードが何であるかを確認できないことを保証します。これが、HTTP 基本認証で常にTLS を使用する必要がある理由です。社内イントラネット環境でも。

もちろん、さらに安全な HTTP 認証スキームは他にもあります。例としては、ダイジェスト ベースの認証を使用するスキームがあります。

ダイジェスト ベースの認証方式は、方式のテキスト値に送信されたパスワードが含まれていないため、優れています。代わりに、特定のデータ (多くの場合、他のヘッダー フィールドと値) のパスワードベースのハッシュが計算され、結果がAuthorizationヘッダー値に入れられます。サーバーは、ローカルに保存したパスワードを使用して、同じパスワードベースのハッシュを計算します。サーバーの計算値がリクエストのヘッダー値と一致する場合、サーバーはリクエストが認証されたと見なすことができます。

この手法がより安全である理由は次のとおりです。生のパスワード自体ではなく、ハッシュのみが送信されます。つまり、この手法を使用して、クリアテキスト (非 TLS) 接続でもリクエストを認証できます (ただし、もちろん、リクエスト データ自体が機密でない場合にのみこれを行う必要があります)。

一部のダイジェスト ベースの認証スキーム:

Amazon などは OAuth 1.0a よりも REST の方が安全です。これは、リクエスト エンティティ ペイロード (つまり、HTTP ヘッダーの後のすべてのもの) を含むリクエスト全体を常に認証するためです。OAuth 1.0a は、またはペイロード (最近のほとんどの REST API)application/x-www-form-urlencodedを使用する REST API に関連しないコンテンツに対してのみこれを行います。application/xmlapplication/json

興味深いことに、OAuth2 はダイジェスト ベースではありません。「ベアラー トークン」と呼ばれる、安全性が低いと思われるものを使用します (これは多くのシナリオで正直に言って問題ありませんが、銀行、軍事、政府通信で使用されるダイジェスト スキームほど良くはありません)。

于 2012-12-26T21:37:07.863 に答える
10

「ユーザーの認証」について話すとき、本当の意味は「他の誰も知らないことをユーザーが知っていることを確認すること」です。その「何か」は、パスワード、証明書、ハードウェア セキュリティ トークン、またはユーザーの網膜パターンである可能性がありますが、すべての場合において、実際にチェックしているのはその情報へのアクセスであり、ユーザーの身元ではありません。意味)そのまま。

ポイントは、原則として、これらすべてのオーセンティケーターが盗まれ、ユーザーになりすますために使用される可能性があるということです。パスワードがログに記録され、保存されているディスクから証明書がコピーされ、ハードウェア トークンが盗まれ (場合によってはリバース エンジニアリングやクローンが作成され)、原則として、ユーザーの網膜パターンがスキャンされ、記録され、偽造される可能性があります。私たちにできる最善のことは、いずれの場合も、これをできるだけ「非常に難しい」ものにすることです。

于 2012-12-26T17:13:06.153 に答える
6

多分私は質問を誤解しています。

あなたが引用した答えは、クライアント証明書、HTTP BASICAUTH、またはその他の認証のいずれであっても、何らかの形式の認証を使用しない場合、サーバーは通信相手を認識できないことを示しています。

(あなたのアプリケーションにはそれでいいかもしれませんし、そうでないかもしれません。あなただけがそれに答えることができます。)

言い換えると、何らかの形式の認証を使用する場合、サーバーは通信相手を認識します。認証された資格情報が属する「人」と通信しています。

このコンテキストでは、認証は、いくつかの資格情報を介して ID を確立するプロセスです。

認証は、資格情報が盗まれていないことを保証するものではありません。SSL は、クライアントとサーバー間の転送中の資格情報が安全であることを保証します (「保証」とは言いません)。

GMail を使用する場合、SSL を使用していることになります

于 2012-12-26T17:10:59.200 に答える