Search code examples
amazon-web-servicesgithubgit-webhooksgithub-webhook

Github Webhooks secret with AWS API Gateway


I am trying to have a Github Webhook launch an AWS Lambda I have. The best way I can figure out how to do that is to use AWS API Gateway, the issue is security.

Github Webhooks will only send a secret with the POST call.

I can't find any way to have AWS API Gateway to verify this signature. Or where I can add this functionality.

I assume I can write an AWS Lambda Authorizer. But this is a lot of code in different places, starting to see the need for serverless framework.

Any easier setup within AWS I do not know about for this?


Solution

  • Came here because I was trying to integrate a Github webhook with AWS lambda and ran into the same problem as the OP. At the time of writing I believe the best solution is to include verification code in the main lambda, as others have suggested.

    On the AWS Computer Blog from September 2017:

    Enhanced request authorizer Lambda functions receive an event object that is similar to proxy integrations. It contains all of the information about a request, excluding the body.

    Source: Using Enhanced Request Authorizers in Amazon API Gateway (amazon.com)

    You can't perform HMAC as recommended by Github, because AWS authorizer lambdas don't give you access to the body of the HTTP request, which you need in order to compare digests.

    This is a shame, because HMAC seems to be a pretty standard way of securing an endpoint that responds to a webhook. See for example this blog post, Webhooks do’s and dont’s: what we learned after integrating +100 APIs (restful.io). Twitter and Stripe do something similar:

    To make the approach described above work, if you're using API Gateway you'll need to make sure that the header that contains the hash signature is forwarded as part of the event argument to the lambda. To do that, follow these instructions: How do I pass custom headers through Amazon API Gateway to an AWS Lambda function using custom Lambda integration for further processing? (amazon.com)