network_security_monitoring/
network_security_monitoring.rs

1//! Network Security Monitoring Example
2//!
3//! This example demonstrates real-world network security monitoring using
4//! anomaly-grid for detecting Advanced Persistent Threats (APTs), DDoS attacks,
5//! and other network anomalies in enterprise environments.
6
7use anomaly_grid::*;
8
9use std::time::Instant;
10
11fn main() -> Result<(), Box<dyn std::error::Error>> {
12    println!("šŸ›”ļø Network Security Monitoring with Anomaly Grid");
13    println!("Detecting APTs, DDoS, and network intrusions\n");
14
15    // Generate 5 days of normal network traffic (reduced for performance)
16    let normal_events = generate_enterprise_traffic(5);
17    println!(
18        "Generated {} normal network events (5 days)",
19        normal_events.len()
20    );
21
22    // Initialize anomaly detection system
23    let mut detector = AnomalyDetector::new(4)?; // Order 4 for complex patterns
24
25    // Train on normal network patterns
26    let train_start = Instant::now();
27    detector.train(&normal_events)?;
28    println!("Training completed in {:?}", train_start.elapsed());
29
30    // Real-time monitoring simulation
31    println!("\nšŸ” Starting real-time network monitoring...");
32
33    // Test various attack scenarios
34    let attack_scenarios = vec![
35        ("Advanced Persistent Threat", generate_apt_campaign()),
36        ("DDoS Attack", generate_ddos_attack()),
37        ("Port Scan", generate_port_scan()),
38        ("SQL Injection", generate_sql_injection()),
39        ("Lateral Movement", generate_lateral_movement()),
40    ];
41
42    for (attack_name, attack_sequence) in attack_scenarios {
43        println!("\nTesting: {attack_name}");
44
45        let detect_start = Instant::now();
46        let anomalies = detector.detect_anomalies(&attack_sequence, 0.001)?;
47        let detect_time = detect_start.elapsed();
48
49        if !anomalies.is_empty() {
50            let max_strength = anomalies
51                .iter()
52                .map(|a| a.anomaly_strength)
53                .fold(0.0, f64::max);
54
55            let min_likelihood = anomalies
56                .iter()
57                .map(|a| a.likelihood)
58                .fold(f64::INFINITY, f64::min);
59
60            println!("  āœ… THREAT DETECTED");
61            println!("  šŸ“Š Anomalies found: {}", anomalies.len());
62            println!("  Max anomaly strength: {max_strength:.3}");
63            println!("  Min likelihood: {min_likelihood:.2e}");
64            println!("  Detection time: {detect_time:?}");
65
66            // Alert classification
67            let threat_level = if max_strength > 0.9 {
68                "CRITICAL"
69            } else if max_strength > 0.7 {
70                "HIGH"
71            } else if max_strength > 0.5 {
72                "MEDIUM"
73            } else {
74                "LOW"
75            };
76
77            println!("  Threat Level: {threat_level}");
78        } else {
79            println!("  āŒ No anomalies detected");
80        }
81    }
82
83    // Batch processing demonstration
84    println!("\nšŸ“¦ Batch Processing Demonstration");
85    let batch_sequences = vec![
86        generate_normal_session(),
87        generate_malware_communication(),
88        generate_data_exfiltration(),
89    ];
90
91    let batch_start = Instant::now();
92    let config = AnomalyGridConfig::default().with_max_order(5)?;
93    let batch_results = batch_process_sequences(&batch_sequences, &config, 0.01)?;
94    let batch_time = batch_start.elapsed();
95
96    println!(
97        "Processed {} sequences in {:?}",
98        batch_sequences.len(),
99        batch_time
100    );
101    for (i, results) in batch_results.iter().enumerate() {
102        println!("  Sequence {}: {} anomalies detected", i + 1, results.len());
103    }
104
105    Ok(())
106}
107
108fn generate_enterprise_traffic(days: usize) -> Vec<String> {
109    let mut traffic = Vec::new();
110    let events_per_day = 10000;
111
112    let normal_patterns = vec![
113        // HTTP/HTTPS traffic
114        vec!["TCP_SYN", "TCP_ACK", "HTTP_GET", "HTTP_200", "TCP_FIN"],
115        vec![
116            "TCP_SYN",
117            "TCP_ACK",
118            "TLS_HANDSHAKE",
119            "HTTPS_POST",
120            "HTTP_201",
121            "TCP_FIN",
122        ],
123        // Email traffic
124        vec![
125            "TCP_SYN",
126            "TCP_ACK",
127            "SMTP_HELO",
128            "SMTP_AUTH",
129            "SMTP_DATA",
130            "SMTP_QUIT",
131        ],
132        vec![
133            "TCP_SYN",
134            "TCP_ACK",
135            "IMAP_LOGIN",
136            "IMAP_SELECT",
137            "IMAP_FETCH",
138            "IMAP_LOGOUT",
139        ],
140        // DNS queries
141        vec!["UDP_DNS_QUERY", "DNS_A_RECORD", "UDP_DNS_RESPONSE"],
142        vec!["UDP_DNS_QUERY", "DNS_MX_RECORD", "UDP_DNS_RESPONSE"],
143        // Internal services
144        vec![
145            "TCP_SYN",
146            "TCP_ACK",
147            "LDAP_BIND",
148            "LDAP_SEARCH",
149            "LDAP_UNBIND",
150        ],
151        vec![
152            "TCP_SYN",
153            "TCP_ACK",
154            "SMB_NEGOTIATE",
155            "SMB_SESSION",
156            "SMB_TREE_CONNECT",
157        ],
158        // VPN connections
159        vec![
160            "IPSEC_INIT",
161            "IPSEC_AUTH",
162            "IPSEC_ESTABLISHED",
163            "DATA_TRANSFER",
164            "IPSEC_CLOSE",
165        ],
166    ];
167
168    for _ in 0..days {
169        for _ in 0..events_per_day {
170            let pattern = &normal_patterns[traffic.len() % normal_patterns.len()];
171            traffic.extend(pattern.iter().map(|s| s.to_string()));
172        }
173    }
174
175    traffic
176}
177
178fn generate_apt_campaign() -> Vec<String> {
179    vec![
180        // Initial compromise
181        "SPEAR_PHISHING_EMAIL",
182        "MACRO_EXECUTION",
183        "PAYLOAD_DOWNLOAD",
184        "PERSISTENCE_REGISTRY",
185        "SCHEDULED_TASK_CREATE",
186        // Reconnaissance
187        "NETWORK_DISCOVERY",
188        "SERVICE_ENUMERATION",
189        "USER_ENUMERATION",
190        "DOMAIN_TRUST_DISCOVERY",
191        "REMOTE_SYSTEM_DISCOVERY",
192        // Lateral movement
193        "CREDENTIAL_DUMPING",
194        "PASS_THE_HASH",
195        "REMOTE_DESKTOP",
196        "ADMIN_SHARE_ACCESS",
197        "SERVICE_EXECUTION",
198        // Data collection
199        "FILE_SYSTEM_SEARCH",
200        "DATA_STAGING",
201        "ARCHIVE_CREATION",
202        "SENSITIVE_DATA_ACCESS",
203        "DATABASE_QUERY",
204        // Exfiltration
205        "C2_COMMUNICATION",
206        "DATA_ENCRYPTION",
207        "EXTERNAL_TRANSFER",
208        "DNS_TUNNELING",
209        "STEGANOGRAPHY",
210        // Cover tracks
211        "LOG_DELETION",
212        "ARTIFACT_REMOVAL",
213        "TIMESTAMP_MODIFICATION",
214    ]
215    .into_iter()
216    .map(String::from)
217    .collect()
218}
219
220fn generate_ddos_attack() -> Vec<String> {
221    vec![
222        // Volumetric attack
223        "UDP_FLOOD",
224        "UDP_FLOOD",
225        "UDP_FLOOD",
226        "UDP_FLOOD",
227        "UDP_FLOOD",
228        "ICMP_FLOOD",
229        "ICMP_FLOOD",
230        "ICMP_FLOOD",
231        "ICMP_FLOOD",
232        // Protocol attack
233        "TCP_SYN_FLOOD",
234        "TCP_SYN_FLOOD",
235        "TCP_SYN_FLOOD",
236        "TCP_SYN_FLOOD",
237        "TCP_ACK_FLOOD",
238        "TCP_ACK_FLOOD",
239        "TCP_ACK_FLOOD",
240        // Application layer attack
241        "HTTP_GET_FLOOD",
242        "HTTP_GET_FLOOD",
243        "HTTP_GET_FLOOD",
244        "HTTP_GET_FLOOD",
245        "HTTP_POST_FLOOD",
246        "HTTP_POST_FLOOD",
247        "HTTP_POST_FLOOD",
248        "SLOWLORIS_ATTACK",
249        "SLOWLORIS_ATTACK",
250        // Amplification attack
251        "DNS_AMPLIFICATION",
252        "NTP_AMPLIFICATION",
253        "MEMCACHED_AMPLIFICATION",
254    ]
255    .into_iter()
256    .map(String::from)
257    .collect()
258}
259
260fn generate_port_scan() -> Vec<String> {
261    vec![
262        "TCP_SYN",
263        "TCP_RST",
264        "TCP_SYN",
265        "TCP_RST",
266        "TCP_SYN",
267        "TCP_RST",
268        "TCP_SYN",
269        "TCP_RST",
270        "TCP_SYN",
271        "TCP_RST",
272        "TCP_SYN",
273        "TCP_RST",
274        "UDP_PROBE",
275        "ICMP_UNREACHABLE",
276        "UDP_PROBE",
277        "ICMP_UNREACHABLE",
278        "STEALTH_SCAN",
279        "FIN_SCAN",
280        "NULL_SCAN",
281        "XMAS_SCAN",
282    ]
283    .into_iter()
284    .map(String::from)
285    .collect()
286}
287
288fn generate_sql_injection() -> Vec<String> {
289    vec![
290        "TCP_SYN",
291        "TCP_ACK",
292        "HTTP_POST",
293        "SQL_INJECTION_ATTEMPT",
294        "ERROR_BASED_SQLI",
295        "UNION_BASED_SQLI",
296        "BLIND_SQLI",
297        "TIME_BASED_SQLI",
298        "DATABASE_ERROR",
299        "SENSITIVE_DATA_LEAK",
300        "HTTP_500",
301        "TCP_RST",
302    ]
303    .into_iter()
304    .map(String::from)
305    .collect()
306}
307
308fn generate_lateral_movement() -> Vec<String> {
309    vec![
310        "CREDENTIAL_THEFT",
311        "PASS_THE_TICKET",
312        "GOLDEN_TICKET",
313        "SILVER_TICKET",
314        "DCSYNC_ATTACK",
315        "KERBEROASTING",
316        "SMB_RELAY",
317        "NTLM_RELAY",
318        "REMOTE_EXECUTION",
319        "PSEXEC",
320        "WMIEXEC",
321        "SCHTASKS_ABUSE",
322    ]
323    .into_iter()
324    .map(String::from)
325    .collect()
326}
327
328fn generate_normal_session() -> Vec<String> {
329    vec![
330        "TCP_SYN",
331        "TCP_ACK",
332        "HTTP_GET",
333        "HTTP_200",
334        "HTTP_GET",
335        "HTTP_200",
336        "HTTP_POST",
337        "HTTP_201",
338        "TCP_FIN",
339        "TCP_ACK",
340    ]
341    .into_iter()
342    .map(String::from)
343    .collect()
344}
345
346fn generate_malware_communication() -> Vec<String> {
347    vec![
348        "DNS_QUERY_SUSPICIOUS",
349        "C2_DOMAIN_RESOLUTION",
350        "TCP_SYN",
351        "TCP_ACK",
352        "ENCRYPTED_C2_TRAFFIC",
353        "BEACON_HEARTBEAT",
354        "COMMAND_DOWNLOAD",
355        "PAYLOAD_EXECUTION",
356        "DATA_UPLOAD",
357        "TCP_FIN",
358    ]
359    .into_iter()
360    .map(String::from)
361    .collect()
362}
363
364fn generate_data_exfiltration() -> Vec<String> {
365    vec![
366        "FILE_SYSTEM_ACCESS",
367        "SENSITIVE_FILE_READ",
368        "DATA_COMPRESSION",
369        "ENCRYPTION_PROCESS",
370        "EXTERNAL_CONNECTION",
371        "LARGE_DATA_TRANSFER",
372        "STEGANOGRAPHY_ENCODING",
373        "COVERT_CHANNEL",
374    ]
375    .into_iter()
376    .map(String::from)
377    .collect()
378}