יצירה והצגה של כללי מדיניות האבטחה של Cloud Armor

בדף הזה מוסבר איך ליצור כללי מדיניות אבטחה של Google Cloud Armor כדי לסנן תנועה נכנסת לאפליקציה. מידע על מושגים שקשורים למדיניות אבטחה זמין במאמר סקירה כללית על מדיניות אבטחה ב-Cloud Armor.

לפני שמתחילים

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

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

  • בודקים את שירותי ה-Backend הקיימים כדי לזהות את אלה שלא מצורפת אליהם מדיניות אבטחה. השירותים העורפיים האלה והעורפיים המשויכים אליהם לא מוגנים. כדי להוסיף הגנה של Cloud Armor, צריך לצרף כללי מדיניות אבטחה חדשים או קיימים לשירות לקצה העורפי.

הגדרת הרשאות IAM למדיניות אבטחה של Cloud Armor

כדי לבצע את הפעולות הבאות, צריך את התפקיד 'אדמין אבטחה ב-Compute' (roles/compute.securityAdmin) בניהול הזהויות והרשאות הגישה (IAM):

  • הגדרה, שינוי, עדכון ומחיקה של כללי מדיניות האבטחה של Cloud Armor
  • באמצעות השיטות הבאות של API:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

משתמש עם התפקיד 'אדמין של רשת מחשוב' (roles/compute.networkAdmin) יכול לבצע את הפעולות הבאות:

  • הגדרת מדיניות אבטחה של Cloud Armor לשירות קצה עורפי
  • באמצעות השיטות הבאות של API:
    • BackendServices setSecurityPolicy
    • BackendServices list (gcloud בלבד)

משתמשים עם תפקיד אדמין אבטחה (roles/iam.securityAdmin) ועם תפקיד אדמין רשת מחשוב (roles/compute.networkAdmin) יכולים להציג מדיניות אבטחה של Cloud Armor באמצעות קודי ה-method של API ‏SecurityPoliciesget, ‏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 get
SecurityPolicies getRule
אדמין אבטחה (roles/iam.securityAdmin)
compute.securityPolicies.list SecurityPolicies list אדמין אבטחה (roles/iam.securityAdmin)
שני התנאים הבאים:
  • compute.securityPolicies.use
  • compute.backendServices.
    setSecurityPolicy
BackendServices
setSecurityPolicy
אדמין ברשת Compute (roles/compute.networkAdmin)
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies 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')

המאמרים הבאים