API GatewayからのLambda呼び出し範囲の確認

API GatewayのLambda権限を必要なAPI経路に制限し、利用者の認証も別途確認してください。

説明

Lambda権限のSourceArnが広いと、意図しないAPI Gatewayのステージ、メソッド、パスにある統合から関数を呼び出せる場合があります。このサービス呼び出し権限と、API利用者の認証・認可は別の制御です。

広いLambda権限だけでAPIが匿名公開されるわけではありません。実際の統合、デプロイ、認証を合わせて確認してください。意図的に公開したAPIまで一律に遮断する必要はありません。

想定される影響

  • 別の経路やステージに誤って接続された統合が関数を実行できる可能性があります。
  • 利用者のアクセス制御も不十分だと、意図しない実行や費用増加につながるおそれがあります。

対処方法

SourceArnを必要なAPI、ステージ、メソッド、リソースパスに絞り、古い広範な権限を削除してください。呼び出し主体をAPI Gatewayサービスに限定し、必要なAPI利用者の認証・認可を別途設定してください。意図した呼び出しは成功し、他の経路は拒否されることを試験してください。

例

Lambda関数定義は省略しています。functionとARN内のリージョン、アカウント、API IDを実際のデプロイに合わせてください。権限リソースの論理IDが異なる比較なので、以前の広い許可が残らないことも確認してください。

変更前

yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "BatchJobDefinition"
Resources:
  s3Permission3:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: apigateway.amazonaws.com
      SourceAccount: !Ref "AWS::AccountId"
      SourceArn: arn:aws:execute-api:eu-central-1:123456789012:api-id/*/*

特定APIの複数のステージ、メソッド、パスに広く呼び出しを許可します。この権限自体がAPI利用者の認証をなくすわけではありません。

変更後

yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "BatchJobDefinition"
Resources:
  apiPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: apigateway.amazonaws.com
      SourceAccount: !Ref "AWS::AccountId"
      SourceArn: arn:aws:execute-api:eu-central-1:123456789012:api-id/prod/GET/orders

prodステージのGET /ordersに呼び出し範囲を絞ります。APIメソッドの認証と関数内の権限チェックも別途必要です。

参考資料