# FILE: MOD4.5_SIEM_Operations.md # MODULE 4.5: SIEM OPERATIONS & LOG ANALYSIS ## Learning Objectives - Master KQL (Kibana Query Language) for Security Onion - Build custom dashboards for threat visualization - Perform log correlation across multiple data sources - Tune alerts to reduce false positives - Export data for integration with custom SOC dashboard (React) --- ## LAB 4.5.1: KIBANA QUERY LANGUAGE (KQL) FUNDAMENTALS ### Basic KQL Syntax ``` # Search for specific field value event.module: "suricata" source.ip: "10.10.2.50" # Multiple conditions (AND) event.module: "suricata" AND alert.signature: "GPL EXPLOIT" # OR condition source.ip: ("10.10.2.50" OR "10.10.2.51") # Wildcards alert.signature: *nmap* # NOT operator event.module: "suricata" NOT alert.severity: 3 # Field exists _exists_: alert.signature # Range queries event.duration: >=1000000 @timestamp: >= "2026-02-11T00:00:00" # Nested field dns.question.name: "evil.com" ``` ### Common SOC Queries **Find failed SSH logins:** ``` event.dataset: "system.auth" AND system.auth.ssh.event: "Failed" ``` **Detect port scans (high SYN packet count):** ``` event.module: "suricata" AND network.transport: "tcp" AND suricata.eve.flow.pkts_toserver: >100 ``` **Find DNS queries to suspicious domains:** ``` dns.question.name: (*malware* OR *phishing* OR *bad*) ``` **High-severity alerts:** ``` alert.severity: (1 OR 2) AND event.module: "suricata" ``` --- ## LAB 4.5.2: BUILDING CUSTOM DASHBOARDS ### Create Attack Detection Dashboard ``` 1. Navigate to: Kibana > Dashboard > Create new dashboard 2. Add Visualization: Top Attack Signatures - Click "Create visualization" - Type: Vertical bar chart - Index pattern: so-* - Metrics: Count - Buckets: Terms → alert.signature.keyword - Top 10 - Save: "Top Attack Signatures" 3. Add Visualization: Alert Timeline - Type: Line chart - X-axis: Date Histogram → @timestamp - Y-axis: Count - Save: "Alert Timeline" 4. Add Visualization: Source IP Geo Map - Type: Maps - Add layer: Documents - Index: so-* - Geospatial field: source.geo.location - Save: "Attack Source Map" 5. Add Visualization: Alert Severity Breakdown - Type: Pie chart - Slice: Terms → alert.severity - Save: "Severity Distribution" 6. Save Dashboard: "Apophis SOC - Attack Overview" ``` --- ## LAB 4.5.3: DASHBOARD INTEGRATION WITH REACT SOC ### Export Data for Mock Dashboard ```bash # Query Security Onion for last 24h alerts # In Kibana Dev Tools: POST /so-*/_search { "size": 100, "query": { "bool": { "must": [ { "range": { "@timestamp": { "gte": "now-24h" } } } ] } }, "sort": [ { "@timestamp": { "order": "desc" } } ] } # Export to JSON, then process for React dashboard: # On Security Onion, create export script: cat > /home/analyst/export_dashboard_data.sh << 'EOF' #!/bin/bash # Export SOC data for dashboard integration # Export alert counts curl -X GET "localhost:9200/so-*/_search?pretty" -H 'Content-Type: application/json' -d' { "size": 0, "aggs": { "severity_count": { "terms": { "field": "alert.severity" } } } } ' > /tmp/severity_data.json # Export top threats curl -X GET "localhost:9200/so-*/_search?pretty" -H 'Content-Type: application/json' -d' { "size": 0, "aggs": { "top_signatures": { "terms": { "field": "alert.signature.keyword", "size": 10 } } } } ' > /tmp/top_threats.json echo "Data exported to /tmp/" EOF chmod +x /home/analyst/export_dashboard_data.sh ./export_dashboard_data.sh # Transfer to dashboard development environment scp /tmp/*.json user@dashboard-host:~/seclab/dashboard/src/data/live/ ``` ### Convert to React Mock Data Format ```javascript // In dashboard/src/data/mockData.js, add real data integration: export const importSecurityOnionData = async () => { // In production, this would fetch from Security Onion API // For now, use exported JSON files const severityData = { critical: 45, high: 128, medium: 312, low: 891 }; const topThreats = [ { ip: "203.0.113.50", count: 1247, country: "CN", severity: "critical" }, { ip: "198.51.100.23", count: 892, country: "RU", severity: "high" }, // ... from exported data ]; return { severityData, topThreats }; }; ``` --- ## LAB 4.5.4: ALERT TUNING & FALSE POSITIVE REDUCTION ### Identify Noisy Rules ``` # In Kibana, find most frequent alerts: POST /so-*/_search { "size": 0, "aggs": { "signatures": { "terms": { "field": "alert.signature.keyword", "size": 20, "order": { "_count": "desc" } } } } } # Common false positives: # - Internal vulnerability scanners (Nessus, OpenVAS) # - Legitimate admin tools (Nmap from IT) # - Noisy signatures (DNS ANY query, etc.) ``` ### Suppress False Positives ```bash # Edit Suricata threshold.config sudo nano /etc/suricata/threshold.config # Suppress specific signature for specific IP suppress gen_id 1, sig_id 2100498, track by_src, ip 10.10.3.50 # Signature 2100498 from source 10.10.3.50 will be suppressed # Rate limit alerts (max 5 per 60 seconds) threshold gen_id 1, sig_id 2010937, type threshold, track by_src, count 5, seconds 60 # Restart Suricata sudo so-suricata-restart ``` --- ## LAB 4.5.5: LOG CORRELATION ### Multi-Source Event Correlation **Scenario:** Detect full attack chain (scan → exploit → command execution) ``` # Step 1: Find nmap scan in Suricata alert.signature: "GPL SCAN nmap*" AND source.ip: "10.10.2.50" # Note timestamp: 2026-02-11T14:30:00 # Step 2: Find exploit attempt within 10 minutes @timestamp: ["2026-02-11T14:30:00" TO "2026-02-11T14:40:00"] AND alert.signature: *exploit* AND destination.ip: "10.10.4.10" # Step 3: Find Zeek connection logs showing data transfer event.dataset: "zeek.conn" AND source.ip: "10.10.2.50" AND destination.ip: "10.10.4.10" AND zeek.conn.orig_bytes: >10000 AND @timestamp: ["2026-02-11T14:35:00" TO "2026-02-11T14:45:00"] # Step 4: Build correlation rule (in Kibana detection rules) { "name": "Attack Chain: Scan to Exploit", "description": "Detects nmap scan followed by exploit attempt", "index": ["so-*"], "query": "sequence by source.ip with maxspan=15m [alert.signature: \"GPL SCAN nmap*\"] [alert.signature: *exploit*]" } ``` --- ##DELIVERABLES - [ ] Custom Kibana dashboard with 5+ visualizations - [ ] KQL query library (saved searches for common threats) - [ ] Alert tuning configuration (threshold.config) - [ ] Correlation rule for attack chain detection - [ ] Data export script for React dashboard integration --- **END OF MODULE 4.5** Proceed to **MOD5: Active Directory Threat Emulation** after mastering SIEM query skills.