AWS CDK の特定バージョン(2.142.0 から 2.148.0)で CognitoUserPoolsAuthorizer の認可スコープが設定されないバグが発生していたので対処方法を確認してみた
こんにちは、製造ビジネステクノロジー部の若槻です。
昨日に AWS より以下のようなメール通知が届きました。
Subject:
[Action Recommended] Update to AWS CDK version v2.148.1 or newer [AWS Account: XXXXXXXXXXXX]
Body:
Hello,
We are aware of an issue [1] in AWS Cloud Development Kit (CDK) [2] versions 2.142.0 through 2.148.0 that, under certain conditions, could result in granting authenticated Amazon Cognito users broader access than intended. We have proactively notified customers affected by this issue. If you use these versions, we recommend you upgrade to v2.148.1 or newer [3].
For these versions, if your application uses the “RestApi” construct [4] with “CognitoUserPoolsAuthorizer” [5] as the authorizer, and you limit access to specific API resources or methods using authorization scopes, your applications designed to make changes would allow changes by a user who previously did not have permission to do so. We identified you are not affected by this issue, however, as a security best practice, we recommend you upgrade to v2.148.1 or newer.
If you have questions or concerns, please contact AWS Support [6] or follow up with your account team.
[1] https://github.com/aws/aws-cdk/issues/30444
[2] https://docs.aws.amazon.com/cdk/v2/guide/home.html
[3] https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install
[4] https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.RestApi.html
[5] https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway.CognitoUserPoolsAuthorizer.html
[6] https://aws.amazon.com/support
Sincerely,
Amazon Web Services
Amazon Web Services, Inc. is a subsidiary of [Amazon.com](http://amazon.com/), Inc. [Amazon.com](http://amazon.com/) is a registered trademark of [Amazon.com](http://amazon.com/), Inc. This message was produced and distributed by Amazon Web Services Inc., 410 Terry Ave. North, Seattle, WA 98109-5210
上記のうち重要部分を翻訳したものが以下です。
AWS Cloud Development Kit (CDK) [2] バージョン 2.142.0 から 2.148.0 に、特定の条件下で認証済みの Amazon Cognito ユーザーに意図したよりも広範なアクセスを許可する可能性がある問題 [1] があることを認識しています。この問題の影響を受けるお客様には事前に通知しています。これらのバージョンを使用している場合は、v2.148.1 以降 [3] にアップグレードすることをお勧めします。
これらのバージョンでは、アプリケーションが「CognitoUserPoolsAuthorizer」[5] を認可者として「RestApi」コンストラクト [4] を使用し、認可スコープを使用して特定の API リソースまたはメソッドへのアクセスを制限している場合、変更を行うように設計されたアプリケーションは、以前は権限がなかったユーザーによる変更を許可します。この問題の影響を受けないことが確認されましたが、セキュリティのベストプラクティスとして、v2.148.1 以降にアップグレードすることをお勧めします。
AWS CDK の v2.142.0 から 2.148.0 において、特定の条件下で認証済みの Amazon Cognito ユーザーに意図したよりも広範なアクセスを許可する可能性がある問題があるとのことです。
何をするべきか
次のいずれかの対処を行い、AWS 環境へのデプロイを行います。
- AWS CDK の v2.148.1 以上へのアップグレード
- RestApi Construct での authorizationType の明示的な指定
CognitoUserPoolsAuthorizer の認可スコープとは
CognitoUserPoolsAuthorizer の認可スコープ(Authorization Scope)とは、Cognito Authorizer を設定した API のメソッドに設定される承認スコープです。メソッド呼び出し時に、アクセストークンから解析されたスコープと、メソッドの承認スコープが一致する場合のみ呼び出しが承認でき、細かいアクセス制御が可能となります。Cognito Authorizer の場合はスコープに以下を含めることができます。
- PHONE
- OPENID
- PROFILE
- COGNITO_ADMIN
今回のバグは、特定バージョンでこの認可スコープの設定が意図せず無効化されてしまうというものとなります。
検証
バグの再現を行い、対処方法を確認してみます。
バグ未発生バージョン(2.142.0 未満)での動作確認
バグ未発生バージョン(2.142.0 未満)でバグが発生しないことを確認します。
AWS CDK v2.141.0 のインストール
npm install [email protected] [email protected]
CDK コード
RestApi Construct で authorizationScopes により認可スコープを設定した CDK コードを作成します。
import { UserPool, OAuthScope } from 'aws-cdk-lib/aws-cognito';
import {
CognitoUserPoolsAuthorizer,
RestApi,
} from 'aws-cdk-lib/aws-apigateway';
import { Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// User Poolの作成
const userPool = new UserPool(this, 'UserPool');
// Cognito User Pools Authorizerの作成
const authorizer = new CognitoUserPoolsAuthorizer(this, 'Authorizer', {
cognitoUserPools: [userPool],
});
// RestApiの作成
const restApi = new RestApi(this, 'RestApi');
// ルートリソースの取得
const rootResource = restApi.root;
// ルートリソースにGETメソッドを追加し、オーソライザーを設定
rootResource.addMethod('GET', undefined, {
authorizer,
authorizationScopes: [OAuthScope.PROFILE.scopeName], // 認可スコープを指定する
});
}
}
デプロイ後の確認
前述の CDK コードをデプロイすると、作成された API のメソッドに認可スコープがちゃんと設定されていることが確認できます。
バグ発生バージョン(2.142.0 から 2.148.0)での動作確認
バグ発生バージョン(2.142.0 から 2.148.0)でバグが再現することを確認します。
AWS CDK v2.142.0 のインストール
npm install [email protected] [email protected]
CDK 合成結果の差分の確認
CDK コードの変更はせず、バグ未追加のバージョンとの CDK 合成結果の差分を確認すると、Authorization Scope が削除されてしまっています。
$ npx cdk diff
[Warning at /SampleStack/RestApi/Default/GET] 'AuthorizationScopes' can only be set when 'AuthorizationType' sets 'COGNITO_USER_POOLS'. Default to ignore the values set in 'AuthorizationScopes'. [ack: @aws-cdk/aws-apigateway:invalidAuthScope]
Stack SampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Resources
[-] AWS::ApiGateway::Deployment RestApi/Deployment RestApiDeployment180EC503aed52c5a4c8b74d82224d289a0734b8a destroy
[+] AWS::ApiGateway::Deployment RestApi/Deployment RestApiDeployment180EC503e916070d7fdf2402bf059f6e97faf48e
[~] AWS::ApiGateway::Stage RestApi/DeploymentStage.prod RestApiDeploymentStageprod3855DE66
└─ [~] DeploymentId
└─ [~] .Ref:
├─ [-] RestApiDeployment180EC503aed52c5a4c8b74d82224d289a0734b8a
└─ [+] RestApiDeployment180EC503e916070d7fdf2402bf059f6e97faf48e
[~] AWS::ApiGateway::Method RestApi/Default/GET RestApiGET0F59260B
└─ [-] AuthorizationScopes
└─ ["profile"]
✨ Number of stacks with differences: 1
また上記では Synth の実行により下記の警告が出ています。
'AuthorizationScopes' can only be set when 'AuthorizationType' sets 'COGNITO_USER_POOLS'. Default to ignore the values set in 'AuthorizationScopes'.
この状態でデプロイを行うと、認可スコープが設定されていない状態で API が公開されてしまいます。
対処
前述の AWS CDK v2.142.0 で発生したバグを解消する対処を行ってみます。
authorizationType の明示的な指定による対処
まずは 1 つ目の対処方法です。
メソッドの authorizationType で COGNITO_USER_POOLS
を明示的に指定します。
// ルートリソースにGETメソッドを追加し、オーソライザーを設定
rootResource.addMethod('GET', undefined, {
authorizer,
authorizationScopes: [OAuthScope.PROFILE.scopeName], // スコープを指定する
authorizationType: AuthorizationType.COGNITO, // COGNITO_USER_POOLS を明示的に指定する
});
すると CDK の差分が発生しなくなり、認可スコープが設定されていることが分かります。
$ npx cdk diff
Stack SampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
There were no differences
✨ Number of stacks with differences: 0
バグ解消済バージョン(2.148.1 以上)へのアップグレードによる対処
次に 2 つ目の対処方法です。
AWS CDK v2.148.1 のインストール
バグ解消済バージョン(2.148.1 以上)へ AWS CDK をアップグレードします。
npm install [email protected] [email protected]
authorizationType を明示的な指定を削除
先ほどの対処方法で追加した authorizationType
の指定を削除します。
// ルートリソースにGETメソッドを追加し、オーソライザーを設定
rootResource.addMethod('GET', undefined, {
authorizer,
authorizationScopes: [OAuthScope.PROFILE.scopeName], // スコープを指定する
// authorizationType: AuthorizationType.COGNITO, // COGNITO_USER_POOLS を明示的に指定する
});
CDK 合成結果の差分の確認
すると CDK の差分が発生しなくなり、こちらも認可スコープが設定されていることが分かります。
$ npx cdk diff
Stack SampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
There were no differences
✨ Number of stacks with differences: 0
おわりに
AWS CDK の特定バージョン(2.142.0 から 2.148.0)で CognitoUserPoolsAuthorizer の認可スコープが設定されないバグが発生していたので、問題の再現と対処をしてみました。
意図しないユーザーが機密情報や特定の操作にアクセスできる可能性があるため、セキュリティに関わる重大な問題となります。早めに対処をするようにしましょう。
以上