IDS/IPS - أنظمة كشف ومنع التسلل — أمن الشبكات
IDS/IPS - كشف ومنع التسلل
IDS - Intrusion Detection System
نظام يكتشف الهجمات ويُنبّه.
IPS - Intrusion Prevention System
نظام يكتشف ويمنع الهجمات تلقائياً.
أنواع IDS/IPS
Network-based (NIDS/NIPS)
- يراقب حركة الشبكة
- يُوضع على نقاط استراتيجية
- أمثلة: Snort, Suricata
Host-based (HIDS/HIPS)
- يراقب جهاز واحد
- يفحص الملفات والـ logs
- أمثلة: OSSEC, Wazuh
طرق الكشف
Signature-based
- يبحث عن أنماط هجمات معروفة
- سريع ودقيق ✅
- لا يكتشف الجديد ❌
Anomaly-based
- يتعلم السلوك الطبيعي
- يكتشف الانحرافات
- يكتشف الجديد ✅
- False positives أكثر ❌
Behavior-based
- يحلل سلوك البرامج
- يكتشف الأنماط المشبوهة
أمثلة على القواعد (Snort)
# كشف محاولة SQL Injection
alert tcp any any -> any 80 (content:"' OR '1'='1"; msg:"SQL Injection Attempt";)
# كشف فحص المنافذ
alert tcp any any -> any any (flags:S; threshold:type both, track by_src, count 20, seconds 10; msg:"Port Scan Detected";)Placement
أين نضع IDS/IPS؟
- بعد الـ Firewall
- قبل الخوادم المهمة
- على نقاط الدخول
# محاكاة IDS بسيط
import re
from datetime import datetime
from collections import defaultdict
class SimpleIDS:
"""
نظام كشف تسلل بسيط للتعليم
"""
def __init__(self):
self.alerts = []
self.connection_count = defaultdict(int)
self.failed_logins = defaultdict(int)
# قواعد Signature-based
self.signatures = {
"sql_injection": [
r"'\s*OR\s*'1'\s*=\s*'1",
r"UNION\s+SELECT",
r"DROP\s+TABLE",
r"--\s*$",
],
"xss": [
r"<script[^>]*>",
r"javascript:",
r"onerror\s*=",
r"onload\s*=",
],
"command_injection": [
r";\s*cat\s+/etc/passwd",
r"\|\s*nc\s+",
r";\s*rm\s+-rf",
r"$\(.*\)",
],
"path_traversal": [
r"\.\./\.\./",
r"etc/passwd",
r"windows/system32",
],
}
# عتبات Anomaly detection
self.thresholds = {
"connections_per_minute": 100,
"failed_logins": 5,
"request_size": 10000,
}
def log_alert(self, severity, alert_type, description, source_ip, details=None):
"""تسجيل تنبيه"""
alert = {
"timestamp": datetime.now().isoformat(),
"severity": severity,
"type": alert_type,
"description": description,
"source_ip": source_ip,
"details": details or {}
}
self.alerts.append(alert)
emoji = {"HIGH": "🔴", "MEDIUM": "🟡", "LOW": "🟢"}
print(f"[{emoji.get(severity, '⚪')} {severity}] {alert_type}: {description}")
print(f" Source: {source_ip}")
def check_signatures(self, request_data, source_ip):
"""فحص Signature-based"""
for attack_type, patterns in self.signatures.items():
for pattern in patterns:
if re.search(pattern, request_data, re.IGNORECASE):
self.log_alert(
severity="HIGH",
alert_type=attack_type.upper(),
description=f"تم اكتشاف {attack_type}",
source_ip=source_ip,
details={"pattern": pattern, "data": request_data[:100]}
)
return True
return False
def check_anomalies(self, source_ip, request_size=0, is_failed_login=False):
"""فحص Anomaly-based"""
alerts = []
# فحص عدد الاتصالات
self.connection_count[source_ip] += 1
if self.connection_count[source_ip] > self.thresholds["connections_per_minute"]:
self.log_alert(
severity="MEDIUM",
alert_type="RATE_LIMIT",
description=f"عدد اتصالات غير طبيعي: {self.connection_count[source_ip]}",
source_ip=source_ip
)
alerts.append("rate_limit")
# فحص محاولات تسجيل الدخول الفاشلة
if is_failed_login:
self.failed_logins[source_ip] += 1
if self.failed_logins[source_ip] >= self.thresholds["failed_logins"]:
self.log_alert(
severity="HIGH",
alert_type="BRUTE_FORCE",
description=f"محاولات تسجيل دخول فاشلة: {self.failed_logins[source_ip]}",
source_ip=source_ip
)
alerts.append("brute_force")
# فحص حجم الطلب
if request_size > self.thresholds["request_size"]:
self.log_alert(
severity="MEDIUM",
alert_type="LARGE_REQUEST",
description=f"طلب كبير جداً: {request_size} bytes",
source_ip=source_ip
)
alerts.append("large_request")
return alerts
def analyze_request(self, request, source_ip):
"""تحليل طلب HTTP"""
print(f"\n📥 تحليل طلب من {source_ip}...")
# فحص Signatures
if self.check_signatures(request, source_ip):
return {"blocked": True, "reason": "signature_match"}
# فحص Anomalies
anomalies = self.check_anomalies(source_ip, len(request))
if anomalies:
return {"blocked": False, "warnings": anomalies}
print(" ✅ الطلب يبدو آمناً")
return {"blocked": False}
def get_summary(self):
"""ملخص التنبيهات"""
print("\n" + "=" * 50)
print("📊 ملخص التنبيهات")
print("=" * 50)
severity_count = {"HIGH": 0, "MEDIUM": 0, "LOW": 0}
for alert in self.alerts:
severity_count[alert["severity"]] += 1
print(f" 🔴 عالية: {severity_count['HIGH']}")
print(f" 🟡 متوسطة: {severity_count['MEDIUM']}")
print(f" 🟢 منخفضة: {severity_count['LOW']}")
print(f" 📋 الإجمالي: {len(self.alerts)}")
# ===== اختبار =====
ids = SimpleIDS()
# طلبات للاختبار
test_requests = [
("192.168.1.100", "GET /index.html HTTP/1.1"),
("10.0.0.50", "GET /search?q=' OR '1'='1 HTTP/1.1"),
("172.16.0.25", "POST /login HTTP/1.1\n<script>alert('xss')</script>"),
("192.168.1.100", "GET /files?path=../../../../etc/passwd HTTP/1.1"),
("10.0.0.50", "GET /api/data HTTP/1.1"),
]
for ip, request in test_requests:
ids.analyze_request(request, ip)
# محاكاة Brute Force
print("\n📥 محاكاة Brute Force Attack...")
for i in range(6):
ids.check_anomalies("attacker_ip", is_failed_login=True)
ids.get_summary()اختبر فهمك