CognitoのIDプールのロールベースアクセスコントロールのまとめ
OpenSearchからCognito認証する際に、詰まったのでメモ
個人のメモなので技術的に間違っているところも多分にある場合があります。
下記についてメモする
・Cognitoのロール割り当て
・OpenSearchとCognito間のロールの引き渡し
Cognitoのロール割り当て
前提
Cognitoでは、STSを用いて一時的にIAMロールをユーザーへ引き渡すことができる。
ID プールの作成中に、ユーザーが引き受ける IAM ロールを更新するよう求められます。IAM ロールは次のように動作します。ユーザーがアプリにログインすると、Amazon Cognito がそのユーザー用に一時的な AWS 認証情報を生成します。これらの一時的な認証情報は、特定の IAM ロールに関連付けられます。IAM ロールでは、AWS リソースにアクセスするための許可一式を定義できます。
また、認証されていないユーザーやユーザー毎にロールを定義できる。
認証されたユーザーと認証されていないユーザー用に、デフォルトの IAM ロールを指定できます。また、ユーザーの ID トークンのクレームに基づいて、各ユーザーのロールを選択するルールを定義できます。
詰まったところ
IDプール内、IDプロバイダーのロール設定のロールの選択
とロールの解決
の項目について理解ができなかった。
ロールベースアクセスコントロールについて
一言サマリー
ロールの選択
:Cognitoのユーザーへ引き渡すIAMロールへ何を引き渡すか
ロールの解決
:認証されないユーザーへの対応
わかったこと
そもそも今回やりたかったことは、
Cognito上にユーザーグループを作成し、そのユーザーグループごとにOpenSearchehへのアクセス権を付与したRoleをフェデレーションすること。
上記のベストプラクティスの中で下記の記載があった。
Amazon Cognito ユーザープールのグループにロールを設定する場合、これらのロールはユーザーの ID トークンを通じて渡されます。これらのロールを使用するには、ID プールの認証ロールの選択に対して [トークンからロールを選択する] を設定する必要があります。
トークンから正しいロールを判断できない場合のデフォルト動作を指定するには、コンソールの [Role resolution] (ロールの解決) 設定と、SetIdentityPoolRoles API の RoleMappings パラメータを使用できます。
ユーザーのトークンを通じてロールが渡されるため、ロールの選択
では、トークンでpreferred_roleクレームを持つロールを選択する
を指定しなければならないとのこと。(マネコン上だと最近少し文言が変わっているぽい)なので、上記設定にしてあげることで、Cognitoにおけるロールのフェデレーションができた。
ちなみに当初ロールの選択
ではデフォルトの認証されたロールを指定していたが、IDプールで認証されたロールの認証情報をユーザーへ発行する設定だったので今回のケースでは不適。
(補足)preferred_role
について
preferred_role
はユーザープールによって割り当てられたロールARNを格納するクレームという理解。
Amazon Cognito ユーザープール経由でログインするユーザーの場合、ユーザープールによって割り当てられた ID トークンにロールを渡すことができます。
cognito:preferred_role クレームはロール ARN です
なので、今回の場合はこのpreferred_role
には、ユーザーグループに付与したOpenSearchへのアクセス権を付与したIAM RoleのARNが格納される
OpenSearchとCognito間のロールの引き渡し
前提
OpenSearchとCognito間では主に2種類のRoleが出てくる
・OpenSearchへアクセスするための権限(Action: es:*等)を持つRole
・Cognitoからのフェデレーションを許可するための権限(Action:cognito:*等)を持つRole
また、OpenSearchにおける権限にはいくつかの層がある。下記の資料がわかりやすかった。
詰まったこと
どこでどのRoleを指定しているのか、およびそれぞれの権限がどのタイミングで使われるのかが理解できてなかった。
OpenSearchへアクセスするための権限(Action: es:*等)を持つRole
- 付与する対象
- Cognito上のユーザープール上に作成したグループ
- 使用タイミング
- Cognitoで認証後、Cognitoユーザーがフェデレーションする際に使用するRole
- 注意点
- master userの場合、master userで設定しているIAM RoleとCognitoのグループへ付与するIAM Roleが一致してないとmissing roleになる
- このロールはSTSを用いてCognitoユーザーへ一時的に発行されるユーザーとなるので、IAMの設定にて
信頼関係
の下記設定を行う必要がある。
{
"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"
}
}
}]
}
Cognitoからのフェデレーションを許可するための権限(Action:cognito:*等)を持つRole
- 付与する対象
- OpenSearch
- 使用タイミング
- ユーザー認証の際にCognito側に認証を行ってもらう時
- 認証後Cognito側からIAM ロールをフェデレーションしてもらう時
- 注意点
- OpenSearch上でCognitoとの連携設定の際にする
- 基本的にデフォルトでOpenSearch側が作ってくれるので、何かする必要はなし。
-下記の話
・CognitoAccessForAmazonOpenSearch ロールについて
OpenSearch Service には、Amazon Cognito ユーザーおよび ID プールを設定し、認証のためにそれらを使用するための許可が必要です。この目的のために、AWS 管理ポリシーの 1 つである AmazonOpenSearchServiceCognitoAccess を使用できます。