How to Build Automated Decision Logic in a Modern SOC (Using Shuffle + SOC Integrator)
Introduction
In a modern Security Operations Center (SOC), speed and consistency are everything. Manual triage is slow, inconsistent, and expensive. The solution is automated decision logic — a structured way to evaluate alerts and decide what action should happen automatically.
This article explains how to build automated decision systems using:
- Shuffle (SOAR platform)
- Wazuh (SIEM)
- DFIR-IRIS (Incident Response)
- PagerDuty (On-call alerting)
- A custom SOC Integrator (Django backend)
We’ll walk through concrete examples and recommended architecture.
Introduction to Shuffle Components
Before designing automated decision logic, it is important to understand the core components of Shuffle (SOAR platform) and how they work together.
1. Backend (Core Engine)
The backend is the automation engine. It:
- Executes workflows
- Handles triggers
- Manages app integrations
- Stores execution history
This is where the playbook logic actually runs.
2. Frontend (Web UI)
The web interface allows analysts and engineers to:
- Build workflows using drag-and-drop
- Configure integrations (API keys, credentials)
- Monitor execution logs
- Manage users and access control
It acts as the SOC automation control panel.
3. Apps (Integration Modules)
Apps are containerized connectors that allow Shuffle to interact with external systems such as:
- Wazuh (SIEM)
- DFIR-IRIS (Incident management)
- PagerDuty (On-call alerting)
- VirusTotal or threat intelligence platforms
Each app performs API calls and returns structured output back into the workflow.
4. Workflows (Playbooks)
Workflows define automation logic:
- Trigger (Webhook, schedule, manual)
- Conditions (IF/ELSE logic)
- Actions (API calls, enrichment, notifications)
Workflows are the brain of SOAR automation.
5. Orborus (App Runner)
Orborus is responsible for executing app containers. It connects the backend to Docker and ensures integration apps run securely and independently.
How Shuffle Components Work Together
Typical flow:
Wazuh → Webhook → Shuffle Backend → Workflow → App Execution → External Systems
Understanding these components makes it easier to design clean automated decision architecture.
What Is Automated Decision Logic?
Automated decision logic is a rule-based or score-based system that answers:
"Given this security alert, what should we do?"
Instead of an analyst deciding manually, the system decides:
- Ignore
- Enrich only
- Create incident case
- Create case + notify on-call
- Append to existing case
The goal is predictable, fast, and measurable incident handling.
Example Scenario: Suspicious VPN Login
Alert from Wazuh
A successful VPN login is detected with the following attributes:
- Country: Russia
- User: admin
- Severity: 12
- Source IP: 185.199.108.153
We want to automate the decision-making process.
Level 1: Simple IF / ELSE Decision
The most basic automation is condition-based.
Rule:
IF
- country != "Thailand"
- AND severity >= 10
THEN
- Enrich IP
- Create IRIS case
- Notify PagerDuty
ELSE
- Log and stop
This works well for early-stage SOC maturity.
Level 2: Risk Scoring Model (Recommended)
Single IF conditions are too rigid. A better approach is scoring.
Example Risk Model
| Signal | Score |
|---|---|
| Country outside Thailand | +40 |
| IP reputation malicious | +30 |
| New user login | +25 |
| Login at unusual hour | +15 |
| MFA disabled | +20 |
Decision Threshold
- Score >= 70 → Critical (Create case + Page)
- Score 40–69 → Medium (Create case only)
- Score < 40 → Log only
This provides flexible and explainable automation.
Level 3: Stateful Decision (Correlation + Deduplication)
Advanced SOC systems must avoid duplicate cases.
Example rule:
"If the same IP triggered in the last 30 minutes, do not create a new case. Append to existing case instead."
This requires state management.
Options:
- Store correlation data in Django database
- Use Redis for temporary state
- Query IRIS before creating new case
This drastically reduces alert fatigue.
Recommended Architecture (Clean Separation)
The cleanest design is to separate responsibilities:
SOC Integrator (Django)
- Risk scoring
- Correlation
- Deduplication
- Decision output
Shuffle
- Workflow execution
- Calling integrations
- Trigger management
Flow
Wazuh → Shuffle Webhook → SOC Integrator /decide → Decision Response → Shuffle executes actions
Sequence Diagram (System Interaction)
sequenceDiagram
autonumber
participant WZ as Wazuh
participant SH as Shuffle (Webhook/Workflow)
participant SI as SOC Integrator (Django /decide)
participant TI as Threat Intel (VT/AbuseIPDB)
participant IR as DFIR-IRIS
participant PD as PagerDuty
WZ->>SH: POST Webhook (alert JSON)
SH->>SI: POST /decide (normalized alert)
SI-->>SH: Decision {ignore|enrich_only|create_case|create_case_and_page|append_case}
alt decision == ignore
SH-->>WZ: Tag/Comment: ignored + reason
else decision == enrich_only
SH->>TI: Enrich src_ip/domain
TI-->>SH: Enrichment result
SH-->>WZ: Tag/Comment: enriched + summary
else decision == append_case
SH->>IR: Add note to existing case (case_id)
IR-->>SH: OK
SH-->>WZ: Tag/Comment: appended_case + case_id
else decision == create_case
SH->>TI: Enrich src_ip/domain
TI-->>SH: Enrichment result
SH->>IR: Create case (title, description, severity)
IR-->>SH: case_id
SH-->>WZ: Tag/Comment: case_created + case_id
else decision == create_case_and_page
SH->>TI: Enrich src_ip/domain
TI-->>SH: Enrichment result
SH->>IR: Create case (title, description, severity)
IR-->>SH: case_id
SH->>PD: Trigger incident (critical) + case link
PD-->>SH: incident_key
SH-->>WZ: Tag/Comment: paged + case_id + incident_key
end
This keeps business logic in code and automation in SOAR.
Example Decision API Response
Your SOC Integrator should return structured decisions:
Example 1 – Create case and page:
{
"decision": "create_case_and_page",
"severity": "critical",
"reason": "High risk VPN login",
"risk_score": 85,
"case_payload": {
"title": "Suspicious VPN Login – admin",
"description": "Login from Russia with malicious IP score"
}
}
Example 2 – Append to existing case:
{
"decision": "append_case",
"case_id": 1234,
"reason": "Repeated event within 30 minutes"
}
Example 3 – Ignore:
{
"decision": "ignore",
"reason": "Low risk score"
}
Shuffle simply branches based on "decision".
Why This Architecture Scales
Benefits:
- Version-controlled decision logic
- Testable scoring models
- Easier tuning over time
- Reduced false positives
- Clear audit trail
It also supports C1, C2, C3 service tiers:
C1 – Basic rule automation
C2 – Risk scoring + enrichment
C3 – Correlation + adaptive decision logic
Final Thoughts
Automated decision systems are not just about speed — they’re about consistency, scalability, and measurable security operations.
Start with simple IF rules.
Then implement scoring.
Then add correlation and state awareness.
That is how you move from reactive SOC to intelligent SOC.
If your organization is planning to implement automated decision systems or build a SOC Integrator layer, this architecture provides a practical and production-ready foundation.
Get in Touch with us
Related Posts
- 用纯开源方案搭建生产级 SOC:Wazuh + DFIR-IRIS + 自研集成层实战记录
- How We Built a Real Security Operations Center With Open-Source Tools
- FarmScript:我们如何从零设计一门农业IoT领域特定语言
- FarmScript: How We Designed a Programming Language for Chanthaburi Durian Farmers
- 智慧农业项目为何止步于试点阶段
- Why Smart Farming Projects Fail Before They Leave the Pilot Stage
- ERP项目为何总是超支、延期,最终令人失望
- ERP Projects: Why They Cost More, Take Longer, and Disappoint More Than Expected
- AI Security in Production: What Enterprise Teams Must Know in 2026
- 弹性无人机蜂群设计:具备安全通信的无领导者容错网状网络
- Designing Resilient Drone Swarms: Leaderless-Tolerant Mesh Networks with Secure Communications
- NumPy广播规则详解:为什么`(3,)`和`(3,1)`行为不同——以及它何时会悄悄给出错误答案
- NumPy Broadcasting Rules: Why `(3,)` and `(3,1)` Behave Differently — and When It Silently Gives Wrong Answers
- 关键基础设施遭受攻击:从乌克兰电网战争看工业IT/OT安全
- Critical Infrastructure Under Fire: What IT/OT Security Teams Can Learn from Ukraine’s Energy Grid
- LM Studio代码开发的系统提示词工程:`temperature`、`context_length`与`stop`词详解
- LM Studio System Prompt Engineering for Code: `temperature`, `context_length`, and `stop` Tokens Explained
- LlamaIndex + pgvector: Production RAG for Thai and Japanese Business Documents
- simpliShop:专为泰国市场打造的按需定制多语言电商平台
- simpliShop: The Thai E-Commerce Platform for Made-to-Order and Multi-Language Stores













