Amazon Cognito
開発者ガイド

ロールベースアクセスコントロール

Amazon Cognito ID プールは、AWS リソースにアクセスするための、権限が制限された一時的な認証情報を、認証されたユーザーに割り当てます。各ユーザーの権限は、お客様が作成する IAM ロールを介して制御されます。ユーザーの ID トークンのクレームに基づいて、各ユーザーのロールを選択するルールを定義できます。認証されたユーザー用のデフォルトのロールを定義できます。また、認証されていないゲストユーザーの制限付き権限を持つ別の IAM ロールも定義できます。

ロールマッピング用のロールの作成

各ロールに適切な信頼ポリシーを追加し、ID プールの認証されたユーザーに対して、Amazon Cognito のみがそのポリシーを引き受けられるようにすることが重要です。このような信頼ポリシーの例を示します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-dead-beef-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

このポリシーでは、cognito-identity.amazonaws.com のフェデレーティッドユーザー (OpenID Connect トークンの発行者) が、このロールを引き受けることができます。さらに、ポリシーでは、ID プールに一致させるためにトークンの aud が制限されます (この場合は ID プール ID)。最後に、ポリシーは、トークンの amr が値 authenticated を含むことを指定します。

ロールのアクセス権限の適用

IAM ユーザーが、ID プールでユーザーの既存のアクセス権限を超えるアクセス権限でロールを設定できるようにするには、そのユーザーに、set-identity-pool-roles API にロールを渡す iam:PassRole アクセス権限を付与します。たとえば、ユーザーが Amazon S3 に書き込むことはできないが、ID プールでユーザーが設定する IAM ロールで Amazon S3 への書き込み権限が付与される場合、iam:PassRole アクセス権限がロールに付与されているときのみ、ユーザーはこのロールを設定できます。次のサンプルポリシー例は、iam:PassRole 権限を付与する方法を示しています。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/myS3WriteAccessRole" ] } ] }

このサンプルポリシーでは、myS3WriteAccessRole ロールに iam:PassRole アクセス権限を付与します。ロールは、ロールの ARN を使用して指定されています。また、IAM ユーザーまたはユーザーに対応するロールに、このポリシーをアタッチする必要があります。詳細については、「管理ポリシーの使用」を参照してください。

注記

Lambda 関数ではリソースベースのポリシーが使用され、ポリシーが Lambda 関数自体に直接アタッチされます。Lambda 関数を呼び出すルールを作成する場合は、ロールを適用しないため、ルールを作成するユーザーに iam:PassRole アクセス権限は必要ありません。Lambda 関数の認証については、「権限の管理: Lambda 関数ポリシーを使用する」を参照してください。

トークンを使用したユーザーへのロールの割り当て

Amazon Cognito ユーザープールを介してログインするユーザーの場合、ユーザープールで割り当てられた ID トークンでロールを渡すことができます。ロールは ID トークンで次のクレームに表示されます。

  • cognito:preferred_role クレームはロール ARN です。

  • cognito:roles クレームは、許可されたロール ARN のセットを含むカンマ区切りの文字列です。

クレームは以下のように設定されます。

  • cognito:preferred_role クレームは、最高 (最も低い) Precedence 値のグループのロールに設定されます。許可されているロールが 1 つだけである場合、cognito:preferred_role はそのロールに設定されます。複数のロールがあり、いずれの単一のロールにも最高の優先順位がない場合、このクレームは設定されません。

  • cognito:roles クレームは、少なくとも 1 つのロールがある場合に設定されます。

トークンを使用してロールを割り当てる際に、ユーザーに割り当てることができる複数のロールがある場合、Amazon Cognito ID プール (フェデレーテッドアイデンティティ) は次のようにロールを選択します。

  • 設定されていて、cognito:roles クレームのロールに一致する場合は GetCredentialsForIdentity CustomRoleArn パラメーターを使用します。このパラメーターが cognito:roles のロールと一致しない場合は、アクセスを拒否します。

  • cognito:preferred_role クレームが設定されている場合は、それを使用します。

  • cognito:preferred_role クレームが設定されていない、cognito:roles クレームが設定されている、GetCredentialsForIdentity への呼び出しで CustomRoleArn が設定されていない場合は、コンソールまたは AmbiguousRoleResolution フィールドの [Role resolution] 設定 (SetIdentityPoolRoles API の RoleMappings パラメーター) を使用して、割り当てるロールが決定されます。

ルールベースのマッピングを使用してユーザーにロールを割り当てる

ルールでは、IAM ロールに ID プロバイダートークンからクレームをマッピングできます。

各ルールは、トークンクレーム (Amazon Cognito ユーザープールの ID トークンのユーザー属性など)、一致タイプ、値、および IAM ロールを指定します。一致タイプは、EqualsNotEqualStartsWith、または Contains となります。クレームに一致する値をユーザーが持っている場合、そのユーザーは、認証情報を取得するときにそのロールを引き受けることができます。たとえば、custom:dept カスタムオリジン属性値が Sales のユーザーに、特定の IAM ロールを割り当てるルールを作成できます。

注記

ルールの設定で、カスタム属性は標準属性と区別するために、custom: プレフィックスを必要とします。

ルールは順に評価され、順序をオーバーライドするために CustomRoleArn が指定されない限り、最初の一致するルールの IAM ロールが使用されます。Amazon Cognito ユーザープールでのユーザー属性の詳細については、「ユーザープールの属性の設定」を参照してください。

ID プール (フェデレーテッドアイデンティティ) コンソールで、認証プロバイダー用に複数のルールを設定できます。ルールは順に適用されます。ルールをドラッグして、順序を変更できます。一致する最初のルールが優先されます。一致タイプが NotEqual で、クレームが存在しない場合、ルールは評価されません。ルールが一致しない場合、[Role resolution] 設定が [Use default Authenticated role] または [DENY] に適用されます。

API および CLI で、RoleMapping タイプの AmbiguousRoleResolution フィールドに一致するルールがない場合に割り当てるロールを指定できます。これは、SetIdentityPoolRoles API の RoleMappings パラメーターで指定します。

ID プールに対して設定された各ユーザープールまたはその他の認証プロバイダーの場合、最大 25 のルールを作成できます。プロバイダーに対して 25 を超えるルールが必要な場合は、サービス制限の引き上げのサポートケースを開いてください。

ルールベースのマッピングで使用するトークンクレーム

Amazon Cognito

Amazon Cognito ID トークンは JSON Web トークン (JWT) として表されます。トークンには、認証ユーザーの ID に関するクレームが含まれます。たとえば、namefamily_namephone_number などです。標準クレームに関する詳細については、OpenID Connect specification を参照してください。標準クレームとは別に、以下は Amazon Cognito 固有の追加クレームです。

  • cognito:groups

  • cognito:roles

  • cognito:preferred_role

Amazon

以下のクレームとそのクレームに使用できる値を、Login with Amazon で使用できます。

  • iss: www.amazon.com

  • aud: App Id

  • sub: Login with Amazon トークンからの sub

Facebook

以下のクレームとそのクレームに使用できる値を、Facebook で使用できます。

  • iss: graph.facebook.com

  • aud: App Id

  • sub: Facebook トークンからの sub

Google

Google トークンには、OpenID Connect specification からの標準クレームが含まれます。OpenID トークンのクレームはすべて、ルールベースのマッピングに使用できます。Google トークンで使用できるクレームについては、Google の OpenID Connect サイトを参照してください。

OpenID

OpenID トークンのクレームはすべて、ルールベースのマッピングに使用できます。標準クレームに関する詳細については、OpenID Connect specification を参照してください。使用できる追加クレームについては、ご使用の OpenID プロバイダのドキュメントを参照してください。

SAML

クレームは受信した SAML アサーションから分析されます。SAML アサーションで利用可能なすべてのクレームは、ルールベースのマッピングで使用できます。

ロールベースのアクセスコントロールのベストプラクティス

重要

ロールにマッピングするクレームがエンドユーザーによって変更できる場合、いずれのエンドユーザーもロールを引き受け、それに応じてポリシーを設定できます。エンドユーザーによって直接設定できないクレームのみを、昇格されたアクセス権限のあるロールにマッピングします。Amazon Cognito ユーザープールで、各ユーザー属性には、アプリごとの読み取り/書き込み権限を設定できます。

重要

Amazon Cognito ユーザープールのグループにロールを設定する場合、これらのロールはユーザーの ID トークンを通じて渡されます。これらのロールを使用するには、ID プールの認証ロールの選択に対して [Choose role from token] を設定する必要があります。

コンソールの [Role resolution] 設定と、SetIdentityPoolRoles API の RoleMappings パラメーターを使用して、トークンから正しいロールを判断できない場合のデフォルトの動作を指定します。