Threat intelligence · GitOps · AWS

Threat Intel Pipeline

Every hour this service collects known-bad IP addresses, phishing URLs and actively exploited vulnerabilities from three public feeds, merges them into one deduplicated database, and answers one question over an authenticated API: is this indicator known to be malicious?

How the data flows

From public feeds to an answer, all inside one small Kubernetes cluster.

  1. 1

    Feeds

    abuse.ch Feodo Tracker (botnet C2 IPs), OpenPhish (phishing URLs), CISA KEV (exploited CVEs).

  2. 2

    Ingest job

    A CronJob fetches each feed over HTTPS only, with size caps and strict parsing. Hostile or malformed values are dropped.

  3. 3

    Normalise

    Every IP, URL and CVE becomes one indicator schema, deduplicated across feeds and runs. Stale entries age out.

  4. 4

    SQLite store

    Kept on its own encrypted EBS volume, so the data survives the server being rebuilt.

  5. 5

    Query API

    FastAPI with a read-only database connection, behind Traefik TLS and per-client rate limits.

  6. 6

    You

    Look up an indicator, search by type or source, or get totals. Every data endpoint needs an API key.

How code reaches production

GitOps: Git is the only way in. CI never holds cluster credentials.

  1. 1

    git push

    A change under app/ lands on main.

  2. 2

    GitHub Actions

    Runs the tests, scans the image with Trivy, and fails on known vulnerabilities.

  3. 3

    GHCR

    Pushes the image and its SBOM to the GitHub Container Registry.

  4. 4

    Deploy commit

    CI commits the new image tag and digest to the prod overlay. That commit is the release.

  5. 5

    Argo CD

    Inside the cluster, it notices the commit and syncs, pruning drift and self-healing manual changes.

  6. 6

    k3s

    Pulls the image by digest and rolls out the new version.

Architecture

Feeds and users reach one EC2 instance running k3s with Traefik, the API, the ingest and backup jobs, and Argo CD. Backups go to S3 with Object Lock; Argo CD follows the GitHub repository. AWS · EC2 t3.small · k3s · no SSH Client + key Public feedsFeodo · OpenPhish · KEV TraefikTLS · rate limit APIread-only DB Ingesthourly CronJob SQLiteencrypted EBS Backupnightly Argo CDsyncs from Git GitHubrepo + GHCR S3 Object Locklocked 7 days

API

Send your key in the X-API-Key header. A browser can't add it by clicking a link, so use curl or an API client.

EndpointReturnsKey
GET /lookup/{value}The match for an IP, URL or CVE, or 404 if no feed knows itRequired
GET /indicators?type=&q=&source=&limit=Search by type (ip, url, cve), text, or source feedRequired
GET /statsTotals by type and the last run of each feedRequired
GET /versionThe deployed buildRequired
GET /healthz, /readyzHealth probes that reveal nothingOpen
curl -H "X-API-Key: $KEY" https://shaheer-ti.duckdns.org/lookup/CVE-2024-3400

Security, layer by layer