Open7

CognitoのIDプールのロールベースアクセスコントロールのまとめ

kumakuma

OpenSearchからCognito認証する際に、詰まったのでメモ

個人のメモなので技術的に間違っているところも多分にある場合があります。

下記についてメモする
・Cognitoのロール割り当て
・OpenSearchとCognito間のロールの引き渡し

kumakuma

Cognitoのロール割り当て

前提

Cognitoでは、STSを用いて一時的にIAMロールをユーザーへ引き渡すことができる。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/iam-roles.html

ID プールの作成中に、ユーザーが引き受ける IAM ロールを更新するよう求められます。IAM ロールは次のように動作します。ユーザーがアプリにログインすると、Amazon Cognito がそのユーザー用に一時的な AWS 認証情報を生成します。これらの一時的な認証情報は、特定の IAM ロールに関連付けられます。IAM ロールでは、AWS リソースにアクセスするための許可一式を定義できます。

また、認証されていないユーザーやユーザー毎にロールを定義できる。

認証されたユーザーと認証されていないユーザー用に、デフォルトの IAM ロールを指定できます。また、ユーザーの ID トークンのクレームに基づいて、各ユーザーのロールを選択するルールを定義できます。

詰まったところ

IDプール内、IDプロバイダーのロール設定のロールの選択ロールの解決の項目について理解ができなかった。
ロールベースアクセスコントロールについて
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/role-based-access-control.html

kumakuma

一言サマリー

ロールの選択:Cognitoのユーザーへ引き渡すIAMロールへ何を引き渡すか
ロールの解決:認証されないユーザーへの対応

わかったこと

そもそも今回やりたかったことは、
Cognito上にユーザーグループを作成し、そのユーザーグループごとにOpenSearchehへのアクセス権を付与したRoleをフェデレーションすること。

上記のベストプラクティスの中で下記の記載があった。

Amazon Cognito ユーザープールのグループにロールを設定する場合、これらのロールはユーザーの ID トークンを通じて渡されます。これらのロールを使用するには、ID プールの認証ロールの選択に対して [トークンからロールを選択する] を設定する必要があります。
トークンから正しいロールを判断できない場合のデフォルト動作を指定するには、コンソールの [Role resolution] (ロールの解決) 設定と、SetIdentityPoolRoles API の RoleMappings パラメータを使用できます。

ユーザーのトークンを通じてロールが渡されるため、ロールの選択では、トークンでpreferred_roleクレームを持つロールを選択するを指定しなければならないとのこと。(マネコン上だと最近少し文言が変わっているぽい)なので、上記設定にしてあげることで、Cognitoにおけるロールのフェデレーションができた。

ちなみに当初ロールの選択ではデフォルトの認証されたロールを指定していたが、IDプールで認証されたロールの認証情報をユーザーへ発行する設定だったので今回のケースでは不適。

kumakuma

(補足)preferred_roleについて
preferred_roleはユーザープールによって割り当てられたロールARNを格納するクレームという理解。

Amazon Cognito ユーザープール経由でログインするユーザーの場合、ユーザープールによって割り当てられた ID トークンにロールを渡すことができます。

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

なので、今回の場合はこのpreferred_roleには、ユーザーグループに付与したOpenSearchへのアクセス権を付与したIAM RoleのARNが格納される

kumakuma

OpenSearchとCognito間のロールの引き渡し

前提

OpenSearchとCognito間では主に2種類のRoleが出てくる
・OpenSearchへアクセスするための権限(Action: es:*等)を持つRole
・Cognitoからのフェデレーションを許可するための権限(Action:cognito:*等)を持つRole

また、OpenSearchにおける権限にはいくつかの層がある。下記の資料がわかりやすかった。
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_Amazon-OpenSearch-Service-Best-Practice-Security_0430_v1.pdf

詰まったこと

どこでどのRoleを指定しているのか、およびそれぞれの権限がどのタイミングで使われるのかが理解できてなかった。

kumakuma

OpenSearchへアクセスするための権限(Action: es:*等)を持つRole

  • 付与する対象
    • Cognito上のユーザープール上に作成したグループ
  • 使用タイミング
    • Cognitoで認証後、Cognitoユーザーがフェデレーションする際に使用するRole
  • 注意点
    • master userの場合、master userで設定しているIAM RoleとCognitoのグループへ付与するIAM Roleが一致してないとmissing roleになる
    • このロールはSTSを用いてCognitoユーザーへ一時的に発行されるユーザーとなるので、IAMの設定にて信頼関係の下記設定を行う必要がある。

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/fgac-walkthrough-iam.html

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "Federated": "cognito-identity.amazonaws.com"
    },
    "Action": "sts:AssumeRoleWithWebIdentity",
    "Condition": {
      "StringEquals": {
        "cognito-identity.amazonaws.com:aud": "identity-pool-id"
      },
      "ForAnyValue:StringLike": {
        "cognito-identity.amazonaws.com:amr": "authenticated"
      }
    }
  }]
}
kumakuma

Cognitoからのフェデレーションを許可するための権限(Action:cognito:*等)を持つRole

  • 付与する対象
    • OpenSearch
  • 使用タイミング
    • ユーザー認証の際にCognito側に認証を行ってもらう時
    • 認証後Cognito側からIAM ロールをフェデレーションしてもらう時
  • 注意点
    • OpenSearch上でCognitoとの連携設定の際にする
    • 基本的にデフォルトでOpenSearch側が作ってくれるので、何かする必要はなし。
      -下記の話

https://docs.aws.amazon.com/ja_jp/opensearch-service/latest/developerguide/cognito-auth.html

・CognitoAccessForAmazonOpenSearch ロールについて
OpenSearch Service には、Amazon Cognito ユーザーおよび ID プールを設定し、認証のためにそれらを使用するための許可が必要です。この目的のために、AWS 管理ポリシーの 1 つである AmazonOpenSearchServiceCognitoAccess を使用できます。