SAMLサービスプロバイダーになる方法


80

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

これが、ユーザーがログインするワークフローを想像する方法です。

お客様のSAMLサーバーをhttps://their.samlserver.comとして定義しましょう。そのため、ユーザーは保護されたリソースを求めてWebアプリケーションにアクセスします。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>

だから私の最初のカップルの質問。

ID値は何であると想定されていますか?

そして、なぜ私は自分自身を発行者として宣言することができますか?

IDプロバイダーは私について知っていますか?多分これは私がOpenAMで見ている信頼の輪です。そして、それが私について知っている場合、それはどのように私について知っており、何を知る必要がありますか?

したがって、ユーザーがそのページを転送した後、IDPhttps //their.samlserver.comによって提供されるページに移動します。彼らはそのページで認証し、IDPは認証を検証してユーザーを検索するのは魔法のようです。認証が成功した後、IDPはここで<samlp:Response>定義されたものを送り返します

さらにいくつか質問があります。

まず、<samlp:Response>Webアプリケーションに戻って確認できるようにするにはどうすればよいですか?

そして、それが成功したことを検証するために、その応答で何を探す必要がありますか?失敗はどのように見えますか?

現在、ユーザーを識別するために電子メールアドレス(LDAP)を使用しているため、おそらく応答からそれを取得して、現在と同じように使用します。その応答で私が注意しなければならない他の何か?

その応答の有効性を確認したので、現在のようにユーザーにセッションを許可できます。しかし、彼らがログアウトしたいとき、そのためのワークフローはありますか?ユーザーが離れたことをIDPに通知する必要がありますか?

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

みんな助けてくれてありがとう。過去数日間でたくさんの情報を見つけました。もう少し遊んだ後、それらをつなぎ合わせることができた可能性があります。しかし、私はまだ簡単な「Here'sthePost」ワークフローの記事を見つけていません。多分それは私がこれがどのように機能するかについて間違っているからです。多分これはそれほど人気が​​ないからです。しかし、ユーザー認証と同じくらい重要なことで重要なステップを逃さないように、ワークフローを確実に取得したかったのです。


3
現在、同じ問題が発生しています(Ping Identityと対話する軽量のフェデレーションSAML v2サービスプロバイダーを作成する方法を検討しています)。それがどのようにうまくいったかコメントしてもよろしいですか?フェドレットを使用したり、独自のコードを記述したりしましたか?ありがとう!
theglauber 2012

1
私はやや似たような環境を持っています。tomcatで実行されているJavaベースのWebアプリケーションがあり、SAMLを使用してSSOを実行する必要があります。理論的な知識以外に、これらの技術についてはわかりません。誰かが最初から構成するのを手伝ってくれますか?
ジェリー

回答:


46

あなたの特定の質問に答えて:

1。)「ID」値は何であると想定されていますか?

  • これは、SAMLリクエストの一意の識別子である必要があります。SAML 2.0仕様では、これがどのように行われるかは実際には実装固有であると述べられていますが、次の推奨事項があります。

SAMLシステムエンティティが識別子が一意であることを保証するメカニズムは、実装に任されています。ランダムまたは疑似ランダム手法を使用する場合、ランダムに選択された2つの識別子が同一である確率は2 ^ -128以下である必要があり、長さは2 ^ -160以下である必要があります。この要件は、長さが128〜160ビットのランダムに選択された値をエンコードすることで満たすことができます。

2.)IdPはあなたについてどのように知っていますか?

  • SPをIdPに登録する必要があります。これを実現するために、SAML仕様では、IdPにSAMLレシーバーの場所、証明書、交換する属性などを通知する「SAMLメタデータ」の形式が定義されています。OpenAMは、信頼できるSPを構成するための最小要件を規定している可能性があります。これは製品ごとに異なります。

3.)応答はどこに行き、何をチェックするのですか?

  • 応答は、初期設定のためにSPからIdPと交換するSAMLメタデータで通常定義されているアサーションコンシューマサービス(ACS)URLに送信されます。SAML応答を受信したら、多くのことを確認する必要がありますが、最も重要なのは、SAMLステータスコードが「成功」であり、inResponseTo IDが要求の送信済みIDと一致し、アサーションでデジタル署名を検証する必要があることです。そのためには、IdPの公開検証証明書を信頼する必要があります。また、失効チェックも行う必要があります。

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

  • SAML 2.0は、シングルログアウト(SLO)のプロファイルも定義します。これにより、SPからログアウトするだけでなく、IdPや、セッションを確立した他のSPからもログアウトします。シングルサインオン(SSO)と同様の要求/応答フローがあるため、セットアップとチェックが同様に行われます(ステータスコード、署名など)。

つまり、これは最初から実装するのは非常に複雑になる可能性があります。Ianが提案するような、実証済みの真のライブラリや製品を使用するのが最善です。彼のような企業は、仕様に従って実装し、他のベンダーとの相互運用性をテストするために、何百時間もの開発者時間を投資してきました。


2
samlリクエストにIDが必要なのはなぜですか。わかりません。
アシュウィン2012年

1
これは、SAML2.0コア仕様の一部として必要です。docs.oasis-open.org/security/saml/v2.0/saml-core-2.0-os.pdfを参照してください。AuthnRequestはタイプAuthnRequestType(セクション3.4.1)であり、これは必須のID属性を持つRequestAbstractType(セクション3.2.1)の拡張です。リクエスト内のIDの主な利点の1つは、レスポンスがIDを参照できるため、SPが2つを一緒にマップして再生を防ぐことができることです。
スコットT.

あなたは、リプレイ攻撃を防ぐためにidが与えられていると言います。サービスプロバイダーとIDプロバイダーの間でssl / https接続を使用している場合、リプレイ攻撃を防ぐことができます。
アシュウィン2012年

1
SPとIdP間のSSL / HTTPSは、「フロントチャネル」(ブラウザ)バインディングが通常使用されるため、リプレイ攻撃を防ぐには多少意味がありません。
スコットT.

@ Ashwin-IDが存在するため、応答を返すと同じIDが返され、受信した応答が要求に関連していることがわかります。再生を防ぐ限り、次のようになります。 SAMLとIDの要求と応答の両方の多くのタイムスタンプは、限られた期間の承認とともにのみ実行可能です。
イロおじさん2015

3

単一のJavaアプリケーションをサービスプロバイダーとして設定しようとしているだけの場合は、Oracle(スタンドアロンとして)またはForgeRock(OpenAMにバンドルされている)のいずれかのFedletの使用を検討する必要があります。ForgeRock Fedletには、IDプロバイダーとしてのShibboleth 2.2.1とのやり取りにいくつかの問題がありますが、構成がやや簡単で、より有益であることがわかりました。

それぞれに、展開に役立つ明示的な指示がREADMEに含まれています。Fedletが構成され、IDPと通信すると、成功ページに、フェデレーションSSOをアプリケーションに統合するために必要なすべてのコードが表示されます。AuthnRequestsとResponsesを送受信するバックグラウンド作業を行います。

スコットの答えはあなたが持っていた質問に非常によく答えますが、SAMLを生成するコードを自分で書き込もうとすることは車輪の再発明だと思います。Fedletは、まさにこのユースケースを念頭に置いて設計されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.