Catalyst SOAR
Overview
Catalyst is a self-hosted SOAR (security orchestration, automation and response) and incident-response platform. It manages the full lifecycle of alerts, incidents, vulnerabilities and threat hunts as structured tickets, each with tasks, a timeline, comments, links and evidence files. It automates repetitive triage with reactions, where a trigger such as a webhook fires an action such as a Python script or an outbound HTTP call.
The SecureAnyCloud image runs the pinned Catalyst release as a single Go binary under systemd, fronted by nginx. The upstream stack is deliberately simple: an embedded SQLite database plus local file storage for uploads. There is no external database or object store to run.
At first boot, catalyst-firstboot.service creates the database fresh and generates all platform secrets at random. It also creates one administrator account with a per-VM password, which it writes to /root/catalyst-credentials.txt (mode 0600, root only). No default login is baked into the image.
What you get:
- Catalyst 0.15.7 single Go binary (
/usr/local/bin/catalyst) - Embedded SQLite database and tus file storage at
/var/lib/catalyst/catalyst_data, with no separate database to maintain catalyst.serviceon loopback127.0.0.1:8090, fronted by nginx on port 80catalyst-firstboot.service, which creates the per-VM database and admin account- python3 available for reaction (automation) Python actions
- Web console (embedded Vue UI) at
/ui/ - Ubuntu 24.04 LTS base with the latest patches and no swap on disk
- 24/7 SecureAnyCloud support with a 24h response SLA
Prerequisites
You need an active Azure subscription, an SSH key, and a VNet with a subnet.
The recommended VM size is Standard_B2s (2 vCPU / 4 GB). Catalyst is a single lightweight Go binary and runs comfortably in 4 GB.
Deploy from the Azure Portal
Search the Marketplace for Catalyst SOAR, choose the plan, and deploy into your VNet. In the NSG, allow TCP 22 (SSH) and TCP 80 (web console) from your client networks only.
In production, front port 80 with a TLS reverse proxy or Azure Application Gateway.
Deploy from the Azure CLI
RG="catalyst-prod"; LOCATION="eastus"; VM_NAME="catalyst-01" IMAGE_URN="sac1647283583153:catalyst-soar-ubuntu-24-04:default:latest" SSH_KEY="$(cat ~/.ssh/id_rsa.pub)" az group create --name "$RG" --location "$LOCATION" az network vnet create -g "$RG" --name cat-vnet --address-prefix 10.103.0.0/16 --subnet-name cat-subnet --subnet-prefix 10.103.1.0/24 az network nsg create -g "$RG" --name cat-nsg az network nsg rule create -g "$RG" --nsg-name cat-nsg --name allow-ssh --priority 100 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 22 --access Allow --protocol Tcp az network nsg rule create -g "$RG" --nsg-name cat-nsg --name allow-web --priority 110 \
--source-address-prefixes "<your-mgmt-cidr>" --destination-port-ranges 80 --access Allow --protocol Tcp
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:catalyst-soar-ubuntu-24-04:default:latest
az vm create -g "$RG" --name "$VM_NAME" --image "$IMAGE_URN" \
--size Standard_B2s --storage-sku StandardSSD_LRS \
--admin-username azureuser --ssh-key-values "$SSH_KEY" \
--vnet-name cat-vnet --subnet cat-subnet --nsg cat-nsg --public-ip-sku StandardConnect via SSH
ssh azureuser@<vm-ip>Both catalyst.service and catalyst-firstboot.service run automatically on first boot.
Verify the Service
sudo systemctl is-active catalyst.service nginx.service catalyst-firstboot.service
sudo test -f /var/lib/sac/data/catalyst-firstboot.done && echo FIRSTBOOT_DONE
sudo ss -tlnp | grep -E ':8090 |:80 ' swapon --show || echo "no swap (correct)"Catalyst listens on loopback 127.0.0.1:8090 and is reached only through the nginx reverse proxy on port 80.
Retrieve the Admin Credentials
sudo cat /root/catalyst-credentials.txtCATALYST_URL=http://<vm-ip>/ CATALYST_ADMIN_EMAIL=admin@catalyst.local CATALYST_ADMIN_PASSWORD=<CATALYST_PASSWORD>The password is unique to this VM. First boot generates it and stores it in a root-only file (mode 0600).
Exercise the REST API
Log in for a bearer token, create an incident ticket, and read it back:
EMAIL=$(sudo grep '^CATALYST_ADMIN_EMAIL=' /root/catalyst-credentials.txt | cut -d= -f2-)
PASS=$(sudo grep '^CATALYST_ADMIN_PASSWORD=' /root/catalyst-credentials.txt | cut -d= -f2-)
TOKEN=$(curl -sf -X POST http://127.0.0.1:8090/auth/local/login \
-H 'Content-Type: application/json' \
-d "{\"email\":\"${EMAIL}\",\"password\":\"${PASS}\"}" \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')
# Create an incident (the "incident" ticket type ships by default; severity is in state)
TID=$(curl -sf -X POST http://127.0.0.1:8090/api/tickets \
-H "Authorization: Bearer ${TOKEN}" -H 'Content-Type: application/json' \
-d '{"type":"incident","name":"Phishing campaign against finance","description":"Reported by SOC","open":true,"schema":{},"state":{"severity":"High"}}' \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["id"])')
# Read it back curl -sf http://127.0.0.1:8090/api/tickets/${TID} -H "Authorization: Bearer ${TOKEN}" | python3 -m json.toolOpen the Web Console
Browse to http://<vm-ip>/. Catalyst redirects to the /ui/ console. Sign in with the email and password from /root/catalyst-credentials.txt.
The dashboard summarizes open tickets by type, tickets per week and your assigned work at a glance:
Work Incidents
The Incidents view lists every open incident with its age and owner. Alerts, Incidents and Vulnerabilities are separate ticket types, each with its own list:
Open a ticket to see its full workspace: description, severity, tasks, comments, a timeline, links and evidence files. It holds everything an analyst needs to run the investigation in one place:
Automations live under Reactions in the sidebar. Pair a trigger (webhook or collection hook) with an action (Python or outbound HTTP) to enrich or triage tickets without a human in the loop.
Server Components
Component Path
Catalyst binary /usr/local/bin/catalyst
Data dir (SQLite + uploads) /var/lib/catalyst/catalyst_data
Environment file /etc/catalyst/catalyst.env
systemd unit /etc/systemd/system/catalyst.service
Firstboot script /usr/local/sbin/catalyst-firstboot.sh
nginx site /etc/nginx/sites-available/sac-catalyst
Credentials /root/catalyst-credentials.txt (mode 0600)
Sentinel /var/lib/sac/data/catalyst-firstboot.done
/usr/local/bin/catalyst --version sudo ls -la /var/lib/catalyst/catalyst_data/
sudo systemctl is-enabled catalyst.service nginx.service catalyst-firstboot.serviceManaging the Service
sudo systemctl restart catalyst.service
sudo journalctl -u catalyst.service --no-pager -n 50
# Create an additional admin (username is derived from the email)
sudo bash -c 'cd /var/lib/catalyst && runuser -u catalyst -- /usr/local/bin/catalyst admin create analyst@example.com "$(openssl rand -hex 20)"'Security Recommendations
- Rotate the admin password in the console (top-left account menu) or with
catalyst admin set-password <email> <password>. - Restrict the NSG so that port 80 reaches only trusted networks.
- Front Catalyst with TLS at a reverse proxy or Azure Application Gateway in production. The built-in listener is plain HTTP on loopback behind nginx.
- Add analyst accounts with the
analystgroup rather than sharing the admin login. Manage users and groups in the console. - Back up
/var/lib/catalyst/catalyst_data/(the SQLite database and uploaded evidence) to Azure Blob storage. - Patch the OS monthly with
sudo apt-get update && sudo apt-get upgrade && sudo reboot.
Support and Licensing
Catalyst is licensed under AGPL-3.0. SecureAnyCloud provides commercial support for the image separately.
- Email: sales@secureanycloud.com
- Website: secureanycloud.com
- Support hours: 24/7, 24h response SLA
Deploy on Azure
Launch Catalyst SOAR on Ubuntu 24.04 with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7. sales@secureanycloud.com
Deploy on Azure
Launch Catalyst SOAR on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Catalyst is an open-source, self-hosted SOAR (Security Orchestration, Automation and Response) and incident-response platform for security teams. It gives a SOC one place to triage alerts, manage incidents, vulnerabilities and tasks, run playbooks and automations (reactions), and keep case timelines and evidence. You work through a web console and a REST API. This guide covers deploying and configuring the SecureAnyCloud Catalyst image on AWS.
The image ships the free and open-source, AGPL-3.0 licensed Catalyst, run the officially supported way as a single pinned Go binary. Catalyst stores everything in an embedded SQLite database and keeps evidence attachments as local file uploads, so there is no external database to run.
The application binds to loopback only. An nginx reverse proxy terminates TLS on port 443 and forwards to it, and port 80 redirects to HTTPS. The incident datastore lives on a dedicated EBS volume mounted at /var/lib/catalyst, separate from the operating-system disk.
An incident-response platform holds sensitive security data, so nothing here ships with a known secret. On first boot, before the platform is reachable, each instance generates a unique admin password, fresh session, token and reset secrets, and a per-instance self-signed TLS certificate.
Catalyst is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by or sponsored by SecurityBrewery or Catalyst. It ships the free and open-source AGPL-3.0 licensed self-hosted software, unmodified. The verbatim license text and a pointer to the corresponding source ship inside the image under /usr/share/doc/sac/third-party-licences.
What you get:
- Catalyst v0.15.7, the upstream single-binary release, SHA256-verified at build time
- An embedded SQLite datastore and local evidence uploads on a dedicated EBS volume at
/var/lib/catalyst - An nginx reverse proxy terminating TLS on port 443, with the application bound to loopback
127.0.0.1:8090 - A unique admin password and fresh session, token and reset secrets, generated per instance on first boot
- A fresh self-signed TLS certificate, generated per instance
- A security group that opens only SSH (22) and HTTPS (443)
- 24/7 SecureAnyCloud support
Connecting to your instance
This listing offers one or more operating-system variants. Connect over SSH as the default login user for your variant, using your EC2 key pair:
OS variant Login user Example
Ubuntu 24.04 LTS ubuntu ssh -i your-key.pem ubuntu@<public-ip>
Subscribe and launch from AWS Marketplace
- On the product page in AWS Marketplace, choose Continue to Subscribe, accept the terms, then choose Continue to Configuration.
- Choose the region and the m5.large instance type (recommended), then choose Continue to Launch.
- Under Network settings, attach a security group that allows inbound TCP 22 (SSH) from your IP and TCP 443 (the web console) from the addresses that should reach the platform. Restrict both to your own CIDR rather than the whole internet, because an incident-response platform should not be world-open.
- Select your EC2 key pair and launch.
Launch from the AWS CLI (alternative)
You can also launch the subscribed AMI directly. Replace the AMI ID, key name, security group and subnet with your own:
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type m5.large \
--key-name your-key \
--security-group-ids <sg-id> \
--subnet-id <subnet-id> \
--metadata-options "HttpTokens=required" \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=catalyst-soar}]'Then connect over SSH as ubuntu, as shown in the table above.
Confirm the services are running
SSH in as ubuntu and confirm that the core services are active:
systemctl is-active catalyst.service nginx.serviceBoth units report active. The application listens on loopback 127.0.0.1:8090 and is reached only through the nginx reverse proxy. From outside the instance, only 443 (HTTPS) is served, and 80 redirects to it:
sudo ss -tln | grep -E ':(443|8090) 'The embedded SQLite datastore lives on its own dedicated EBS volume, separate from the OS disk:
findmnt /var/lib/catalystRetrieve your per-instance credentials
The first boot of every instance generates a unique admin password and writes it to a root-only file, alongside the console URL:
sudo cat /root/catalyst-credentials.txtThe file (mode 0600 root:root) holds CATALYST_URL, CATALYST_ADMIN_EMAIL (admin@catalyst.local) and CATALYST_ADMIN_PASSWORD. None of these ship in the image. Every value is unique to this instance, so no two instances share a credential and there is no default login. Catalyst also generates fresh session, token and reset secrets in the database on first boot.
Sign in to the console
Open the console in your browser at https://<public-ip>/. The certificate is a per-instance self-signed certificate, so your browser warns you once. Accept it to continue. Then sign in with the email and password from the credentials file.
Triage alerts and manage incidents
Catalyst organizes work as tickets of different types: alerts, incidents and vulnerabilities. Each ticket has its own severity, timeline and tasks. Use the sidebar to open the incident queue, where you can search and filter open or closed cases. Select New Ticket to raise one.
Open a case to work it. Set its status and assignee, edit the description, add tasks and attach evidence. This case view is the core of Catalyst incident-response case management.
Automate with reactions and use the API
Catalyst runs automations called reactions. It also exposes a full REST API, so you can create and update tickets from your existing tooling, such as a SIEM, EDR or scripts.
Every API request must carry a bearer token from POST /auth/local/login, and unauthenticated requests are refused. python3 and python3-venv are installed so that reaction Python actions run.
Security model
- No known credential ships. On first boot, before the platform is reachable, Catalyst generates a unique admin password and fresh session, token and reset secrets for this instance, plus a per-instance self-signed TLS certificate. Default logins are rejected.
- Loopback application, TLS front door. The application binds to
127.0.0.1:8090only. nginx terminates TLS on 443 and is the only external exposure. The security group opens just SSH (22) and HTTPS (443). - Datastore on a dedicated volume. The embedded SQLite database and evidence uploads live under
/var/lib/catalyst/catalyst_dataon an independently resizable EBS volume, separate from the OS disk. - Clean first boot. Build-time state is wiped before the image is captured, so the database, incidents, secrets and TLS certificate are all created fresh on your instance.
You can confirm the front door end to end at any time. The reverse proxy serves the console over HTTPS and reports healthy, and plain HTTP redirects to HTTPS:
curl -sk -o /dev/null -w 'HTTPS health: %{http_code}\n' https://127.0.0.1/healthcurl -s -o /dev/null -w 'HTTP redirect: %{http_code}\n' http://127.0.0.1/Replace the TLS certificate (optional)
The image ships a per-instance self-signed certificate at /etc/ssl/certs/catalyst-selfsigned.crt with its key at /etc/ssl/private/catalyst-selfsigned.key. To use a certificate that your browsers trust, replace those two files with your own. For example, use a certificate from your internal CA, or from a public CA for a DNS name that points at the instance. Then reload nginx:
sudo systemctl reload nginxBack up the datastore
Catalyst keeps everything under /var/lib/catalyst/catalyst_data (the SQLite database and evidence uploads) on the dedicated volume. To back up your cases, snapshot that EBS volume or copy the data directory:
sudo ls -la /var/lib/catalyst/catalyst_dataManaging the service
- Check status:
systemctl --no-pager status catalyst.service - The application binary is
/usr/local/bin/catalyst, and its systemd unit serves it on loopback127.0.0.1:8090 - The configuration is at
/etc/catalyst/catalyst.env, and the datastore is/var/lib/catalyst/catalyst_dataon a dedicated EBS volume - The nginx TLS reverse proxy configuration is at
/etc/nginx/sites-available/sac-catalyst - The AGPL-3.0 license text and source pointer ship at
/usr/share/doc/sac/third-party-licences
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat, with a one-hour average response for critical issues. We help with deployment, TLS termination and certificate replacement, DNS, backups, user and playbook setup, and scaling.
Deploy on AWS
Launch Catalyst SOAR with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com