← Back to list

Security Operations Center

Threat Visibility & Detection For FireOps System

Expadox Lab · 2026-06-04 13:50 · 1 claps · 12.6 min read
#information-security #soc #wazuh
Open on Medium ↗
Wiki topics: 🔒 · Cybersecurity

Security Operations Center

Threat Visibility & Detection For FireOps System

A project done by Expadox Lab Cohort 2, 2026 SignalHunt— a cybersecurity Team:

Team SignalHunt was engaged to design, implement, and validate a Security Operations Center (SOC) for FireOps Systems — a fintech startup providing online payment processing and digital wallet services across multiple African countries. FireOps recently expanded to a hybrid infrastructure spanning on-premise systems and cloud workloads on both AWS and Azure, but had no centralized visibility, alerting, or incident response capability.

This blog covers the full project lifecycle from architecture design through attack simulation and validation, addressing all eight deliverables specified in the project brief. The implementation uses exclusively open-source tools and standard security practices.

Business Context & Problem Statement

Who is FireOps Systems?

FireOps Systems is a growing fintech startup providing online payment processing and wallet services across multiple African countries. The company recently expanded its infrastructure to include both on premise systems and cloud workloads on AWS and Azure. As their customer base grows, they face increasing cyber risk targeting their payment APIs and customer financial data.

The Problem

At project inception, FireOps had no security monitoring capability whatsoever:

No visibility into endpoint or network activity

No centralized log collection or SIEM platform

No ability to detect failed login attempts or intrusion activity

No cloud workload monitoring across AWS or Azure

No automated alerting, escalation procedures, or incident playbooks

No data retention policy or access control framework for security logs

Business Requirements

The following requirements were defined by FireOps leadership:

Achieve full visibility across all infrastructure — on-premise and cloud

Detect unauthorized access attempts and potential data exfiltration

Monitor cloud resources, endpoints, and network traffic for compromise

Generate automated alerts for suspicious behaviour

Ensure logs are collected, normalized, and stored securely for future analysis

Build reporting dashboards for operational and executive audiences

Security Architecture & Design

Architecture Overview

The SignalHunt SOC architecture is organized into four layers: Log Sources, Detection Layer, Response & Automation, and Visibility & Reporting. All on-premise traffic flows over an isolated Host-Only network (192.168.56.0/24). Cloud telemetry flows via Wazuh native modules.

Data Flow

The complete log pipeline from source to alert is as follows:

Raw event occurs on endpoint (SSH fail, HTTP request, network packet)

Local tool captures it: sshd writes to auth.log, Apache to access.log, Suricata to eve.json, CrowdSec to crowdsec.log

Wazuh agent on Ubuntu reads configured log paths via <localfile> directives in ossec.conf

Agent forwards normalized events to Wazuh Manager over encrypted channel

Wazuh Manager runs decoders then matches rules — assigns rule ID and severity level

Matched alerts indexed to Wazuh Indexer (OpenSearch) for storage and querying

Wazuh Dashboard renders alerts in real time — Threat Hunting, MITRE ATT&CK, agent views

Tool Justification

Lab Environment Setup — Full Commands

Virtual Machine Specifications

Both VMs share the vboxnet0 Host-Only adapter on network 192.168.56.0/24. The Kali attacker IP is 192.168.56.104. All attack simulation traffic remains on this isolated network — no external exposure.

Network Adapter Configuration

Ubuntu (fireops) — Adapter 1 (NAT, internet access), Set to NAT in VirtualBox settings — provides outbound internet for package downloads

Figure: Ubuntu (fireops) VM — Adapter 1 configured as NAT

Figure: Ubuntu (fireops) VM — Adapter 1 configured as NAT

Ubuntu (fireops) — Adapter 2 (Host-Only, isolated lab network)

Set to Host-Only Adapter, attached to vboxnet0. This is the interface Suricata monitors and where all attack traffic flows.

Figure: Ubuntu (fireops) VM — Adapter 2 configured as Host-Only (vboxnet0)

Figure: Ubuntu (fireops) VM — Adapter 2 configured as Host-Only (vboxnet0)

Kali Linux — Adapter 1 (NAT) + Adapter 2 (Host-Only)

Same dual-adapter configuration. Host-Only adapter gives Kali direct connectivity to the fireops VM.

Figure: Kali Linux VM — Adapter 1 configured as NAT

Figure: Kali Linux VM — Adapter 1 configured as NAT

Figure: Kali Linux VM — Adapter 2 configured as Host-Only

Figure: Kali Linux VM — Adapter 2 configured as Host-Only

Initial System Updates

Tool Installation & Configuration

DVWA — Damn Vulnerable Web Application

DVWA is installed on the Ubuntu (fireops) VM as the web attack target. It runs on Apache and simulates a vulnerable payment portal.

Install DVWA using automated script:

# Download the DVWA installation script

wget https://raw.githubusercontent.com/IamCarron/DVWA-Script/main/Install-DVWA.sh

# Make it executable

chmod +x Install-DVWA.sh

# Run as root

sudo ./Install-DVWA.sh

Configure Apache to serve DVWA as default site:

sudo nano /etc/apache2/sites-available/000-default.conf

*# Add these lines inside the <VirtualHost :80> block:**

DocumentRoot /var/www/html/DVWA

<Directory /var/www/html/DVWA>

Options Indexes FollowSymLinks

AllowOverride All

Require all granted

</Directory>

# Rename default Apache page so it doesn’t override DVWA

mv /var/www/html/index.html /var/www/html/index.html.bak

# Restart Apache

sudo systemctl restart apache2

# Verify DVWA is accessible

curl http://<UBUNTU_IP>

Set DVWA security level to ‘Low’ in the DVWA Security settings page before running attack simulations. This exposes the vulnerable SQL injection endpoint.

Wazuh SIEM

Wazuh is installed as an all-in-one deployment on the Ubuntu (fireops) VM. This single command installs the Wazuh Manager, Wazuh Indexer (OpenSearch), and Wazuh Dashboard.

Install Wazuh all-in-one:

curl -sO https://packages.wazuh.com/4.14/wazuh-install.sh && sudo bash ./wazuh install.sh -a

After installation, the terminal outputs credentials:

Retrieve all passwords from install archive:

sudo tar -O -xvf wazuh-install-files.tar wazuh-install-files/wazuh-passwords.txt

Access the dashboard:

Service management commands:

sudo systemctl restart wazuh-manager

sudo systemctl restart wazuh-indexer

sudo systemctl restart wazuh-dashboard

sudo systemctl status wazuh-manager

sudo systemctl status wazuh-indexer

sudo systemctl status wazuh-dashboard

Suricata IDS

Suricata is installed on the Ubuntu (fireops) VM and integrated with Wazuh to provide network-layer threat detection.

Step 1 — Install Suricata:

sudo apt-get update

sudo apt-get install suricata -y

Download Emerging Threats ruleset:

cd /tmp/ && curl -LO

https://rules.emergingthreats.net/open/suricata-6.0.8/emerging.rules.tar.gz

sudo tar -xvzf emerging.rules.tar.gz

sudo mkdir /etc/suricata/rules

sudo mv rules/*.rules /etc/suricata/rules/

sudo find /etc/suricata/rules -name ‘*.rules’ -exec chmod 777 {} \;

Configure /etc/suricata/suricata.yaml:

Restart Suricata:

sudo systemctl restart suricata

sudo systemctl status suricata

Configure Wazuh agent to read Suricata logs:

Add the following block to /var/ossec/etc/ossec.conf on the Ubuntu agent:

Restart Wazuh to apply:

sudo systemctl restart wazuh-manager wazuh-indexer wazuh-dashboard

CrowdSec (Replaces Fail2Ban)

CrowdSec provides behavioral-based automated IP blocking with collaborative threat intelligence. It replaces Fail2Ban for the following reasons:

Community-sourced blocklists — known attacker IPs blocked before they even connect

Behavioral analysis instead of fixed thresholds — fewer false positives for dynamic fintech IPs

Multi-service protection — SSH, HTTP, APIs protected simultaneously

Native JSON output — direct Wazuh ingest without custom decoder complexity

Reports attacker IPs to global CrowdSec network — collaborative defence

Install CrowdSec and iptables bouncer:

Add CrowdSec repository

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash

Install CrowdSec and the iptables firewall bouncer

sudo apt install crowdsec crowdsec-firewall-bouncer-iptables -y

Verify installation

sudo cscli version

Install SSH collection and scenario:

sudo cscli collections install crowdsecurity/linux

sudo cscli scenarios install crowdsecurity/ssh-bf

sudo cscli scenarios install crowdsecurity/http-sqli

sudo cscli scenarios install crowdsecurity/http-probing

# Restart CrowdSec to load new scenarios

sudo systemctl restart crowdsec

Integrate CrowdSec with Wazuh (agent config):

Add the following to /var/ossec/etc/ossec.conf:

CrowdSec operational commands:

UFW — Firewall

Apache Web Server (for SQL Injection Detection)

Configure Wazuh to monitor Apache access logs:

Add to /var/ossec/etc/ossec.conf:

Kali Attack Tools (Pre-installed on Kali Linux)

Threat Detection & Alerting Configuration

Detection Architecture

Wazuh uses a two-stage pipeline: decoders first extract structured fields from raw log lines, then rules match against those fields and assign severity levels. Custom decoders and rules were written for CrowdSec integration.

CrowdSec Custom Decoder

Create /var/ossec/etc/decoders/crowdsec_decoder.xml on the Wazuh Manager:

CrowdSec Custom Alert Rules

Create /var/ossec/etc/rules/crowdsec_rules.xml on the Wazuh Manager:

Alert Severity Levels

Key Detection Rules Reference

Attack Simulations & Evidence

Three attack scenarios were simulated from the Kali Linux VM (192.168.56.104) targeting the Ubuntu fireops VM. All attacks were conducted on the isolated Host-Only network.

Attack 1 — Nmap Reconnaissance

Command executed from Kali:

What Nmap discovered:

Port 22/tcp — open — SSH (OpenSSH)

Port 80/tcp — open — HTTP (Apache httpd 2.4)

Port 443/tcp — open — HTTPS

1 host up, scan completed in ~11 seconds

Detection evidence:

Suricata’s Emerging Threats ruleset flagged the high-frequency SYN packets characteristic of a port scan

Rule 86601 fired: SURICATA HTTP Response excessive header repetition

4 Suricata alerts appeared in Wazuh Threat Hunting dashboard at 08:19:24 UTC

All alerts attributed to agent ‘fireops’, filterable by manager.name:fireops in Wazuh DQL

Figure: Left: Nmap scan from Kali (ports 22, 80 discovered). Right: Wazuh detects the scan — 4 Suricata alerts, Rule 86601, at 08:19:24 UTC

Figure: Left: Nmap scan from Kali (ports 22, 80 discovered). Right: Wazuh detects the scan — 4 Suricata alerts, Rule 86601, at 08:19:24 UTC

Attack 2 — SQL Injection

Command executed from Kali:

Detection evidence:

Wazuh agent monitored /var/log/apache2/access.log

Apache logged all incoming HTTP GET requests including the malformed SQL query strings

Wazuh Rule 31152 matched: ‘Multiple SQL Injection attempts from same source IP’

14 alert hits at severity Level 10 between 08:34:50 and 08:49:03 UTC

All alerts attributed to agent ‘fireops’, visible in Wazuh Threat Hunting with DQL filter

DQL query to view SQLi alerts in Wazuh:

rule.id: 31152 AND agent.name: fireops

Figure: Left: SQLMap testing injection techniques against DVWA. Right: Wazuh records 14 SQLi hits, Rule 31152, Level 10

Figure: Left: SQLMap testing injection techniques against DVWA. Right: Wazuh records 14 SQLi hits, Rule 31152, Level 10

Attack 3 — SSH Brute Force + CrowdSec Auto-Block

Command executed from Kali

SSH setup on Ubuntu (required pre-condition):

Detection evidence:

sshd daemon logged every failed authentication attempt to /var/log/auth.log

Wazuh Rule 5710 fired 11 times: ‘sshd: Attempt to login using non-existent user’ at 08:53:46 UTC

CrowdSec crowdsecurity/ssh-bf scenario threshold triggered after 3 failures in the defined window

CrowdSec iptables bouncer automatically blocked 192.168.56.104 — confirmed with: cscli

decisions list

CrowdSec ban event logged to /var/log/crowdsec.log — forwarded to Wazuh — Rule 100300 fired

Verify CrowdSec ban from fireops VM:

Manually verify iptables block is active:

Figure: Left: Hydra SSH brute force from Kali (0 valid passwords). Right: Wazuh logs 11 failed-login alerts, Rule 5710, Level 5

Figure: Left: Hydra SSH brute force from Kali (0 valid passwords). Right: Wazuh logs 11 failed-login alerts, Rule 5710, Level 5

Screenshot placeholder: the CrowdSec ban confirmation goes here. Capture it by running ‘sudo cscli decisions list’ and ‘sudo cscli alerts list’ after the brute force, showing 192.168.56.104 banned via the crowdsecurity/ssh-bf scenario.

Dashboard & Reporting Framework

Wazuh Dashboard Capabilities

Figure: Wazuh dashboard overview — severity summary (Critical/High/Medium), Endpoint Security and Threat Intelligence modules

Figure: Wazuh dashboard overview — severity summary (Critical/High/Medium), Endpoint Security and Threat Intelligence modules

Key Metrics from Testing Session

Figure: Wazuh Threat Hunting dashboard — 1,039 total events, 17 auth failures, 111 auth successes, with MITRE ATT&CK technique breakdown

Figure: Wazuh Threat Hunting dashboard — 1,039 total events, 17 auth failures, 111 auth successes, with MITRE ATT&CK technique breakdown

Useful DQL Queries for Wazuh Threat Hunting

# All events from fireops agent

agent.name: fireops

# Filter to SQL injection alerts only

rule.id: 31152

# Filter to SSH brute force alerts

rule.id: 5710

# Filter to CrowdSec ban events

rule.id: 100300

# Show all Suricata alerts

rule.groups: suricata

# Filter by source IP

data.srcip: 192.168.56.104

# All high-severity events (level 10+)

rule.level: [10 TO 15]

# AWS CloudTrail events

rule.groups: amazon

# Azure Monitor events

rule.groups: azure

Generating Reports from Wazuh

Wazuh supports on-demand PDF and CSV report generation from the Threat Hunting view:

Navigate to Threat Intelligence > Threat Hunting

Apply relevant filters (time window, agent, rule ID)

Click ‘Generate report’ in the top-right of the dashboard

Select PDF or CSV format

Download report for executive or technical audience distribution

For scheduled automated reporting, Wazuh supports integration with email and webhook via the Wazuh

Manager integrations configuration.

Incident Response Workflow & Playbooks

Universal 8-Phase IR Workflow

Playbook A — SSH Brute Force (CrowdSec-Assisted)

Trigger: Wazuh Rule 5710 fires 3+ times from same IP within 10 minutes

Playbook B — SQL Injection / Web Application Attack

Trigger: Wazuh Rule 31152 fires — multiple SQLi patterns from same source IP

Playbook C — Cloud Infrastructure Anomaly (AWS / Azure)

Trigger: Wazuh Rule 80400 (AWS Root Usage) or Rule 87100 (Azure Impossible Travel)

Security Controls Validation

Validation Test Results

Sample Log Evidence

Suricata eve.json — Nmap detection entry:

Apache access.log — SQL injection entry:

CrowdSec ban log entry:

Cloud Infrastructure Detection

AWS CloudTrail Integration

AWS CloudTrail records all API calls made to AWS services. Wazuh’s built-in aws-s3 module reads

CloudTrail logs from an S3 bucket and generates alerts using AWS-specific detection rules.

Architecture flow:

Enable CloudTrail in AWS account — configure to log all regions

CloudTrail delivers logs to an S3 bucket (e.g. fireops-cloudtrail-logs)

Wazuh aws-s3 module polls the bucket on a 10-minute interval

Events are parsed and matched against AWS Wazuh rules (80xxx series)

Alerts appear in Wazuh Dashboard under Cloud Security > Amazon Web Services

Wazuh ossec.conf configuration:

Key AWS Detection Scenarios

Azure Monitor Integration

Azure Monitor collects activity logs from all Azure resources. Wazuh’s azure-logs module ingests these via the Azure Monitor REST API.

Wazuh ossec.conf configuration:

Key Azure Detection Scenarios

Data Retention & Access Control

Log Retention Policy

Access Control Policy

Wazuh user roles are managed via the Wazuh Dashboard under Server Management > Security > Roles. Each role maps to OpenSearch index-level permissions — analysts cannot write or delete indexed data.

Wazuh user roles are managed via the Wazuh Dashboard under Server Management > Security > Roles. Each role maps to OpenSearch index-level permissions — analysts cannot write or delete indexed data.

Lessons Learned & Limitations

Lessons Learned

CrowdSec behavioral analysis significantly reduces false positives versus Fail2Ban — critical for a fintech with dynamic IPs across multiple African countries.

Suricata’s Emerging Threats ruleset provided effective out-of-the-box detection for Nmap scans with zero custom rule authoring.

Apache log integration with Wazuh is the critical link for web attack detection — without it, SQL injection is completely invisible at the network layer.

The Host-Only VirtualBox network adapter correctly isolated all attack traffic — no external exposure during any simulation.

Wazuh’s MITRE ATT&CK dashboard mapping gives incident responders instant technique context — not just a rule ID.

CrowdSec community blocklists provide zero-configuration day-one protection from known malicious IPs across the global network.

Wazuh decoder regex must be validated carefully before deployment — an incorrect regex silently fails and produces no alerts.

The Suricata af-packet interface setting must match the correct Host-Only adapter name (check with: ip addr show).

Limitations

Self-signed TLS certificate on the Wazuh dashboard requires a browser security exception.

Production deployment must use a CA-issued certificate.

No remote Wazuh agents deployed in this lab — all monitoring is local to the Ubuntu VM. Full FireOps deployment requires agents on every monitored endpoint.

Cloud monitoring configured at module level only — full validation requires live AWS and Azure accounts with real CloudTrail/Monitor data.

Log retention lifecycle policies not formally enforced on Wazuh Indexer — required for PCI-DSS and fintech regulatory compliance.

CrowdSec HTTP collection scenarios (http-sqli, http-probing) installed but not triggered in this lab iteration — future test should include web-based CrowdSec blocking.

Recommended Next Steps for FireOps Production

Deploy Wazuh agents on all payment servers, API gateways, and employee workstations

Activate CrowdSec HTTP collection for web application brute force and SQLi auto-blocking

Configure Wazuh Indexer index lifecycle management — enforce 90-day hot / 1-year cold retention

Enable AWS CloudTrail across all regions and all AWS accounts in the FireOps organization

Configure Azure Monitor diagnostic settings on all resource types — VMs, Key Vaults, Storage, Azure AD

Replace self-signed Wazuh TLS certificate with a CA-issued certificate

Install Wazuh agents on AWS EC2 instances and Azure VMs for host-level endpoint detection

Establish a formal vulnerability management process using Wazuh’s Vulnerability Detector module


메타데이터
post_id
7b8ed734b4d4
slug
security-operations-center-7b8ed734b4d4
url
https://medium.com/@expadoxlabs/security-operations-center-7b8ed734b4d4
canonical_url
https://medium.com/@expadoxlabs/security-operations-center-7b8ed734b4d4
author_url
https://medium.com/@expadoxlabs
status
ok
fetched_at
2026-06-09 15:37:30