Lambda の呼び出し主体にワイルドカードを使用

Lambda の呼び出し権限に、意図したサービスやアカウントを明示します。

説明

AWS::Lambda::Permission の Principal が * だと、プリンシパル自体では呼び出し主体を絞り込みません。実際のアクセス範囲には SourceArn や SourceAccount などの条件も適用されます。

想定される影響

条件まで広すぎると、想定外の呼び出しで費用が増えたり、関数のデータや処理が悪用されたりするおそれがあります。

対処方法

実際に呼び出すサービスやアカウントを指定してください。AWS サービスに権限を付与する場合は、そのサービスが対応する送信元 ARN とアカウントの制限も適用してください。

例

この例は送信元アカウントとバケットの制限を維持し、呼び出し主体を S3 と明示しています。function と bucket は別途定義するリソースです。

変更前

yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Grants S3 permission to invoke Lambda
Resources:
  s3Permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: "*"
      SourceAccount: !Ref "AWS::AccountId"
      SourceArn: !GetAtt bucket.Arn

変更後

yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Grants S3 permission to invoke Lambda
Resources:
  s3Permission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt function.Arn
      Action: lambda:InvokeFunction
      Principal: s3.amazonaws.com
      SourceAccount: !Ref "AWS::AccountId"
      SourceArn: !GetAtt bucket.Arn

参考資料