API Gateway の認証構成の確認

保護する API ルートに適切な認証を関連付け、実際の権限確認を検証してください。

説明

保護が必要な API に有効な認証・認可がないと、意図しない呼び出し元が機能を利用できるおそれがあります。Authorizer リソースがなくても IAM 認証などのアクセス制御が適用される場合があるため、API の目的と実際のメソッド・ルート設定を確認する必要があります。

オーソライザーを宣言するだけではルートに認証は適用されません。API の種類に応じた関連付けが必要であり、WebSocket API の Lambda オーソライザーは $connect ルートでのみ使用できます。

想定される影響

  • 認証が必要な操作が、確認されていない呼び出し元に許可されるおそれがあります。
  • 接続時に認証しても、その後のメッセージの権限を確認しないと、想定範囲を超える操作が実行されるおそれがあります。

対処方法

API の種類と呼び出し元に合う認証方式を選び、保護するメソッドやルートに関連付けてください。WebSocket API では、Lambda オーソライザーを $connect ルートの CUSTOM 認証と AuthorizerId に関連付け、Lambda 呼び出し権限を用意してください。接続後の操作権限もアプリケーションで確認し、許可と拒否のケースを試験してください。

例

WebSocket API とオーソライザー定義の抜粋です。Lambda ARN を実際の関数に置き換え、呼び出し権限と $connect ルートを別途構成してください。クエリ文字列のトークンがログに漏れないようにし、WSS 接続を使用してください。

変更前

yaml
Resources:
  DevWebSocket:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: dev-websocket
      ProtocolType: WEBSOCKET
      RouteSelectionExpression: $request.body.action

API の定義のみで、この抜粋にはルート認証の設定を含みません。公開利用の意図と、実際のルートの認証を確認してください。

変更後

yaml
Resources:
  DevWebSocket:
    Type: AWS::ApiGatewayV2::Api
    Properties:
      Name: dev-websocket
      ProtocolType: WEBSOCKET
      RouteSelectionExpression: $request.body.action

  DevAuthorizer:
    Type: AWS::ApiGatewayV2::Authorizer
    Properties:
      Name: request-authorizer
      ApiId: !Ref DevWebSocket
      AuthorizerType: REQUEST
      IdentitySource:
        - route.request.querystring.token
      AuthorizerUri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:123456789012:function:auth/invocations

REQUEST オーソライザーを追加します。宣言だけでは認証は有効にならないため、$connect ルートに関連付けてください。

参考資料