ロールベースのアクセスコントロール - Amazon Cognito

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

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

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

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

{ "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-corner-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

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

PassRole 許可の付与

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" ] } ] }

このポリシー例では、iam:PassRole ロールに myS3WriteAccessRole 許可が付与されます。ロールは、ロールの 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 プール (フェデレーティッド ID) が以下のようにロールを選択します。

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

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

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

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

ルールは、IAM ロールに ID プロバイダートークンからのクレームをマップすることを許可します。

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

注記

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

CustomRoleArn が順序を上書きするように指定されている場合を除き、ルールは順序に従って評価され、一致する最初のルールの IAM ロールが使用されます。Amazon Cognito ユーザープールでのユーザー属性の詳細については、「ユーザープールの属性の設定」を参照してください。

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

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

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

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

Amazon Cognito

Amazon Cognito ID トークンは JSON Web トークン (JWT) として表されます。トークンには、認証ユーザーの ID に関するクレームが含まれます。たとえば、namefamily_namephone_number などです。標準クレームに関する詳細については、「OpenID Connect 仕様」を参照してください。標準クレームとは別に、以下のような 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 仕様からの標準クレームが含まれます。OpenID トークンのクレームはすべて、ルールベースのマッピングに使用できます。Google トークンで使用できるクレームについては、Google の OpenID Connect サイトを参照してください。

Apple

Apple トークンには、OpenID Connect specification からの標準クレームが含まれます。Apple トークンから入手できるクレームの詳細については、Apple のドキュメントの「Apple でサインインを使用してユーザーを認証する」を参照してください。email は Apple のトークンには必ずしも含まれているわけではありません。

OpenID

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

SAML

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

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

重要

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

重要

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

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