Skip to main contentThe goal of Nemesis is to create an extensible file-processing system for
Advesary Simulation operations which takes files collected from C2 agents and
provides automated analysis and assists with triage.
Project Structure
- ./docs/ - documentation that’s published to the GitHub page
- ./infra/ - infrastructure files (Dapr, Postgres, etc.)
- ./libs/ - common library files and the file_enrichment_modules
- ./projects/ - the main logic files that comprise the various services
- ./tools/ - misc helper scripts
Design Choices
Many of the decisions made with Nemesis 1.X resulted in an over-engineered system that was less flexible and difficult to expand/maintain. Nemesis 2.0 aims to take lessons learned and simplifies the entire architecture:
- Docker/Docker-Compose is used instead of k8s for speed of development
and general ease of use, especially as we didn’t experiment with scaling in the
previous version (we may move back to k8s at some point).
- Dapr is now used to increase reliability and to offload infrastructure plumbing concerns
- Strict protobuf schemas were dropped in favor of a flexibilbe schema
- Overall project code/approaches were greatly simplified
- Dropped Elasticsearch (the largest resource hog) in favor of consolidating with PostgreSQL
HTTP Endpoint
Easy for people to create consumers without needing to structure their messages
with protobuf.
RabbitMQ
We still use RabbitMQ as the main queuing system for Nemesis. While
RabbitMQ does not have some of the features of Kafka such as persistent storage
and replay, it is significantly lighter weight and can still scale well.
With Dapr pub/sub integration, this can easily be swapped out.