SAML 署名と暗号化 - Amazon Cognito

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

SAML 署名と暗号化

SAML 2.0 サインインは、認証フローのリクエストとレスポンスのベアラーとしてアプリケーションのユーザーを中心に構築されています。転送中にこれらの SAML ドキュメントについてユーザーによる読み取りや変更ができないようにしておきたい場合があります。これを実現するには、ユーザープールの SAML ID プロバイダー (IdP) に SAML 署名と暗号化を追加します。SAML 署名を使用すると、ユーザープールは SAML のサインインリクエストとサインアウトリクエストに署名を追加します。ユーザープールのパブリックキーを使用すると、IdP は、変更されていない SAML リクエストを受信していることを検証できます。次に、IdP が応答し、ユーザーのブラウザセッションに SAML アサーションを渡すと、IdP はそのレスポンスを暗号化して、ユーザーが独自の属性と権限を検査できないようにします。

SAML 署名と暗号化では、ユーザープール SAML オペレーション中のすべての暗号化オペレーションは、Amazon Cognito が生成するユーザープール提供のキーを使用して署名と暗号文を生成する必要があります。現在、外部キーを使用してリクエストに署名することや、暗号化されたアサーションを受け入れるようにユーザープールを設定することはできなくなっています。

注記

ユーザープール証明書は 10 年間有効です。年に 1 回、Amazon Cognito はユーザープールの新しい署名証明書と暗号化証明書を生成します。Amazon Cognito は、署名証明書をリクエストするときに最新の証明書を返し、最新の署名証明書を使用してリクエストに署名します。IdP は、有効期限が切れていないユーザープール暗号化証明書を使用して SAML アサーションを暗号化できます。以前の証明書は、その有効期間の全期間にわたって引き続き有効であり、パブリックキーは、新旧の証明書で変更ありません。ベストプラクティスとしては、プロバイダー設定で証明書を毎年更新します。

IdP からの暗号化された SAML レスポンスの受け入れ

Amazon Cognito と IdP は、ユーザーによるサインインとサインアウトの際に、SAML レスポンスで機密性を確立できます。Amazon Cognito は、パブリック/プライベート RSA キーペアと証明書を、ユーザープールで設定した各外部 SAML プロバイダーに割り当てます。ユーザープール SAML プロバイダーのレスポンス暗号化を有効にする場合は、暗号化された SAML レスポンスをサポートする IdP に証明書をアップロードする必要があります。提供されたキーで IdP がすべての SAML アサーションの暗号化を開始する前は、SAML IdP へのユーザープール接続は機能しません。

以下は、暗号化された SAML サインインのフローの概要です。

  1. ユーザーがサインインを開始し、SAML IdP を選択します。

  2. ユーザープール 認可エンドポイント は、SAML サインインリクエストを使用してユーザーを SAML IdP にリダイレクトします。ユーザープールは、オプションとして、IdP による整合性の検証を可能にする署名に、このリクエストを添付できます。SAML リクエストに署名する場合は、署名証明書のパブリックキーを使用してユーザープールが署名したリクエストを受け入れるように IdP を設定する必要があります。

  3. SAML IdP はユーザーに署名し、SAML レスポンスを生成します。IdP はパブリックキーでレスポンスを暗号化し、ユーザーをユーザープール /saml2/idpresponse エンドポイントにリダイレクトします。IdP は、SAML 2.0 仕様で定義されているようにレスポンスを暗号化する必要があります。詳細については、「Assertions and Protocols for the OASIS Security Assertion Markup Language (SAML) V2.0」の「Element <EncryptedAssertion>」を参照してください。

  4. ユーザープールは、SAML レスポンスの暗号文をプライベートキーで復号し、ユーザーに署名します。

重要

ユーザープールで SAML IdP のレスポンス暗号化を有効にする場合、IdP は、プロバイダーに固有のパブリックキーを使用してすべてのレスポンスを暗号化する必要があります。Amazon Cognito は、暗号化をサポートするように設定した SAML 外部 IdP から、暗号化されていない SAML レスポンスを受け入れません。

ユーザープール内の外部 SAML IdP はレスポンス暗号化をサポートでき、各 IdP は独自のキーペアを受け取ります。

AWS Management Console
SAML レスポンスの暗号化を設定するには
  1. ユーザープールアプリケーションクライアント、および SAML IdP を作成します。

  2. SAML ID プロバイダーの作成または編集を行うときは、[リクエストへの署名とレスポンスの暗号化] で、[暗号化された SAML アサーションをこのプロバイダーに要求] というタイトルのチェックボックスをオンにします。

  3. ユーザープールのソーシャルプロバイダーと外部プロバイダーのメニューから、SAML IdP を選択し、暗号化証明書の表示を選択します。

  4. [.crt としてダウンロード] を選択し、ダウンロードしたファイルを SAML IdP に提供します。証明書内のキーを使用して SAML レスポンスを暗号化するように SAML IdP を設定します。

API/CLI

SAML レスポンスの暗号化を設定するには

CreateIdentityProvider API リクエストまたは UpdateIdentityProvider API リクエストの EncryptedResponses パラメータを使用してレスポンス暗号化を設定します。以下は、リクエスト署名をサポートする IdP の ProviderDetails の例です。

"ProviderDetails": { "MetadataURL" : "https://myidp.example.com/saml/metadata", "IDPSignout" : "true", "RequestSigningAlgorithm" : "rsa-sha256", "EncryptedResponses" : "true", "IDPInit" : "true" }

ユーザープールから暗号化証明書を取得するには、DescribeIdentityProvider API リクエストを行い、レスポンスパラメータ ProviderDetailsActiveEncryptionCertificate 値を取得します。この証明書を保存し、ユーザープールからのサインインリクエストの暗号化証明書として、この証明書を IdP に提供します。

SAML リクエストへの署名

IdP への SAML 2.0 リクエストの整合性を証明できる機能は、Amazon Cognito の SP が開始した SAML サインインのセキュリティ上のメリットです。ドメインを持つ各ユーザープールは、ユーザープール X.509 署名証明書を受け取ります。この証明書内のパブリックキーを使用すると、ユーザープールは、ユーザーが SAML IdP を選択したときにユーザープールが生成するサインアウトリクエストに暗号化署名を適用します。オプションで、SAML サインインリクエストに署名するようにアプリケーションクライアントを設定できます。SAML リクエストに署名すると、IdP は、リクエストの XML メタデータの署名が、指定したユーザープール証明書のパブリックキーと一致することを確認できます。

AWS Management Console
SAML リクエストの署名を設定するには
  1. ユーザープールアプリケーションクライアント、および SAML IdP を作成します。

  2. SAML ID プロバイダーの作成または編集を行うときは、[リクエストへの署名とレスポンスの暗号化] で、[このプロバイダーへの SAML リクエストに署名する] というタイトルのチェックボックスをオンにします。

  3. ユーザープールのソーシャルプロバイダーと外部プロバイダーメニューから、署名証明書の表示を選択します。

  4. [.crt としてダウンロード] を選択し、ダウンロードしたファイルを SAML IdP に提供します。受信 SAML リクエストの署名を検証するように SAML IdP を設定します。

API/CLI

SAML リクエストの署名を設定するには

CreateIdentityProvider API リクエストまたは UpdateIdentityProvider API リクエストの RequestSigningAlgorithm パラメータを使用してリクエスト署名を設定します。以下は、リクエスト署名をサポートする IdP の ProviderDetails の例です。

"ProviderDetails": { "MetadataURL" : "https://myidp.example.com/saml/metadata", "IDPSignout" : "true", "RequestSigningAlgorithm" : "rsa-sha256", "EncryptedResponses" : "true", "IDPInit" : "true" }