🕌

[Cognito] 認証されていないIDに対してのアクセスを無効にする

4 min read

これは何?

  • Cognito IdentityPoolの設定の一つである 「認証されていないIDに対してアクセスを有効化する」 とは何かをざっくりとまとめたものです。
  • サービス仕様としてゲストユーザ向けにコンテンツ提供がない場合は設定を無効にしておくと良いと思います。

予備知識

IdentityPoolとは

  • IdentityProvider(以下、IDP)と連携を行い、ユーザへAWSリソースにアクセスするための権限を付与するサービスです。
  • IDPとは簡単に説明するとユーザの認証・管理を担うサービスのことで、IdentityPoolでは同じAWS系列であるCognito UserPoolをはじめ、Google+やTwitterなど様々なサービスに対応しています。
  • 発行できる一時クレデンシャルには認証ユーザ向けとゲストユーザ向けの二種類があり、STSが裏側の仕組みとして使われています。


Fig1: identityPoolの役割

本題

認証されたIDと認証されていないID

  • IdentityPoolでは一時クレデンシャルの発行対象となるユーザ単位でIDを払い出し、その発行したIDを管理する役割も合わせて担っています。
  • 管理されるIDには2種類あり、「認証されたID」 と 「認証されていないID」 があります。

認証されたID

  • ユーザがIDPに対してサインイン処理後、アクセス権限を要求した場合に発行されます。
  • アクセス権限を要求する際に、IDPから受け取ったユーザ識別子(UserPoolの場合はIDトークン)をIdentityPoolに対して送信をします。
  • 付与されるアクセス権限は認証ユーザ向けIAMロール相当になります。
    image
    Fig2: 認証されたIDの発行と一時クレデンシャルの取得

認証されていないID

  • ユーザがIDPにサインインを行わずidentityPoolへアクセス権限を要求した場合に発行されます。
  • 付与されるアクセス権限はゲストユーザ向けIAMロール相当になります。

    Fig3: 認証されていないIDの発行と一時クレデンシャルの取得

認証されていないID経由でクレデンシャルを取得する

  • 認証されていないIDの発行、および一時クレデンシャルの取得に必要なAPIは、その性質上Public APIとして提供されています。
  • そのため、AWSクレデンシャルを必要とせず identityPoolId さえ知ることができれば誰でも発行することが可能です。
# 認証されていないIDの発行
$aws cognito-identity get-id --identity-pool-id ${IDENTITY_POOL_ID} --query "IdentityId" --output text

us-east-1:xxx-xxxx-xxxx-xxx-xxx

# 一時クレデンシャルの取得
$aws cognito-identity get-credentials-for-identity --identity-id us-east-1:xxx-xxxx-xxxx-xxx-xxx

{
    "IdentityId": "us-east-1:xxx-xxxx-xxxx-xxx-xxx",
    "Credentials": {
        "AccessKeyId": "xxxx",
        "SecretKey": "xxxx",
        "SessionToken": "xxxx",
        "Expiration": "2021-05-05T12:15:31+09:00"
    }
}

認証されていないIDに対してのアクセスを無効にする

  • サービス仕様として認証ユーザ/ゲストユーザという区分があり、それぞれでAWSリソースへのアクセスを制御したい場合は、アクセスを有効にしていても問題ないと思います。
  • ただ、そうでない場合はアクセスを有効化にしておくとIAMポリシーの内容によっては思わぬアクセスが発生する可能性があります。
  • そのため、ゲストユーザにはクレデンシャルをはらい出さないように、この設定を無効化するための方法を最後にまとめておきます。

コンソールの場合

  • IDプールの編集認証されていない ID に対してアクセスを有効にする のチェックボックスを外します。

AWS CLIの場合

$aws cognito-identity update-identity-pool --identity-pool-id ${IDENTITY_POOL_ID} --identity-pool-name ${IDENTITY_POOL_NAME} --no-allow-unauthenticated-identities

AWS CDKの場合

  • allowUnauthenticatedIdentities の値をfalseに設定しデプロイすることで反映できます。
import { CfnIdentityPool } from '@aws-cdk/aws-cognito';
import { Construct, Stack, StackProps } from '@aws-cdk/core';

export class SampleCdkStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const identityPool = new CfnIdentityPool(this, 'myIdentityPool', {
      // ここの値です。
      allowUnauthenticatedIdentities: false, 
    });
  }
}

反映結果

  • アクセスを無効化した状態で認証されていないIDの発行をリクエストするとエラーになります。
$aws cognito-identity get-id --identity-pool-id ${IDENTITY_POOL_ID} --query "IdentityId" --output text

An error occurred (NotAuthorizedException) when calling the GetId operation: Unauthenticated access is not supported for this identity pool.

参考にしたもの

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/identity-pools.html
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/authentication-flow.html
https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetId.html
https://docs.aws.amazon.com/cognitoidentity/latest/APIReference/API_GetCredentialsForIdentity.html
https://docs.aws.amazon.com/cli/latest/reference/cognito-identity/update-identity-pool.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-cognito-identitypool.html

Discussion

ログインするとコメントできます