설명
API Gateway에 넓은 SourceArn으로 Lambda 호출을 허용하면 의도하지 않은 스테이지·메서드·경로의 통합에서도 함수를 호출할 수 있습니다. 이 서비스 호출 권한과 API 이용자의 인증·인가는 서로 다른 통제입니다.
넓은 Lambda 권한만으로 API가 익명 공개되는 것은 아닙니다. API Gateway의 실제 통합, 배포와 인증 설정을 함께 확인해야 하며, 의도적으로 공개한 API까지 일률적으로 차단할 필요는 없습니다.
잠재적 영향
- 다른 경로나 스테이지에 잘못 연결된 통합이 함수를 실행할 수 있습니다.
- 접근 통제도 부족하면 의도하지 않은 함수 실행과 비용 증가가 발생할 수 있습니다.
해결 방법
SourceArn을 실제 필요한 API·스테이지·메서드·리소스 경로로 제한하고 불필요한 이전 권한을 제거하세요. 호출 주체를 API Gateway 서비스로 제한하고 API 이용자에게 필요한 인증·인가를 별도로 적용하세요. 의도한 호출은 성공하고 다른 경로의 호출은 거부되는지 시험하세요.
예시
Lambda 함수 정의는 생략했습니다. function과 ARN의 리전·계정·API 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 메서드의 인증과 함수 내부의 권한 검사도 별도로 필요합니다.