1. ホーム
  2. security

[解決済み] SAMLサービスプロバイダになる方法

2023-07-27 16:16:59

質問

私の会社は現在、JavaのWebアプリケーションを開発しています。私たちのクライアントのいくつかは、内部のSAMLサーバー(IDプロバイダー?)を持っており、それらと統合することを要求しています。そこで最近、私はそれについて読み、OpenAMで遊んでいます。3日ほどやって、だいたいのことは理解できたのですが、まだ知識のギャップがあります。私の希望は、誰かが私のためにこれをクリアすることです。

では、ユーザーがログインする際のワークフローを想像してみます。

顧客のSAMLサーバを次のように定義しましょう。 https://their.samlserver.com . ユーザは、保護されているリソースを求めて、私たちのウェブ・アプリケーションにやってくるわけです。そのURLは http://my.app.com/something .

ということで、もし私が正しいのであれば my.app.com がSAMLで定義されているもので サービスプロバイダ . 我々のアプリケーションは、このユーザがログインする必要があることを認識する。そして、このようなページをユーザーに表示します。

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

そして、その someBase64Database64 をエンコードしたものです。

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

では、最初の2つの質問です。

は何ですか? ID の値は何でしょうか?

また、なぜ私は自分自身を 発行者 ?

IDプロバイダは私について知っていますか?もしかしたら、これは 信頼の輪 で見てきた OpenAM . そして、もしそれが私のことを知っているのなら、どうやって私のことを知り、何を知る必要があるのでしょうか?

そこで、ユーザーはそのページを転送された後、IDPが提供するページ https://their.samlserver.com . ユーザーはそのページで認証を行い、IDPはその認証を検証し、ユーザーを検索するために魔法をかけます。認証が成功すると、IDP は <samlp:Response> 定義された ここで .

もう少し質問です。

まず、どのように <samlp:Response> はどのようにしてWebアプリケーションに戻り、それを確認できるのでしょうか?

そして、成功したことを確認するために、その応答で何を探せばいいのでしょうか?失敗した場合はどのように見えるのでしょうか?

現在、ユーザーを識別するために電子メールアドレス (LDAP) を使用しているので、おそらくレスポンスからそれを取得し、現在と同じ方法でそれを使用するでしょう。そのレスポンスで他に注意すべきことはありますか?

そのレスポンスの有効性をチェックしたので、現在行っているように、ユーザーにセッションを許可することができます。しかし、ユーザーがログアウトしたいとき、そのためのワークフローはありますか? ユーザーが退出したことを IDP に通知する必要がありますか。

最後に、私が読んだ本の中で投げかけられたいくつかのトピックがありますが、それらがこのワークフローにどのように適合するかはわかりません。それらは 信頼の輪 , トークン そして アーティファクト .

みなさん、どんな助けでもありがとうございます。ここ数日で多くの情報を見つけ、もう少し遊んだらそれらを組み合わせることができるかもしれません。しかし、私はまだストレートな "これが投稿です" ワークフローの記事をまだ見つけていません。多分それは、私がこの仕組みについて間違っているからでしょう。もしかしたら、これはそれほど人気がないからかもしれません。しかし、ユーザー認証のような重要なステップを見逃さないために、私は本当にワークフローを確認したかったのです。

どのように解決するのか?

具体的な質問にお答えします。

1.) ID"値はどのようなものでしょうか?

  • これは、SAML リクエストの一意な識別子であるべきです。 SAML 2.0 仕様では、これをどのように行うかは実装に依存すると述べているが、次のように推奨している。

SAML システムエンティティが,識別子が一意であることを保証するメカニズムは,実装に任されている。 の識別子が一意であることを保証するメカニズムは、実装に任されています。を採用する場合 ランダムまたは擬似ランダム手法を採用する場合,ランダムに選ばれた2つの ランダムに選択された2つの識別子が同一である確率は, 2 ^ -128以下でなければならない(MUST)。 2 ^ -128 以下でなければならず,長さは 2 ^ -160 以下であるべきである(SHOULD)。 この要件は、長さ128ビットから160ビットの間でランダムに選ばれた値を符号化することで 満たしてもよい。 この要件は,128ビットから160ビットの長さの間でランダムに選んだ値を符号化することで満たしてもよい。

2.) IdPはどうやってあなたのことを知るのでしょうか?

  • SPはIdPに登録される必要があります。 これを達成するために、SAML 仕様では、SAML メタデータの形式を定義しています。このメタデータは、SAML レシーバーがどこにあるか、証明書は何か、交換する属性などを IdP に伝えます。 OpenAMは、信頼できるSPを構成するための最小限の要件を規定しているようだ。 これは各製品で異なります。

3.) レスポンスはどこへ行くのか、何を確認すればいいのか?

  • Response は、通常、初期設定のために SP から IdP と交換する SAML メタデータに定義されている Assertion Consumer Service (ACS) URL に送信されます。 SAML Response を受け取ると、多くのことを確認する必要がある。最も重要なのは、SAML Status コードが "success" であること、inResponseTo ID がリクエストの送信済み ID と一致すること、そして Assertion のデジタル署名を検証する必要があることである。 そのためには、IdPの公開検証証明書を信頼する必要があり、おそらく失効チェックも行いたいでしょう。

4.) ログアウトはどうする?

  • SAML 2.0 は Single LogOut (SLO) 用のプロファイルも定義しています。 これは、SP からログアウトするだけでなく、IdP や、潜在的にはセッションを確立した他の SP からもログアウトします。 これは、シングルサインオン (SSO) と同様のリクエスト/レスポンスフローを持つため、設定および確認する内容も似ています (ステータスコード、署名など)。

要するに、ゼロから実装するのはかなり複雑だということです。 Ian が提案するような、試行錯誤を経た真のライブラリや製品を使用することが最善です。 彼のような企業は、仕様に従って実装し、他のベンダーとの相互運用性をテストするために、何百時間もの開発者の時間を投資してきました。