Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
9957043
fin: remove MQTT-based external execution
hidde-jan Aug 26, 2026
6cd260e
docs: remove MQTT-specific Fin protocol docs and example
hidde-jan Aug 26, 2026
1aea335
action/executor: stepwise dispatch, route capability by agent.Type
hidde-jan Aug 26, 2026
0343913
execution: add StepExecutionId to key reporting/cache by invocation
hidde-jan Aug 26, 2026
eb75220
registry: add generic two-level pending-work registry primitive
hidde-jan Aug 26, 2026
85be217
manual: rekey pending-interaction registry on StepExecutionId, fix re…
hidde-jan Aug 26, 2026
f898568
docs: update manual API reference docs and swagger for PUT continue e…
hidde-jan Aug 26, 2026
a458776
fin: define new HTTP/JSON pull protocol data models
hidde-jan Aug 26, 2026
e226fa9
fin: add MongoDB-backed Fin registry and in-memory job queue
hidde-jan Aug 26, 2026
ed859bf
fin: add HTTP/JSON Fin protocol REST API endpoints
hidde-jan Aug 26, 2026
dfad9e4
fin: add FinCapability, routing unmapped agent types to the job queue
hidde-jan Aug 26, 2026
6633b30
fin: wire Fin subsystem into controller (repo, queue, capability, rou…
hidde-jan Aug 26, 2026
c97ad1d
docs: add Fin protocol page and worked example playbook
hidde-jan Aug 26, 2026
5e3c509
fin: add end-to-end test covering the full protocol lifecycle
hidde-jan Aug 26, 2026
9f924e5
feat: split fin unregister (self) from admin fin delete
hidde-jan Aug 27, 2026
78313b3
fin: fail fast when no live fin is registered, surface staleness to API
hidde-jan Aug 27, 2026
26eab84
docs: correct outdated fin liveness/staleness description
hidde-jan Aug 27, 2026
0526009
fin: use ErrRegistrationTokenInvalid for invalid registration tokens
hidde-jan Aug 28, 2026
9d9da02
docs: regenerate swagger (catch up missed regen, add command_b64)
hidde-jan Aug 28, 2026
5517c68
fin: forward CommandB64 to fins in job payloads
hidde-jan Aug 28, 2026
4495e46
fin: touch LastSeen on job result submission and status ping, not jus…
hidde-jan Aug 28, 2026
56f1ecd
core: raise default step timeout fallback from 1 minute to 10 minutes
hidde-jan Aug 28, 2026
d52902c
Add typed pluggable storage layer with memory and MongoDB backends
hidde-jan Aug 28, 2026
8640d33
Remove old database layer
invalid-email-address Aug 28, 2026
4bb70e7
Wire controllers to new storage layer
invalid-email-address Aug 28, 2026
c23913b
Split transport vs runtime
invalid-email-address Aug 28, 2026
2fe7f9d
Refactor FIN deps; StaleAfter now time.Duration
invalid-email-address Aug 29, 2026
f2965f4
Enforce strict runtime/transport boundary with narrow accessors
invalid-email-address Aug 29, 2026
bc6fc43
Phase 0: Define service layer interfaces
invalid-email-address Aug 29, 2026
e0bc48c
Phase 1: Extract execution runtime orchestration
invalid-email-address Aug 29, 2026
e63313e
Phase 2: Extract FIN service layer (FinRegistry + FinWorkService)
invalid-email-address Aug 29, 2026
aa147ae
Phase 3: Extract ManualInbox service
invalid-email-address Aug 29, 2026
7e6b8ea
Phase 4: Extract playbook and reporter services
invalid-email-address Aug 29, 2026
a8c0e5e
Add trigger service and integrate with API
invalid-email-address Aug 29, 2026
d6fcc5a
Phase 5: Clean up transport layer with bootstrap composition root
invalid-email-address Aug 29, 2026
c0b8878
Remove accidentally committed binary
invalid-email-address Aug 29, 2026
6416d7b
Phase 5 (actual): Move NewDecomposer/TheHive wiring out of HTTP trans…
invalid-email-address Aug 29, 2026
256187f
Remove accidentally committed binary again
invalid-email-address Aug 29, 2026
93c5a85
Phase 5a: Runtime constructs application services
invalid-email-address Aug 29, 2026
05248a3
Phase 5b: move HTTP handler composition into transport
invalid-email-address Aug 29, 2026
244f099
Phase 0 baseline for test
invalid-email-address Aug 29, 2026
31f3089
Phase 1 some workflow stuf
invalid-email-address Aug 29, 2026
d401931
Phase 2 flatten dependency graph
invalid-email-address Aug 29, 2026
ee2dbce
Phase 3 and 5 proper boundary
invalid-email-address Aug 29, 2026
62e84f5
Phase 4 move test
invalid-email-address Aug 29, 2026
000539b
Lots of renaming
invalid-email-address Aug 29, 2026
200e948
WIP
invalid-email-address Aug 30, 2026
c4aa0e4
Renaming
invalid-email-address Aug 30, 2026
02ef42e
Update doc
invalid-email-address Aug 30, 2026
d8f5499
Update
invalid-email-address Aug 30, 2026
20bcdb0
Update .env.example
invalid-email-address Aug 30, 2026
6e7ca0b
Use sql database
invalid-email-address Aug 30, 2026
294d739
Renaming and diving into pkg and internal
invalid-email-address Aug 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
30 changes: 21 additions & 9 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,37 @@ PORT: 8080
ENABLE_TLS: false
CERT_FILE: "/certs/server.crt"
CERT_KEY_FILE: "/certs/server.key"
MAX_EXECUTIONS=1000
MAX_RUNS=1000
SOARCA_ALLOWED_ORIGINS: "*"
GIN_MODE: "release"
MONGODB_URI: "mongodb://localhost:27017"
DATABASE_NAME: "soarca"
DB_USERNAME: "root"
DB_PASSWORD: "rootpassword"
# Storage. The scheme selects the backend.
# sqlite://soarca.db file in the working directory (default)
# sqlite://:memory: in-memory, wiped on restart
# postgres://soarca:soarca@localhost:5432/soarca?sslmode=disable
DATABASE_URL: "sqlite://soarca.db"
PLAYBOOK_API_LOG_LEVEL: trace
DATABASE: "false"
MAX_REPORTERS: "5"

LOG_GLOBAL_LEVEL: "info"
LOG_MODE: "development"
LOG_FILE_PATH: ""
LOG_FORMAT: "json"

ENABLE_FINS: false
MQTT_BROKER: "localhost"
MQTT_PORT: 1883
# Fin protocol (HTTP/JSON pull-based external executors, see
# docs/adr/FIN-WEBHOOK-PROTOCOL-PROPOSAL.md). FIN_REGISTRATION_TOKEN gates
# POST /fin/register; leaving it unset/empty disables Fin registration
# entirely (fails closed).
FIN_REGISTRATION_TOKEN: "dev-registration-token"
FIN_POLL_INTERVAL_SECONDS: 5
FIN_LONG_POLL_TIMEOUT_SECONDS: 25
FIN_JOB_LEASE_SECONDS: 60

# Hard deadline used for a Manual or Fin step when its own cacao.Step.timeout
# is omitted/zero (see pkg/utils/timeout.go). Not part of the CACAO spec's
# own defaults - chosen to be realistic for human-in-the-loop approvals and
# Fin jobs doing real external work, rather than the spec's own
# __ACTION_TIMEOUT__ example value of 60000ms (1 minute).
DEFAULT_STEP_TIMEOUT_SECONDS: 600

HTTP_SKIP_CERT_VALIDATION: false
### Integrations
Expand Down
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,8 @@ docs/.hugo_build.lock
**.hugo_build.lock

certs

# Local SQLite databases
soarca.db
soarca.db-shm
soarca.db-wal
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ SOARCA was developed for research and innovation purposes and allows SOC, CERT a


## Software
SOARCA is a security orchestrator that can ingest, validate and execute CACAOv2 security playbooks. These playbooks and the triggers for their execution are consumed via a JSON API. SOARCA comes with native http(s), SSH and OpenC2 capabilities to interface with external tools and data resources. These native capabilities can be extended via a dedicated MQTT interface, allowing developers to compile additional integrations according their needs.
SOARCA is a security orchestrator that can ingest, validate and execute CACAOv2 security playbooks. These playbooks and the triggers for their execution are consumed via a JSON API. SOARCA comes with native http(s), SSH and OpenC2 capabilities to interface with external tools and data resources. These native capabilities can be extended via a dedicated Fin interface, allowing developers to compile additional integrations according their needs.

Development is ongoing. The current version solely supports machine and command line interfaces, but a graphical user interface will be added in the foreseeable future. Furthermore, its current capability to run CACAOv2 playbooks sequentially will evolve towards the ability to run multiple playbooks in parallel. Such further developments will be announced and published on the SOARCA repository on Github.

Expand Down
6 changes: 3 additions & 3 deletions cmd/soarca/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import (
"fmt"

api "soarca/api"
"soarca/internal/controller"
"soarca/internal/app"
"soarca/internal/logger"
"soarca/pkg/api/status"
"soarca/internal/transport/http/handlers/status"
"soarca/pkg/utils"

"github.com/joho/godotenv"
Expand Down Expand Up @@ -52,7 +52,7 @@ func main() {

// Version is only available here
status.SetVersion(Version)
err = controller.Initialize()
err = app.Run()
if err != nil {
log.Fatal("Something Went wrong with setting-up the app, msg: ", err)
panic(err)
Expand Down
9 changes: 0 additions & 9 deletions deployments/docker/mqtt/config/mosquitto.conf

This file was deleted.

Empty file.
34 changes: 0 additions & 34 deletions deployments/docker/mqtt/docker-compose.yml

This file was deleted.

Empty file.
9 changes: 0 additions & 9 deletions deployments/docker/soarca/config/mosquitto.conf

This file was deleted.

39 changes: 0 additions & 39 deletions deployments/docker/soarca/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,31 +12,6 @@ services:
source: mongodb_data_container
target: /data/db

mosquitto:
image: docker.io/eclipse-mosquitto
container_name: mosquitto
volumes:
- type: volume
source: mosquitto_config
target: /mosquitto/config
- type: volume
source: mosquitto_data
target: /mosquitto/data
- type: volume
source: mosquitto_log
target: /mosquitto/log
networks:
- mqtt-net
ports:
- target: 1883
published: 1883
protocol: tcp
mode: host
- target: 9001
published: 9001
protocol: tcp
mode: host

soarca-gui:
image: docker.io/cossas/soarca-gui:latest
container_name: soarca_gui
Expand Down Expand Up @@ -77,9 +52,6 @@ services:
LOG_MODE: "production"
LOG_FILE_PATH: ""
LOG_FORMAT: "json"
ENABLE_FINS: true
MQTT_BROKER: "mosquitto"
MQTT_PORT: 1883
HTTP_SKIP_CERT_VALIDATION: false
# Integrations:
# The Hive
Expand All @@ -88,13 +60,11 @@ services:
THEHIVE_API_BASE_URL: http://localhost:9000/api/v1/
networks:
- db-net
- mqtt-net
- soarca-net
ports:
- 127.0.0.1:8080:8080
depends_on:
- mongodb_container
- mosquitto

loki:
image: grafana/loki:3.0.0
Expand Down Expand Up @@ -133,18 +103,9 @@ services:

networks:
db-net:
mqtt-net:
soarca-net:

volumes:
mongodb_data_container:
mosquitto_config:
driver: local # Define the driver and options under the volume name
driver_opts:
type: none
device: ./config
o: bind
mosquitto_data:
mosquitto_log:
loki_data_container:
grafana_data_container:
23 changes: 10 additions & 13 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
version: "3.7"
services:
mongodb_container:
image: mongo:latest
container_name: mongo_soarca_stack
postgres:
image: postgres:17
container_name: postgres_soarca_stack
environment:
MONGO_INITDB_ROOT_USERNAME: "root"
MONGO_INITDB_ROOT_PASSWORD: "rootpassword"
POSTGRES_USER: "soarca"
POSTGRES_PASSWORD: "soarca"
POSTGRES_DB: "soarca"
networks:
- db-net
volumes:
- mongodb_data_container:/data/db
- postgres_data_container:/var/lib/postgresql/data

cert-generator:
image: alpine
Expand Down Expand Up @@ -41,12 +42,8 @@ services:
CERT_KEY_FILE: "/app/certs/server.key"
SOARCA_ALLOWED_ORIGINS: "*"
GIN_MODE: "release"
MONGODB_URI: "mongodb://mongodb_container:27017"
DATABASE_NAME: "soarca"
DB_USERNAME: "root"
DB_PASSWORD: "rootpassword"
DATABASE_URL: "postgres://soarca:soarca@postgres:5432/soarca?sslmode=disable"
PLAYBOOK_API_LOG_LEVEL: trace
DATABASE: "false"
HTTP_SKIP_CERT_VALIDATION: false
AUTH_ENABLED: false #OPTIONAL for OIDC Based auth
OIDC_PROVIDER: "https://authentikuri:9443/application/o/soarca/"
Expand All @@ -55,7 +52,7 @@ services:
ports:
- 127.0.0.1:8080:8080
depends_on:
- mongodb_container
- postgres
- cert-generator

loki:
Expand All @@ -82,6 +79,6 @@ networks:
db-net:

volumes:
mongodb_data_container:
postgres_data_container:
certs_data_containter:
loki_data_container:
2 changes: 1 addition & 1 deletion docs/content/en/docs/concepts/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ One can generate playbooks using LLMs using the [playbook generation guide](/doc

### SOARCA Fin(s): Extending the core capabilities

SOARCA can be extended with custom extensions or rather so-called FIN (inspired by the majestic orca). A fin can be integrated within the SOARCA core. Technical descriptions of the components can be found [here](/docs/soarca-extensions/fin-protocol). Fins communicate with the SOARCA core using a pre-defined MQTT protocol.
SOARCA can be extended with custom extensions or rather so-called FIN (inspired by the majestic orca). A fin can be integrated within the SOARCA core. Fins communicate with the SOARCA core over a simple pull-based HTTP/JSON protocol. Technical descriptions of the components can be found [here](/docs/soarca-extensions).


## Join the SOARCA Community
Expand Down
Loading