こんにちは!
認証周りはアプリ開発で最も複雑化しやすいところなので、可能な限り AWS にお任せしたいところですよね。
AWS のマネージド認証サービスといえば「Cognito」ですが、「ユーザープールは使ったことあるけど、ユーザープールグループは使ったことない」なんて方が多いのではないでしょうか?
本記事では、ユーザープールグループの扱い方、IAM ロールの指定について解説したいと思います!
Cognito ユーザープールは認証を扱うサービスで、ID プールは認可を扱うサービスです。それぞれのユースケースは下記となります。
Cognito | ユースケース |
ユーザープール | AppSync、API Gatewayの呼び出しを認証ユーザーのみに制限 |
IDプール | AWSの各種サービスへ厳格なアクセス制御を制限 |
実施のユースケースで言うと
となります。
私たちの経験上ですが、ID プールトークンによる認可の方が少し開発が複雑になるような印象があります。(各種リソースごとに、誰に、どのようなアクションを許可するのか設計する必要があります)
AppSync→Lambda、あるいは API Gateway→Lambda によるリソースアクセスで十分であれば、ID プールを利用せずLambda に対しての IAM 付与だけで構築をすることを推奨します。(認証系は最も複雑化しやすく開発者が疲弊しやすいのでシンプルにしておいた方が良いですね)
わたし達は AppSync と Cognito ユーザープール連携させて利用することが多いですね。
AppSync にリクエストする際に JWT トークンをのせてあげれば、AppSync がヘッダーからクレデンシャルを取り出し中身を解析しユーザーグループを取得、アクセス制限を行ってくれます。
クレデンシャルを取得し連携するケースについては、次セクション「ユーザープールに指定する IAM ロールの扱いについて」で解説したいと思います。
Cognito ユーザープールがリリースされる2016年までは、「認証=固定ロール」でしか設定できませんでした。わかりやすく言うと、管理者とコンシューマーでアクセス可能な AWS リソースを変更ができなかったということです。(同じロールが付与されてしまう)
2016年に Cognito ユーザープールグループがリリースされてからは、認証ユーザーにグループ情報を付与し、付与するロールの変更することが可能となりました。
より認可の仕組みを強力にサポートしてくれる仕組みですね。ただ注意点としては、ユーザーグループはネストできないということです。尚、複数ロールが付与されているユーザーにはグループ優先度を設定し、適用させるロールを決定することが可能です。
事前にユーザープールグループと ID プールと連携させておく(ID プールのプロバイダーに Cognito を指定しておく)ことで、ユーザープールグループに指定した IAM ロールに対応するクレデンシャル(STS)を、ID プールに発行させることが可能です。
つまり、ユーザープールグループ単体での IAM ロールは意味を持たないということです。
ID プールから STS トークンを発行させる場合は、まず ID プールに sts:AssumeRoleWithWebIdentity を行います。
{
"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-xxxx-xxxx-xxxx"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}
次に、ID プールの認証プロバイダーへ Cognito を登録します。「トークンからロールを決定する」を選択しておくことで、ユーザープールグループへ指定したロールの STG が返却されるようになります。
これで準備は完了です。
あとはユーザープールトークンと ID プールトークンを交換し、STS を受け取りましょう。
IAM と聞くと苦手意識ある方が多いと思いますが、AWS を扱う上で必ず理解しておかないといけないサービスの1つです。
IAM と仲良くなることでより堅牢で安全な AWS 運用を行うことが可能になります。
Cognito、IAMに関する開発のご相談はお気軽に問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎