Your First Endpoint
Socless uses Event Endpoints to receive event/alert data from external systems and trigger playbooks.
At their core, Event Endpoints are simply AWS Lambda functions that invoke the create_events
function from the socless
Python library with the information necessary to register the event within Socless and trigger the appropriate playbook. As such, the bare-bones, psuedo-code implementation for any Socless Event Endpoint looks like this:
from socless import create_events
def lambda_handler(event, context):
# Populate event_details object with approriate fields
event_details = {
'event_type': '...', # event name
'playbook': '...', # playbook name
'details': [{'...'},{'...'}] # alert findings
}
# Invoke create_events function with event_details
create_events(event_details, context)
return {"statusCode": 200}
The create_events
function takes two parameters: event_details
and context
.
context
is the AWS Lambda context which all Lambda functions receive when they are executed by AWS. It’s passed to the create_events function without any modification.
event_details
is a dictionary constructed by the developer of the Event Endpoint that must contain the below key-value pairs:
Key | Type | Description | Required? | Example Value |
---|---|---|---|---|
event_type | string | The unique event name | Yes | Anomalous Login IP Detected |
details | list of dicts | List of dictionaries containing aggregated findings for the event type | Yes | [{"username": "bruce.wayne","ip": "113.63.125.3"}] |
playbook | string | The Playbook to execute for the event | Yes | InvestigateLogin |
For our tutorial, all the values needed to populate the event_details
dictionary are conveniently contained in the alert payload our detection system will send.
So the implementation for our tutorial endpoint will look like this:
from socless import create_events
import json
def lambda_handler(event, context):
alert_payload = json.loads(event['body'])
event_details = {
'event_type': alert_payload['alert_name'],
'playbook': alert_payload['response_plan'],
'details': alert_payload['details']
}
try:
create_events(event_details, context)
except Exception as e:
return {"statusCode": 400, "body": f"{e}"}
return {"statusCode": 200}
Include this implementation in the lambda_function.py
file in the tutorial_endpoint
folder. Note that the current implementation does not include an authentication mechanism to protect our endpoint. Authentication for endpoints will be discussed in the Event Endpoints reference documentation here. For now, we’ll keep our endpoint simple and include authentication later in our tutorial.
With the logic for our Event Endpoint implemented, we’re ready to configure it for deployment
Configuring our Event Endpoint for Deployment
Much like Socless’ core infrastructure, Event Endpoints are deployed as Serverless Framework applications. Since we created our socless-tutorial
folder using the socless-integrations-template
, it is already pre-configured with much of the information we need to deploy our Event Endpoint (the current pre-configurations will be explained in the socless-integrations-template
reference documentation here).
All we need do now is add configurations for the tutorial_endpoint
function we just created.
Open the serverless.yml
file contained within our socless-tutorial
folder. This file is where configurations for our socless-tutorial
Serverless application lives. At the bottom of the file, let’s configure a lambda function that:
- is reference-able in our config as
TutorialEndpoint
- is named
_socless_tutorial_endpoint
- has its entry point (handler) at
lambda_function.lambda_handler
- has the description: “Receives alerts from our tutorial detection system”
- creates its source package from the contents of the
functions/tutorial_endpoint
folder of oursocless-tutorial
folder - is triggered by an http POST request to the
/endpoints/tutorial
path of Socless’ API endpoint
Here’s what that configuration looks like:
TutorialEndpoint:
name: _socless_tutorial_endpoint
handler: lambda_function.lambda_handler
description: Receives alerts from our tutorial detection system
package:
include:
- functions/tutorial_endpoint
events:
- http:
path: /tutorial
method: post
We are now ready to deploy and test our endpoint.
Deploy The Endpoint
Since we’re still in the development phase, we’ll only deploy the event endpoint to our Socless dev environment. Do so by running the below command
npm run dev
Once the deployment is successful, you will find a URL that ends in /tutorial
in the Service Information section. This is the URL for the endpoint we just deployed. It’s where our tutorial detection system will send our alert payload. Keep it handy. We'll need it to test the playbook