<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nguyen Dong</title>
    <description>The latest articles on Forem by Nguyen Dong (@xuxu298).</description>
    <link>https://forem.com/xuxu298</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3810025%2F6d6873c9-b089-4f5b-8872-076d73c641d7.png</url>
      <title>Forem: Nguyen Dong</title>
      <link>https://forem.com/xuxu298</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/xuxu298"/>
    <language>en</language>
    <item>
      <title>How 5 AI Agents Run Our SOC Autonomously — Architecture Deep Dive</title>
      <dc:creator>Nguyen Dong</dc:creator>
      <pubDate>Tue, 17 Mar 2026 12:42:42 +0000</pubDate>
      <link>https://forem.com/xuxu298/how-5-ai-agents-run-our-soc-autonomously-architecture-deep-dive-10fh</link>
      <guid>https://forem.com/xuxu298/how-5-ai-agents-run-our-soc-autonomously-architecture-deep-dive-10fh</guid>
      <description>&lt;p&gt;&lt;em&gt;We replaced a 6-person SOC team with 5 AI agents running 24/7 for $5/month in API costs. Here's the architecture.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Alert Fatigue is Killing SMB Security
&lt;/h2&gt;

&lt;p&gt;The average SOC receives &lt;strong&gt;11,000 alerts per day&lt;/strong&gt;. Enterprise teams with 10+ analysts struggle to keep up. Now imagine an SMB with zero security staff.&lt;/p&gt;

&lt;p&gt;That was our starting point. We built VRadar — a cloud SOC platform for SMBs — and quickly realized that collecting alerts is useless if nobody's reading them. A dashboard with 1,000 unread alerts is the same as having no dashboard at all.&lt;/p&gt;

&lt;p&gt;So we did something unconventional: we built &lt;strong&gt;5 specialized AI agents&lt;/strong&gt;, each handling a different aspect of SOC operations. Not one monolithic AI — five focused agents that collaborate.&lt;/p&gt;




&lt;h2&gt;
  
  
  The 5 Agents
&lt;/h2&gt;

&lt;p&gt;Here's what each agent does and how they interact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌─────────────────┐
                        │   AI Operator   │ ← Alert triage (GPT-4o-mini)
                        │   Every 5 min   │   Batch 100 alerts
                        └────────┬────────┘
                                 │ escalate / create incident
                        ┌────────▼────────┐
                        │   AI Monitor    │ ← Infrastructure health
                        │   Every 10 min  │   10 health checks
                        └────────┬────────┘
                                 │ degraded service alert
                        ┌────────▼────────┐
                        │  AI Optimizer   │ ← Resource + threat defense
                        │  &amp;amp; Firewall     │   Auto-block attackers
                        └────────┬────────┘
                                 │ knowledge for responses
                        ┌────────▼────────┐
                        │   AI Care       │ ← Customer support (RAG)
                        │   Real-time     │   Auto-reply chat + social
                        └────────┬────────┘
                                 │ content from knowledge base
                        ┌────────▼────────┐
                        │  AI Marketing   │ ← Content + social media
                        │   On-demand     │   Auto-reply FB comments
                        └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agent 1: AI Operator — The Autonomous SOC Analyst
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Job&lt;/strong&gt;: Triage every security alert and decide what to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cron job runs every 5 minutes&lt;/li&gt;
&lt;li&gt;Pulls up to 100 unprocessed alerts from PostgreSQL&lt;/li&gt;
&lt;li&gt;Each alert goes through GPT-4o-mini with &lt;strong&gt;function calling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;LLM chooses from 5 actions: &lt;code&gt;block_ip&lt;/code&gt;, &lt;code&gt;create_incident&lt;/code&gt;, &lt;code&gt;acknowledge&lt;/code&gt;, &lt;code&gt;escalate&lt;/code&gt;, &lt;code&gt;notify_customer&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Each action executes real consequences (Wazuh Active Response, incident creation, notifications)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The economics trick — Hybrid AI mode&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;90%+ of security alerts are LOW or MEDIUM severity (Windows Event 4624 "successful login", Sysmon process creation, etc.). Sending these to GPT-4o costs $0.002/alert. At 1,000 alerts/day, that's $60/month per tenant.&lt;/p&gt;

&lt;p&gt;Our Hybrid mode: LOW + MEDIUM → &lt;strong&gt;rule-based auto-acknowledge ($0)&lt;/strong&gt;, HIGH + CRITICAL → &lt;strong&gt;LLM triage ($0.0002/alert)&lt;/strong&gt;. Total: ~$2-5/month per tenant. &lt;strong&gt;94% cost savings&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;processingMode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hybrid_ai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lowMedAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;alerts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MEDIUM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="c1"&gt;// Rule-based: auto-ack, $0&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;autoAcknowledgeLow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lowMedAlerts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;highCritAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;alerts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HIGH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CRITICAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="c1"&gt;// LLM: function calling, ~$0.0002/alert&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processWithLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;highCritAlerts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Human-in-the-loop&lt;/strong&gt;: Every AI decision is logged in &lt;code&gt;AiOperatorDecision&lt;/code&gt; with confidence score. Admin can override any decision. There's an evaluation system (6 mock scenarios) for testing AI accuracy without executing real actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 2: AI Monitor — Infrastructure Watchdog
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Job&lt;/strong&gt;: Ensure all 12 Docker containers and security services are healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10 health checks&lt;/strong&gt; (6 infra + 4 security):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Docker containers&lt;/td&gt;
&lt;td&gt;Auto-discover + verify all 12 containers running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;Connection + query latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ClickHouse&lt;/td&gt;
&lt;td&gt;Connection + table accessibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;td&gt;Connection + memory usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk usage&lt;/td&gt;
&lt;td&gt;Alert if &amp;gt; 85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory usage&lt;/td&gt;
&lt;td&gt;Alert if &amp;gt; 90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anomaly detection&lt;/td&gt;
&lt;td&gt;ML service health (IsolationForest + LSTM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent heartbeat&lt;/td&gt;
&lt;td&gt;Wazuh agent connectivity check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed logins&lt;/td&gt;
&lt;td&gt;Brute force detection (suspicious patterns)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSL certificate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TLS handshake to vradar.io:443, check expiry&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Runs every 10 minutes. Results stored in &lt;code&gt;SystemConfig&lt;/code&gt;. Uptime trend visualization in the dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3: AI Optimizer &amp;amp; Firewall — Self-Defense System
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Job&lt;/strong&gt;: Optimize resources and auto-block attackers.&lt;/p&gt;

&lt;p&gt;This agent is unique because it runs on &lt;strong&gt;every single HTTP request&lt;/strong&gt; via middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// threat-defense.middleware.ts — runs on EVERY request&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;threatDefenseMiddleware&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What it tracks per IP&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request rate (Redis counter, 60-second window)&lt;/li&gt;
&lt;li&gt;4xx error rate (scanning detection)&lt;/li&gt;
&lt;li&gt;Known-bad User-Agent patterns (nmap, sqlmap, nuclei, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Auto-response&lt;/strong&gt;: IP exceeds threshold → blocked in Redis → all future requests return 403.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource monitoring&lt;/strong&gt; (8 sub-checks):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS disk/RAM usage&lt;/li&gt;
&lt;li&gt;Redis memory consumption&lt;/li&gt;
&lt;li&gt;ClickHouse table sizes across all tenants&lt;/li&gt;
&lt;li&gt;AI cost tracking (LLM API calls in last 24h)&lt;/li&gt;
&lt;li&gt;Expired session detection&lt;/li&gt;
&lt;li&gt;Device capacity per tenant&lt;/li&gt;
&lt;li&gt;Cross-service degradation alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: We've auto-blocked &lt;strong&gt;2,197 malicious IPs&lt;/strong&gt; on our VPS without human intervention. Current active blocks: 209.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 4: AI Care — RAG-Powered Customer Support
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Job&lt;/strong&gt;: Auto-reply customer chat messages using Retrieval-Augmented Generation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer sends message → Chat API
    ↓
triggerAICareReply() — async
    ↓
ChromaDB semantic search (all-MiniLM-L6-v2 embeddings)
    ↓
Top 3 relevant knowledge chunks retrieved
    ↓
GPT-4o-mini generates reply with context
    ↓
Confidence check (threshold: 0.7)
    ↓
If confident → auto-reply as AI_CARE bot
If not → escalate to human agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Knowledge base&lt;/strong&gt;: Kreuzberg (document extraction + OCR) processes uploaded PDFs/DOCX → chunks → ChromaDB vector store. We pre-loaded 820 lines of VRadar product knowledge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt;: Works on Facebook Messenger and Zalo OA too. Same RAG pipeline, different input channels.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 5: AI Marketing — Content &amp;amp; Social Manager
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Job&lt;/strong&gt;: Generate marketing content and manage social media interactions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content generation&lt;/strong&gt;: 5 channels (Facebook, LinkedIn, Zalo, Blog, Email) with distinct tones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DALL-E 3 image generation&lt;/strong&gt;: Branded cybersecurity visuals ($0.04/image)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook comment auto-reply&lt;/strong&gt;: Webhook receives mentions → RAG-enriched AI response → posts via Graph API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart scheduling&lt;/strong&gt;: Platform-specific optimal posting times&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Shared Brain: Unified LLM Service
&lt;/h2&gt;

&lt;p&gt;All 5 agents share one &lt;code&gt;llm.service.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callLLMText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o-mini&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// Default for all agents&lt;/span&gt;
  &lt;span class="na"&gt;maxTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// Cost control&lt;/span&gt;
  &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agentPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Agent-specific context&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key design decisions&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single model everywhere&lt;/strong&gt;: GPT-4o-mini ($0.15/1M tokens) instead of GPT-4o ($2.50/1M). 94% savings, negligible quality difference for SOC tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis caching&lt;/strong&gt;: Knowledge search results (1h TTL) + AI replies (30min TTL). Same question = cached answer = $0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful degradation&lt;/strong&gt;: If OpenAI is down, agents log the failure but don't crash. Security monitoring continues without AI triage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost tracking&lt;/strong&gt;: Every LLM call logged with token count. Dashboard shows daily/weekly AI spend.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Running Cost Breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Frequency&lt;/th&gt;
&lt;th&gt;Cost/Month (per tenant)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Operator (Hybrid)&lt;/td&gt;
&lt;td&gt;Every 5 min&lt;/td&gt;
&lt;td&gt;~$2-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Monitor&lt;/td&gt;
&lt;td&gt;Every 10 min&lt;/td&gt;
&lt;td&gt;~$0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Optimizer&lt;/td&gt;
&lt;td&gt;Continuous (middleware)&lt;/td&gt;
&lt;td&gt;$0 (rule-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Care&lt;/td&gt;
&lt;td&gt;On-demand (chat)&lt;/td&gt;
&lt;td&gt;~$0.10-1.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Marketing&lt;/td&gt;
&lt;td&gt;On-demand&lt;/td&gt;
&lt;td&gt;~$0.50-2.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$3-8/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Compare this to a &lt;strong&gt;6-person SOC team&lt;/strong&gt;: $300K-600K/year in salaries alone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons From Building AI Agents for Production
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Don't build one mega-agent.&lt;/strong&gt; Specialized agents with clear boundaries are easier to debug, test, and iterate. Our AI Operator went through 4 rewrites — without touching the other agents.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid AI is mandatory.&lt;/strong&gt; Sending every LOW-severity alert to an LLM is burning money. Rule-based filtering for the 90% + LLM for the 10% = same security, 94% less cost.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Function calling &amp;gt; text parsing.&lt;/strong&gt; GPT-4o-mini with structured function calling (&lt;code&gt;block_ip&lt;/code&gt;, &lt;code&gt;create_incident&lt;/code&gt;) is dramatically more reliable than asking it to output JSON or parse text responses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cache aggressively.&lt;/strong&gt; The same customer asks "What is VRadar?" 50 times. Redis cache = $0 after the first answer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Log everything.&lt;/strong&gt; Every AI decision, every confidence score, every action taken. When a customer asks "why did AI block this IP?", you need the audit trail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build an evaluation mode.&lt;/strong&gt; Our AI Operator has 6 test scenarios that run through the full LLM pipeline without executing real actions. Test before you deploy.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try VRadar
&lt;/h2&gt;

&lt;p&gt;VRadar is live at &lt;strong&gt;&lt;a href="https://vradar.io" rel="noopener noreferrer"&gt;vradar.io&lt;/a&gt;&lt;/strong&gt; — AI-powered SOC from $25/device/month.&lt;/p&gt;

&lt;p&gt;All 5 agents are running in production right now, monitoring real customer networks across ASEAN.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Dong, solo dev from Vietnam. Built VRadar's 5-agent SOC system over 3 months. Happy to deep-dive on any architectural question in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: #ai #cybersecurity #soc #llm #gpt4 #architecture #startup #buildinpublic #agents #aisecurity #devto #opensource&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>startup</category>
      <category>opensource</category>
    </item>
    <item>
      <title>HIDS + NIDS: Why Your SMB Needs Both (And How We Integrated Wazuh + Suricata in a Single Platform)</title>
      <dc:creator>Nguyen Dong</dc:creator>
      <pubDate>Tue, 10 Mar 2026 12:09:42 +0000</pubDate>
      <link>https://forem.com/xuxu298/hids-nids-why-your-smb-needs-both-and-how-we-integrated-wazuh-suricata-in-a-single-platform-29bf</link>
      <guid>https://forem.com/xuxu298/hids-nids-why-your-smb-needs-both-and-how-we-integrated-wazuh-suricata-in-a-single-platform-29bf</guid>
      <description>&lt;p&gt;&lt;em&gt;Most SMBs think they're "covered" with just antivirus. Here's why that's like locking the front door but leaving every window wide open.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Blind Spot in SMB Security
&lt;/h2&gt;

&lt;p&gt;I've talked to dozens of SMB owners about their security setup. The conversation usually goes like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt;: "What security monitoring do you have?"&lt;br&gt;
&lt;strong&gt;Them&lt;/strong&gt;: "We have antivirus on every computer."&lt;br&gt;
&lt;strong&gt;Me&lt;/strong&gt;: "What about network traffic? Can you see what's going in and out?"&lt;br&gt;
&lt;strong&gt;Them&lt;/strong&gt;: &lt;em&gt;...silence...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the blind spot. &lt;strong&gt;Antivirus checks what's ON your computers. But nobody checks what's FLOWING THROUGH your network.&lt;/strong&gt; A hacker stealing data over DNS tunneling, a compromised device beaconing to a C2 server, lateral movement between machines — antivirus won't catch any of it.&lt;/p&gt;

&lt;p&gt;You need two types of monitoring. And no, you don't need a $200K/year SIEM to get them.&lt;/p&gt;


&lt;h2&gt;
  
  
  HIDS vs. NIDS: A 60-Second Primer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;HIDS (Host-based IDS)&lt;/th&gt;
&lt;th&gt;NIDS (Network-based IDS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it watches&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Individual devices (endpoints)&lt;/td&gt;
&lt;td&gt;Network traffic flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Detects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File changes, process anomalies, login attempts, malware&lt;/td&gt;
&lt;td&gt;Port scans, intrusion attempts, data exfiltration, C2 beaconing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Wazuh Agent&lt;/td&gt;
&lt;td&gt;Suricata IDS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where it runs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;On each endpoint&lt;/td&gt;
&lt;td&gt;On a network sensor or device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security camera inside each room&lt;/td&gt;
&lt;td&gt;Guard at the building entrance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;HIDS tells you &lt;em&gt;what happened on a machine&lt;/em&gt;. NIDS tells you &lt;em&gt;what's happening on the wire&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need both. Here's a real example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Wazuh alert says "3 failed SSH logins from 182.23.XX.XX". That's HIDS.&lt;br&gt;
Suricata simultaneously sees "182.23.XX.XX is port-scanning 47 services on your network". That's NIDS.&lt;/p&gt;

&lt;p&gt;Combined? You know it's not a typo — it's an active attacker probing your infrastructure. Block them instantly.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What We Built: Wazuh + Suricata → ClickHouse → AI
&lt;/h2&gt;

&lt;p&gt;In VRadar, we integrated both HIDS and NIDS into a single pipeline. Here's how the data flows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    HIDS Pipeline
Windows/Linux/Mac ──→ Wazuh Agent ──→ Wazuh Manager
                                            │
                                            ▼ webhook
                                      VRadar Backend ──→ ClickHouse
                                            │              (security_logs)
                                            ▼
                                      AI Operator ──→ Triage + Auto-Response

                    NIDS Pipeline  
Network Traffic ──→ Suricata IDS ──→ eve.json
                                        │
                                  Wazuh Agent (monitors eve.json)
                                        │
                                  Wazuh Manager ──→ Custom Rules 100100-100104
                                        │
                                        ▼ webhook
                                  VRadar Backend ──→ ClickHouse
                                                     (nta_events)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both pipelines converge into the same backend. One dashboard. One AI engine analyzing everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Integration (For the Engineers)
&lt;/h3&gt;

&lt;p&gt;Getting Suricata to talk to Wazuh cleanly wasn't trivial. Here are the challenges we solved:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Interface Detection on Windows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suricata crashes if you pass it a friendly interface name like "Wi-Fi" or "Ethernet". It needs the NPF device path: &lt;code&gt;\Device\NPF_{GUID}&lt;/code&gt;. Our installation script auto-detects this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Convert friendly name → NPF device path (Suricata requirement)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$adapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-NetAdapter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Up'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InterfaceDescription&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-notmatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'Loopback|Virtual|Hyper-V'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$npcapDevice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\\Device\\NPF_&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$adapter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;InterfaceGuid&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Rule File Auto-Detection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suricata ships different rule files depending on version. Our script scans the actual &lt;code&gt;rules/&lt;/code&gt; directory and rewrites &lt;code&gt;suricata.yaml&lt;/code&gt; to match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$rules&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;ProgramFiles&lt;/span&gt;&lt;span class="s2"&gt;\Suricata\rules"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*.rules"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;Where-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$_&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-notmatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'dnp3|modbus|ipsec'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c"&gt;# Exclude ICS rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. JSON Decoder Limit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suricata's &lt;code&gt;eve.json&lt;/code&gt; events are large (800+ bytes). Wazuh's default JSON decoder limit (256) truncates them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;analysisd.decoder_order_size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1024  # Increased from 256&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Custom Wazuh Rules for Suricata&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suricata alerts come through Wazuh's rule 86600 at level 0 (ignored by default). We created custom rules 100100-100104 to elevate them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"100100"&lt;/span&gt; &lt;span class="na"&gt;level=&lt;/span&gt;&lt;span class="s"&gt;"3"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;if_sid&amp;gt;&lt;/span&gt;86600&lt;span class="nt"&gt;&amp;lt;/if_sid&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;field&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"event_type"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;^flow$&lt;span class="nt"&gt;&amp;lt;/field&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Suricata: Network flow event&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. One-Click Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest challenge: making all of this install with &lt;strong&gt;one command&lt;/strong&gt;. Our agent script handles 6 steps automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clean up any existing Wazuh/Suricata installation&lt;/li&gt;
&lt;li&gt;Register with Wazuh Manager&lt;/li&gt;
&lt;li&gt;Install Wazuh Agent (version-matched to Manager)&lt;/li&gt;
&lt;li&gt;Configure HIDS monitoring&lt;/li&gt;
&lt;li&gt;Install Npcap + Suricata IDS&lt;/li&gt;
&lt;li&gt;Wire Suricata → Wazuh → VRadar pipeline&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Works on Windows, Linux, and macOS.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You See in the Dashboard
&lt;/h2&gt;

&lt;p&gt;Once both HIDS and NIDS are running, the VRadar dashboard shows:&lt;/p&gt;

&lt;h3&gt;
  
  
  HIDS Tab (System Alerts)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security alerts from Wazuh (3,000+ detection rules)&lt;/li&gt;
&lt;li&gt;Alert severity distribution (Critical/High/Medium/Low)&lt;/li&gt;
&lt;li&gt;AI-powered triage decisions with confidence scores&lt;/li&gt;
&lt;li&gt;One-click IP blocking via Wazuh Active Response&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  NIDS Tab (Network Monitoring)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Suricata IDS events (flow, DNS, HTTP, TLS)&lt;/li&gt;
&lt;li&gt;Severity breakdown over 7 days&lt;/li&gt;
&lt;li&gt;Protocol distribution and traffic patterns&lt;/li&gt;
&lt;li&gt;Source/destination IP analysis with geolocation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Threat Map
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time world map showing attacks hitting your network&lt;/li&gt;
&lt;li&gt;SVG-based Mercator projection with animated attack lines&lt;/li&gt;
&lt;li&gt;Data from both HIDS (login attempts, malware) and NIDS (port scans, intrusion attempts)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security Score
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;9-factor scoring including both HIDS and NIDS health&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIDS Monitoring&lt;/strong&gt; is one of the 9 scoring factors (10% weight)&lt;/li&gt;
&lt;li&gt;Getting both working pushes your score above 80 (Grade B → A territory)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Cost Argument
&lt;/h2&gt;

&lt;p&gt;Here's what dual HIDS + NIDS monitoring costs at scale:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;HIDS + NIDS&lt;/th&gt;
&lt;th&gt;Monthly Cost (50 devices)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arctic Wolf&lt;/td&gt;
&lt;td&gt;Managed SOC&lt;/td&gt;
&lt;td&gt;$3,500+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blumira&lt;/td&gt;
&lt;td&gt;SIEM + IDS&lt;/td&gt;
&lt;td&gt;$850+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SentinelOne + Darktrace&lt;/td&gt;
&lt;td&gt;EDR + NDR&lt;/td&gt;
&lt;td&gt;$2,500+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;VRadar&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wazuh + Suricata + AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,250&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We can offer this pricing because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wazuh and Suricata are open-source&lt;/strong&gt; — $0 licensing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI triage via GPT-4o-mini&lt;/strong&gt; — $0.15/1M tokens (we spend ~$2-5/tenant/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ClickHouse for log storage&lt;/strong&gt; — handles millions of events on a single server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo operation&lt;/strong&gt; — no sales team, no marketing department (yet)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Lessons for Other Builders
&lt;/h2&gt;

&lt;p&gt;If you're building security tooling for SMBs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't make users choose between HIDS and NIDS.&lt;/strong&gt; They need both. Bundle them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-install everything.&lt;/strong&gt; If setup takes more than one command, adoption drops to near zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI triage is table stakes now.&lt;/strong&gt; GPT-4o-mini costs almost nothing. Use it to reduce alert fatigue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suricata on Windows is possible&lt;/strong&gt; but painful. Budget extra time for NPF device paths, rule-file compatibility, and threshold configs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Log everything to a columnar DB.&lt;/strong&gt; ClickHouse handles millions of events for $0 and queries complete in milliseconds.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;VRadar is live at &lt;strong&gt;&lt;a href="https://vradar.io" rel="noopener noreferrer"&gt;vradar.io&lt;/a&gt;&lt;/strong&gt; — plans start at $25/device/month for dual HIDS + NIDS monitoring with AI-powered threat analysis.&lt;/p&gt;

&lt;p&gt;If you're running an SMB with no security monitoring (or just antivirus), you're exactly who we built this for.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Dong, a solo developer from Vietnam building affordable security tools. If you have questions about integrating Wazuh + Suricata or building security products for the SMB market — ask me anything in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags&lt;/strong&gt;: #cybersecurity #wazuh #suricata #HIDS #NIDS #ai #SOC #startup #opensource #buildinpublic&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>wazuh</category>
      <category>suricata</category>
      <category>startup</category>
    </item>
    <item>
      <title>From Zero to 140 Features: How I Built a Cloud SOC Platform as a Solo Developer</title>
      <dc:creator>Nguyen Dong</dc:creator>
      <pubDate>Fri, 06 Mar 2026 14:39:52 +0000</pubDate>
      <link>https://forem.com/xuxu298/from-zero-to-140-features-how-i-built-a-cloud-soc-platform-as-a-solo-developer-1pcf</link>
      <guid>https://forem.com/xuxu298/from-zero-to-140-features-how-i-built-a-cloud-soc-platform-as-a-solo-developer-1pcf</guid>
      <description>&lt;h2&gt;
  
  
  &lt;em&gt;How AI, open-source security tools, and relentless iteration turned a side project into a full-featured Security Operations Center.&lt;/em&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Here's a number that should scare you: &lt;strong&gt;90% of small and medium businesses in Southeast Asia have zero security monitoring.&lt;/strong&gt;&lt;br&gt;
Not weak monitoring. Not basic monitoring. &lt;em&gt;Zero.&lt;/em&gt;&lt;br&gt;
They run their business, store customer data, process payments — all with no visibility into who's poking around their network. The reason? Traditional SOC platforms cost $100-300 per device per month. For an SMB with 50 endpoints, that's $60,000-$180,000 per year. Most can't justify that, so they just... hope for the best.&lt;/p&gt;

&lt;h2&gt;
  
  
  I decided to fix this. &lt;strong&gt;Alone.&lt;/strong&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;VRadar&lt;/strong&gt; is a cloud-native SOC (Security Operations Center) platform that monitors networks, detects threats using AI, and responds automatically. Here's what 140+ features look like after 36 development phases:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Core Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HIDS&lt;/strong&gt;: Wazuh Manager 4.14.2 (3,000+ detection rules) — monitors every host&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NIDS&lt;/strong&gt;: Suricata IDS — analyzes network traffic in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: PostgreSQL for relational data, ClickHouse for 1M+ security logs (fast analytical queries)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache&lt;/strong&gt;: Redis with JWT blacklist for instant token revocation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js 15 with dark cyberpunk dashboard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend&lt;/strong&gt;: Node.js + Express + TypeScript, 32 API modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI&lt;/strong&gt;: GPT-4o-mini for threat analysis + autonomous agents
### The Five AI Agents
This is what makes VRadar different. Instead of just collecting logs and showing dashboards, VRadar has &lt;strong&gt;5 autonomous AI agents&lt;/strong&gt; that actually &lt;em&gt;do&lt;/em&gt; things:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Operator&lt;/strong&gt; — Triages every alert automatically. Reads the alert, checks threat intelligence (AbuseIPDB, VirusTotal, MITRE ATT&amp;amp;CK), assigns severity, and decides if it needs human attention. Handles 80% of alerts without human intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Monitor&lt;/strong&gt; — Runs 9 health checks every 30 minutes (6 infrastructure + 3 security). Detects anomalies, generates incidents, escalates via Telegram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Optimizer&lt;/strong&gt; — Self-defense mechanism. When it detects flooding or scanning patterns, it auto-blocks attacking IPs and adjusts firewall rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Care&lt;/strong&gt; — Customer support chatbot powered by RAG (Retrieval-Augmented Generation). Trained on product documentation, answers questions 24/7.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Marketing&lt;/strong&gt; — Generates SEO-optimized blog posts and social media content from knowledge base.
### Security That Watches Itself
The platform doesn't just monitor &lt;em&gt;your&lt;/em&gt; network — it monitors &lt;em&gt;itself&lt;/em&gt;:&lt;/li&gt;
&lt;li&gt;HIDS + NIDS running on the VRadar server itself&lt;/li&gt;
&lt;li&gt;Auto-escalation: Alert → AI Triage → Incident → Notification → Auto-Response&lt;/li&gt;
&lt;li&gt;Threat defense middleware that auto-blocks IPs showing scanning/flooding behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - Compliance scoring against ISO 27001 (28 controls), PCI DSS v4.0 (27 controls), NIST CSF 2.0 (25 controls)
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│   Wazuh     │────▶│              │────▶│  ClickHouse │
│   Agents    │     │   Backend    │     │  (1M+ logs) │
└─────────────┘     │   (Node.js)  │     └─────────────┘
                    │              │
┌─────────────┐     │  32 Modules  │     ┌─────────────┐
│  Suricata   │────▶│  5 AI Agents │────▶│ PostgreSQL  │
│   (NIDS)    │     │  80 Controls │     │  (Prisma)   │
└─────────────┘     └──────┬───────┘     └─────────────┘
                           │
                    ┌──────▼───────┐
                    │   Next.js    │
                    │  Dashboard   │
                    │ (Dark Theme) │
                    └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12 Docker containers, orchestrated with Docker Compose. The entire platform runs on a single VPS with 23GB RAM.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Lessons Learned Building Solo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AI is a Force Multiplier, Not a Replacement
&lt;/h3&gt;

&lt;p&gt;GPT-4o-mini costs ~$2-5 per tenant per month for alert triage. At that price, every SMB can afford AI-powered security analysis. But it's not magic — you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured prompts with context (alert data + threat intel + historical patterns)&lt;/li&gt;
&lt;li&gt;Fallback logic when AI fails (and it will)&lt;/li&gt;
&lt;li&gt;Caching (Redis) to avoid redundant API calls — saved 94% on AI costs
### 2. Open Source is Your Superpower
Wazuh + Suricata give you enterprise-grade HIDS + NIDS for free. The real value I added:&lt;/li&gt;
&lt;li&gt;Integration layer (webhook forwarding, ClickHouse storage)&lt;/li&gt;
&lt;li&gt;AI triage on top of raw alerts&lt;/li&gt;
&lt;li&gt;Multi-tenant SaaS wrapper&lt;/li&gt;
&lt;li&gt;One-click agent installation scripts (Windows/Linux/macOS)
### 3. Security is Non-Negotiable from Day 1
Before going public, I did a full security hardening:&lt;/li&gt;
&lt;li&gt;Penetration test: reduced risk from 6.2/10 to 2.8/10&lt;/li&gt;
&lt;li&gt;OWASP Top 10: 9/10 pass&lt;/li&gt;
&lt;li&gt;3-layer rate limiting (Nginx → Express → per-endpoint)&lt;/li&gt;
&lt;li&gt;MFA, JWT blacklist, bcrypt-12, AES-256-GCM encryption&lt;/li&gt;
&lt;li&gt;ClickHouse/Redis authentication, Cloudflare DDoS protection&lt;/li&gt;
&lt;li&gt;Fail2ban banned 14 attacking IPs within the first 30 minutes of installation
### 4. Ship Fast, But Track Everything
36 phases in 5 weeks. Every feature documented in CONTEXT.md (1,200+ lines). Every commit purposeful. The key: time-box features to 2-4 hours max, ship, observe, iterate.
---
## The Numbers
| Metric | Value |
|:---|:---|
| Features | 140+ |
| Development phases | 36 |
| API modules | 32 |
| Compliance controls | 80 (ISO + PCI + NIST) |
| Security logs stored | 1,062,253 |
| AI agents | 5 |
| Docker services | 12 |
| Pentest risk score | 2.8/10 |
| QA score | 8.0/10 |
| Starting price | $25/device/month |
| Competitor price | $100-300/device/month |
---
## What's Next
VRadar is live and serving customers in Vietnam. We're expanding to ASEAN markets with a simple pitch: &lt;strong&gt;get 80% of enterprise SOC capabilities at 20% of the cost.&lt;/strong&gt;
The platform is built for SMBs with 10-500 endpoints. If you're an IT manager tired of having zero visibility into your security posture, or an MSSP looking for a white-label SOC platform — I'd love your feedback.
🔗 &lt;strong&gt;&lt;a href="https://vradar.io" rel="noopener noreferrer"&gt;vradar.io&lt;/a&gt;&lt;/strong&gt;
---
&lt;em&gt;I'm Dong, a developer from Vietnam building security tools for businesses that can't afford a Fortune 500 security budget. Ask me anything in the comments.&lt;/em&gt;
---&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cybersecurity</category>
      <category>ai</category>
      <category>startup</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
