説明
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メソッドの認証と関数内の権限チェックも別途必要です。