1922 words
10 minutes
SIEM Event Collection and Correlation: A Comprehensive Technical Guide

SIEM Event Collection and Correlation: A Comprehensive Technical Guide#

Table of Contents#

Introduction: The Foundation of Modern Security Operations#

In today’s threat landscape where 72% of organizations experienced cyber incidents in 2023, Security Information and Event Management (SIEM) systems have evolved from optional tools to critical infrastructure. At the heart of effective SIEM deployment lies two fundamental capabilities: Event Collection and Event Correlation.

This comprehensive guide explores these core SIEM functions through practical implementations, real-world use cases, and hands-on examples using Wazuh, one of the leading open-source SIEM platforms.

Why Event Collection and Correlation Matter#

Consider this: A typical enterprise generates millions of security events daily across hundreds of systems. Without proper collection and correlation:

  • Critical threats remain hidden in the noise
  • Incident response times increase dramatically
  • Compliance requirements go unmet
  • Security teams face alert fatigue

Event correlation transforms this chaos into actionable intelligence by connecting seemingly unrelated events to reveal attack patterns and security incidents.

Part 1: Understanding Event Collection#

The Science Behind Centralized Log Management#

Event collection is more than just aggregating logs—it’s about creating a unified security telemetry pipeline that provides complete visibility across your infrastructure.

Key Benefits of Centralized Log Management#

  1. Unified Visibility

    • Single pane of glass for all security events
    • Cross-platform correlation capabilities
    • Reduced blind spots in security monitoring
  2. Compliance Enablement

    • Meet regulatory requirements (GDPR, PCI DSS, HIPAA)
    • Automated log retention policies
    • Audit trail maintenance
  3. Operational Efficiency

    • Faster incident investigation
    • Reduced mean time to detect (MTTD)
    • Streamlined forensic analysis

Log Collection Architecture#

The modern log collection pipeline follows this flow:

Data Sources → Collection Agents → Aggregation → Parsing → Normalization → Enrichment → Storage → Analysis

Critical Log Sources to Monitor#

Source TypeExamplesKey Events
Network DevicesFirewalls, IDS/IPS, RoutersConnection attempts, policy violations, traffic anomalies
EndpointsWorkstations, ServersLogin events, process creation, file modifications
ApplicationsWeb servers, DatabasesAuthentication, transactions, errors
Security ToolsAV, EDR, DLPMalware detection, data exfiltration attempts
Cloud ServicesAWS, Azure, GCPAPI calls, resource changes, access events

Part 2: Implementing Event Collection with Wazuh#

Real-World Use Case: Plesk Windows Server Monitoring#

Let’s walk through a production implementation of event collection for a Windows Server 2019 running Plesk control panel.

Step 1: Agent Deployment and Configuration#

First, install the Wazuh agent and configure it to communicate with your Wazuh manager:

<!-- C:\Program Files (x86)\ossec-agent\ossec.conf -->
<ossec_config>
<client>
<server>
<address>192.168.1.100</address>
<port>1514</port>
<protocol>tcp</protocol>
</server>
<config-profile>windows, plesk</config-profile>
</client>
<!-- Windows Event Log Collection -->
<localfile>
<location>Application</location>
<log_format>eventchannel</log_format>
</localfile>
<localfile>
<location>Security</location>
<log_format>eventchannel</log_format>
</localfile>
<localfile>
<location>System</location>
<log_format>eventchannel</log_format>
</localfile>
</ossec_config>

Step 2: Collecting Critical Plesk Logs#

For comprehensive Plesk monitoring, configure collection for these essential components:

<!-- Plesk-specific log collection -->
<localfile>
<location>C:\Program Files (x86)\Plesk\admin\logs\*.log</location>
<log_format>syslog</log_format>
</localfile>
<!-- MySQL/MariaDB logs -->
<localfile>
<location>C:\Program Files\MySQL\MySQL Server 8.0\data\*.err</location>
<log_format>mysql_log</log_format>
</localfile>
<!-- ModSecurity logs for web application security -->
<localfile>
<location>C:\Program Files (x86)\Plesk\ModSecurity\logs\audit.log</location>
<log_format>apache</log_format>
</localfile>
<!-- FTP logs -->
<localfile>
<location>C:\inetpub\logs\LogFiles\FTPSVC\*.log</location>
<log_format>iis</log_format>
</localfile>

Step 3: Agent Activation and Validation#

Restart the Wazuh agent to apply configurations:

Terminal window
# PowerShell command with administrator privileges
Restart-Service -Name wazuh

Scaling Log Collection#

For enterprise environments, consider these architectural patterns:

1. Hierarchical Collection#

Endpoints → Regional Collectors → Central SIEM → Archive Storage

2. Stream Processing#

Log Sources → Kafka/Kinesis → Real-time Processing → SIEM Platform

3. Hybrid Cloud Collection#

On-Premises → Log Forwarders → Cloud SIEM → Data Lake

Part 3: Mastering Event Correlation#

The Mathematics of Correlation#

Event correlation applies statistical and logical analysis to identify patterns that indicate security incidents. Think of it as pattern recognition on steroids—connecting dots that human analysts might miss.

Benford’s Law in Security Analytics#

An interesting application of mathematical principles in security is Benford’s Law, which states that in naturally occurring datasets, the leading digit 1 appears about 30% of the time. This can be used to detect:

  • Fraudulent transactions
  • Manipulated log entries
  • Artificial traffic patterns
# Example: Detecting anomalies using Benford's Law
def check_benford_distribution(data):
leading_digits = [str(abs(x))[0] for x in data if x != 0]
digit_freq = Counter(leading_digits)
expected_dist = {
'1': 0.301, '2': 0.176, '3': 0.125,
'4': 0.097, '5': 0.079, '6': 0.067,
'7': 0.058, '8': 0.051, '9': 0.046
}
chi_square = sum(
(observed - expected)**2 / expected
for observed, expected in zip(digit_freq.values(), expected_dist.values())
)
return chi_square > threshold # Anomaly detected if true

Building Correlation Rules#

Example 1: Detecting Brute Force Attacks#

Let’s create a comprehensive correlation rule to detect brute force attacks:

<!-- Step 1: Define decoders for authentication logs -->
<decoder name="auth_decoder">
<program_name>sshd</program_name>
</decoder>
<decoder name="auth_extract">
<parent>auth_decoder</parent>
<regex>(\w+) for (\w+) from (\d+\.\d+\.\d+\.\d+)</regex>
<order>status, user, srcip</order>
</decoder>
<!-- Step 2: Create base rules for login events -->
<group name="authentication,">
<!-- Successful login -->
<rule id="100001" level="3">
<decoded_as>auth_extract</decoded_as>
<field name="status">Accepted</field>
<description>Successful authentication</description>
</rule>
<!-- Failed login -->
<rule id="100002" level="5">
<decoded_as>auth_extract</decoded_as>
<field name="status">Failed</field>
<description>Failed authentication attempt</description>
</rule>
</group>
<!-- Step 3: Correlation rule for multiple failures -->
<group name="authentication_attack,">
<rule id="100010" level="10" frequency="5" timeframe="120">
<if_matched_sid>100002</if_matched_sid>
<same_srcip />
<description>Possible brute force attack - Multiple failed logins from same IP</description>
<mitre>
<id>T1110</id>
</mitre>
</rule>
<!-- Step 4: Detect successful login after failures -->
<rule id="100011" level="12" timeframe="300">
<if_matched_sid>100010</if_matched_sid>
<field name="status">Accepted</field>
<same_srcip />
<same_user />
<description>CRITICAL: Successful login after brute force attempts - Possible compromise</description>
<mitre>
<id>T1078</id>
</mitre>
</rule>
</group>

Example 2: Detecting Data Exfiltration#

<group name="data_exfiltration,">
<!-- Large file transfer detection -->
<rule id="200001" level="7">
<decoded_as>firewall</decoded_as>
<field name="bytes_sent">^[0-9]{7,}</field> <!-- 10MB+ -->
<description>Large outbound data transfer detected</description>
</rule>
<!-- Correlation: Multiple large transfers -->
<rule id="200010" level="12" frequency="3" timeframe="3600">
<if_matched_sid>200001</if_matched_sid>
<same_srcip />
<description>Possible data exfiltration - Multiple large transfers</description>
<mitre>
<id>T1041</id>
</mitre>
</rule>
<!-- Correlation: Large transfer to suspicious destination -->
<rule id="200011" level="14">
<if_matched_sid>200001</if_matched_sid>
<list field="dstip" lookup="match_key">etc/lists/suspicious_ips</list>
<description>CRITICAL: Large transfer to known malicious IP</description>
</rule>
</group>

Advanced Correlation Patterns#

1. Temporal Correlation#

Detect events that occur in specific sequences:

<rule id="300001" level="10">
<if_matched_sid>100001</if_matched_sid>
<time>21:00-06:00</time>
<weekday>saturday,sunday</weekday>
<description>Suspicious: Login during non-business hours</description>
</rule>

2. Cross-System Correlation#

Link events across multiple systems:

<rule id="400001" level="12" timeframe="60">
<if_matched_group>web_attack</if_matched_group>
<if_matched_group>ids_alert</if_matched_group>
<same_srcip />
<description>Coordinated attack detected across multiple systems</description>
</rule>

3. Behavioral Correlation#

Identify deviations from baseline behavior:

<rule id="500001" level="9" frequency="10" timeframe="600">
<if_matched_sid>5402</if_matched_sid> <!-- User added to group -->
<same_user />
<description>Unusual activity: Multiple privilege changes for single user</description>
</rule>

Part 4: Testing and Validation#

Creating a Testing Framework#

1. Simulated Attack Scenarios#

Deploy controlled attack simulations to validate correlation rules:

#!/bin/bash
# Brute force simulation script
TARGET_HOST="192.168.1.100"
TARGET_USER="testuser"
# Generate failed login attempts
for i in {1..10}; do
ssh -o BatchMode=yes $TARGET_USER@$TARGET_HOST 2>/dev/null
sleep 2
done
# Successful login after failures
sshpass -p 'correct_password' ssh $TARGET_USER@$TARGET_HOST "echo 'Login successful'"

2. Log Injection Testing#

Test correlation rules with synthetic logs:

import socket
import time
from datetime import datetime
def inject_test_logs(siem_host, siem_port):
"""Inject test logs to validate correlation rules"""
test_scenarios = [
# Brute force pattern
{"event": "Failed login", "count": 5, "interval": 1},
{"event": "Successful login", "count": 1, "interval": 0},
# Data exfiltration pattern
{"event": "Large transfer", "count": 3, "interval": 300},
]
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for scenario in test_scenarios:
for i in range(scenario["count"]):
timestamp = datetime.now().strftime("%b %d %H:%M:%S")
log_entry = f"{timestamp} test-host {scenario['event']} from 10.0.0.{i}"
sock.sendto(log_entry.encode(), (siem_host, siem_port))
time.sleep(scenario["interval"])
sock.close()
# Execute test
inject_test_logs("192.168.1.100", 514)

Performance Tuning#

Optimizing Correlation Rules#

  1. Use Specific Conditions First

    <!-- Good: Specific condition first -->
    <rule id="600001" level="10">
    <field name="action">DROP</field>
    <srcip>!192.168.0.0/16</srcip>
    <description>External connection blocked</description>
    </rule>
  2. Implement Efficient Timeframes

    • Short timeframes (60-300s) for rapid attacks
    • Long timeframes (3600-86400s) for slow attacks
    • Balance between detection speed and resource usage
  3. Leverage Field Extraction

    <decoder name="efficient_decoder">
    <prematch>^User:</prematch>
    <regex>User: (\S+) Action: (\S+) IP: (\S+)</regex>
    <order>user, action, srcip</order>
    </decoder>

Part 5: Integration with Security Operations#

Building a SOC Dashboard#

Create comprehensive visibility with key metrics:

# Wazuh dashboard configuration
dashboard:
panels:
- title: "Failed Authentication Attempts"
query: "rule.id:100002"
visualization: "line_chart"
timeframe: "24h"
- title: "Top Attacking IPs"
query: "rule.groups:authentication_attack"
visualization: "data_table"
aggregation: "srcip"
- title: "Critical Alerts"
query: "rule.level:[12 TO 15]"
visualization: "metric"
real_time: true
- title: "Data Exfiltration Risk"
query: "rule.groups:data_exfiltration"
visualization: "heat_map"
breakdown: "srcip,dstip"

Automated Response Integration#

Slack Integration for Critical Alerts#

<integration>
<name>slack</name>
<hook_url>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</hook_url>
<level>12</level>
<alert_format>json</alert_format>
<options>
{
"pretext": "🚨 Critical Security Alert",
"color": "danger",
"fields": [
{"title": "Rule", "value": "_rule.description_"},
{"title": "Level", "value": "_rule.level_"},
{"title": "Source IP", "value": "_srcip_"},
{"title": "User", "value": "_dstuser_"}
]
}
</options>
</integration>

Automated Incident Response#

#!/usr/bin/env python3
# Automated response to brute force attacks
import json
import subprocess
from datetime import datetime, timedelta
def block_attacker(alert_data):
"""Automatically block IPs after brute force detection"""
alert = json.loads(alert_data)
if alert['rule']['id'] == '100010': # Brute force detection
source_ip = alert['data']['srcip']
# Add to firewall blocklist
subprocess.run([
'iptables', '-A', 'INPUT',
'-s', source_ip,
'-j', 'DROP'
])
# Set expiration (24 hours)
expiry = datetime.now() + timedelta(hours=24)
# Log the action
with open('/var/log/auto_blocks.log', 'a') as f:
f.write(f"{datetime.now()}: Blocked {source_ip} until {expiry}\n")
return True
return False

Part 6: Compliance and Reporting#

Meeting Regulatory Requirements#

GDPR Compliance Monitoring#

<group name="gdpr_compliance,">
<!-- Personal data access monitoring -->
<rule id="700001" level="8">
<decoded_as>database_query</decoded_as>
<match>SELECT .* FROM users</match>
<description>Personal data accessed - GDPR Article 15</description>
</rule>
<!-- Data deletion requests -->
<rule id="700002" level="6">
<decoded_as>database_query</decoded_as>
<match>DELETE FROM users WHERE</match>
<description>Right to erasure executed - GDPR Article 17</description>
</rule>
<!-- Consent tracking -->
<rule id="700003" level="5">
<program_name>webapp</program_name>
<match>consent_updated</match>
<description>User consent modified - GDPR Article 7</description>
</rule>
</group>

PCI DSS Compliance#

<group name="pci_dss,">
<!-- Requirement 8.1.6: Lock after failed attempts -->
<rule id="800001" level="10" frequency="6" timeframe="900">
<if_matched_sid>5503</if_matched_sid>
<same_user />
<description>PCI DSS 8.1.6: Account lockout threshold reached</description>
<pci_dss>8.1.6</pci_dss>
</rule>
<!-- Requirement 10.2.2: Admin actions -->
<rule id="800002" level="8">
<if_matched_group>sudo</if_matched_group>
<description>PCI DSS 10.2.2: Administrative action logged</description>
<pci_dss>10.2.2</pci_dss>
</rule>
</group>

Custom Reporting Templates#

# Generate compliance reports
def generate_compliance_report(start_date, end_date):
"""Generate comprehensive compliance report"""
report = {
"period": f"{start_date} to {end_date}",
"compliance_frameworks": {
"GDPR": {
"data_access_requests": count_events("700001"),
"deletion_requests": count_events("700002"),
"consent_updates": count_events("700003")
},
"PCI_DSS": {
"account_lockouts": count_events("800001"),
"admin_actions": count_events("800002"),
"failed_logins": count_events("5503")
}
},
"security_metrics": {
"total_alerts": get_total_alerts(),
"critical_alerts": get_alerts_by_level(12, 15),
"mean_time_to_detect": calculate_mttd(),
"false_positive_rate": calculate_fpr()
}
}
return json.dumps(report, indent=2)

Part 7: Advanced Correlation Techniques#

Machine Learning Integration#

from sklearn.ensemble import IsolationForest
import numpy as np
class AnomalyDetector:
"""ML-based anomaly detection for event correlation"""
def __init__(self):
self.model = IsolationForest(
contamination=0.1,
random_state=42
)
self.feature_extractor = FeatureExtractor()
def train(self, historical_logs):
"""Train on normal behavior patterns"""
features = self.feature_extractor.extract(historical_logs)
self.model.fit(features)
def detect_anomalies(self, new_events):
"""Identify anomalous event patterns"""
features = self.feature_extractor.extract(new_events)
predictions = self.model.predict(features)
anomalies = []
for i, pred in enumerate(predictions):
if pred == -1: # Anomaly detected
anomalies.append({
"event": new_events[i],
"anomaly_score": self.model.score_samples([features[i]])[0],
"timestamp": new_events[i]["timestamp"]
})
return anomalies

Graph-Based Correlation#

import networkx as nx
class EventGraph:
"""Graph-based event correlation for attack path analysis"""
def __init__(self):
self.graph = nx.DiGraph()
def add_event(self, event):
"""Add event as node with relationships"""
node_id = f"{event['srcip']}_{event['timestamp']}"
self.graph.add_node(
node_id,
**event
)
# Link to related events
for node in self.graph.nodes():
if self.are_related(event, self.graph.nodes[node]):
self.graph.add_edge(node, node_id)
def find_attack_paths(self):
"""Identify potential attack paths"""
suspicious_paths = []
for path in nx.all_simple_paths(self.graph, cutoff=5):
risk_score = self.calculate_path_risk(path)
if risk_score > 0.7:
suspicious_paths.append({
"path": path,
"risk_score": risk_score,
"tactics": self.extract_tactics(path)
})
return suspicious_paths

Best Practices and Recommendations#

1. Event Collection Best Practices#

  • Start Small, Scale Gradually: Begin with critical systems
  • Standardize Log Formats: Use common event format (CEF) or similar
  • Implement Log Rotation: Prevent storage overflow
  • Encrypt in Transit: Use TLS for log transmission
  • Regular Audits: Verify all critical sources are being collected

2. Correlation Rule Development#

  • Follow KISS Principle: Keep rules simple and specific
  • Test in Staging: Always test rules in non-production first
  • Document Everything: Maintain rule documentation
  • Regular Reviews: Update rules based on threat landscape
  • Performance Monitoring: Track rule execution times

3. Operational Excellence#

  • Establish Baselines: Know your normal to detect abnormal
  • Automate Response: Implement SOAR for common scenarios
  • Continuous Training: Keep team updated on latest threats
  • Metrics-Driven: Track KPIs like MTTD and MTTR
  • Regular Drills: Conduct tabletop exercises

Conclusion: Building Resilient Security Operations#

Event collection and correlation form the backbone of modern security operations. By implementing the techniques and strategies outlined in this guide, organizations can:

  1. Transform raw data into actionable intelligence
  2. Detect sophisticated attacks that bypass traditional controls
  3. Reduce incident response times from hours to minutes
  4. Meet compliance requirements with automated reporting
  5. Build a proactive security posture

Remember: Effective SIEM implementation is not a one-time project but an ongoing journey. Continuously refine your collection sources, correlation rules, and response procedures based on lessons learned and evolving threats.

Next Steps#

  1. Assess Current State: Evaluate your existing log collection coverage
  2. Identify Gaps: Determine critical sources not being monitored
  3. Develop Use Cases: Create correlation rules for your top threats
  4. Test and Validate: Run simulations to verify detection capabilities
  5. Iterate and Improve: Continuously enhance based on findings

The combination of comprehensive event collection and intelligent correlation transforms security operations from reactive firefighting to proactive threat hunting. Start implementing these practices today to build a more resilient security posture for tomorrow.


For hands-on practice and additional resources, visit the Wazuh documentation and join the security community discussions on professional forums.

SIEM Event Collection and Correlation: A Comprehensive Technical Guide
https://mranv.pages.dev/posts/siem-event-collection-correlation-guide/
Author
Anubhav Gain
Published at
2024-12-21
License
CC BY-NC-SA 4.0