Skip to main content

Overview

This repo contains the scripts necessary to parse Akamai property and redirect configs and ingest them into Neo4j. It is a starting point to help visualize your external attack surface within Akamai.

LinkedIn Blog post

Setup Neo4j

  1. Download and install Neo4j: https://neo4j.com/docs/desktop-manual/current/installation/download-installation/
  2. Create and start database (version 5.7.0: https://neo4j.com/docs/desktop-manual/current/operations/create-dbms/
  3. Install APOC: https://neo4j.com/docs/apoc/5/installation/

Download Akamai credentials

  1. Create and download akamai credentials: https://techdocs.akamai.com/developer/docs/set-up-authentication-credentials

NOTE: These values will be used in your .env

Install and run the app

  1. Install python3: https://www.python.org/downloads/
  2. Install poetry: https://python-poetry.org/docs/#installation
  3. Install nodestream: https://nodestream-proj.github.io/nodestream/0.5/docs/tutorial/
  4. Generate a new nodestream project
  5. Add nodestream-akamai to your project dependencies in your nodestream projects pyproject.toml file.
  6. Install necessary dependencies: poetry install
  7. In nodestream.yaml add the following:
plugin_config:
  akamai:
    base_url: !env AKAMAI_BASE_URL
    client_token: !env AKAMAI_CLIENT_TOKEN
    client_secret: !env AKAMAI_CLIENT_SECRET
    access_token: !env AKAMAI_ACCESS_TOKEN
    # If you are using an akamai account key add the following line:
    account_key: !env AKAMAI_ACCOUNT_KEY
targets:
  my-db:
    database: neo4j 
    uri: bolt://localhost:7687
    username: neo4j
    password: neo4j123
  1. Set environment variables in your terminal session for: AKAMAI_BASE_URL, AKAMAI_CLIENT_TOKEN, AKAMAI_CLIENT_SECRET, AKAMAI_ACCESS_TOKEN and if using an akamai account key AKAMAI_ACCOUNT_KEY.
  2. Verify nodestream has loaded the pipelines: poetry run nodestream show
  3. Use nodestream to run the pipelines: poetry run nodestream run <pipeline-name> --target my-db

Property rule pipeline: AkamaiPropertyRule keying

As of 0.16.2 the property-rule pipeline keys AkamaiPropertyRule nodes on the rule's position in the Akamai rule tree: (proxy_id, rule_path), where rule_path is the ordinal index path from the root (ROOT, 3.0, 3.0.1, …). The rule's human-readable name breadcrumb is stored as the full_path property.

Previously these nodes were keyed on (proxy_id, rule_name, hostname), which is not unique — Akamai rule names repeat across a property's tree and most rules have no hostname criterion — so the NODE KEY constraint could not be created (Neo.DatabaseError.Schema.ConstraintCreationFailed). A path-eligible rule is also now written as a Path node only (never both a Path and an AkamaiPropertyRule).

If a database was loaded by an older plugin version that used the old key, do not just rerun the pipeline: the old nodes have no rule_path, so a rerun creates a parallel set of correctly-keyed nodes and leaves the old ones behind. Instead, drop the plugin-owned AkamaiPropertyRule subgraph, (re)create the constraint, then rerun the pipeline so nodes repopulate under the new key.

Find databases that still hold old property-rule nodes:

MATCH (r:AkamaiPropertyRule)
WHERE r.rule_path IS NULL
RETURN count(r) AS old_rule_nodes

Using make

  1. Install make (ie. brew install make)
  2. Run make run

Install Bloom visualization

  1. For detailed instructions on how to import a perspective: https://neo4j.com/docs/bloom-user-guide/current/bloom-perspectives/perspective-creation/
  2. Download the perspective to a file https://github.com/ccloes/neo4j-akamai/blob/main/Bloom_Perspective.json

Using the saved cypher queries

  1. Type show endpoint <some.fqdn.com> (this will show that endpoint and the relationships to it)
  • show endpoint <fqdn>
  1. Type show akamai graph (this will show the current akamai data loaded in the graph)
  • show akamai graph
  1. Type show schema (this will show the graph schema and how the nodes relate and their relationships)
  • show schema

Schema visualization

Arrows.app link

Authors

  • Zach Probst
  • Chad Cloes
  • Bryan Norman
  • Gabe Gallagher
  • Stuart Macleod
  • Grant Hoffman

Metadata

Release files for nodestream-plugin-akamai 0.16.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nodestream-plugin-akamai 0.16.2
File Size Uploaded Provenance
nodestream_plugin_akamai-0.16.2.tar.gz 43.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for nodestream-plugin-akamai 0.16.2
File Interpreter ABI Platform
nodestream_plugin_akamai-0.16.2-py3-none-any.whl Python 3 none any Details

Total release size: 112.6 kB

Release files / nodestream_plugin_akamai-0.16.2.tar.gz

Download URL nodestream_plugin_akamai-0.16.2.tar.gz
Size 43.4 kB
Tags Source
SHA-256 checksum
How to use checksums
8d3513d1fb3021fa404df134369d4147aac6d6237cc69093471267e71fa893e5
BLAKE2b-256 checksum
How to use checksums
cb9de82c6c8536a4342277b05418ae1d1381d06ee26a33ad416da2fbd0fdbc90
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 1, 2026.

Transparency log

Release files / nodestream_plugin_akamai-0.16.2-py3-none-any.whl

Download URL nodestream_plugin_akamai-0.16.2-py3-none-any.whl
Size 69.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1c2c8b0be92eea84deb9a89b3760a4f6a3b94d97ea7c90dad33add1eaffbfdc5
BLAKE2b-256 checksum
How to use checksums
b270b8091e14e45b47f9fb7d373f2d664cfbaa66e8ad1b8a181ccbc870dad5b2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 1, 2026.

Transparency log

Security for nodestream-plugin-akamai 0.16.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for nodestream_plugin_akamai-0.16.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 1, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.16.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page