SAML認証とは
SAML認証(Security Assertion Markup Language Authentication)は、オンラインサービスやアプリケーションのユーザー認証に使用されるセキュリティプロトコルの1つです。
SAML認証は、ユーザーの認証情報(ユーザー名やパスワードなど)を安全に伝送するために、XMLベースのセキュリティトークンを使用します。このセキュリティトークンは、ユーザーの認証情報を含むだけでなく、認証情報が正当であることを証明する署名も含んでいます。
SAML認証は、クラウドベースのサービスやアプリケーションの認証に特に適しており、多数のユーザーを管理する場合にも有効です。また、SAML認証を使用することで、ユーザーが同じ認証情報を複数のアプリケーションで使用することができます。
SAML プロトコルは、次の 3 つの主要なパートから構成されています。
-
認証要求 (Authentication Request): SAML 認証フローの開始を要求するメッセージです。このメッセージには、リクエストの ID、SAML バージョン、およびリダイレクト先などの情報が含まれます。
-
認証応答 (Authentication Response): IdP (Identity Provider) がユーザーを認証した後に生成されるメッセージで、ユーザーが SSO に成功したかどうかを示します。このメッセージには、セキュリティトークンが含まれており、これを SP (Service Provider) に渡すことで、ユーザーが SP アプリケーションにアクセスできるようになります。
-
ログアウト要求 (Logout Request) およびログアウト応答 (Logout Response): ユーザーが SSO セッションを終了するために使用されるメッセージです。
用語
IDP(identity provider)
ユーザーの認証および認可情報を管理するオンラインシステムです。(認証情報を提供する側)
SP(service provider)
SAML認証を利用する際に、認証情報を提供するためのサービスを提供するオンラインシステムです。(認証情報を要求、ユーザへサービスを提供する側)
SSO(Single Sign-On)の実現方式
-
エージェント方式
- Webシステムのサーバにエージェントソフトを導入し、エージェントが認証情報を管理
-
リバースプロキシ方式
- 端末とWebサーバ間にリバースプロキシサーバを設置し、エージェントソフトを導入
-
代理認証方式
- 代理で認証を行うサーバを設置する方式
-
フェデレーション方式
- 異なるドメインのサービスでも認証情報を連携可能
- クラウドサービスの設定だけで実現可能だが、対応しているサービスは限られる
- 主にSAMLが用いられる
-
透過型方式
実現方法
AWSにSAMLの認証フローがあり、そこは詳しく書いてあります。
-
アプリはユーザーに AWS によってホストされる UI を指定することで、サインアップとサインインを開始します。モバイルアプリはウェブビューを使用して AWS UI のウェブページを表示することができます。
-
通常、ユーザープールはユーザーの E メールアドレスからユーザーの IdP を判断します。
また、アプリがユーザーをユーザープールにダイレクトする前に情報を収集した場合は、クエリパラメータを通じてその情報を Amazon Cognito に提供することができます。 -
ユーザーは、SAML リクエストを使用して IdP(認証情報を提供する側) にリダイレクトされます。
-
必要に応じて IdP がユーザーを認証します。IdP がユーザーにアクティブなセッションがあると認識している場合、IdP で認証がスキップされ、シングルサインイン (SSO) が提供されます。
-
IdP は Amazon Cognito サービスに SAML アサーションを POST します。
-
SAML アサーションが検証され、アサーションからユーザー属性 (クレーム) が収集されると、Amazon Cognito がユーザープールのユーザープロファイルを内部で作成または更新します。Amazon Cognito が、サインインされたユーザーの OIDC トークンをアプリに返します。
ユーザープールの SAML ID プロバイダーの作成
AWSコンソールで作成
下記のaws コマンドでID プロバイダーを作成する
aws cognito-idp create-identity-provider
頂いたIDPメタデータをID プロバイダーにアップロードします。
- メタデータファイルの例:
aws cognito-idp create-identity-provider --user-pool-id <user_pool_id> --provider-name=SAML_provider_1 --provider-type SAML --provider-details file:///details.json --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
- メタデータ URL の例
aws cognito-idp create-identity-provider --user-pool-id <user_pool_id> --provider-name=SAML_provider_1 --provider-type SAML --provider-details MetadataURL=<metadata_url> --attribute-mapping email=http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress
結果:
{
"MetadataFile": "<SAML metadata XML>"
}
SAML IDPメタデータ XML に引用符が (") 含まれる場合は、エスケープ (") する必要があります。
Cognitoのコンソール画面から作成
Cognito コンソール>user pool>フェデレーション>ID プロバイダー
プロバイダー作成後、その有効化を忘れないように
Cognito>User Pool>アプリの統合>アプリクライアントの設定から設定できます。
SP メタデータ
IDP側がメタデータを提供していて、SP側もメタデータを提供しないといけません。
IDPメタデータはAWS Cognitoの属性を基に作成されています。
サンプルは下記です。
entityID
SAML IdPs によっては、SP urn / Audience URI / SP エンティティ ID を次の形式で指定する必要もあります。
urn:amazon:cognito:sp:<yourUserPoolID>
<?xml version="1.0"?>
<EntityDescriptor entityID="urn:amazon:cognito:sp:ap-northeast-********"
xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
ap-northeast-********
はプールIDです。
Cognito>User Pool>全般設定
プールIDを確認できます。
デジタル署名証明書
SAML 2.0 IDP に提供するデジタル署名用証明書はフェデレーション>ID プロバイダー!
から確認できます。
<ds:X509Data>
<ds:X509Certificate>MIIDbTCCAlWgAwIBAgIEeICyWTANBgkqhkiG9w0BAQsFADBnMR8wHQYDVQQDExZ1....
</ds:X509Certificate>
</ds:X509Data>
binding endpoint
IdP は次の POST binding endpointを IdP-to-SP 応答メッセージに使用します。https://Your user pool domain/saml2/idpresponse
https://Your user pool domain/saml2/idpresponse
With an Amazon Cognito domain:
https://<yourDomainPrefix>.auth.<region>.amazoncognito.com/saml2/idpresponse
With a custom domain:
https://Your custom domain/saml2/idpresponse
Cognito>User Pool>アプリの統合>ドメイン名
ドメイン名を確認できます。
<AssertionConsumerService index="1" isDefault="true" Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://user-pool-domain.auth.ap-northeast-1.amazoncognito.com/saml2/idpresponse"/>
マッピング
Cognito>User Pool>フェデレーション>属性マッピング
属性マッピングを設定できます。
認証
SAML認証は下記のURLでリダイレクトします。
https://your_Amazon_Cognito_userpool_domain/authorize?response_type=code&identity_provider=your-SAML-IdP-name&client_id=your-client-id&redirect_uri=https://your_application_redirect_url
リクエストで適切なパラメータを使用すると、/authorize では、Amazon Cognito は SP が開始したサインインフローをサイレントに開始し、IdP でサインインするようにユーザーをリダイレクトします。
-
SP側から認証の場合
- ユーザーが SP(サービス提供側) にアクセスする
- SP がSAML認証要求を作成する(AWSのログインUI画面)
- SP から受け取ったSAML認証要求を IDP に送信する
- IDP の認証画面が表示される
- ユーザーはIDPの認証情報を入力して IdP との間で認証処理を行なう
- 認証が成功すると、IdP からSAML認証応答が発行される
- ユーザーは IDP から受け取ったSAML認証応答を SP に送信する
- SP にSAML認証応答が届くとログインができる
-
IDPから認証の場合
TOKEN発行
認証で発行したcode
を用いて、TOKENを発行します。
POST https://mydomain.auth.us-east-1.amazoncognito.com/oauth2/token&
Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic ZGpjOTh1M2ppZWRtaTI4M2V1OTI4OmFiY2RlZjAxMjM0NTY3ODkw
grant_type=authorization_code&
client_id=1example23456789&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect
レスポンス例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"eyJra1example",
"id_token":"eyJra2example",
"refresh_token":"eyJj3example",
"token_type":"Bearer",
"expires_in":3600
}
- redirect_uri
Amazon Cognito がユーザーを認証した後、認証サーバーによってブラウザがリダイレクトされる URL です。URI を事前にクライアントに登録しておく必要があります。- 「アプリケーションの統合」タブ
- アプリケーションクライアント
- ホストされた UI
- 許可されているコールバック URLを追加する
UserInfo エンドポイント
リクエスト例:
GET /oauth2/userInfo HTTP/1.1
Content-Type: application/x-amz-json-1.1
Authorization: Bearer eyJra12345EXAMPLE
User-Agent: [<replaceable>User agent<replaceable>]
Accept: */*
Host: auth.example.com
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
上記例のAuthorizationの eyJra12345EXAMPLE はaccessTokenです。
参考