לכל כלל במדיניות האבטחה של Google Cloud Armor יש עדיפות, תנאי התאמה ופעולה. Cloud Armor מבצע את הפעולה של הכלל בעל העדיפות הגבוהה ביותר שתואם לבקשה. המערכת לא בודקת כללים עם עדיפות נמוכה יותר מהכלל התואם עם העדיפות הכי גבוהה, גם אם יש להם את אותם תנאי התאמה.
כל כלל במדיניות האבטחה תומך בשני סוגים של תנאי התאמה:
- תנאי התאמה בסיסי מכיל רשימות של כתובות IP או רשימות של טווחי כתובות IP. כשיוצרים כלל באמצעות Google Cloud CLI, מגדירים תנאי התאמה בסיסיים באמצעות הדגל
--src-ip-ranges. - תנאי התאמה מתקדם מכיל ביטוי עם עד חמישה ביטויי משנה שיכולים להתאים למגוון מאפיינים של בקשה נכנסת.
תנאי התאמה מתקדמים מוגדרים באמצעות הדגל
--expressionכשיוצרים כלל באמצעות Google Cloud CLI.
בדף הזה נסביר על תנאי התאמה מתקדמים ועל שפת הכללים המותאמים אישית של Cloud Armor, שמשמשת לכתיבת ביטויים בתנאי ההתאמה המתקדמים של כללי מדיניות האבטחה. השפה של הכללים בהתאמה אישית ב-Cloud Armor היא קבוצת משנה של Common Expression Language (CEL). ביטויים שנכתבים בשפה של כללים מותאמים אישית ב-Cloud Armor דורשים שני רכיבים:
- המאפיין: הנתונים לבדיקה
- הפעולה: איך משתמשים בנתונים
לדוגמה, הביטוי הבא משתמש במאפיינים origin.ip ו-198.51.100.0/24 בפעולה inIpRange. במקרה הזה, הביטוי מחזיר true אם origin.ip נמצא בטווח כתובות ה-IP 198.51.100.0/24.
inIpRange(origin.ip, '198.51.100.0/24')
למרות שביטוי הדוגמה הקודם תואם רק לכתובת ה-IP של הלקוח, כשמשתמשים בביטוי הדוגמה בכלל של מדיניות אבטחה של Cloud Armor, הכלל נחשב לכלל עם תנאי התאמה מתקדמים מבחינת מכסת השימוש. מידע נוסף מופיע במאמר בנושא מכסות ומגבלות של Cloud Armor.
תפעול
במסמך העזר הבא מוסבר על האופרטורים שאפשר להשתמש בהם עם מאפיינים (שמיוצגים על ידי x, y ו-k) כדי להגדיר ביטויי כללים.
| תפעול | ביטויים | תיאור |
|---|---|---|
| שוויון | x == y |
הפונקציה מחזירה את הערך true אם x שווה ל-y. |
| שוויון, מחרוזת מילולית | x == "foo" |
הפונקציה מחזירה את הערך true אם x שווה למחרוזת הקבועה שצוינה. |
| שוויון, מחרוזת גולמית מילולית | x == R"fo'o" |
הפונקציה מחזירה את הערך true אם x שווה למחרוזת הליטרלית הגולמית שצוינה, שלא מפרשת רצפי escape. ליטרלים של מחרוזות גולמיות נוחים לשימוש כשרוצים לבטא מחרוזות שצריך להשתמש בהן בתווי בריחה.
|
| שלילה לוגית | !x |
הפונקציה מחזירה true אם הערך הבוליאני x הוא false, או מחזירה false אם הערך הבוליאני x הוא true. |
| אי-שוויון | x != y |
הפונקציה מחזירה את הערך true אם x לא שווה ל-y. |
| שרשור | x + y |
הפונקציה מחזירה את המחרוזת המחוברת xy. |
| Logical AND | x && y |
הפונקציה מחזירה true אם גם x וגם y הם true. |
| OR לוגי | x || y |
הפונקציה מחזירה true אם x, y או שניהם הם true. |
| מכיל מחרוזת משנה | x.contains(y) |
הפונקציה מחזירה true אם המחרוזת x מכילה את מחרוזת המשנה y. |
| מתחיל עם מחרוזת משנה | x.startsWith(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x מתחילה במחרוזת המשנה y. |
| מסתיים במחרוזת משנה | x.endsWith(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x מסתיימת במחרוזת המשנה y. |
| התאמה של ביטוי רגיל | x.matches(y) |
הפונקציה מחזירה את הערך true אם המחרוזת x תואמת באופן חלקי לתבנית y של RE2 שצוינה. התבנית RE2 עוברת קומפילציה באמצעות האפשרות RE2::Latin1 שמשביתה תכונות Unicode. |
| כתובת IP בטווח | inIpRange(x, y) |
הפונקציה מחזירה את הערך true אם כתובת ה-IP x נכללת בטווח כתובות ה-IP y. |
| אותיות קטנות | x.lower() |
הפונקציה מחזירה את הערך באותיות קטנות של המחרוזת x. |
| אותיות רישיות | x.upper() |
הפונקציה מחזירה את הערך באותיות רישיות של המחרוזת x. |
| ערך מפוענח בקידוד Base64 | x.base64Decode() |
הפונקציה מחזירה את הערך המפוענח בקידוד base64 של x. קודם לכן, התווים קו תחתון (_) ומקף (-) מוחלפים בקו נטוי (/) ובסימן פלוס (+), בהתאמה.
הפונקציה מחזירה "" (מחרוזת ריקה) אם x הוא לא ערך Base64 תקין. |
| ערך של מיפוי מקשים | m['k'] |
הפונקציה מחזירה את הערך במפתח k במפה m של מחרוזת למחרוזת אם k זמין, אחרת היא מחזירה שגיאה. הגישה המומלצת היא קודם לבדוק את הזמינות באמצעות "has(m['k'])==true". |
| בדיקת הזמינות של מפתחות במפה | has(m['k']) |
הפונקציה מחזירה את הערך true אם המפתח k זמין במפה m. |
| המרה למספר שלם | int(x) |
הפונקציה ממירה את התוצאה של המחרוזת x לסוג int. אחר כך אפשר להשתמש בו כדי לבצע השוואה בין מספרים שלמים באמצעות אופרטורים אריתמטיים רגילים כמו > ו-<=. הפעולה הזו אפשרית רק עבור ערכים שאמורים להיות מספרים שלמים. |
| אורך | size(x) |
הפונקציה מחזירה את האורך של המחרוזת x. |
| פענוח כתובת URL | x.urlDecode() |
הפונקציה מחזירה את הערך של x אחרי פענוח כתובת ה-URL. רצפי תווים בפורמט %## מוחלפים במקבילות שאינן ASCII, ו-+ מוחלף ברווח. קידודים לא תקינים מוחזרים כמו שהם. |
| פענוח כתובת URL (Unicode) | x.urlDecodeUni() |
הפונקציה מחזירה את הערך של x אחרי פענוח כתובת ה-URL. בנוסף ל-urlDecode(), היא מטפלת גם ברצפים של תווים ב-Unicode בפורמט %u###. קידודים לא תקינים מוחזרים כמו שהם. |
| המרת utf8 ל-Unicode | x.utf8ToUnicode() |
הפונקציה מחזירה את הייצוג ב-Unicode באותיות קטנות של x בקידוד UTF-8. |
| קיים | m.exists(k, expr) |
הפונקציה מחזירה true אם לפחות רשומה אחת במפה m עומדת בתנאי expr,
כאשר k מייצג את המפתח של כל רשומה במפה.
|
| Exists one | m.exists_one(k, expr) |
הפונקציה מחזירה את הערך true אם בדיוק רשומה אחת במפה m עומדת בתנאי expr, כאשר k מייצג את המפתח של כל רשומה במפה.
|
| הכול | m.all(k, expr) |
הפונקציה מחזירה true אם כל הרשומות במפה m עומדות בתנאי expr, כאשר k מייצג את המפתח של כל רשומה במפה.
|
| מסנן | m.filter(k, expr) |
מחזירה מפה שמכילה רק את הרשומות מהמפה m שבהן הרשומה עומדת בתנאי expr, כאשר k מייצג את המפתח של כל רשומה במפה. |
| מפה | m.map(k, expr) |
הפונקציה מחזירה רשימה שמכילה את התוצאה של הערכת expr לכל מפתח במפה m, כאשר k מייצג את המפתח של כל רשומה במפה. |
מאפיינים
מאפיינים מייצגים מידע מבקשה נכנסת, כמו כתובת ה-IP של הלקוח או נתיב כתובת ה-URL המבוקשת.
| שדה | סוג | תיאור |
|---|---|---|
origin.ip |
מחרוזת | כתובת ה-IP של הלקוח שיזם את הבקשה. |
origin.user_ip |
מחרוזת | כתובת ה-IP של הלקוח המקורי, שכלולה ב-HTTP-HEADER על ידי שרת proxy במעלה הזרם. לפני שמשתמשים במאפיין הזה, צריך להגדיר את האפשרות userIpRequestHeaders[] בשדה advancedOptionsConfig של מדיניות האבטחה כך שתתאים למקור כמו True-Client-IP, X-Forwarded-For או X-Real-IP. מידע נוסף זמין במאמר בנושא סקירה כללית של כתובות ה-IP של משתמשים.
אם לא מגדירים את האפשרות |
origin.tls_ja4_fingerprint |
מחרוזת | טביעת אצבע של JA4 TLS/SSL
אם הלקוח מתחבר באמצעות
HTTPS, HTTP/2 או HTTP/3. אם הוא לא זמין, מוחזרת מחרוזת ריקה. |
origin.tls_ja3_fingerprint |
מחרוזת | טביעת אצבע של JA3 TLS/SSL
אם הלקוח מתחבר באמצעות
HTTPS, HTTP/2 או HTTP/3. אם הוא לא זמין, מוחזרת מחרוזת ריקה. |
request.headers |
מפה | מיפוי של כותרות בקשת HTTP ממחרוזת למחרוזת. אם לכותרת יש כמה ערכים, הערך התואם במפה הזו הוא מחרוזת יחידה שמכילה את כל הערכים, מופרדים בפסיקים. המפתחות במפה הזו הם כולם אותיות קטנות. מאזני העומסים החיצוניים של האפליקציות בודקים את כל הכותרות שהתקבלו, והמגבלות שחלות על הכותרות האלה הן אותן מגבלות. אפשר להשתמש ב- אפשר לחזור על המיפוי כדי לבדוק גם את המפתחות וגם את הערכים.
עם זאת, אפשר להשתמש באופרטורים של איטרציה של מפה ( |
request.body |
מחרוזת | מייצג את גוף הבקשה כמחרוזת גולמית. הוא יכול לייצג נתונים מכל Content-Type. הוא מאחסן את התוכן כמחרוזת ללא ניתוח אוטומטי.
|
request.params |
מפה | מפה של צמדי מפתח/ערך שמצורפים לכתובת ה-URL או נכללים בגוף של בקשות. URI request: name1=value1&name2=value2JSON request body with Content-Type: application/json:{ "username": "johndoe", "email": "johndoe@example.com" }GraphQL POST request body with Content-Type: application/graphql:{ Username: "exampleUser", query: "/* other fields */" }Form POST request body with Content-Type: application/x-www-form-urlencoded:"username=exampleUser&email=johndoe%40example.com"
|
request.method |
מחרוזת | ה-method של בקשת ה-HTTP. |
request.path |
מחרוזת | נתיב כתובת ה-URL של ה-HTTP שהתבקש. כשכותבים כללים שתואמים ל-request.path, מומלץ לבצע נורמליזציה של הנתיב כדי להקל על התאמת התחביר במקרה של קידוד כתובת URL, וריאציות של אותיות רישיות או לוכסנים הפוכים.
מידע נוסף ודוגמאות זמינים במאמר בנושא Path traversal and normalization (מעבר בין נתיבים ונרמול). |
request.scheme |
מחרוזת | סכימת כתובות ה-URL מסוג HTTP, כמו http או https.
הערכים של המאפיין הזה הם באותיות קטנות. |
request.query |
מחרוזת | שאילתת כתובת ה-URL מסוג HTTP בפורמט
name1=value&name2=value2, כפי שהיא מופיעה בשורה הראשונה של
בקשת ה-HTTP. לא מתבצע פענוח.
|
origin.region_code |
מחרוזת | קוד המדינה ב-Unicode שמשויך לכתובת ה-IP של הלקוח, לדוגמה US. אם יוצרים כלל או ביטוי שמשתמשים בקודי מדינה או אזור לפי ISO 3166-1 alpha 2, Cloud Armor מתייחס לכל קוד בנפרד. הכללים והביטויים של Cloud Armor משתמשים בקודים האזוריים האלה באופן מפורש כדי לאשר או לדחות בקשות.
|
origin.asn |
מספר שלם | מספר המערכת האוטונומית (ASN) שמשויך לכתובת ה-IP של הלקוח. מספר ה-ASN הייחודי בעולם נקבע על סמך מפעיל הרשת שתומך בקידומות של כתובות ה-IP שמכילות את כתובת ה-IP של הלקוח. |
ביטויים לדוגמה
עבור כל אחד מהביטויים האלה, הפעולה שתתבצע תלויה בשאלה אם הביטוי נכלל בכלל דחייה או בכלל אישור.
אישור או דחייה של גישה על סמך טווח כתובות IP ב-IPv4 או ב-IPv6
הביטוי הבא תואם לבקשות מ
198.51.100.0/24טווח כתובות ה-IP:inIpRange(origin.ip, '198.51.100.0/24')
הביטוי הבא תואם לבקשות מ
2001:db8::/32טווח כתובות ה-IP:inIpRange(origin.ip, '2001:db8::/32')
אישור או דחייה של גישה על סמך טווח כתובות IP מותאם אישית של לקוחות מאחורי שרת proxy במעלה הזרם
אם הגדרתם את האופרטור origin.user_ip, תוכלו להתאים על סמך ערכי הכותרת שציינתם בשדה advancedOptionsConfig.userIpRequestHeaders[].
הביטוי הבא תואם לבקשות שמקורן בטווח כתובות ה-IP
192.0.2.0/24:inIpRange(origin.user_ip, '192.0.2.0/24')
הביטוי הבא תואם לבקשות שמקורן בטווח כתובות ה-IP
2001:db8::/32:inIpRange(origin.user_ip, '2001:db8::/32')
אישור או דחייה של תעבורה עם קובץ Cookie ספציפי
הביטוי הבא תואם לבקשות שיש להן קובץ Cookie שמכיל את הערך
80=BLAH:has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
התרת תנועה או דחייה שלה עם כותרת referer לא ריקה
הביטוי הבא תואם לבקשות עם כותרת
refererלא ריקה:has(request.headers['referer']) && request.headers['referer'] != ""
אישור או דחייה של תנועה על סמך כותרת המארח
אפשר לאשר או לדחות תנועה על סמך הערך של הכותרת Host בבקשה.
הביטוי הבא תואם לבקשות לכתובת URL ספציפית באמצעות
==:request.headers['host'].lower() == 'test.example.com'
הביטוי הבא תואם לבקשות לכתובת URL ספציפית באמצעות
endsWith:request.headers['host'].lower().endsWith('.example.com')הביטוי הבא תואם לבקשות לכתובת URL ספציפית באמצעות
contains:request.headers['host'].lower().contains('test.example.com')
הביטוי הבא תואם לבקשות למספר דומיינים באמצעות
contains:request.headers['host'].lower().contains('test.example.com') || request.headers['host'].lower().contains('test22.example.com')הביטוי הבא תואם לבקשות לדומיין ולתת-הדומיינים שלו באמצעות
matches:request.headers['host'].matches('(?i:(sub\.)?test\.example\.com)')
אישור או דחייה של תנועה מאזור ספציפי
אם אפליקציית האינטרנט שלך לא זמינה באזור AU, צריך לחסום את כל הבקשות מהאזור הזה.
בכלל דחייה, משתמשים בביטוי הבא שתואם לבקשות מהאזור
AU:origin.region_code == 'AU'
לחלופין, אם אפליקציית האינטרנט שלכם זמינה רק באזור AU, צריך לחסום בקשות מכל שאר האזורים.
בכלל דחייה, משתמשים בביטוי הבא, שתואם לבקשות מכל האזורים מלבד אזור
AU:origin.region_code != 'AU'
קודי האזור מבוססים על קודי ISO 3166-1 alpha 2. לפעמים אזור מתאים למדינה, אבל זה לא תמיד המצב. לדוגמה, US הקוד כולל את כל המדינות בארצות הברית, מחוז אחד ושישה אזורים מרוחקים.
איך מאשרים או דוחים תנועה ממספר מערכת אוטונומית (ASN) ספציפי
אם צריך לחסום את אפליקציית האינטרנט שלכם ללקוחות שמקבלים שירות ממפעיל רשת ספציפי, אפשר להשתמש במספר ה-ASN של מפעיל הרשת כדי לחסום אותה.
בכלל דחייה, משתמשים בביטוי הבא שתואם לבקשות מ-ASN ספציפי:
origin.asn == 123
לחלופין, אם אפליקציית האינטרנט שלכם זמינה רק ללקוחות של מפעיל רשת ספציפי, צריך לחסום בקשות מכל מפעיל רשת אחר.
בכלל דחייה, משתמשים בביטוי הבא, שתואם לכל מפעילי הרשתות האחרים מלבד זה שרוצים לאפשר:
origin.asn != 123
כמה הבעות
כדי לכלול כמה תנאים בכלל אחד, משלבים כמה ביטויי משנה.
בדוגמה הבאה, בקשות מ-
1.2.3.0/24(למשל, מבודקי אלפא) באזורAUתואמות לביטוי הבא:origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
הביטוי הבא תואם לבקשות מ-
1.2.3.4שבהן סוכן המשתמש מכיל את המחרוזתWordPress:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
אישור או דחייה של תנועה עבור URI של בקשה שתואם לביטוי רגולרי
הביטוי הבא תואם לבקשות שמכילות את המחרוזת
/example_path/במזהה ה-URI:request.path.matches('/example_path/')הביטוי הבא תואם לבקשות שכוללות את
Chromeבשדה הכותרתUser-Agent:request.headers['user-agent'].matches('Chrome')הביטוי הבא מציג התאמה לא תלוית-אותיות בכותרת
User-Agentשמכילה אתwordpress. הוא מתאים ל-User-Agent:WordPress/605.1.15, ל-User-Agent:wordPressולוריאציות אחרות שלwordpress:request.headers['user-agent'].matches('(?i:wordpress)')
התרת תנועה שמכילה ערך מפוענח ספציפי בקידוד base64 או דחיית תנועה כזו
הביטוי הבא תואם לבקשות עם ערך מפוענח ב-Base64 של
myValueבכותרתuser-id:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
אישור או דחייה של תנועה שמכילה ערך מחרוזת באורך מסוים
הביטוי הבא תואם לבקשות שבהן אורך כתובת ה-URL גדול מ-10 תווים:
size(request.path) > 10
הביטוי הבא תואם לבקשות עם כותרת
x-dataבאורך של 1,024 תווים או יותר:size(request.headers['x-data']) >= 1024
התרת תנועה או דחייה של תנועה עם content-length בגוף ה-HTTP
הביטוי הבא תואם לבקשות שכוללות את הערך אפס
content-lengthבגוף ה-HTTP:int(request.headers["content-length"]) == 0
התרת תנועה שמכילה ערך מקודד ספציפי של כתובת URL או דחייה שלה
הביטוי הבא תואם לבקשות עם ערך של קובץ Cookie שמכיל
%3c:has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
התרת תנועה שמכילה ערך מקודד ספציפי של כתובת URL של מחרוזת Unicode או דחיית תנועה כזו
הביטוי הבא תואם לבקשות שבהן ערך קובץ ה-Cookie שווה ל-
Match%2BValueאו ל-Match%u002BValue:has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
הרשאה או דחייה של תנועה שמכילה מחרוזת Unicode ספציפית של טקסט UTF-8
הביטוי הבא תואם לבקשות שבהן ערך קובץ ה-Cookie שווה ל-
¬:has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
אישור או דחייה של תנועה על סמך טביעת אצבע מוכרת של JA4
הביטוי הבא תואם לבקשות עם טביעת אצבע של JA4 ששווה ל-
t13d1516h2_8daaf6152771_b186095e22b6:origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
אישור או דחייה של תנועת נתונים על סמך רשימה של טביעות אצבע של JA4
הביטוי הבא תואם לבקשות עם טביעת אצבע של JA4 ששווה לאחת מטביעות האצבע הבאות של JA4:
t00d0000h0_000000000000_000000000000t13d1516h2_8daaf6152771_b186095e22b6
origin.tls_ja4_fingerprint == 't00d0000h0_000000000000_000000000000' || origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
אישור או דחייה של תנועה על סמך תוכן גוף הבקשה
הביטוי הבא תואם לבקשות POST שמכילות את המחרוזת
malicious-valueבגוף הבקשה:request.method == 'POST' && request.body.contains('malicious-value')הביטוי הבא תואם לבקשות שמתחילות ב-
<!DOCTYPE html>:request.body.startsWith('<!DOCTYPE html>')הביטוי הבא תואם לבקשות שבהן גוף הבקשה תואם לביטוי הרגולרי
\w+@\w+.com:request.body.matches('\w+@\w+.com')
אישור או דחייה של תנועה על סמך פרמטרים של בקשות
הביטוי הבא תואם לבקשות שלא מכילות פרמטר בשם
category:!has(request.params.category)
הביטוי הבא מתאים לבקשות שבהן הפרמטר
categoryהואelectronics:request.params.category == 'electronics'
הביטוי הבא תואם לבקשות שבהן כל ערכי הפרמטרים לא ריקים:
request.params.all(k, request.params[k] != '')
הביטוי הבא תואם לבקשות שבהן פרמטר כלשהו מכיל את המחרוזת
admin:request.params.exists(k, request.params[k].contains('admin'))הביטוי הבא מתאים לבקשות שבהן בדיוק שם פרמטר אחד מכיל את
admin:request.params.exists_one(k, k.contains('admin'))הביטוי הבא תואם לבקשות שבהן לפחות שם פרמטר אחד מכיל את
id:size(request.params.filter(k, k.contains('id'))) > 0הביטוי הבא תואם לבקשות שבהן ערכי הפרמטרים כוללים את המחרוזת
admin:request.params.map(k, request.params[k]).contains('admin')
אישור או דחייה של תנועה על סמך נתונים מובְנים בגוף הבקשה
הביטוי הבא תואם לבקשות שבהן השדה
passwordבגוף בקשת JSON מכיל את הערך123:has(request.params.password) && request.params.password.contains('123')הביטוי הבא תואם לבקשות שבהן השדה
cityבנתוני הטופס הואNewYork:has(request.params.city) && request.params.city == 'NewYork'
הביטוי הבא תואם לבקשות שבהן השדה
newsletterהמקונן הואtrue:has(request.params.preferences) && has(request.params.preferences.newsletter) && request.params.preferences.newsletter == true
הביטוי הבא תואם לבקשות שבהן השדה
nameשל הרכיב הראשון במערךfriendsהואjohndoe:request.params['friends'][0]['name'] == 'johndoe'
כללי WAF שהוגדרו מראש
כללי WAF שהוגדרו מראש משתמשים בחתימות סטטיות שהוגדרו מראש, בביטויים רגולריים או בשניהם כדי להתאים לגוף של בקשת HTTP, לכותרות של בקשת HTTP ולפרמטרים של שאילתה. כללי ה-WAF המוגדרים מראש מבוססים על OWASP Core Rule Set 4.22. ב-Cloud Armor יש כמה כללי WAF מוגדרים מראש. רשימה מלאה של כללי WAF שהוגדרו מראש זמינה במאמר בנושא סקירה כללית על כללי WAF שהוגדרו מראש ב-Cloud Armor.
כדי לראות רשימה של כל כללי ה-WAF שהוגדרו מראש, אפשר לעיין במאמר בנושא רשימת כללי WAF שהוגדרו מראש.
מידע נוסף על כללי WAF שהוגדרו מראש זמין בתרחיש לדוגמה צמצום התקפות בשכבת האפליקציה באמצעות כללי WAF שהוגדרו מראש.
שמות של כללי WAF שהוגדרו מראש
השמות של כללי ה-WAF שהוגדרו מראש הם בפורמט
<attack category>-<OWASP CRS version>-<version field>. קטגוריית המתקפה מציינת את סוג המתקפות שרוצים להתגונן מפניהן, כמו xss (פרצת אבטחה XSS (cross-site scripting)) או sqli (הזרקת SQL).
שדות הגרסה הנתמכים הם stable ו-canary. תוספות ושינויים בכללים מתפרסמים קודם בגרסה canary. אם התוספות והשינויים נחשבים בטוחים ויציבים, הם מקודמים לגרסה stable.
מזהי חברים של כללי WAF שהוגדרו מראש
כלל WAF שהוגדר מראש מכיל כמה ביטויים, שלכל אחד מהם יש חתימה משלו.
לדוגמה, כלל ה-WAF שהוגדר מראש xss-v422-stable כולל ביטוי בשם owasp-crs-v042200-id941100-xss, שמתאים למזהה הכלל id941100 בגרסה 4.22. אפשר להשתמש בחתימות כדי להחריג ביטויים ספציפיים, וכך למנוע את השימוש בהם. זה שימושי אם ביטוי מסוים מפעיל באופן עקבי תוצאה חיובית שגויה. מידע נוסף זמין במאמר בנושא תוצאות חיוביות שגויות.
מידע על קבוצת כללי הליבה ועל כוונון ברמות רגישות שונות זמין במאמר כוונון כללי WAF ב-Cloud Armor.
אופרטור לכללי WAF שהוגדרו מראש
| ביטויים | תיאור |
|---|---|
evaluatePreconfiguredWaf(string, MAP<string, dyn>) |
הפונקציה מחזירה true אם אחת מחתימות ה-WAF בתוך קבוצת כללי ה-WAF שצוינה מחזירה true. הארגומנט הראשון הוא השם של קבוצת הכללים של ה-WAF, למשל xss-v422-stable. הארגומנט השני (אופציונלי) הוא מיפוי שבו המפתח הוא מחרוזת והערך הוא הקלדה דינמית בהתאם למפתח. מטרת הארגומנט הזה היא לכוונן את החתימות של ה-WAF שמוערכות. המפתחות הקבילים כוללים את
המפתחות הבאים:
המפתחות |
evaluatePreconfiguredWaf(string, LIST) |
הפונקציה מחזירה הארגומנט הראשון הוא השם של כלל ה-WAF שהוגדר מראש, למשל |
דוגמאות לכללי WAF שהוגדרו מראש
הביטוי הבא משתמש בכלל WAF שהוגדר מראש
xss-v422-stableכדי לצמצם את הסיכון להתקפות XSS:evaluatePreconfiguredWaf('xss-v422-stable')הביטוי הבא משתמש בכל הביטויים מכלל ה-WAF שהוגדר מראש
xss-v422-stableחוץ ממזהי החברים941100ו-941110:evaluatePreconfiguredWaf('xss-v422-stable', {'opt_out_rule_ids': ['owasp-crs-v042200-id941100-xss', 'owasp-crs-v042200-id941110-xss']})הביטוי הבא משתמש בכלל WAF שהוגדר מראש כדי לצמצם את ההשפעה של מתקפות SQLi מטווח כתובות ה-IP
198.51.100.0/24:inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredWaf('sqli-v422-stable')הביטוי הבא משתמש בכלל WAF
xss-v422-stableשהוגדר מראש כדי לצמצם את הסיכון להתקפות XSS בבקשות אלexample.com, לא כולל נתיבים ש מתחילים ב-/login/api/:request.headers['host'].lower() == 'example.com' && !request.path.startswith('/login/api/') && evaluatePreconfiguredWaf('xss-v422-stable')
מפעילים אחרים
| ביטויים | תיאור |
|---|---|
evaluateThreatIntelligence(string)evaluateThreatIntelligence(string, LIST)evaluateThreatIntelligence(string, string, LIST)
|
הפונקציה מחזירה הארגומנט הראשון הוא השם של הפיד של Google Threat Intelligence, כמו |
evaluateAddressGroup(string, string)evaluateAddressGroup(string, string, LIST)evaluateOrganizationAddressGroup(string, string)evaluateOrganizationAddressGroup(string, string, LIST)
|
הפונקציה מחזירה את הערך הארגומנט הראשון הוא שם קבוצת הכתובות. הארגומנט השני קובע מאיפה כתובת ה-IP מחולצת, והוא יכול להיות |
evaluateAdaptiveProtection(string) |
הפונקציה מחזירה את הערך הארגומנט הוא המזהה של התראה ספציפית שנוצרה על ידי ההגנה הדינמית אחרי זיהוי של ניסיון תקיפה. |
evaluateAdaptiveProtectionAutoDeploy() |
הפונקציה מחזירה את הערך |
דוגמאות
הביטוי הבא משווה את הבקשה הנכנסת לפיד של Google Threat Intelligence
iplist-known-malicious-ipsכדי להגן מפני רשימה מוכרת של כתובות IP זדוניות:evaluateThreatIntelligence('iplist-known-malicious-ips')הביטוי הבא מתאים לבקשה הנכנסת מול פיד Google Threat Intelligence
iplist-known-malicious-ipsלהגנה מפני רשימת כתובות ה-IP הזדוניות הידועות, למעט כתובות ה-IP ב-203.0.113.0/24:evaluateThreatIntelligence('iplist-known-malicious-ips', ['203.0.113.0/24'])הביטוי הבא מתאים לכותרת הבקשה המותאמת אישית של כתובת ה-IP של המשתמש לקבוצת הכתובות שנקראת
my-own-list-of-bad-ips:evaluateAddressGroup('my-own-list-of-bad-ips', origin.user_ip)