בדף הזה מוסבר איך ליצור כללי מדיניות אבטחה של Google Cloud Armor כדי לסנן תנועה נכנסת לאפליקציה. מידע על מושגים שקשורים למדיניות אבטחה זמין במאמר סקירה כללית על מדיניות אבטחה ב-Cloud Armor.
לפני שמתחילים
לפני שמגדירים מדיניות אבטחה, צריך לבצע את הפעולות הבאות:
חשוב להכיר את המושגים שקשורים למאזן עומסים חיצוני של אפליקציות (ALB).
בודקים את שירותי ה-Backend הקיימים כדי לזהות את אלה שלא מצורפת אליהם מדיניות אבטחה. השירותים העורפיים האלה והעורפיים המשויכים אליהם לא מוגנים. כדי להוסיף הגנה של Cloud Armor, צריך לצרף כללי מדיניות אבטחה חדשים או קיימים לשירות לקצה העורפי.
הגדרת הרשאות IAM למדיניות אבטחה של Cloud Armor
כדי לבצע את הפעולות הבאות, צריך את התפקיד 'אדמין אבטחה ב-Compute' (roles/compute.securityAdmin) בניהול הזהויות והרשאות הגישה (IAM):
- הגדרה, שינוי, עדכון ומחיקה של כללי מדיניות האבטחה של Cloud Armor
- באמצעות השיטות הבאות של API:
SecurityPolicies insertSecurityPolicies deleteSecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule
משתמש עם התפקיד 'אדמין של רשת מחשוב' (roles/compute.networkAdmin) יכול לבצע את הפעולות הבאות:
- הגדרת מדיניות אבטחה של Cloud Armor לשירות קצה עורפי
- באמצעות השיטות הבאות של API:
BackendServices setSecurityPolicy-
BackendServices list(gcloudבלבד)
משתמשים עם תפקיד אדמין אבטחה (roles/iam.securityAdmin) ועם תפקיד אדמין רשת מחשוב (roles/compute.networkAdmin) יכולים להציג מדיניות אבטחה של Cloud Armor באמצעות קודי ה-method של API SecurityPolicies get, list ו-getRule.
הגדרת הרשאות IAM לתפקידים בהתאמה אישית
בטבלה הבאה מפורטות הרשאות הבסיס של תפקידי IAM, שיטות ה-API שמשויכות להן והתפקידים שמעניקים את ההרשאה הזו.
| הרשאת IAM | שיטות API | תפקידים |
|---|---|---|
compute.securityPolicies.create |
SecurityPolicies insert |
אדמין אבטחת מחשוב (roles/compute.securityAdmin) |
compute.securityPolicies.delete |
SecurityPolicies delete |
אדמין אבטחת מחשוב (roles/compute.securityAdmin) |
compute.securityPolicies.get |
SecurityPolicies getSecurityPolicies getRule |
אדמין אבטחה (roles/iam.securityAdmin) |
compute.securityPolicies.list |
SecurityPolicies list |
אדמין אבטחה (roles/iam.securityAdmin) |
שני התנאים הבאים:
|
BackendServices |
אדמין ברשת Compute (roles/compute.networkAdmin) |
compute.securityPolicies.update |
SecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule |
אדמין אבטחת מחשוב (roles/compute.securityAdmin) |
יצירת מדיניות אבטחה
אפשר להשתמש במסוף Cloud de Confiance , ב-Google Cloud CLI או ב-API בארכיטקטורת REST כדי להגדיר כללי מדיניות אבטחה, כללים וביטויים של Cloud Armor. כשמשתמשים ב-CLI של gcloud, צריך להשתמש בדגל --type כדי לציין אם מדיניות האבטחה היא מדיניות אבטחה של קצה עורפי או מדיניות אבטחה של קצה.
אם אתם לא מכירים את ההגדרה של מדיניות האבטחה, כדאי לעיין בדוגמאות למדיניות אבטחה.
ביטויים לדוגמה
אלה ביטויים לדוגמה. מידע נוסף זמין במאמר בנושא הפניה לשפה של כללים בהתאמה אישית ב-Cloud Armor.
אם בכלל משתמשים בקודי מדינה או אזור לפי ISO 3166-1 alpha-2 בכלל, Cloud Armor מתייחס לכל קוד בנפרד. כללי וביטויים של Cloud Armor משתמשים בקודים האלה כדי לאשר או לדחות בקשות.
הביטוי הבא תואם לבקשות מכתובת ה-IP
1.2.3.4שמכילות את המחרוזתexampleבכותרתUser-Agent:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')לחלופין, אפשר להתאים לטווח כתובות ה-IP של כותרת מותאמת אישית של כתובת IP של לקוח באמצעות המאפיין
origin.user_ip:inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')הביטוי הבא תואם לבקשות שיש להן קובץ Cookie עם ערך ספציפי:
has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')הביטוי הבא תואם לבקשות מהאזור
AU:origin.region_code == 'AU'
הביטוי הבא תואם לבקשות מהאזור
AUשלא נמצאות בטווח כתובות ה-IP שצוין:origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
הביטוי הבא מתאים לבקשות עם נתיב משתנה ממוספר לקובץ ספציפי אם ה-URI תואם לביטוי רגולרי:
request.path.matches('/path/[0-9]+/target_file.html')הביטוי הבא תואם לבקשות אם הערך אחרי פענוח Base64 של הכותרת
user-idמכיל ערך ספציפי:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')הביטוי הבא משתמש בקבוצת ביטויים שהוגדרה מראש כדי להתאים להתקפות SQLi:
evaluatePreconfiguredWaf('sqli-stable')
Path traversal and normalization
בצע נורמליזציה של תוכן בכללים מבוססי-נתיב כדי לנהל כללים של Path traversal וקידוד, וליצור כללים כלליים שלא תלויים באותיות רישיות או בקידוד ספציפי לתוכן.
כשכותבים כללים שמשתמשים ב-startsWith, ב-endsWith או ב-contains כדי להתאים ל-request.path, צריך להשתמש ב-lower וב-urlDecode כדי לנרמל את הנתיב לפני ההתאמה. כך נמנעות עקיפות שמשתמשות בקידוד URL או בשינויים באותיות רישיות.
לדוגמה, כדי לחסום את הגישה לספרייה /admin, משתמשים בביטוי הבא:
request.path.lower().urlDecode().startsWith('/admin')
הכלל הזה חוסם בקשות ל-/admin, ל-/Admin, ל-/a%64min ולגרסאות אחרות.
כשכותבים כללים שמשתמשים ב-matches כדי להתאים ל-request.path, צריך להביא בחשבון את התו של הקו הנטוי ההפוך (\) בביטוי הרגולרי.
לדוגמה, כדי לחסום גישה לספרייה /admin, משתמשים בביטוי הבא כדי לחסום עקיפות שמשתמשות בתו הלוכסן ההפוך (\):
request.path.matches(r'^/\\*admin')
משלבים את זה עם urlDecode כדי לטפל גם בקידוד כתובות URL וגם במעקף של התו 'קו נטוי הפוך' (\\):
request.path.urlDecode().matches(r'^/\\*admin')