Code Monkey home page Code Monkey logo

tr-05-serverless-google-chronicle's Introduction

Gitter Chat

NOTE! This code has been upgraded and the current release no longer supports installation in AWS

If you wish to deploy in AWS, use this previous release.

Google Chronicle Relay (Cisco Hosted)

A Cisco SecureX Concrete Relay implementation using Google Chronicle as a third-party Cyber Threat Intelligence service provider.

The Relay itself is just a simple application written in Python that can be easily packaged and deployed. This relay is now Cisco Hosted and no longer requires AWS Lambda.

The code is provided here purely for educational purposes.

Rationale

  • We need an application that will translate API requests from SecureX Threat Response to the third-party integration, and vice versa.
  • We need an application that can be completely self contained within a virtualized container using Docker.

Testing (Optional)

Open the code folder in your terminal.

cd code

If you want to test the application you will require Docker and several dependencies from the Pipfile file:

pip install --no-cache-dir --upgrade pipenv && pipenv install --dev

You can perform two kinds of testing:

  • Run static code analysis checking for any semantic discrepancies and PEP 8 compliance:

    flake8 .

  • Run the suite of unit tests and measure the code coverage: coverage run --source api/ -m pytest --verbose tests/unit/ && coverage report

NOTE. If you need input data for testing purposes you can use data from the observables.json file.

Building the Docker Container

In order to build the application, we need to use a Dockerfile.

  1. Open a terminal. Build the container image using the docker build command.
docker build -t tr-05-google-chronicle .
  1. Once the container is built, and an image is successfully created, start your container using the docker run command and specify the name of the image we have just created. By default, the container will listen for HTTP requests using port 9090.
docker run -dp 9090:9090 --name tr-05-google-chronicle tr-05-google-chronicle
  1. Watch the container logs to ensure it starts correctly.
docker logs tr-05-google-chronicle
  1. Once the container has started correctly, open your web browser to http://localhost:9090. You should see a response from the container.
curl http://localhost:9090

Implementation Details

This application was developed and tested under Python version 3.9.

Implemented Relay Endpoints

  • POST /health

    • Verifies the Authorization Bearer JWT and decodes it to restore the original credentials.
    • Authenticates to the underlying external service to check that the provided credentials are valid and the service is available at the moment.
  • POST /observe/observables

    • Accepts a list of observables and filters out unsupported ones.
    • Verifies the Authorization Bearer JWT and decodes it to restore the original credentials.
    • Makes a series of requests to the underlying external service to query for some cyber threat intelligence data on each supported observable.
    • Maps the fetched data into appropriate CTIM entities.
    • Returns a list per each of the following CTIM entities (if any extracted):
      • Indicator,
      • Sighting,
      • Relationship.
  • POST /version

    • Returns the current version of the application.

Supported Types of Observables

  • ip
  • ipv6
  • domain
  • md5
  • sha1
  • sha256

JWT Payload Structure

{
  "type": "<CREDENTIALS_TYPE>",
  "project_id": "<PROJECT_ID>",
  "private_key_id": "<PRIVATE_KEY_ID>",
  "private_key": "<PRIVATE_KEY>",
  "client_email": "<CLIENT_EMAIL>",
  "client_id": "<CLIENT_ID>",
  "auth_uri": "<AUTH_URI>",
  "token_uri": "<TOKEN_URI>",
  "auth_provider_x509_cert_url": "<AUTH_PROVIDER_X509_CERT_URL>",
  "client_x509_cert_url": "<CLIENT_CERT_URL>"
}

NOTE. JWT Payload Structure above matches Google Developer Service Account Credential

CTIM Mapping Specifics

Each Google Chronicle assets record generates 2 CTIM Sighting entities based on assets[].firstSeenArtifactInfo.seenTime and assets[].lastSeenArtifactInfo.seenTime which are used as an .observed_time.start_time value of a Sighting.

  • Objects from assets[].asset are treated as a Target of a Sighting.

  • Objects from .assets[].firstSeenArtifactInfo.artifactIndicator and .assets[].lastSeenArtifactInfo.artifactIndicator are used as sighting.observables. In most cases, artifactIndicator field holds the same value as an input parameter of investigation, but in a couple of cases it may differ:

    • when a subdomain is returned as an artifactIndicator for a domain investigation an observed relation domain->'Supra-domain_Of'->subdomain is created.
    • when a domain is returned as an artifactIndicator for an IP investigation an observed relation domain->'Resolved_To'->IP is created.

Each Google Chronicle IOC details record generates a CTIM Indicator entity.

  • The actual mapping here is quite straightforward. The only non-obvious piece of the mapping is the logic for inferring the actual values for the confidence field: the possible values of the raw_confidence_score field, which is used as a source of confidence, are: Low, Medium, High or a number between 0 and 127. The string values are used as-is, while the diapason of possible values for the number is divided into 3 equal segments resulting in Low, Medium and High confidence.

  • IOC details are provided for the following types: domain, ip, ipv6.

Each Sighting is linked to each Indicator with the corresponding CTIM Relationship.

tr-05-serverless-google-chronicle's People

Contributors

alinablahun avatar anastasiiarozlyvan avatar ceilingduster avatar denyskulykov avatar maxmhonc avatar mdougal avatar mistergreen22 avatar mstoro avatar opavlyshyn avatar oshtaier avatar oshynk avatar tarasmaliuchenko avatar yevhenlysen avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

waynekearns

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.