4th task
هذا الالتزام موجود في:
78
miniSIEM/README.md
Normal file
78
miniSIEM/README.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# هيكل المشروع
|
||||
|
||||
- **Log Sources**
|
||||
- تمثل مصادر السجلات (Logs) التي يجمع منها النظام البيانات.
|
||||
- في هذا المشروع سيتم استخدام **3 ملفات `.log` وهمية** لتجربة النظام ومحاكاة بيئة حقيقية، ويمكن توليدها بسهولة باستخدام ChatGPT.
|
||||
- أمثلة على المصادر:
|
||||
- `auth.log` : محاولات تسجيل الدخول.
|
||||
- `nginx.log` : طلبات خادم الويب.
|
||||
- `app.log` : أخطاء التطبيق.
|
||||
|
||||
---
|
||||
|
||||
- **Log Collector (Python)**
|
||||
- مسؤول عن قراءة السجلات من جميع المصادر بشكل دوري.
|
||||
- يجمع كل سجل (Log Entry) ويمرره إلى مرحلة التحليل دون إجراء أي قرار أمني بنفسه.
|
||||
|
||||
---
|
||||
|
||||
- **Parser + Detection Rules**
|
||||
- يقوم الـ Parser بتحليل كل Log واستخراج المعلومات المهمة مثل:
|
||||
- عنوان IP
|
||||
- الوقت
|
||||
- نوع الحدث
|
||||
- الرسالة
|
||||
- بعد ذلك يتم تطبيق مجموعة من **قواعد الكشف (Detection Rules)** لتحديد ما إذا كان الحدث طبيعياً أو مشبوهاً.
|
||||
- أمثلة على القواعد:
|
||||
- أكثر من **5 محاولات تسجيل دخول فاشلة** خلال دقيقة واحدة → **Brute Force**.
|
||||
- طلب يحتوي على كلمات مثل `UNION SELECT` أو `' OR 1=1` → **SQL Injection**.
|
||||
- محاولة الوصول إلى `/admin` أو ملفات حساسة بشكل متكرر → **Directory Enumeration**.
|
||||
- إرسال مرفق بريد إلكتروني بامتداد `.exe` أو `.bat` → **احتمال Malware**.
|
||||
- عدد كبير من الطلبات من نفس عنوان IP خلال فترة قصيرة → **Suspicious Activity**.
|
||||
|
||||
---
|
||||
|
||||
- **Alerts Database / File**
|
||||
- عند اكتشاف حدث مشبوه، يتم إنشاء Alert يحتوي على:
|
||||
- الوقت
|
||||
- عنوان IP
|
||||
- نوع الهجوم
|
||||
- مستوى الخطورة (Low / Medium / High)
|
||||
- تُحفظ التنبيهات في ملف `alerts.json` (أو قاعدة بيانات في الأنظمة الأكبر) ليتم عرضها لاحقاً.
|
||||
|
||||
---
|
||||
|
||||
- **Dashboard (HTML / CSS / JavaScript)**
|
||||
- واجهة رسومية تعرض التنبيهات التي اكتشفها النظام.
|
||||
- تعرض معلومات مثل:
|
||||
- عناوين IP المشبوهة.
|
||||
- نوع الهجوم.
|
||||
- مستوى الخطورة.
|
||||
- وقت اكتشاف الحدث.
|
||||
- يتم تحديث البيانات من ملف `alerts.json` الذي ينتجه برنامج Python.
|
||||
|
||||
---
|
||||
|
||||
# تشغيل المشروع
|
||||
|
||||
1. شغّل برنامج تحليل السجلات:
|
||||
|
||||
```bash
|
||||
python siem.py
|
||||
```
|
||||
|
||||
سيقوم البرنامج بقراءة ملفات الـ Logs وتحليلها وإنشاء ملف `alerts.json`.
|
||||
|
||||
2. بعد ذلك شغّل خادم HTTP لعرض لوحة التحكم:
|
||||
|
||||
```bash
|
||||
python -m http.server 8000
|
||||
```
|
||||
|
||||
3. افتح المتصفح وانتقل إلى:
|
||||
|
||||
```text
|
||||
http://localhost:8000/dashboard/
|
||||
```
|
||||
|
||||
ستظهر لوحة التحكم وتعرض جميع التنبيهات التي اكتشفها النظام.
|
||||
32
miniSIEM/alerts.json
Normal file
32
miniSIEM/alerts.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
{
|
||||
"time": "2026-07-27 21:59:27.947124",
|
||||
"ip": "10.0.0.5",
|
||||
"attack": "Brute Force Login",
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"time": "2026-07-27 21:59:27.947161",
|
||||
"ip": "10.0.0.5",
|
||||
"attack": "Brute Force Login",
|
||||
"severity": "HIGH"
|
||||
},
|
||||
{
|
||||
"time": "2026-07-27 21:59:27.947285",
|
||||
"ip": "10.0.0.8",
|
||||
"attack": "Web Attack Attempt",
|
||||
"severity": "MEDIUM"
|
||||
},
|
||||
{
|
||||
"time": "2026-07-27 21:59:27.947295",
|
||||
"ip": "10.0.0.9",
|
||||
"attack": "Web Attack Attempt",
|
||||
"severity": "MEDIUM"
|
||||
},
|
||||
{
|
||||
"time": "2026-07-27 21:59:27.947408",
|
||||
"ip": "LOCAL",
|
||||
"attack": "Application Error",
|
||||
"severity": "LOW"
|
||||
}
|
||||
]
|
||||
33
miniSIEM/dashboard/app.js
Normal file
33
miniSIEM/dashboard/app.js
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
fetch("../alerts.json")
|
||||
|
||||
.then(res=>res.json())
|
||||
|
||||
.then(data=>{
|
||||
|
||||
|
||||
let table=document.getElementById("alerts");
|
||||
|
||||
|
||||
data.forEach(alert=>{
|
||||
|
||||
|
||||
table.innerHTML +=
|
||||
|
||||
`
|
||||
<tr>
|
||||
|
||||
<td>${alert.ip}</td>
|
||||
|
||||
<td>${alert.attack}</td>
|
||||
|
||||
<td>${alert.severity}</td>
|
||||
|
||||
</tr>
|
||||
|
||||
`
|
||||
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
45
miniSIEM/dashboard/index.html
Normal file
45
miniSIEM/dashboard/index.html
Normal file
@@ -0,0 +1,45 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<title>Mini SIEM Dashboard</title>
|
||||
|
||||
<link rel="stylesheet" href="style.css">
|
||||
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
<h1>Security Alerts</h1>
|
||||
|
||||
|
||||
<table>
|
||||
|
||||
<thead>
|
||||
|
||||
<tr>
|
||||
|
||||
<th>IP</th>
|
||||
<th>Attack</th>
|
||||
<th>Severity</th>
|
||||
|
||||
</tr>
|
||||
|
||||
</thead>
|
||||
|
||||
|
||||
<tbody id="alerts"></tbody>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
<script src="app.js"></script>
|
||||
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
24
miniSIEM/dashboard/style.css
Normal file
24
miniSIEM/dashboard/style.css
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
body{
|
||||
|
||||
font-family:Arial;
|
||||
margin:40px;
|
||||
|
||||
}
|
||||
|
||||
|
||||
table{
|
||||
|
||||
border-collapse:collapse;
|
||||
|
||||
width:80%;
|
||||
|
||||
}
|
||||
|
||||
|
||||
td,th{
|
||||
|
||||
border:1px solid black;
|
||||
padding:10px;
|
||||
|
||||
}
|
||||
1
miniSIEM/logs/app.log
Normal file
1
miniSIEM/logs/app.log
Normal file
@@ -0,0 +1 @@
|
||||
ERROR database failed
|
||||
2
miniSIEM/logs/auth.log
Normal file
2
miniSIEM/logs/auth.log
Normal file
@@ -0,0 +1,2 @@
|
||||
Jul 27 Failed password for root from 10.0.0.5
|
||||
Jul 27 Failed password for admin from 10.0.0.5
|
||||
2
miniSIEM/logs/nginx.log
Normal file
2
miniSIEM/logs/nginx.log
Normal file
@@ -0,0 +1,2 @@
|
||||
10.0.0.8 GET /admin.php
|
||||
10.0.0.9 GET /sql?id=1
|
||||
104
miniSIEM/siem.py
Normal file
104
miniSIEM/siem.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import re
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
LOG_FILES = [
|
||||
"logs/auth.log",
|
||||
"logs/nginx.log",
|
||||
"logs/app.log"
|
||||
]
|
||||
|
||||
|
||||
alerts = []
|
||||
|
||||
|
||||
def create_alert(ip, attack, severity):
|
||||
|
||||
alert = {
|
||||
"time": str(datetime.now()),
|
||||
"ip": ip,
|
||||
"attack": attack,
|
||||
"severity": severity
|
||||
}
|
||||
|
||||
alerts.append(alert)
|
||||
|
||||
|
||||
|
||||
def analyze_auth(line):
|
||||
|
||||
pattern = r"Failed password.*from ([0-9.]+)"
|
||||
|
||||
result = re.search(pattern,line)
|
||||
|
||||
if result:
|
||||
ip = result.group(1)
|
||||
|
||||
create_alert(
|
||||
ip,
|
||||
"Brute Force Login",
|
||||
"HIGH"
|
||||
)
|
||||
|
||||
|
||||
|
||||
def analyze_web(line):
|
||||
|
||||
if "admin" in line or "sql" in line.lower():
|
||||
|
||||
ip = line.split()[0]
|
||||
|
||||
create_alert(
|
||||
ip,
|
||||
"Web Attack Attempt",
|
||||
"MEDIUM"
|
||||
)
|
||||
|
||||
|
||||
|
||||
def analyze_app(line):
|
||||
|
||||
if "ERROR" in line:
|
||||
|
||||
create_alert(
|
||||
"LOCAL",
|
||||
"Application Error",
|
||||
"LOW"
|
||||
)
|
||||
|
||||
|
||||
|
||||
def collect_logs():
|
||||
|
||||
for file in LOG_FILES:
|
||||
|
||||
with open(file) as f:
|
||||
|
||||
for line in f:
|
||||
|
||||
if "auth" in file:
|
||||
analyze_auth(line)
|
||||
|
||||
elif "nginx" in file:
|
||||
analyze_web(line)
|
||||
|
||||
else:
|
||||
analyze_app(line)
|
||||
|
||||
|
||||
|
||||
collect_logs()
|
||||
|
||||
|
||||
with open("alerts.json","w") as f:
|
||||
|
||||
json.dump(
|
||||
alerts,
|
||||
f,
|
||||
indent=4
|
||||
)
|
||||
|
||||
|
||||
print("SIEM Scan Completed")
|
||||
print(len(alerts),"alerts found")
|
||||
المرجع في مشكلة جديدة
حظر مستخدم