זיהוי חריגות ברשת עם ML

שיטות לזיהוי חריגות בנתוני רשת ומשתמשים.

שימוש באלגוריתמי למידת מכונה לאיתור התנהגות חשודה בזמן אמת.

Anomaly Detection — מפגש 2 | שיטות מתקדמות לאיתור התנהגות חשודה בזמן אמת


1

סדר יום — מפגש 2

במפגש זה נעמיק בטכניקות ML מתקדמות לזיהוי חריגות ברשת ובמשתמשים. נעבור משיטות בסיסיות לכלים מבוססי בינה מלאכותית של קוד פתוח.

01

רקע ותיאוריה

סקירת מושגי יסוד בזיהוי חריגות ורשתות

02

אלגוריתמים מרכזיים

Isolation Forest, Autoencoders, LSTM ועוד

03

כלי קוד פתוח

PyOD, Scikit-learn, TensorFlow ו-Alibi Detect

04

מימוש מעשי

קוד חי, דאטאסטים אמיתיים ותרגול


2

מה זה Anomaly Detection ברשת?

זיהוי חריגות הוא תהליך של זיהוי דפוסים חריגים בנתוני רשת שאינם תואמים את ההתנהגות הצפויה. בניגוד לחתימות מסורתיות, ML לומד את "הנורמה" ומתריע על כל סטייה משמעותית.

התנהגות נורמלית

  • תעבורה עקבית לפי שעות
  • חיבורים לשרתים מוכרים
  • נפחי נתונים צפויים

חריגות טיפוסיות

  • העברות נתונים חריגות בלילה
  • חיבורים ל-IP לא מוכרים
  • עלייה פתאומית בבקשות DNS

3

רגע — מה זה בכלל חריגה? 🤔

דמיינו שאתם בודקים את חשבון הבנק שלכם. כל יום אתם מוציאים בין 50-200 ש"ח. פתאום יום אחד — 15,000 ש"ח. זו חריגה!

ברשת מחשבים זה בדיוק אותו דבר — מחפשים פעולות שחורגות מהדפוס הרגיל.

מה נורמלי

פעילות יומיומית, דפוסים מוכרים.

מה חריג

סטייה משמעותית מהנורמה, אירוע מפתיע.

למה זה חשוב

הגנה מפני איומים, זיהוי פריצות מוקדם.


4

סוגי חריגות — טקסונומיה

הבנת סוג החריגה קריטית לבחירת האלגוריתם הנכון. חריגת נקודה בודדת מטופלת אחרת מחריגה קולקטיבית שמצביעה על מתקפה מתואמת.


5

🧠 תרגיל חשיבה — חריגה או לא?

בואו נחדד את ההבנה שלנו בסוגי חריגות בעזרת כמה תרחישים.

שרת שולח 1MB, ואז 1GB

חריגה נקודתית: סטייה קיצונית בנקודת זמן ספציפית.

1,000 בקשות בשעה בשעות עבודה

נורמלי: פעילות רגילה בתוך דפוסי ההתנהגות הצפויים.

1,000 בקשות בשעה ב-3 לפנות בוקר

חריגה קונטקסטואלית: פעילות נורמלית אך בהקשר לא צפוי (זמן).

50 מחשבים פונים לאותו IP בו-זמנית

חריגה קולקטיבית: קבוצת אירועים שיוצרים דפוס חריג.


6

למה ML עדיף על חוקים מסורתיים?

חוקים מסורתיים (Signatures)

  • מחייב עדכון ידני מתמיד
  • עיוורים לאיומים חדשים (Zero-Day)
  • שיעור false-positive גבוה
  • לא מתאים לנפחי תעבורה גדולים

למידת מכונה (ML)

  • לומד אוטומטית את הנורמה
  • מזהה איומים לא מוכרים
  • מותאם אישית לסביבת הארגון
  • ניתן להרחבה לנפחים גדולים

7

🔍 איך ML מזהה חריגות? — האנלוגיה של השומר

דמיינו שומר בכניסה לבניין שלמד את "הנורמה": עובדים עם תגים, בשעות קבועות, במסלולים מוכרים. כשמישהו מגיע בלי תג, בשעה 3 לפנות בוקר, ורץ לחדר השרתים — השומר מזהה חריגה!

למידת מכונה (machine learning)

עושה בדיוק את זה, רק על מיליוני אירועים בשנייה:

01

לומד נורמלי

בניית פרופיל התנהגות רגילה.

02

מזהה סטייה

איתור אירועים החורגים מהפרופיל.

03

מתריע

התראה על אירועי אבטחה פוטנציאליים.


8

אלגוריתמים

מפת האלגוריתמים — סקירה כללית

בחירת האלגוריתם תלויה בסוג הנתונים, נפח התעבורה ודרישות זמן האמת. נעבור על כל קטגוריה בפירוט.


9

תת-קורס מבוא

מבוא לסטטיסטיקה לזיהוי חריגות

לפני שנצלול לאלגוריתמים — נבין את הבסיס הסטטיסטי שעליו הם בנויים.

ממוצע וסטיית תקן

הבסיס לכל ניתוח סטטיסטי. מגדיר מה "נורמלי" ומה חריג.
(Mean & Standard Deviation)

התפלגות נורמלית

עקומת הפעמון: רוב הנתונים מתרכזים סביב הממוצע, וחריגים נמצאים בקצוות.
(Normal Distribution)

Z-Score

מדד המציין כמה סטיות תקן נקודה מרוחקת מהממוצע. ערך מעל 3 מסמן חריגה.
(Z-Score)

IQR ואחוזונים

שיטה עמידה לזיהוי חריגות שאינה מניחה התפלגות נורמלית. מתאימה לנתונים מוטים.
(IQR & Percentiles)


10

תת-קורס מבוא

📊 נתונים — מה זה בכלל?

נתון הוא מדידה אחת של תכונה מסוימת. לדוגמה, גובה של אדם, ציון במבחן או זמן תגובה של שרת.

דאטאסט (Dataset) הוא אוסף של מדידות רבות — מיליוני חבילות רשת, טמפרטורות יומיות או רשומות מכירה.

סוגי נתונים מרכזיים

מספריים (כמה?)

ערכים כמותיים ניתנים למדידה.
דוגמה: נפח תעבורה, מספר חיבורים.

קטגוריאליים (מה סוג?)

ערכים איכותיים המייצגים קטגוריות.
דוגמה: סוג פרוטוקול, מערכת הפעלה.

זמניים (מתי?)

ערכים הקשורים לזמן.
דוגמה: חותמת זמן של אירוע, משך חיבור.

כל חבילת רשת הנכנסת או היוצאת מהארגון נחשבת לנתון בודד. מיליוני חבילות יוצרות דאטאסט רחב שבו ML יכול לזהות חריגות.


11

תת-קורס מבוא

ממוצע וסטיית תקן — הבסיס של הכל

לפני שנוכל לזהות חריגות, עלינו להבין מה נחשב ל"נורמלי" מבחינה סטטיסטית. נתחיל עם אבני הבניין הסטטיסטיים.

ממוצע ( / )

הערך האופייני והמרכזי של קבוצת נתונים. מחשבים אותו כסכום כל הערכים חלקי מספרם. הממוצע נותן לנו נקודת ייחוס בודדת לתיאור הנתונים.

סטיית תקן ()

מדד לפיזור הנתונים סביב הממוצע. ככל שסטיית התקן () גדולה יותר, כך הנתונים מפוזרים ורחוקים יותר מהמרכז.

🧍 אנלוגיה: גובה אנשים

דמיינו כיתה עם ממוצע גובה של 170 ס"מ וסטיית תקן של 10 ס"מ. רוב התלמידים יהיו בין 160 ל־180 ס"מ. אדם בגובה 220 ס"מ יבלוט מיד כחריג!

🌐 דוגמה מרשת

ממוצע חבילות לשנייה ברשת הוא 1,000, עם סטיית תקן של 200. לפתע המערכת מדווחת על 5,000 חבילות לשנייה — חריגה ברורה, כיוון שהיא מרוחקת מאוד מהממוצע.

הבנת הממוצע () וסטיית התקן () היא קריטית לקביעת ספים וזיהוי אירועים חריגים.


12

תת-קורס מבוא

התפלגות נורמלית — עקומת הפעמון

עקומת הפעמון (עקומת גאוס) מתארת איך רוב הנתונים מתרכזים סביב הממוצע, ורק אחוז קטן נמצא בקצוות. זהו הבסיס להבנת 'מה נורמלי' סטטיסטית. ככל שנתון רחוק יותר מהממוצע, כך הוא חריג יותר.

68%

בטווח סטיית תקן אחת

מהממוצע

95%

בטווח שתי סטיות תקן

מהממוצע

99.7%

בטווח שלוש סטיות תקן

מהממוצע

דוגמה: זמן תגובה של שרת

רוב בקשות השרת נענות בתוך 50-150 מילישניות. בקשה שלוקחת מעל 500 מילישניות היא חריגה קיצונית, כיוון שהיא נופלת מחוץ ל-3 סטיות תקן מהנורמה.


13

תת-קורס מבוא

אחוזונים (Percentiles) — מה הם ואיך עובדים?

לא כל הנתונים מתנהגים לפי התפלגות נורמלית. במקרים אלו, אחוזונים וטווח בין-רבעוני (IQR) מספקים דרך חזקה לזהות חריגות מבלי להניח נורמליות.

אחוזונים (Percentiles)

אחוזון מייצג את הערך שמתחתיו נמצא אחוז מסוים מהנתונים.

  • האחוזון ה-25 () — מתחתיו 25% מהנתונים
  • האחוזון ה-50 () — החציון, מחצית הנתונים מתחתיו
  • האחוזון ה-75 () — מתחתיו 75% מהנתונים

14

תת-קורס מבוא

IQR — טווח בין-רבעוני לזיהוי חריגות

טווח בין-רבעוני (IQR)

ה-IQR הוא טווח המכיל את 50% האמצעיים של הנתונים, בין Q1 ל-Q3. הוא פחות רגיש לערכים חריגים מאשר סטיית תקן, ולכן אידיאלי כאשר הנתונים אינם מתפלגים נורמלית.

IQR = Q3 − Q1

חריג אם: x < Q1 − 1.5 × IQR או x > Q3 + 1.5 × IQR

אנלוגיה: ציוני בגרות

בכיתה מסוימת, אם Q1 = 60 ו-Q3 = 85, אז ה-IQR הוא 25. ציון של 10 (מחוץ לטווח Q1 − 1.5 × IQR) או ציון של 130 (מחוץ לטווח Q3 + 1.5 × IQR) ייחשבו לחריגות סטטיסטיות.

דוגמה מרשת: גדלי קבצים

בהעברות קבצים, ייתכן ש-Q1 = 10KB ו-Q3 = 10MB. קובץ בגודל 500MB ייחשב לחריגה המצריכה בדיקה. השיטה עמידה בפני ערכים קיצוניים המעוותים ממוצעים.


15

תת-קורס מבוא

קורלציה ותלות — כשמשתנים קשורים זה לזה

קורלציה (Correlation) מודדת את העוצמה והכיוון של הקשר הלינארי בין שני משתנים. היא עוזרת לנו להבין איך שינוי במשתנה אחד משפיע על שינוי במשתנה אחר.

הערך שלה נע בין (קורלציה שלילית מושלמת) ל- (קורלציה חיובית מושלמת), כאשר מצביע על חוסר קשר לינארי.

קורלציה חיובית

כשאחד עולה, השני עולה (או כשאחד יורד, השני יורד). לדוגמה: יותר משתמשים פעילים באתר = יותר תעבורת רשת.

קורלציה שלילית

כשאחד עולה, השני יורד (או כשאחד יורד, השני עולה). לדוגמה: יותר עומס על השרת = פחות מהירות תגובה.

חשיבות לזיהוי חריגות

אם הקורלציה הרגילה נשברת, זו חריגה. לדוגמה: תעבורה גבוהה אך מעט משתמשים = מתקפת DDoS פוטנציאלית.

16


תת-קורס מבוא

🧮 תרגיל — חשבו בעצמכם!

בואו נראה איך חריגים יכולים להשפיע על המדדים הסטטיסטיים. נתבונן בזמני תגובה של שרת במילישניות:

[120, 130, 115, 125, 118, 122, 800, 119, 121, 117]

1) מהו הממוצע של זמני התגובה?

תשובה: כ-188.7 מילישניות (לאחר חישוב: (120+130+115+125+118+122+800+119+121+117) / 10)

2) איזה ערך בקבוצה הוא חריג באופן ברור?

תשובה: 800 מילישניות. הוא רחוק משמעותית מרוב שאר הנתונים.

3) למה הממוצע "מרומה" על ידי הערך החריג?

תשובה: הערך החריג (800ms) מושך את הממוצע כלפי מעלה, ובכך גורם לו לא לייצג נאמנה את מרבית הנתונים ה"נורמליים".

מסקנה: במקרים בהם יש חריגים, מדדים כמו ה-IQR עדיפים על הממוצע לייצוג מרכז הנתונים וזיהוי חריגות, כיוון שהם פחות רגישים אליהם.


17

תת-קורס מבוא

📈 ויזואליזציה — לראות את הנתונים

לפני כל חישוב — תמיד תסתכלו על הנתונים!

01

היסטוגרמה

מראה כמה פעמים כל ערך מופיע (מצוין לראות התפלגות).

02

Box Plot

מראה ממוצע, רבעונים וחריגים בבת אחת.

03

גרף זמן (Time Series)

מראה שינויים לאורך זמן.

דוגמה מרשת: היסטוגרמה של גדלי חבילות — חריגה = עמודה בודדת רחוקה מהשאר.


18

תת-קורס מבוא

🎲 הסתברות בסיסית — מה הסיכוי?

הסתברות מודדת כמה סביר שמשהו יקרה. הערך שלה נע בין 0 (בלתי אפשרי) ל-1 (ודאי).

דוגמאות פשוטות: הטלת מטבע והשגת "עץ" = 0.5 (50% סיכוי). הטלת קוביה והשגת "6" = 1/6 (כ-16.7% סיכוי).

חשיבות לזיהוי חריגות: אם הסתברות של אירוע מסוים נמוכה מאוד (למשל, 0.001) — הדבר מצביע על חריגה פוטנציאלית הדורשת בדיקה.

דוגמה מרשת: הסתברות שמשתמש יתחבר משלוש מדינות שונות באותה שעה = 0.0001
→ זוהי חריגה משמעותית המצריכה התראה!

0.5

אירוע רגיל

סבירות גבוהה, חלק מהנורמה.

0.05

אירוע חשוד

נמוך מספיק כדי לעורר חשד.

0.001

אירוע חריג

נדיר ביותר, כמעט בלתי אפשרי במצב רגיל.


19

תת-קורס מבוא

✅ סיכום — הכלים הסטטיסטיים שלנו

נתונים

מה זה: הבסיס לכל ניתוח, נקודות מידע גולמיות.

זיהוי חריגות: הבנת טבעם קריטית לבחירת כלי הזיהוי הנכון.

ממוצע / סטיית תקן

מה זה: מדדי מיקום ופיזור. ממוצע - מרכז, סטיית תקן - פיזור סביבו.

זיהוי חריגות: טובים לנתונים סימטריים. חריגים רחוקים מהממוצע ביותר מ-2-3 סטיות תקן.

התפלגות נורמלית

מה זה: עקומת פעמון, רוב הנתונים קרובים לממוצע. כלל 68-95-99.7.

זיהוי חריגות: מזהה חריגים על בסיס מיקומם בעקומת הפעמון (מעבר ל-3 סטיות תקן).

IQR / אחוזונים

מה זה: אחוזונים מחלקים נתונים, IQR הוא טווח הרבעונים האמצעי. פחות רגישים לחריגים.

זיהוי חריגות: אידיאלי לנתונים לא נורמליים. חריגים מחוץ לגבולות IQR ± 1.5 * IQR.

קורלציה

מה זה: מודדת קשר לינארי בין משתנים. חיובית (+1) או שלילית (-1).

זיהוי חריגות: שבירה של קשר צפוי בין משתנים, למשל: שינוי במשתנה אחד ללא שינוי מתאים בשני.

עכשיו מוכנים לאלגוריתמים! 🚀


20

תת-קורס מבוא

🎯 עכשיו נשלב הכל — Z-Score ו-IQR בפעולה

חיבור בין מה שלמדנו (ממוצע, סטיית תקן, IQR) לבין האלגוריתמים הסטטיסטיים לזיהוי חריגות.

  • Z-Score: כמה סטיות תקן הנקודה רחוקה מהממוצע. מניח התפלגות נורמלית.
  • IQR (טווח בין-רבעוני): האם הנקודה מחוץ לגבולות הרבעונים. עובד גם בלי הנחת נורמליות.
01

Z-Score

לנתונים עם התפלגות נורמלית

02

IQR

לנתונים ללא התפלגות נורמלית


21

שיטות סטטיסטיות — Z-Score ו-IQR

השיטות הסטטיסטיות הן נקודת הפתיחה הקלאסית לזיהוי חריגות. הן מניחות שנתונים נורמליים מתפלגים סביב ממוצע ידוע, וסטייה חדה מסמנת חריגה. הן פשוטות, מהירות, ומתאימות לנתוני רשת כמו גדלי חבילות, ספירות חיבורים, ועיכובים.

Z-Score — הנוסחה והרקע

ה-Z-Score מחשב כמה סטיות תקן ערך נמצא מהממוצע:

z = (x − μ) / σ

כאשר μ הוא הממוצע וσ היא סטיית התקן. הנחות:

  • הנתונים מתפלגים נורמלית
  • אין ערכים קיצוניים חזקים שמסיטים את הממוצע
  • כמות נתונים גדולה מספיק

בחירת סף: סף של 3 נפוץ (99.7% מהנתונים הנורמליים בטווח), אך ניתן להחמיר ל-2.5 לרשתות רגישות.

IQR — עמידות בפני ערכים קיצוניים

ה-IQR (Interquartile Range) מסתמך על הרבעונים ולא על הממוצע:

IQR = Q3 − Q1

גבולות החריגה:

מתחת ל-Q1 − 1.5·IQR

או מעל Q3 + 1.5·IQR

יתרונות על פני Z-Score:

  • עמיד בפני ערכים קיצוניים (robust) — הממוצע לא מושפע
  • לא מניח התפלגות נורמלית
  • מתאים לנתונים עם skew חזק
  • מומלץ כשיש מעט נתונים

Modified Z-Score — גרסה עמידה יותר

ה-Modified Z-Score משתמש ב-חציון (median) במקום ממוצע, וב-MAD (Median Absolute Deviation) במקום סטיית תקן — מה שהופך אותו לעמיד הרבה יותר בנוכחות ערכים קיצוניים:

Modified Z = 0.6745 * (x − median) / MAD

ערכים מעל 3.5 נחשבים חריגים (Iglewicz & Hoaglin, 1993)

Z-Score

  • מהיר וקל להסבר
  • מניח התפלגות נורמלית
  • רגיש לערכים קיצוניים
  • סף מומלץ: 3

IQR

  • עמיד בפני קיצוניים
  • אינו מניח נורמליות
  • מתאים ל-skewed data
  • גורם: 1.5×IQR

Modified Z-Score

  • עמיד ביותר מבין השלושה
  • משתמש בחציון ו-MAD
  • מתאים לנתונים עם noise
  • סף מומלץ: 3.5

22

Z-Score על נתוני תעבורת רשת — קוד

Z-Score על נתוני תעבורת רשת

import numpy as np
from scipy import stats
import pandas as pd

# Simulated network traffic: packet sizes (bytes)
np.random.seed(42)
normal_traffic = np.random.normal(loc=500, scale=50, size=1000)
# Inject anomalies (large packets, possible exfiltration)
anomalies = np.array([2000, 2500, 1800, 3000])
data = np.concatenate([normal_traffic, anomalies])

df = pd.DataFrame({'packet_size': data})

# Compute Z-Score
df['z_score'] = np.abs(stats.zscore(df['packet_size']))

# Flag anomalies with threshold = 3
threshold = 3
df['is_anomaly'] = df['z_score'] > threshold

print(f"Detected {df['is_anomaly'].sum()} anomalies")
print(df[df['is_anomaly']][['packet_size', 'z_score']])

23

IQR על נתוני ספירת חיבורים — קוד

IQR על נתוני ספירת חיבורים

import numpy as np
import pandas as pd

# Simulated connection counts per second
np.random.seed(42)
normal_conn = np.random.poisson(lam=20, size=1000)
# Inject anomalies (DDoS-like spike)
anomalies = np.array([500, 750, 600, 480])
data = np.concatenate([normal_conn, anomalies])

df = pd.DataFrame({'connections': data})

# Compute IQR bounds
Q1 = df['connections'].quantile(0.25)
Q3 = df['connections'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

df['is_anomaly'] = (
    (df['connections'] < lower) |
    (df['connections'] > upper)
)

print(f"Q1={Q1}, Q3={Q3}, IQR={IQR}")
print(f"Bounds: [{lower:.1f}, {upper:.1f}]")
print(f"Detected {df['is_anomaly'].sum()} anomalies")

24 / 70

השוואה מקיפה — Z-Score, IQR ו-Modified Z-Score

השוואת שלוש השיטות על אותו דאטאסט:

import numpy as np
import pandas as pd
from scipy import stats

# Generate dataset with mixed anomalies
np.random.seed(0)
normal = np.random.normal(loc=300, scale=40, size=500)
anomalies = np.array([1000, 950, 1100, -200, 1200])
data = pd.Series(np.concatenate([normal, anomalies]), name='metric')

results = pd.DataFrame({'value': data})

# --- Method 1: Z-Score ---
results['z_score'] = np.abs(stats.zscore(data))
results['zscore_flag'] = results['z_score'] > 3

# --- Method 2: IQR ---
Q1, Q3 = data.quantile(0.25), data.quantile(0.75)
IQR = Q3 - Q1
results['iqr_flag'] = (data < Q1 - 1.5*IQR) | (data > Q3 + 1.5*IQR)

# --- Method 3: Modified Z-Score (robust) ---
median = np.median(data)
mad = np.median(np.abs(data - median))
results['mod_z'] = 0.6745 * np.abs(data - median) / mad
results['mod_z_flag'] = results['mod_z'] > 3.5

# Summary
print("=== Anomaly Detection Comparison ===")
print(f"Z-Score    detected: {results['zscore_flag'].sum()} anomalies")
print(f"IQR        detected: {results['iqr_flag'].sum()} anomalies")
print(f"Modified Z detected: {results['mod_z_flag'].sum()} anomalies")

# Show rows flagged by at least one method
flagged = results[
    results['zscore_flag'] | results['iqr_flag'] | results['mod_z_flag']
]
print("\nFlagged records:")
print(flagged[['value','zscore_flag','iqr_flag','mod_z_flag']])

25

Isolation Forest

עקרון ה"בידוד"

Isolation Forest הוא אחד האלגוריתמים הפופולריים ביותר לזיהוי חריגות. הרעיון: נקודות חריגות קל יותר לבודד בעץ החלטה — הן דורשות פחות חיתוכים. האלגוריתם בונה יערות עצים אקראיים ומודד את "עומק הבידוד" של כל נקודה.

from sklearn.ensemble import IsolationForest

model = IsolationForest(
    n_estimators=100,
    contamination=0.05,  # 5% anomalies expected
    random_state=42
)
model.fit(X_train)
predictions = model.predict(X_test)
# -1 = anomaly, 1 = normal

26

Isolation Forest — ביצועים ותוצאות

יתרונות

  • מהיר מאוד גם על נתונים גדולים
  • עובד ללא תוויות (Unsupervised)
  • מטפל טוב בממדים גבוהים
  • קל להגדרה ולהרצה

מגבלות

  • רגיש לפרמטר Contamination
  • פחות יעיל לחריגות קולקטיביות
  • לא אידיאלי לנתוני time-series
100

עצים מומלצים

n_estimators אופטימלי

5%

Contamination טיפוסי

ברשתות ארגוניות

O(n)

סיבוכיות זמן

ליניארית בנפח הנתונים

27


Local Outlier Factor (LOF)

LOF משווה את צפיפות השכנות של כל נקודה לצפיפות שכניה. נקודה עם צפיפות נמוכה בהרבה משכניה מסומנת כחריגה. אידיאלי לתעבורת רשת עם צלילים מקומיים.

from sklearn.neighbors import LocalOutlierFactor

lof = LocalOutlierFactor(
    n_neighbors=20,
    contamination=0.05,
    novelty=False  # True for predict on new data
)
labels = lof.fit_predict(X)
scores = lof.negative_outlier_factor_
# More negative = more anomalous

28

Deep Learning

Autoencoders לזיהוי חריגות

Autoencoder

הוא רשת נוירונים שלומדת לדחוס לפרוס ולשחזר נתונים נורמליים.

כאשר מוזנת חריגה,

שגיאת השחזור,

(Reconstruction Error) תהיה גבוהה, מה שמסמן אותה כ

import tensorflow as tf

encoder = tf.keras.Sequential([
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(16, activation='relu')
])
decoder = tf.keras.Sequential([
    tf.keras.layers.Dense(32, activation='relu'),
    tf.keras.layers.Dense(64, activation='relu'),
    tf.keras.layers.Dense(input_dim, activation='sigmoid')
])

29

אימון Autoencoder — בניית הארכיטקטורה

pip install tensorflow numpy

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, Model

# Build Autoencoder
input_layer = layers.Input(shape=(input_dim,))
encoded = layers.Dense(64, activation='relu')(input_layer)
encoded = layers.Dense(32, activation='relu')(encoded)
latent = layers.Dense(16, activation='relu')(encoded)
decoded = layers.Dense(32, activation='relu')(latent)
decoded = layers.Dense(64, activation='relu')(decoded)
output_layer = layers.Dense(input_dim,
                activation='sigmoid')(decoded)

autoencoder = Model(input_layer, output_layer)
autoencoder.compile(optimizer='adam', loss='mse')

ייבוא ספריות

numpy לחישובים מתמטיים, tensorflow כמסגרת למידה עמוקה, keras.layers לבניית שכבות הרשת

שכבת Input

layers.Input(shape=(input_dim,)) — מגדיר את מספר הפיצ'רים שנכנסים לרשת

Encoder 64→32→16

שלוש שכבות דחיסה. כל שכבה מצמצמת את הממדים. שכבת ה-Latent (16) היא "צוואר הבקבוק"

Decoder 16→32→64

שכבות הפענוח — מנסות לשחזר את הקלט המקורי מהייצוג הדחוס

compile — הגדרת אימון

optimizer=adam: אדפטיבי ומהיר. loss=mse: מודד שגיאת שחזור בריבוע

30


אימון Autoencoder — אימון וזיהוי חריגות

pip install tensorflow numpy

# Train ONLY on normal traffic
autoencoder.fit(X_normal, X_normal,
    epochs=50, batch_size=256,
    validation_split=0.1)

# Detect anomalies — compute reconstruction error
reconstructions = autoencoder.predict(X_test)
mse = np.mean(np.power(X_test - reconstructions, 2), axis=1)

# Set threshold at 95th percentile of training errors
threshold = np.percentile(mse, 95)
anomalies = mse > threshold

autoencoder.fit(X_normal, X_normal, ...)

מאמנים את הרשת רק על תעבורה נורמלית. הקלט והפלט זהים — הרשת לומדת לשחזר נורמליות

epochs=50, batch_size=256

50 מחזורי אימון. batch_size=256 — כמה דוגמאות מעובדות בכל צעד

validation_split=0.1

10% מהנתונים שמורים לבדיקת overfitting בזמן אמת

autoencoder.predict(X_test)

מריצים את כל נתוני הבדיקה דרך הרשת ומקבלים שחזור

mse = np.mean(np.power(X_test - reconstructions, 2), axis=1)

מחשבים שגיאת שחזור לכל דוגמה. חריגה = שגיאה גבוהה

threshold = np.percentile(mse, 95)

הסף נקבע כ-Percentile 95 — כל מה שמעליו נחשב חריגה


31

LSTM לזיהוי חריגות ב

Time Series

רשתות LSTM (Long Short-Term Memory) מצוינות לנתוני רצפים כמו לוגים ותעבורת רשת. הן "זוכרות" הקשרים ארוכי טווח ומזהות כאשר סדרת אירועים חורגת מהדפוס הצפוי.

pip install tensorflow numpy

from tensorflow.keras.layers import LSTM, Dense
from tensorflow.keras.models import Sequential

model = Sequential([
    LSTM(64, input_shape=(timesteps, features),
         return_sequences=True),
    LSTM(32, return_sequences=False),
    Dense(timesteps * features)
])
model.compile(optimizer='adam', loss='mae')
model.fit(X_train, X_train, epochs=30)

from tensorflow.keras.layers import LSTM, Dense

ייבוא שכבת LSTM (זיכרון לטווח ארוך) ושכבה צפופה רגילה מ-Keras

Sequential([...])

בניית מודל רצפי — שכבות מחוברות אחת אחרי השנייה

LSTM(64, input_shape=(timesteps, features), return_sequences=True)

שכבת LSTM ראשונה עם 64 תאים. input_shape: timesteps = כמה צעדי זמן אחורה, features = מספר פיצ'רים. return_sequences=True מעביר את כל הרצף לשכבה הבאה

LSTM(32, return_sequences=False)

שכבת LSTM שנייה עם 32 תאים. return_sequences=False — מחזירה רק את הפלט האחרון

Dense(timesteps * features)

שכבת פלט שמנסה לשחזר את הרצף המקורי. גודלה = timesteps × features

compile(optimizer='adam', loss='mae')

MAE (Mean Absolute Error) כפונקציית הפסד — עמידה יותר לערכים קיצוניים מ-MSE

model.fit(X_train, X_train, epochs=30)

אימון על נתונים נורמליים בלבד. הקלט = הפלט הצפוי — הרשת לומדת לשחזר נורמליות


32

כלי קוד פתוח

PyOD — Python Outlier Detection

PyOD היא ספריית Python המובילה לזיהוי חריגות עם מעל 40 אלגוריתמים תחת ממשק אחיד. מושלמת להשוואת אלגוריתמים ולאב-טיפוס מהיר.

pip install pyod

from pyod.models.iforest import IForest
from pyod.models.lof import LOF
from pyod.models.auto_encoder import AutoEncoder
from pyod.models.knn import KNN

# Unified API for all algorithms
clf = IForest(contamination=0.05)
clf.fit(X_train)
y_pred = clf.predict(X_test)        # 0=normal, 1=anomaly
scores = clf.decision_function(X_test)  # anomaly scores

pip install pyod

התקנת PyOD — ספריית Python המובילה עם 40+ אלגוריתמי זיהוי חריגות תחת ממשק אחיד

from pyod.models.iforest import IForest

ייבוא Isolation Forest מ-PyOD. ניתן להחליף ל-LOF, AutoEncoder, KNN — אותו ממשק בדיוק

clf = IForest(contamination=0.05)

יצירת מודל. contamination=0.05 = אנחנו מצפים ש-5% מהנתונים יהיו חריגים

clf.fit(X_train)

אימון המודל על נתוני האימון. ב-PyOD כל האלגוריתמים משתמשים באותה פקודה

y_pred = clf.predict(X_test)

חיזוי: מחזיר 0 = נורמלי, 1 = חריגה. אחיד לכל 40+ האלגוריתמים

scores = clf.decision_function(X_test)

ציון רציף: ערך גבוה יותר = חריגה חזקה יותר. שימושי לתעדוף התראות


33 / 68


Alibi Detect — כלי מתקדם לייצור

Alibi Detect של Seldon היא ספרייה ברמת ייצור לזיהוי חריגות, drift ועוד. מתאימה לצינורות MLOps מלאים עם תמיכה ב-TensorFlow ו-PyTorch.

pip install alibi-detect

from alibi_detect.od import IForest, OutlierAE
from alibi_detect.utils.saving import save_detector

# Autoencoder Outlier Detector
od = OutlierAE(threshold=0.012,
               encoder_net=encoder,
               decoder_net=decoder)
od.fit(X_train, epochs=30)

# Save for production
save_detector(od, './anomaly_detector')

# Predict with metadata
result = od.predict(X_test,
    outlier_type='instance',
    return_feature_score=True)

pip install alibi-detect

התקנת Alibi Detect של Seldon — ספרייה ברמת ייצור עם תמיכה ב-TensorFlow ו-PyTorch

import IForest, OutlierAE

ייבוא גלאי חריגות: IForest = Isolation Forest, OutlierAE = Autoencoder-based detector

OutlierAE(threshold=0.012, ...)

יצירת גלאי מבוסס Autoencoder. threshold = סף שגיאת שחזור. encoder_net ו-decoder_net = רשתות שהגדרתם מראש

od.fit(X_train, epochs=30)

אימון הגלאי על נתונים נורמליים בלבד. epochs=30 = מספר מחזורי אימון

save_detector(od, './anomaly_detector')

שמירת המודל לדיסק לשימוש בייצור. ניתן לטעון מאוחר יותר עם load_detector

od.predict(..., return_feature_score=True)

חיזוי עם מטא-דאטה: outlier_type='instance' = בדיקה ברמת הדוגמה, return_feature_score=True = מחזיר ציון לכל פיצ'ר בנפרד


34 / 68

River — זיהוי חריגות בזמן אמת (Online ML)

River היא ספריית Python ל-Online ML — למידה מתמשכת מ-stream של נתונים ללא צורך לאמן מחדש. מושלמת לניטור תעבורת רשת בזמן אמת.

pip install river

from river import anomaly
from river import preprocessing

# Half-Space Trees for streaming anomaly detection
model = (
    preprocessing.StandardScaler() |
    anomaly.HalfSpaceTrees(
        n_trees=25,
        height=15,
        window_size=250,
        seed=42
    )
)

# Process each packet as it arrives
for packet in network_stream:
    features = extract_features(packet)
    score = model.score_one(features)
    model.learn_one(features)
    if score > 0.7:
        alert(packet, score)

pip install river

התקנת River — ספריית Online ML לעיבוד stream של נתונים. לומדת מכל דוגמה בנפרד, ללא צורך לאמן מחדש.

StandardScaler() | HalfSpaceTrees(...)

פייפליין: | מחבר שלבים. StandardScaler מנרמל, HalfSpaceTrees מזהה חריגות.

n_trees=25, height=15, window_size=250

n_trees=25: מספר עצים. height=15: עומק כל עץ. window_size=250: כמה דוגמאות אחרונות נשמרות בזיכרון.

score = model.score_one(features)

מחשב ציון חריגה לדוגמה הנוכחית לפני שמעדכן את המודל. ציון גבוה = חריגה.

model.learn_one(features)

מעדכן את המודל עם הדוגמה הנוכחית. כך המודל מסתגל לשינויים בתעבורה לאורך זמן.

if score > 0.7: alert(...)

סף 0.7 מסמן חריגה. ניתן לכוון — ערך גבוה יותר = פחות התראות שגויות.


35

Scikit-learn — ארסנל מובנה לזיהוי חריגות

IsolationForest

sklearn.ensemble

הכי פופולרי, מהיר, לנתונים גבוהי ממד

OneClassSVM

sklearn.svm

טוב לנתונים קטנים, מגדיר גבול החלטה

LocalOutlierFactor

sklearn.neighbors

מבוסס צפיפות, אידיאלי לחריגות מקומיות

EllipticEnvelope

sklearn.covariance

להנחת גאוסיאן, עמיד לרעשים


36

Feature Engineering

לתעבורת רשת

איכות הפיצ'רים קובעת את הצלחת המודל. תעבורת רשת עשירה בסיגנלים — השאלה היא אילו לחלץ.

מאפייני זמן

משך חיבור, זמן בין חבילות (IAT), שעת יום, יום בשבוע

מאפייני רשת

פרוטוקול, פורט, גודל חבילה, כיוון תעבורה, Flags TCP

סטטיסטיקות זרימה

מספר חבילות, bytes סה"כ, יחס Upload/Download, variance

פרופיל התנהגותי

ממוצע חיבורים לשעה, יעדים ייחודיים, entropy של DNS


37

עיבוד נתוני רשת — CICFlowMeter ו-Scapy

לפני הזנת נתונים למודל יש לחלץ פיצ'רים מקבצי PCAP. שני הכלים הנפוצים ביותר:

CICFlowMeter

כלי Java/Python לחילוץ אוטומטי של 80+ פיצ'רים מ-PCAP. מייצר CSV מוכן לאימון.

# Install
pip install cicflowmeter

# Extract features
cicflowmeter -f capture.pcap \
  -c output.csv

Scapy

ספריית Python לניתוח מעמיק של חבילות רשת. מאפשרת חילוץ מותאם אישית.

from scapy.all import rdpcap

packets = rdpcap('capture.pcap')
for pkt in packets:
    if pkt.haslayer('IP'):
        src = pkt['IP'].src
        size = len(pkt)

38

דאטאסטים לאימון ובנצ'מרקינג

KDD Cup 1999

הדאטאסט הקלאסי לזיהוי חדירות. 5 מיליון רשומות, 41 פיצ'רים. טוב לתרגול בסיסי.

CICIDS 2017/2018

תעבורה מודרנית עם מתקפות DDoS, Brute Force, SQL Injection. מומלץ מאוד.

UNSW-NB15

175,341 רשומות, 49 פיצ'רים, 9 סוגי מתקפות. נוצר ב-2015 בסביבה מבוקרת.

NSL-KDD

גרסה משופרת של KDD ללא כפילויות. נפוץ בהשוואות אלגוריתמים.


39

פיפליין מלא

ארכיטקטורת פיפליין זיהוי חריגות

פיפליין ייצור מלא חייב לכלול כל חמשת השלבים. חסרון בכל שלב — ולו אחד — פוגע באמינות המערכת כולה.


40

Zeek (Bro) — ניטור רשת בקוד פתוח

Zeek (לשעבר Bro) הוא מנתח תעבורת רשת חזק במיוחד. הוא מייצר לוגים מובנים עשירים המתאימים ישירות לאימון מודלי ML.

# Zeek generates structured logs automatically:
# conn.log, http.log, dns.log, ssl.log

# Parse Zeek logs with Python
import pandas as pd
from zeekcut import ZeekCut

# Load connection log
conn_df = pd.read_csv('conn.log', sep='\t',
    comment='#',
    names=['ts','uid','src','sport','dst','dport',
           'proto','service','duration','bytes'])

# Feature for ML
conn_df['bytes_per_sec'] = (
    conn_df['bytes'] / conn_df['duration'].clip(0.001)
)

41

הערכת מודל — מדדים לזיהוי חריגות

במצבי חוסר איזון (class imbalance) — Accuracy חסרת ערך. צריך מדדים מותאמים:

Precision

מתוך כל ההתראות, כמה היו אמיתיות? גבוה = פחות False Positives. TP/(TP+FP)

Recall

מתוך כל החריגות האמיתיות, כמה גילינו? גבוה = פחות False Negatives. TP/(TP+FN)

F1-Score

ממוצע הרמוני בין Precision ל-Recall. המדד המאוזן ביותר. 2*(P*R)/(P+R)

AUC-ROC

מודד את יכולת ההפרדה הכוללת של המודל ללא תלות בסף. מומלץ לעקומות.


42

קוד הערכת מודל — מדדים וחישובים

pip install scikit-learn matplotlib

from sklearn.metrics import (
    classification_report,
    roc_auc_score,
    confusion_matrix,
    precision_recall_curve
)
import matplotlib.pyplot as plt

# Evaluate model
y_pred = model.predict(X_test)
y_scores = model.decision_function(X_test)

print(classification_report(y_test, y_pred,
    target_names=['Normal', 'Anomaly']))

# AUC-ROC
auc = roc_auc_score(y_test, y_scores)
print(f"AUC-ROC: {auc:.4f}")

# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
print(f"False Positives: {cm[0][1]}")
print(f"False Negatives: {cm[1][0]}")
print(f"True Positives:  {cm[1][1]}")

from sklearn.metrics import ...

ייבוא כלי הערכה: classification_report לדוח מפורט, roc_auc_score לציון AUC, confusion_matrix למטריצת בלבול, precision_recall_curve לעקומת PR

model.predict(X_test)

מריצים את המודל על נתוני הבדיקה. מחזיר 1 (נורמלי) או -1 (חריגה) עבור Isolation Forest

model.decision_function(X_test)

מחזיר ציון רציף (לא בינארי). ציון נמוך יותר = חריגה חזקה יותר. נדרש לחישוב AUC

classification_report(...)

מדפיס Precision, Recall ו-F1 לכל קלאס. הכי חשוב: Recall של קלאס החריגות

roc_auc_score(y_test, y_scores)

AUC-ROC: 1.0 = מושלם, 0.5 = אקראי. מדד עיקרי לאיכות מודל זיהוי חריגות

confusion_matrix

cm[0][1] = False Positives (התראות שגויות), cm[1][0] = False Negatives (חריגות שפוספסו — הכי מסוכן!)


43

UEBA

זיהוי חריגות התנהגות משתמשים (UEBA)

UEBA (User and Entity Behavior Analytics) מרחיבה את זיהוי החריגות מרשת לרמת המשתמש. המטרה: לזהות Insider Threats, גניבת אישורים, ועבירות מדיניות.

פרופיל בסיס

כניסות רגילות, שעות עבודה, שרתים נגישים, נפח נתונים

חריגות מזוהות

כניסה ממדינה אחרת, גישה לשרת רגיש חדש, הורדת נתונים מסיבית

ציון סיכון

כל פעולה מקבלת ציון — צבירת ציונים מעל סף מפעילה התראה


44

מימוש UEBA — טעינת נתונים והנדסת פיצ'רים

pip install pandas scikit-learn

import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import LabelEncoder

# Load user activity logs
logs = pd.read_csv('user_activity.csv')

# Feature engineering per user session
features = logs.groupby(['user_id', 'session_id']).agg({
    'hour':        'first',
    'country':     'first',
    'data_bytes':  'sum',
    'resource':    'nunique',
    'failed_auth': 'sum'
}).reset_index()

# Encode categorical features
le = LabelEncoder()
features['country_enc'] = le.fit_transform(features['country'])

pd.read_csv('user_activity.csv')

טוענים לוג פעילות משתמשים מקובץ CSV. כל שורה = פעולה אחת של משתמש

groupby(['user_id', 'session_id'])

מקבצים את הפעולות לפי משתמש וסשן — כל סשן הופך לשורה אחת

hour: first

שעת תחילת הסשן — חשוב לזיהוי כניסות בשעות חריגות (לילה, סוף שבוע)

data_bytes: sum

סך הבייטים שהועברו בסשן — נפח גבוה חריג עלול להצביע על Exfiltration

resource: nunique

מספר משאבים שונים שנגשו אליהם — גישה למשאבים רבים = חשוד

failed_auth: sum

מספר ניסיונות אימות כושלים — אינדיקטור ל-Brute Force

LabelEncoder()

ממיר ערכים קטגוריאליים (כמו שם מדינה) למספרים שהמודל יכול לעבד


45

מימוש UEBA — אימון המודל וציוני סיכון

pip install pandas scikit-learn

# Train per-user baseline (unsupervised)
model = IsolationForest(contamination=0.03)
model.fit(features[numeric_cols])

# Risk score (-1 to 0 range, lower = riskier)
risk_scores = model.decision_function(features[numeric_cols])
features['risk'] = risk_scores

# Flag high-risk sessions
high_risk = features[features['risk'] < -0.1]
print(f"High-risk sessions: {len(high_risk)}")
print(high_risk[['user_id', 'hour', 'data_bytes', 'risk']].sort_values('risk'))

IsolationForest(contamination=0.03)

contamination=0.03 אומר שאנחנו מצפים ש-3% מהסשנים יהיו חריגים. כוונו לפי הסביבה שלכם

model.fit(features[numeric_cols])

אימון על כל הסשנים ללא תוויות. המודל לומד מה נורמלי לכל משתמש

model.decision_function(...)

מחזיר ציון רציף: קרוב ל-0 = נורמלי, שלילי = חריג. שונה מ-predict שמחזיר רק 1/-1

features['risk'] = risk_scores

שומרים את ציון הסיכון לכל סשן לצורך דיווח ותעדוף

features[features['risk'] < -0.1]

סף -0.1 מסמן סשנים בסיכון גבוה. ניתן לכוון לפי רמת הרגישות הרצויה

sort_values('risk')

ממיינים מהמסוכן ביותר — מאפשר לאנליסט לטפל בהתראות לפי עדיפות


46

Deep Learning

רשתות נוירונים גרפיות (GNN) — מבוא

רשתות נוירונים גרפיות (GNNs) הן סוג של מודל למידה עמוקה שתוכנן במיוחד לעבד נתונים המאורגנים במבנה גרפי. הן חיוניות לזיהוי חריגות במערכות מורכבות, שם הקשרים בין הישויות חשובים לא פחות מהישויות עצמן.

מהו גרף?

בסביבת רשת מחשבים: מחשבים ושרתים הם צמתים (Nodes), והקשרים ביניהם (תקשורת, חיבורים) הם קשתות (Edges).

כוחו של ייצוג גרפי

הוא לוכד את הקשרים והאינטראקציות בין ישויות, לא רק את נקודות הנתונים הבודדות. זה מאפשר הבנה עמוקה יותר של המערכת.

זיהוי חריגות בגרף

מאפשר לזהות דפוסי התקפה כמו "תנועה רוחבית" (Lateral Movement) שמתפשטת בין מכונות, וקשה לזיהוי בנתוני זרם סטנדרטיים.

איך GNN עובד?

כל צומת "לומד" מהשכנים שלו, כלומר, מאגד מידע מהמחשבים או השרתים המחוברים אליו ישירות ולאורך הגרף.

מתי להשתמש ב-GNN?

כאשר הקשרים בין ישויות חשובים באותה מידה כמו הישויות עצמן, לדוגמה: רשתות תקשורת, רשתות חברתיות, או מערכות פיננסיות.


47

Graph Neural Networks — קוד עם הסברים

Graph Anomaly Detection
מייצג את מחשבים, שרתים ומשתמשים
(edges)באמצעות קשתות-nodes ותקשורת ביניהם כ-.
מאפשר זיהוי של דפוסי תקיפה כמו

Lateral Movement
שבלתי אפשרי לזהות בנתוני זרם פשוטים.

pip install torch-geometric
pip install torch numpy

import torch
from torch_geometric.nn import GCNConv
from torch_geometric.data import Data

# Build network graph from connections
edge_index = torch.tensor(
    [[src_ids], [dst_ids]], dtype=torch.long)
x = torch.tensor(node_features, dtype=torch.float)

data = Data(x=x, edge_index=edge_index)

# GCN for anomaly scoring
class GraphAnomalyDetector(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = GCNConv(in_channels, 64)
        self.conv2 = GCNConv(64, 32)
        self.score  = torch.nn.Linear(32, 1)

pip install torch-geometric

ספריית PyTorch Geometric לעבודה עם גרפים.
דורשת התקנה מיוחדת בהתאם לגרסת CUDA.

edge_index = torch.tensor([[src_ids], [dst_ids]])

מטריצת הקשרים:
שורה 0 = מקורות, שורה 1 = יעדים.
כל עמודה = קשר (edge) אחד.

x = torch.tensor(node_features, dtype=torch.float)

מטריצת פיצ'רים:
כל שורה = node (מחשב/שרת),
כל עמודה = פיצ'ר (כמות חיבורים, bytes וכו').

Data(x=x, edge_index=edge_index)

אובייקט הגרף של PyG.
מכיל את הפיצ'רים והקשרים יחד.

GCNConv(in_channels, 64)

שכבת Graph Convolution: מצבר מידע מהשכנים.
כל node מקבל מידע מהמחשבים שמחובר אליהם.

self.score = torch.nn.Linear(32, 1)

שכבת פלט:
מייצרת ציון חריגה אחד לכל node ברשת.


47

DNS Anomaly

זיהוי חריגות DNS — מקרה בוחן

תעבורת DNS היא אחת הוקטורים הנפוצים ביותר להסתרת מתקפות. C2 Beaconing, DNS Tunneling ו-Data Exfiltration מסתתרים בתוך שאילתות DNS לגיטימיות לכאורה.

סימנים ל-DNS Tunneling

  • שאילתות ל-subdomains ארוכות חריגות
  • Entropy גבוה בשם הדומיין
  • תדירות גבוהה של TXT/NULL records
  • תגובות גדולות חריגות

זיהוי ב-Python

import math

def dns_entropy(domain):
    freq = {}
    for c in domain:
        freq[c] = freq.get(c, 0) + 1
    total = len(domain)
    return -sum(
        (v/total)*math.log2(v/total)
        for v in freq.values()
    )

# High entropy = suspicious
threshold = 3.5
suspicious = df[
  df['query'].apply(dns_entropy) > threshold
]

48


זיהוי C2 Beaconing — קוד עם הסברים

תוכנות זדוניות מתקשרות לשרת C2
במרווחי זמן קבועים (Beaconing).
זיהוי הדפוס הסדיר הזה בתוך רעש התעבורה
הוא אתגר קלאסי של זיהוי חריגות.

pip install numpy scipy

import numpy as np
from scipy import stats

def detect_beaconing(connection_times, threshold=0.1):
    """Detect periodic communication patterns."""
    intervals = np.diff(sorted(connection_times))
    
    if len(intervals) < 5:
        return False, 0
    
    # Low coefficient of variation = very regular
    cv = intervals.std() / intervals.mean()
    
    # Check periodicity with FFT
    fft = np.fft.fft(intervals)
    dominant_freq = np.argmax(np.abs(fft[1:])) + 1
    
    is_beacon = cv < threshold
    return is_beacon, cv

# Alert if beaconing detected
for host, times in host_connections.items():
    is_beacon, score = detect_beaconing(times)
    if is_beacon:
        print(f"ALERT: {host} beaconing (CV={score:.3f})")

intervals = np.diff(sorted(...))

ממיינים את זמני החיבור ומחשבים את ההפרשים ביניהם. Beaconing = הפרשים קבועים

if len(intervals) < 5: return False, 0

צריך לפחות 5 חיבורים כדי לקבוע דפוס. פחות מזה — אין מספיק נתונים

cv = intervals.std() / intervals.mean()

Coefficient of Variation: סטיית תקן חלקי ממוצע. CV נמוך = מרווחים קבועים = Beaconing

fft = np.fft.fft(intervals)

Fast Fourier Transform — מזהה תדרים דומיננטיים בנתונים. תדר חזק = תקשורת מחזורית

dominant_freq = np.argmax(np.abs(fft[1:])) + 1

מוצאים את התדר הדומיננטי ביותר (מדלגים על DC component)

is_beacon = cv < threshold

אם CV מתחת לסף (ברירת מחדל 0.1) — מסמנים כ-Beaconing חשוד

for host, times in host_connections.items()

עוברים על כל מארח ברשת ובודקים את דפוס החיבורים שלו


49 / 68

MLOps

ניהול מודלים בפרודקשן — MLOps לאבטחה

מודל שעובד בפיתוח אינו מובטח לעבוד בייצור.

שינויי תעבורה, מתקפות חדשות ו-Data Drift

דורשים ניטור ואימון מחדש מתמשך.


50

Data Drift — כשהרשת משתנה

Data Drift מתרחש כשדפוסי התעבורה משתנים לאורך זמן: עדכוני אפליקציות, מעבר לענן, עבודה מהבית. מודל שאומן על תעבורה ישנה יתחיל להפיק False Positives מסיביים.

זיהוי Drift

from alibi_detect.cd import (
    KSDrift,  # Kolmogorov-Smirnov
    MMDDrift  # Maximum Mean Discrepancy
)

# Monitor for distribution changes
drift_detector = KSDrift(
    x_ref=X_reference,
    p_val=0.05
)

result = drift_detector.predict(X_new)
if result['data']['is_drift']:
    print("DRIFT DETECTED — retrain needed")
    trigger_retraining_pipeline()

אסטרטגיות תגובה

  • אימון מחדש אוטומטי על חלון זמן עדכני
  • Weighted Training — עדיפות לנתונים חדשים
  • Online Learning עם River
  • התראה לאנליסט לבדיקה ידנית

from alibi_detect.cd import KSDrift, MMDDrift

ייבוא גלאי Drift: KSDrift = Kolmogorov-Smirnov (לפיצ'רים בודדים), MMDDrift = Maximum Mean Discrepancy (לכל הפיצ'רים יחד)

KSDrift(x_ref=X_reference, p_val=0.05)

יצירת גלאי. x_ref = נתוני הייחוס (תעבורה נורמלית ישנה). p_val=0.05 = רמת מובהקות סטטיסטית

drift_detector.predict(X_new)

בדיקה האם הנתונים החדשים שונים סטטיסטית מנתוני הייחוס

result['data']['is_drift']

True אם זוהה Drift.== False אם הנתונים עדיין דומים לייחוס

trigger_retraining_pipeline()

הפעלת פייפליין אימון מחדש אוטומטי. בייצור: מחובר ל-MLflow, Airflow או Kubeflow


51

SHAP — הסברתיות למודל אנומליות

SHAP מסביר
למה מודל סיווג רשומה כחריגה.
קריטי לאנליסטי מרכז האבטחה
שצריכים להבין ולאמת כל התראה.

pip install shap

import shap

# Explain Isolation Forest decisions
explainer = shap.TreeExplainer(isolation_forest_model)
shap_values = explainer.shap_values(X_test)

# Plot feature importance for anomaly
shap.waterfall_plot(
    shap.Explanation(
        values=shap_values[anomaly_idx],
        base_values=explainer.expected_value,
        data=X_test[anomaly_idx],
        feature_names=feature_names
    )
)

# Summary plot - which features matter most?
shap.summary_plot(shap_values, X_test,
    feature_names=feature_names)

52

אינטגרציה עם SIEM — קוד עם הסברים

SIEM (Security Information and Event Management)
הוא מערכת מרכזית שאוספת לוגים והתראות
מכל רכיבי הרשת — שרתים, פיירוולים, אנטי-וירוס ועוד
ומאפשרת לאנליסט לראות את כל התמונה במקום אחד.

הצעד הקריטי האחרון הוא חיבור המודל ל-SIEM הארגוני.
נתמקד ב-Elastic SIEM
כדוגמה לקוד פתוח.

pip install elasticsearch

from elasticsearch import Elasticsearch
from datetime import datetime
import json

es = Elasticsearch(['http://localhost:9200'])

def send_alert(anomaly_data, score, explanation):
    """Send anomaly alert to Elasticsearch/SIEM."""
    alert = {
        "@timestamp": datetime.utcnow().isoformat(),
        "event.category": "network",
        "event.type": "anomaly",
        "anomaly.score": float(score),
        "anomaly.explanation": explanation,
        "source.ip": anomaly_data['src_ip'],
        "destination.ip": anomaly_data['dst_ip'],
        "network.bytes": anomaly_data['bytes'],
        "severity": "high" if score > 0.8 else "medium"
    }
    
    es.index(
        index=f"anomalies-{datetime.now():%Y.%m.%d}",
        document=alert
    )
    print(f"Alert sent: {anomaly_data['src_ip']}")

es = Elasticsearch([...])

יצירת חיבור ל-Elasticsearch. בייצור: החליפו localhost בכתובת ה-SIEM האמיתית עם אימות

@timestamp: datetime.utcnow()

חותמת זמן UTC — קריטי לקורלציה עם אירועים אחרים ב-SIEM

event.category / event.type

שדות ECS (Elastic Common Schema) — תקן אחיד שמאפשר חיפוש אחיד בין מקורות שונים

anomaly.score: float(score)

ציון החריגה (0-1). מאפשר לאנליסט לתעדף התראות לפי חומרה

anomaly.explanation

הסבר מה גרם לחריגה (מ-SHAP). הופך את ההתראה לניתנת לפעולה

severity: high if score > 0.8

סיווג חומרה אוטומטי. ניתן להוסיף low לציונים מתחת ל-0.5

es.index(index=f'anomalies-...')

שמירה לאינדקס יומי. מאפשר ניהול retention policy ומחיקה אוטומטית של נתונים ישנים


53

VAE

Variational Autoencoders (VAE) — גנרטיבי לחריגות

  • VAE
  • לומד "מה נורמלי" — לא כנקודה אחת, אלא כהתפלגות הסתברותית
  • כשמוזנת חריגה — היא "לא מתאימה" להתפלגות, והציון עולה
  • בונוס: VAE יכול לייצר נתוני אימון סינתטיים כשיש מעט דאטה
pip install tensorflow numpy

import tensorflow as tf

class VAE(tf.keras.Model):
    def __init__(self, latent_dim):
        super().__init__()
        self.latent_dim = latent_dim
        self.encoder = self._build_encoder()
        self.decoder = self._build_decoder()
    
    def call(self, x):
        z_mean, z_log_var = self.encoder(x)
        # Reparameterization trick
        epsilon = tf.random.normal(
            shape=tf.shape(z_mean))
        z = z_mean + tf.exp(0.5*z_log_var)*epsilon
        reconstructed = self.decoder(z)
        # KL Divergence loss (regularization)
        kl_loss = -0.5 * tf.reduce_mean(
            1 + z_log_var - tf.square(z_mean) 
            - tf.exp(z_log_var))
        self.add_loss(kl_loss)
        return reconstructed

class VAE(tf.keras.Model)

הגדרת VAE כמחלקת Keras מותאמת. יורשת מ-tf.keras.Model כדי לאפשר לוגיקת אימון מותאמת

self.encoder = self._build_encoder()

הEncoder דוחס את הקלט לפרמטרים של התפלגות (z_mean ו-z_log_var) — לא לנקודה אחת

z_mean, z_log_var = self.encoder(x)

הEncoder מחזיר שני וקטורים: ממוצע ולוג-שונות של ההתפלגות הנורמלית הנלמדת

epsilon = tf.random.normal(...)

דגימה אקראית מהתפלגות נורמלית. זה מה שהופך את ה-VAE לגנרטיבי

z = z_mean + tf.exp(0.5*z_log_var)*epsilon

Reparameterization Trick: מאפשר גרדיאנטים לזרום דרך הדגימה האקראית

kl_loss = -0.5 * tf.reduce_mean(...)

KL Divergence: מדד כמה ההתפלגות הנלמדת קרובה לנורמלית סטנדרטית. מונע overfitting

self.add_loss(kl_loss)

הוספת KL loss לפונקציית ההפסד הכוללת. ה-VAE ממזג שגיאת שחזור + KL divergence


54

השוואת ביצועים — אלגוריתמים על CICIDS2017

LSTM ו-VAE ֿ

מובילים בביצועים אך דורשים יותר משאבי חישוב.

Isolation Forest

מציע את האיזון הטוב ביותר בין ביצועים למהירות.

55


זמן עיבוד — מהירות לעומת דיוק

הגרף מראה בבירור: Isolation Forest הוא המהיר ביותר (2ms לחיזוי), בעוד LSTM ו-VAE מציעים דיוק גבוה עם עיכוב מינימלי. One-Class SVM הוא האיטי ביותר עם הדיוק הנמוך ביותר.


56

Semi-Supervised

למידה חצי-מפוקחת — הטוב משני העולמות

ב-Semi-Supervised Learning משתמשים בכמות קטנה של דוגמאות מתויגות (ידנית ע"י אנליסטים) לצד כמות גדולה של נתונים לא מתויגים. מחקרים מראים שיפור של 15-25% ב-F1 לעומת שיטות לא מפוקחות לחלוטין.

from sklearn.semi_supervised import (
    LabelPropagation,
    LabelSpreading
)
import numpy as np

# -1 = unlabeled, 0 = normal, 1 = anomaly
y_mixed = np.full(len(X), -1)  # all unlabeled
y_mixed[labeled_normal_idx] = 0
y_mixed[labeled_anomaly_idx] = 1

# Label Propagation spreads known labels
model = LabelSpreading(
    kernel='rbf',
    alpha=0.2,
    max_iter=100
)
model.fit(X, y_mixed)
predictions = model.predict(X_test)

57

Active Learning — אנליסט כחלק מהמערכת

Active Learning מבקש מהאנליסט לתייג רק את הדוגמאות המסוכנות ביותר — אלה שהמודל הכי לא בטוח בהן. כך ניתן לשפר את המודל עם מינימום מאמץ אנושי.

from modAL.models import ActiveLearner
from modAL.uncertainty import uncertainty_sampling

learner = ActiveLearner(
    estimator=IsolationForest(contamination=0.05),
    query_strategy=uncertainty_sampling,
    X_training=X_initial,
    y_training=y_initial
)

# Query the most informative samples
query_idx, query_sample = learner.query(X_pool, n_instances=10)
# Analyst labels these 10 samples
y_new = analyst_review(query_sample)
learner.teach(X_pool[query_idx], y_new)

58

Network Forensics

חיבור ל-Suricata — IDS בזמן אמת

,Suricata הוא כלי ניטור רשת בקוד פתוח מסוג IDS/IPS
.כלומר מערכת שמזהה ומונעת חדירות.
שילובו עם מודל למידת מכונה ,מאפשר להעשיר את ההתראות המסורתיות
,עם ציוני חריגות מבוססי בינה מלאכותית,
.ובכך להפחית התראות שגויות

pip install pyod

import json
import subprocess
from pyod.models.iforest import IForest

def process_suricata_alert(alert_json):
    """Enrich Suricata alert with ML anomaly score."""
    alert = json.loads(alert_json)
    
    features = extract_flow_features(alert)
    score = ml_model.decision_function([features])[0]
    
    # Enrich alert with ML score
    alert['ml_anomaly_score'] = float(score)
    alert['ml_is_anomaly'] = score < threshold
    alert['ml_confidence'] = abs(score)
    
    return alert

# Tail Suricata EVE JSON log
with open('/var/log/suricata/eve.json', 'r') as f:
    for line in follow(f):
        enriched = process_suricata_alert(line)
        if enriched['ml_is_anomaly']:
            send_high_priority_alert(enriched)

import json, subprocess

json לפענוח התראות Suricata בפורמט EVE JSON. subprocess לתקשורת עם תהליך Suricata

def process_suricata_alert(alert_json)

פונקציה שמקבלת התראת Suricata גולמית ומעשירה אותה עם ציון ML

extract_flow_features(alert)

חילוץ פיצ'רים מהתראה: IP מקור/יעד, פורטים, bytes, משך חיבור וכו'

decision_function([features])[0]

הרצת המודל על הפיצ'רים. ציון נמוך = חריגה חזקה יותר

alert['ml_anomaly_score']

הוספת ציון ML להתראה המקורית. ההתראה המועשרת נשלחת ל-SIEM

score < threshold

סיווג בינארי: האם ההתראה היא חריגה אמיתית לפי המודל

for line in follow(f)

קריאה רציפה מקובץ הלוג של Suricata. follow() = tail -f בפייתון — ממתין לשורות חדשות


59

Docker — פריסת מערכת זיהוי חריגות

# Dockerfile for anomaly detection service
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8080

CMD ["uvicorn", "main:app", 
     "--host", "0.0.0.0", 
     "--port", "8080"]

# docker-compose.yml
version: '3.8'
services:
  anomaly-detector:
    build: .
    ports: ["8080:8080"]
    volumes:
      - ./models:/app/models
    environment:
      - MODEL_PATH=/app/models/isolation_forest.pkl
      - THRESHOLD=0.05
      - KAFKA_BROKER=kafka:9092

  kafka:
    image: confluentinc/cp-kafka:latest
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

  elasticsearch:
    image: elasticsearch:8.8.0

FROM python:3.11-slim

תמונת בסיס Python רזה. slim = ללא חבילות מיותרות, מקטין את גודל ה-image

WORKDIR /app

הגדרת תיקיית עבודה בתוך הקונטיינר. כל הפקודות הבאות יורצו מכאן

COPY requirements.txt . / RUN pip install

העתקת קובץ הדרישות והתקנת ספריות. שלב נפרד מ-COPY . . כדי לנצל Docker cache

EXPOSE 8080

הצהרה שהקונטיינר מאזין על פורט 8080. לא פותח את הפורט בפועל — זה נעשה ב-docker run

CMD [uvicorn, main:app, --host 0.0.0.0, --port 8080]

פקודת ההפעלה. 0.0.0.0 = מאזין על כל ממשקי הרשת (חובה בקונטיינר)

volumes: - ./models:/app/models

Mount של תיקיית המודלים. מאפשר עדכון מודל ללא בנייה מחדש של ה-image

environment: MODEL_PATH, THRESHOLD, KAFKA_BROKER

משתני סביבה לקונפיגורציה. מאפשרים לשנות הגדרות ללא שינוי קוד


60

FastAPI — ממשק REST לזיהוי חריגות

pip install fastapi uvicorn pydantic scikit-learn numpy

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import pickle
import numpy as np

app = FastAPI(title="Network Anomaly Detection API")

# Load pre-trained model
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

class NetworkFlow(BaseModel):
    src_bytes: float
    dst_bytes: float
    duration: float
    protocol: int
    src_port: int
    dst_port: int

class AnomalyResult(BaseModel):
    is_anomaly: bool
    score: float
    severity: str

@app.post("/predict", response_model=AnomalyResult)
async def predict_anomaly(flow: NetworkFlow):
    features = np.array([[
        flow.src_bytes, flow.dst_bytes,
        flow.duration, flow.protocol,
        flow.src_port, flow.dst_port
    ]])
    score = model.decision_function(features)[0]
    is_anomaly = score < -0.1
    severity = "high" if score < -0.5 else "medium"
    return AnomalyResult(is_anomaly=is_anomaly,
        score=float(score), severity=severity)

app = FastAPI(title='Network Anomaly Detection API')

יצירת אפליקציית FastAPI. title מופיע בדוקומנטציה האוטומטית ב-/docs

with open('model.pkl', 'rb') as f: model = pickle.load(f)

טעינת המודל המאומן מקובץ. pickle = פורמט סריאליזציה של Python. נטען פעם אחת בהפעלה

class NetworkFlow(BaseModel)

הגדרת סכמת הקלט עם Pydantic. FastAPI מאמת אוטומטית שכל שדה קיים ומהסוג הנכון

class AnomalyResult(BaseModel)

הגדרת סכמת הפלט. FastAPI מייצר תיעוד API אוטומטי מהמחלקות האלו

@app.post('/predict', response_model=AnomalyResult)

הגדרת endpoint POST. response_model מאמת שהפלט תואם לסכמה

features = np.array([[flow.src_bytes, ...]])

המרת אובייקט Pydantic למערך NumPy שהמודל יכול לעבד

score = model.decision_function(features)[0]

הרצת המודל. [0] כי decision_function מחזיר מערך — לוקחים את הערך הראשון

severity = 'high' if score < -0.5 else 'medium'

סיווג חומרה אוטומטי לפי ציון. ניתן להוסיף low לציונים קרובים ל-0


61

Case Study

מקרה בוחן — זיהוי DDoS בזמן אמת

בחברה פיננסית מובילה — זוהתה מתקפת DDoS מסוג SYN Flood תוך 8 שניות ממתחילתה, לפני שהשרות הושפע. הנה הגישה:

1

T+0s

עלייה חריגה בחיבורי SYN חלקיים — מודל מסמן חריגה

2

T+3s

River מעדכן מודל Online ומאשר דפוס DDoS

3

T+8s

התראה נשלחת ל-SIEM + חסימה אוטומטית ב-firewall

4

T+15s

SOC מקבל דוח מלא עם SHAP explanation


62

מקרה בוחן — זיהוי Insider Threat

עובד בכיר ניסה להוציא מאגר לקוחות שבועיים לפני עזיבתו. מערכת UEBA זיהתה את הדפוס:

שבוע לפני — גישה לשרת DB חדש

העובד ניגש לשרת שמעולם לא ניגש אליו — ציון חריגות: 0.72

3 ימים לפני — הורדת נתונים מסיבית

300MB ב-23:00 — חריגה כפולה: שעה ונפח. ציון: 0.89

יום לפני — שימוש ב-USB

חיבור התקן נייד — ציון מצטבר עבר 0.95 — התראה קריטית

חסימה ידנית בזמן

SOC חסם את החשבון לפני ביצוע ההעברה הסופית


63

אתיקה ופרטיות בזיהוי חריגות

ניטור התנהגות משתמשים מעלה שאלות משפטיות ואתיות קריטיות. מערכות UEBA חייבות להיות מעוצבות עם Privacy by Design.

עמידה בתקנות

GDPR, חוק הגנת הפרטיות הישראלי — אנונימיזציה של נתונים אישיים

שקיפות

עובדים צריכים להיות מודעים לניטור — הסכמה מפורשת

הטיית מודל

בדיקת fairness — המודל לא יפלה על בסיס מאפיינים לא רלוונטיים


64

Federated Learning — ML ללא שיתוף נתונים

Federated Learning מאפשר לאמן מודל זיהוי חריגות משותף בין ארגונים מרובים — ללא שיתוף נתוני רשת רגישים. כל ארגון מאמן מקומית ומשתף רק את עדכוני המשקולות.

pip install flwr  # Flower - Federated Learning

import flwr as fl
import numpy as np

class AnomalyClient(fl.client.NumPyClient):
    def get_parameters(self, config):
        return model.get_weights()
    
    def fit(self, parameters, config):
        model.set_weights(parameters)
        model.fit(local_X_train, local_X_train,
                  epochs=1, batch_size=256)
        return model.get_weights(), len(local_X_train), {}
    
    def evaluate(self, parameters, config):
        model.set_weights(parameters)
        loss = model.evaluate(local_X_test, local_X_test)
        return loss, len(local_X_test), {}

fl.client.start_numpy_client(
    server_address="federated-server:8080",
    client=AnomalyClient()
)

pip install flwr

התקנת Flower — ספריית Federated Learning הפופולרית ביותר ב-Python. תומכת ב-TensorFlow, PyTorch ו-scikit-learn

class AnomalyClient(fl.client.NumPyClient)

הגדרת לקוח Federated. כל ארגון מריץ instance של המחלקה הזו על הנתונים המקומיים שלו

def get_parameters(...): return model.get_weights()

שליחת משקולות המודל המקומי לשרת המרכזי. הנתונים עצמם לא נשלחים — רק המשקולות

def fit(self, parameters, config)

קבלת משקולות מהשרת, אימון מקומי על הנתונים הפרטיים, החזרת משקולות מעודכנות

model.set_weights(parameters)

עדכון המודל המקומי עם המשקולות המצורפות מהשרת (ממוצע של כל הארגונים)

model.fit(local_X_train, ..., epochs=1)

אימון epoch אחד על הנתונים המקומיים. הנתונים לא יוצאים מהארגון

fl.client.start_numpy_client(server_address=...)

חיבור לשרת הפדרטיבי המרכזי. השרת מתאם בין כל הלקוחות ומחשב ממוצע משקולות


65

הכנת סביבת עבודה — Quickstart מלא

# 1. Create virtual environment
python -m venv anomaly_env
source anomaly_env/bin/activate  # Linux/Mac
# anomaly_env\Scripts\activate    # Windows

# 2. Install all required packages
pip install scikit-learn pyod alibi-detect \
    tensorflow torch torch-geometric \
    river shap mlflow elasticsearch \
    fastapi uvicorn scapy pandas \
    matplotlib seaborn jupyter

# 3. Download CICIDS2017 dataset
# from: https://www.unb.ca/cic/datasets/ids-2017.html

# 4. Start Jupyter notebook
jupyter notebook anomaly_detection.ipynb

# 5. Start MLflow tracking server
mlflow server --host 0.0.0.0 --port 5000

# 6. Run anomaly detection service
uvicorn main:app --reload --port 8080

ספריות ליבה

  • numpy, scipy, pandas — עיבוד נתונים וסטטיסטיקה
  • matplotlib, seaborn — ויזואליזציה
  • scikit-learn — ML קלאסי: Isolation Forest, LOF, One-Class SVM
  • jupyter — סביבת עבודה אינטראקטיבית

ספריות מתקדמות

  • pyod — 40+ אלגוריתמי זיהוי חריגות בממשק אחיד
  • alibi-detect — זיהוי drift וחריגות ברמת ייצור (Seldon)
  • river — Online ML לזיהוי חריגות בזמן אמת
  • tensorflow + keras — Autoencoders ו-LSTM
  • torch + torch-geometric — Graph Neural Networks
  • shap — הסברתיות למודלים
  • elasticsearch — אינטגרציה עם SIEM
  • fastapi + uvicorn — REST API לשירות המודל
  • scapy — עיבוד קבצי PCAP ותעבורת רשת

בדיקת ההתקנה

print("Checking installations...")
try: import numpy; print("numpy OK")
except: print("numpy MISSING")
try: import sklearn; print("scikit-learn OK")
except: print("scikit-learn MISSING")
try: import pyod; print("pyod OK")
except: print("pyod MISSING")
try: import alibi_detect; print("alibi-detect OK")
except: print("alibi-detect MISSING")
try: import river; print("river OK")
except: print("river MISSING")
try: import tensorflow; print("tensorflow OK")
except: print("tensorflow MISSING")
try: import torch; print("torch OK")
except: print("torch MISSING")
try: import shap; print("shap OK")
except: print("shap MISSING")
print("Done!")

חלופת Docker — הכי מהיר

docker pull jupyter/scipy-notebook
docker run -p 8888:8888 -v $(pwd):/home/jovyan/work jupyter/scipy-notebook

# Then inside the container:
pip install pyod alibi-detect river shap torch-geometric

בעיות נפוצות ופתרונות

torch-geometric מורכב להתקנה

השתמשו בגרסה המתאימה ל-CUDA שלכם:

pip install torch-geometric -f https://data.pyg.org/whl/torch-2.0.0+cpu.html

tensorflow vs tensorflow-cpu

ללא GPU: pip install tensorflow-cpu

עם GPU: pip install tensorflow[and-cuda]

alibi-detect conflicts

צרו venv נפרד לאליבי:

python -m venv alibi_env


66

משאבים — קהילה ולמידה נוספת

GitHub Repositories

  • yzhao062/pyod — 40+ algorithms
  • SeldonIO/alibi-detect — production ready
  • online-ml/river — streaming ML

מחקרים מרכזיים

  • "Isolation Forest" — Liu et al. 2008
  • "DeepLog" — Du et al. 2017
  • "UEBA Survey" — 2023

קורסים מקוונים

  • Coursera — ML Security Specialization
  • Fast.ai — Practical Deep Learning
  • Kaggle Learn — Free ML courses

67

תרגיל מעשי — מפגש זה

כעת תיישמו את מה שלמדתם. בחרו אחד מהתרגילים הבאים בהתאם לרמתכם:

1

רמה בסיסית — Isolation Forest

טענו את CICIDS2017, חלצו 5 פיצ'רים, אמנו Isolation Forest והדפיסו Confusion Matrix.

2

רמה בינונית — Autoencoder

בנו Autoencoder ב-Keras, אמנו על תעבורה נורמלית בלבד, הציבו סף Reconstruction Error.

3

רמה מתקדמת — פיפליין מלא

חברו River ל-Kafka Stream, הוסיפו SHAP explanation, שלחו התראות ל-Elasticsearch.


68

שאלות הסיכום — בדקו את עצמכם

שאלה 1

מה ההבדל בין חריגה נקודתית לקונטקסטואלית? תנו דוגמה מתחום הרשתות.

שאלה 2

מתי תעדיפו LSTM על Isolation Forest לזיהוי חריגות? הסבירו את הסיבות.

שאלה 3

כיצד SHAP עוזר לאנליסט SOC? תארו תרחיש שימוש ספציפי.

שאלה 4

מה Data Drift ואיך Alibi Detect מסייע בזיהויו בייצור?

שאלה 5

הסבירו את עיקרון ה-Reconstruction Error ב-Autoencoder ואיך קובעים את הסף.

שאלה 6

מדוע Federated Learning מתאים לשיתוף פעולה בין ארגונים בתחום הסייבר?


69

סיכום וצעדים הבאים 🚀

השלמנו מסע מקיף מתיאוריה לייצור — יש לכם כעת את הכלים לבנות מערכת זיהוי חריגות ברמת enterprise.

  • למדנו אלגוריתמים מרכזיים: Isolation Forest, Autoencoder, LSTM ו-VAE
  • התנסינו בספריות מובילות: PyOD, Alibi Detect ו-River
  • הבנו Feature Engineering, SHAP ו-Drift Detection בייצור

הצעד הבא: במפגש 3 נעלה רמה — LLMs לניתוח לוגים ו-SOC Automation עם LangChain.


70