説明
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