説明
保護が必要な 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 ルートに関連付けてください。