Media CDN משתמש במדיניות האבטחה של Google Cloud Armor כדי למנוע מתעבורה לא רצויה להגיע לשירותים שלו. אפשר לאשר או לדחות בקשות על סמך הפרטים הבאים:
- כתובות וטווחי IPv4 ו-IPv6 (CIDR)
- קוד מדינה (מיקום גיאוגרפי)
- סינון בשכבה 7
- Google Threat Intelligence (נדרשת רמת השירות Google Cloud Armor Enterprise)
- מספרי מערכת אוטונומית (ASN)
היכולות האלה מאפשרות לכם להגביל את ההורדות של התוכן למשתמשים במיקומים ספציפיים שבהם יש לכם הגבלות על רישוי תוכן, לאפשר רק לכתובות IP ארגוניות לגשת לנקודות קצה של בדיקות או שלבי ביניים, ולחסום רשימה של כתובות IP של לקוחות לא רצויים.
Cloud Armor משתלב עם ASN כדי לאפשר לכם לאשר או לחסום תנועת רשת שמגיעה ממספרי ASN ספציפיים. מדיניות האבטחה של Cloud Armor יכולה להשתמש במספר מערכת אוטונומית (ASN) שמשויך לכתובת ה-IP של המקור, כפי שנקבע על ידי מפעיל הרשת שאחראי על קידומות ה-IP האלה, כדי לשלוט בזרימת התנועה.
אתם יכולים להוסיף בקשות ש-Cloud Armor מאשר על ידי הוספת כותרות בהתאמה אישית עם שמות וערכים שניתנים להגדרה.
השילוב של Cloud Armor עם Google Threat Intelligence מאפשר לכם לשלוט בתעבורה מכתובות IP ודומיינים זדוניים ידועים, ומספק הגנה מתקדמת מפני איומים.
מדיניות האבטחה של Cloud Armor חלה על כל התוכן שמוצג מ-Media CDN, כולל תוכן שנשמר במטמון ופספוסים של מטמון.
מדיניות האבטחה של Cloud Armor מוגדרת לכל שירות Media CDN – כל הבקשות שמיועדות לכתובת ה-IP (או לשמות המארחים) של השירות הזה נאכפות באופן עקבי בהתאם למדיניות האבטחה. אפשר להחיל על שירותים שונים מדיניות אבטחה שונה, ואפשר ליצור כמה שירותים לאזורים גיאוגרפיים שונים לפי הצורך.
כדי להגן על התוכן ברמה של כל משתמש, מומלץ להשתמש בכתובות URL חתומות ובקובצי Cookie חתומים בשילוב עם מדיניות של Cloud Armor.
Media CDN לא מתייחס לכותרת referer במהלך הערכת הכללים של מדיניות אבטחה בקצה לסינון כותרות בשכבה 7, כשהיא מוגדרת לאחד מהערכים הבאים:
- כתובות URL מרובות
- כתובת URL יחסית
- כתובות URL מוחלטות תקינות שמכילות פרטי משתמש או רכיב של שבר
הגדרת מדיניות אבטחה
כדי להגדיר מדיניות אבטחה:
לפני שמתחילים
כדי לצרף מדיניות אבטחה של Cloud Armor לשירות Media CDN, צריך לוודא את הדברים הבאים:
- להכיר את Cloud Armor.
- שירות Media CDN קיים שרוצים להחיל עליו את המדיניות.
- אופציונלי, אבל מומלץ: מפעילים רישום ביומן בשירות Media CDN כדי לזהות בקשות חסומות.
כדי לאשר, ליצור ולצרף מדיניות אבטחה לשירות Media CDN, צריך גם את ההרשאות הבאות לניהול זהויות והרשאות גישה:
compute.securityPolicies.addAssociationcompute.securityPolicies.createcompute.securityPolicies.deletecompute.securityPolicies.getcompute.securityPolicies.listcompute.securityPolicies.updatecompute.securityPolicies.use
משתמשים שצריכים לצרף אישור קיים לשירות Media CDN צריכים רק את הרשאות ה-IAM הבאות:
compute.securityPolicies.getcompute.securityPolicies.listcompute.securityPolicies.use
התפקיד roles/networkservices.edgeCacheUser כולל את כל ההרשאות האלה.
יצירת מדיניות אבטחה
מדיניות האבטחה של Cloud Armor מורכבת מכמה כללים, כאשר כל כלל מגדיר קבוצה של קריטריונים תואמים (ביטוי) לבקשה ופעולה. לדוגמה, ביטוי יכול להכיל לוגיקה של התאמה ללקוחות שנמצאים בהודו, והפעולה המשויכת היא allow. אם בקשה לא תואמת לכלל, Cloud Armor ממשיך להעריך את הכלל הבא, עד שכל הכללים נבדקים.
למדיניות האבטחה יש כלל ברירת מחדל עם פעולה allow. כלל ברירת המחדל מאפשר בקשות שלא תואמות לכללים הקודמים. אפשר לשנות את זה לכלל deny אם רוצים allow רק בקשות שתואמות לכללים הקודמים ולדחות את כל השאר.
בדוגמה הבאה מוצג איך ליצור כלל שחוסם את כל הלקוחות שממוקמים באוסטרליה באמצעות HTTP 403, ומאפשר את כל הבקשות האחרות.
gcloud
כדי ליצור מדיניות חדשה מהסוג CLOUD_ARMOR_EDGE, משתמשים בפקודה gcloud compute security-policies create:
gcloud compute security-policies create block-australia \
--type="CLOUD_ARMOR_EDGE" --project="PROJECT_ID"
פעולה זו יוצרת מדיניות עם כלל הרשאה שמוגדר כברירת מחדל בעדיפות הנמוכה ביותר (priority: 2147483647):
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].
אחר כך תוכלו להוסיף כלל עם עדיפות גבוהה יותר:
gcloud compute security-policies rules create 1000 \
--security-policy=block-australia --description "block AU" \
--expression="origin.region_code == 'AU'" --action="deny-403"
הפלט שיתקבל:
Updated [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].
Terraform
אם בודקים את המדיניות, רואים את שני הכללים: הכלל הראשון חוסם בקשות שמקורן באוסטרליה (origin.region_code == 'AU'), והכלל השני, עם העדיפות הכי נמוכה, מאפשר את כל התנועה שלא תואמת לכלל (או לכללים) עם העדיפות הגבוהה יותר.
kind: compute#securityPolicy
name: block-australia
rules:
- action: deny(403)
description: block AU
kind: compute#securityPolicyRule
match:
expr:
expression: origin.region_code == 'AU'
preview: false
priority: 1000
- action: allow
description: default rule
kind: compute#securityPolicyRule
match:
config:
srcIpRanges:
- '*'
versionedExpr: SRC_IPS_V1
preview: false
priority: 2147483647
ruleNumber: '1'
type: CLOUD_ARMOR_EDGE
הוספת כללים למדיניות אבטחה
כללי מדיניות האבטחה של Cloud Armor הם קבוצות של כללים שמתאימים למאפיינים של שכבה 7 כדי להגן על אפליקציות או שירותים שפונים כלפי חוץ. כל כלל מוערך ביחס לתנועה הנכנסת.
אפשר להשתמש במאפיינים האלה לבקשות HTTP במדיניות אבטחה:
request.headers, request.method, request.path, request.scheme וגם
request.query. למידע נוסף על כתיבת ביטויים לכללים של מדיניות אבטחה, אפשר לעיין בהפניה לשפה של כללים בהתאמה אישית ב-Cloud Armor.
כלל במדיניות אבטחה של Cloud Armor מורכב מתנאי התאמה ומפעולה שמתבצעת כשהתנאי מתקיים.
gcloud
כדי ליצור כלל למדיניות אבטחה, משתמשים בפקודה gcloud compute security-policies rules create PRIORITY.
מחליפים את PRIORITY בעדיפות של הכלל במדיניות:
gcloud compute security-policies rules create PRIORITY \
--security-policy POLICY_NAME \
--description DESCRIPTION \
--src-ip-ranges IP_RANGES | --expression EXPRESSION \
--action=[ allow | deny-403 | deny-404 | deny-502 ] \
--preview
צירוף מדיניות לשירות
gcloud
כדי לצרף מדיניות קיימת של Cloud Armor לשירות Media CDN, משתמשים בפקודה gcloud edge-cache services update:
gcloud edge-cache services update SERVICE_NAME \
--edge-security-policy=SECURITY_POLICY
עדכון כלל במדיניות אבטחה
במאמר הזה מוסבר איך לעדכן כלל יחיד במדיניות אבטחה של Cloud Armor. אפשר גם לעדכן כמה כללים במדיניות אבטחה באופן אטומי.
gcloud
משתמשים בפקודה gcloud compute security-policies rules update:
gcloud compute security-policies rules update PRIORITY [ \
--security-policy POLICY_NAME \
--description DESCRIPTION \
--src-ip-ranges IP_RANGES | --expression EXPRESSION \
--action=[ allow | deny-403 | deny-404 | deny-502 ] \
--preview
]
לדוגמה, הפקודה הבאה מעדכנת כלל עם עדיפות 1111 כדי לאפשר תנועה מטווח כתובות ה-IP 192.0.2.0/24:
gcloud compute security-policies rules update 1111 \
--security-policy my-policy \
--description "allow traffic from 192.0.2.0/24" \
--src-ip-ranges "192.0.2.0/24" \
--action "allow"
כדי לעדכן את העדיפות של כלל, צריך להשתמש ב-API בארכיטקטורת REST. מידע נוסף זמין במאמר בנושא השיטה securityPolicies.patchRule.
צפייה בקובץ מצורף למדיניות
כדי לבדוק איזו מדיניות מצורפת לשירות קיים, בודקים (מתארים) את השירות.
gcloud
כדי לראות את מדיניות Cloud Armor שמצורפת לשירות Media CDN, משתמשים בפקודה gcloud edge-cache services describe:
gcloud edge-cache services describe SERVICE_NAME
בשדה edgeSecurityPolicy של השירות מפורטת המדיניות שמצורפת:
name: "SERVICE_NAME" edgeSecurityPolicy: "SECURITY_POLICY
הסרת מדיניות
כדי להסיר מדיניות קיימת, מעדכנים את השירות המשויך ומעבירים מחרוזת ריקה כמדיניות.
gcloud
משתמשים בפקודה gcloud edge-cache services update:
gcloud edge-cache services update SERVICE_NAME \
--edge-security-policy=""
השדה edgeSecurityPolicy מושמט עכשיו מהפלט של הפקודה gcloud edge-cache services describe SERVICE_NAME.
דוגמאות
ריכזנו כאן כמה תרחישים לדוגמה.
דוגמה: זיהוי בקשות חסומות
כדי שהבקשות החסומות יתועדו ביומן, צריך להפעיל את הרישום ביומן בשירות Edge Cache.
בקשות שהמדיניות מאפשרת או דוחה מתועדות ביומן של Logging. כדי לסנן בקשות שנדחו, שאילתת הרישום ביומן הבאה להגדרת prod-video-service תיראה כך:
resource.type="edge_cache_service" jsonPayload.statusDetails="denied_by_security_policy"
דוגמה: התאמה אישית של קודי תגובה
אתם יכולים להגדיר כלל ב-Cloud Armor כך שיחזיר קוד סטטוס ספציפי כפעולה שמשויכת לכלל נתון. ברוב המקרים, מומלץ להחזיר קוד סטטוס HTTP 403 DENY כדי לציין בבירור שהלקוח נחסם על ידי הכלל.
קודי הסטטוס הנתמכים הם:
- HTTP
403 Forbidden - HTTP
404 Not Found - HTTP
502 Bad Gateway
בדוגמה הבאה מוצג איך להגדיר את קוד הסטטוס שמוחזר:
כדי לציין את אחת מהאפשרויות [allow | deny-403 | deny-404 | deny-502] כפעולה שמשויכת לכלל, מריצים את הפקודה הבאה. בדוגמה הזו, הכלל מוגדר להחזרת קוד סטטוס 502 של HTTP.
gcloud compute security-policies rules create 1000 \
--security-policy=block-australia --description "block AU" \
--expression="origin.region_code == 'AU'" --action="deny-502"
כל כלל במדיניות אבטחה יכול להגדיר קוד סטטוס שונה בתשובה.
דוגמה: דחיית לקוחות מחוץ למדינה, למעט כתובות IP מותרות
מקרה נפוץ בהצגת מדיה הוא דחיית חיבורים מלקוחות שנמצאים מחוץ לאזור שבו יש לכם רישיונות תוכן או מנגנוני תשלום.
לדוגמה, יכול להיות שתרצו לאפשר רק ללקוחות שנמצאים בהודו, וגם לכל כתובות ה-IP שנמצאות ברשימת ההיתרים, כולל אלה של שותפי תוכן והעובדים שלכם, בטווח 192.0.2.0/24, ולדחות את כל השאר.
כדי להשיג את התוצאה הזו, משתמשים בביטוי הבא בשפה של כללים בהתאמה אישית ב-Cloud Armor:
origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
הביטוי הזה מוגדר ככלל allow, עם כלל ברירת מחדל deny שמוגדר להתאמה לכל שאר הלקוחות. למדיניות אבטחה תמיד יש כלל ברירת מחדל.
בדרך כלל מגדירים את זה לdefault deny תנועה שלא מאשרים באופן מפורש. במקרים אחרים, יכול להיות שתבחרו לחסום עומס תנועה קל וdefault allow את כל שאר התנועה.
בפלט של מדיניות האבטחה, שימו לב לפרטים הבאים:
- הכלל עם העדיפות הכי גבוהה (
priority: 0) מאפשר תעבורה מהודו או מהרשימה המוגדרת של כתובות IP. - הכלל עם העדיפות הכי נמוכה מייצג
default deny. מנוע הכללים דוחה את כל הלקוחות שהכללים בעלי העדיפות הגבוהה יותר לא מחזירים לגביהם את הערך True. - אפשר לשלב כמה כללים באמצעות אופרטורים בוליאניים.
המדיניות מאפשרת תנועה מלקוחות בהודו, מאפשרת תנועה מלקוחות מטווח IP מוגדר ודוחה את כל התנועה האחרת.
כשמציגים את פרטי המדיניות, הפלט נראה כך:
kind: compute#securityPolicy
name: allow-india-only
type: "CLOUD_ARMOR_EDGE"
rules:
- action: allow
description: ''
kind: compute#securityPolicyRule
match:
expr:
expression: origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
preview: false
priority: 0
- action: deny(403)
description: Default rule, higher priority overrides it
kind: compute#securityPolicyRule
match:
config:
srcIpRanges:
- '*'
versionedExpr: SRC_IPS_V1
preview: false
priority: 2147483647
אפשר גם להגדיר כותרת תגובה בהתאמה אישית באמצעות משתנה הכותרת {region_code}. אפשר לבדוק את הכותרת הזו באמצעות JavaScript ולהעביר אותה ללקוח.
דוגמה: חסימת תנועה מכתובות IP זדוניות מוכרות
הביטוי הבא בשפת הכללים המותאמים אישית של Cloud Armor חוסם תנועה מכתובות IP שמזוהות כזדוניות:
evaluateThreatIntelligence('iplist-known-malicious-ips')
הביטוי מנחה את Cloud Armor לבדוק בקשות נכנסות מול רשימת כתובות ה-IP הזדוניות הידועות של Google, שמתעדכנת כל הזמן, ומספק הגנה חזקה ואוטומטית.
כדי לחסום באופן אוטומטי כתובות IP זדוניות, אתם יכולים להגדיר את מדיניות האבטחה שלכם באמצעות כללי Google Threat Intelligence.
הפקודות הבאות של Google Cloud CLI מראות איך להוסיף כלל חדש של Google Threat Intelligence למדיניות קיימת, כמו my-edge-policy:
gcloud compute security-policies create my-edge-policy \
--type=CLOUD_ARMOR_EDGE
gcloud edge-cache services update my-edge-cache-service \
--edge-security-policy "my-edge-policy"
gcloud compute security-policies rules create 1000 \
--security-policy "my-edge-policy" \
--expression "evaluateThreatIntelligence('iplist-known-malicious-ips')" \
--action "deny-403"
דוגמה: חסימת לקוחות זדוניים לפי כתובת IP וטווחי כתובות IP
כדי להשיג את התוצאה הזו, משתמשים בביטוי הבא בשפה של כללים בהתאמה אישית ב-Cloud Armor:
inIpRange(origin.ip, '192.0.2.2/32') || inIpRange(origin.ip, '192.0.2.170/32')
אפשר לחסום טווחי כתובות IP עד /8 מסכה ב-IPv4 ועד /32 ב-IPv6. מקרה נפוץ בפלטפורמות סטרימינג הוא חסימה של טווחי כתובות IP של שרתי proxy או ספקי VPN כדי לצמצם את הסיכוי לעקיפת רישיונות תוכן:
inIpRange(origin.ip, '192.0.2.0/24') || inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.0/24') || inIpRange(origin.ip, '2001:DB8::B33F:2002/64')
יש תמיכה בטווחים של כתובות IPv4 ו-IPv6.
דוגמה: מתן הרשאה רק לרשימה קבועה של מיקומים גיאוגרפיים
אם יש לכם רשימה של קודי מדינות, אתם יכולים להשתמש באופרטור הבוליאני OR || כדי לשלב תנאי התאמה.
באמצעות שפת הכללים המותאמים אישית של Cloud Armor, הביטוי הבא מאפשר למשתמשים שמזוהים כמי שמגיעים מאוסטרליה או מניו זילנד:
origin.region_code == "AU" || origin.region_code == "NZ"
אפשר גם לשלב את זה עם ביטויים של origin.ip או inIpRange(origin.ip,
'...') כדי לאפשר לבודקים, לשותפים ולטווחים של כתובות IP ארגוניות לגשת לתוכן, גם אם הם לא נמצאים באחד מהאזורים הגיאוגרפיים שצוינו.
מספר ביטויי המשנה שמתועד לכל כלל עם ביטוי מותאם אישית. אם אתם צריכים לשלב כמה ביטויי משנה, אתם יכולים להגדיר כמה כללים במדיניות אחת.
דוגמה: חסימת לקוחות ממדינות מסוימות
דוגמה פחות נפוצה היא חסימת לקוחות ממדינות מסוימות, אבל לאפשר בקשות מכל המדינות האחרות.
כדי לעשות את זה, יוצרים מדיניות שחוסמת גם את המדינה וגם את כל הלקוחות שלא ניתן לקבוע את האזור שלהם, ואז עוברים לכלל הרשאה שמוגדר כברירת מחדל לכל הבקשות האחרות.
בדוגמה הבאה מתוארת מדיניות שחוסמת לקוחות מקנדה, וגם לקוחות שהמיקום שלהם לא ידוע, אבל מאפשרת את כל שאר התנועה:
kind: compute#securityPolicy
name: block-canada
type: "CLOUD_ARMOR_EDGE"
rules:
- action: deny(403)
description: ''
kind: compute#securityPolicyRule
match:
expr:
expression: origin.region_code == "CA" || origin.region_code == "ZZ"
preview: false
priority: 0
- action: allow
description: Default rule, higher priority overrides it
kind: compute#securityPolicyRule
match:
config:
srcIpRanges:
- '*'
versionedExpr: SRC_IPS_V1
preview: false
priority: 2147483647
דוגמה: דחיית בקשות לתוכן שנשמר במטמון עם כותרות ספציפיות
מדיניות אבטחה של קצה הרשת חלה על כל הבקשות שמיועדות לכל שירות Media CDN שהמדיניות מצורפת אליו. אכיפת המדיניות הזו מתבצעת לפני כל חיפוש במטמון. בקשות שלא מותרות על ידי מדיניות האבטחה של Edge נדחות עם קוד הסטטוס שהוגדר.
הביטוי הבא תואם לבקשות מכתובת ה-IP 1.2.3.4 שמכילות את המחרוזת user1 בכותרת user-agent:
inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('user1')
הפקודה הבאה מוסיפה את כלל הסינון 105 למדיניות האבטחה של הקצה my-edge-policy, שמצורפת לשירות Media CDN:
gcloud compute security-policies rules create 105 \
--security-policy "my-edge-policy" \
--expression = "inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('charlie')" \
--action= deny-403 \
--description="block requests from IP addresses in which the user-agent header contains the string charlie"
רישום פעולות אכיפה
כל יומן בקשות מספק פרטים על מדיניות האבטחה שהוחלה ועל כך שהבקשה אושרה (ALLOW) או נדחתה (DENY).
כדי להפעיל את הרישום ביומן, מוודאים שהערך של logConfig.enable מוגדר ל-true בשירות. אירועים של מדיניות אבטחה לא נרשמים ביומנים של שירותים שלא הופעלה בהם האפשרות 'יומנים'.
כשלקוח נמצא מחוץ לארצות הברית ומדיניות אבטחה בשם deny-non-us-clients בתוקף, שדוחה בקשות שמקורן מחוץ לארה"ב, זו רשומת היומן של בקשה שנדחתה:
enforcedSecurityPolicy: name: deny-non-us-clients outcome: DENY
בשירותים שלא צורפה אליהם מדיניות של Cloud Armor, הערך של enforcedSecurityPolicy.name הוא no_policy והערך של outcome הוא ALLOW. לדוגמה, רשומה ביומן הבקשות של שירות שלא מצורפת אליו מדיניות כוללת את הערכים הבאים:
enforcedSecurityPolicy: name: no_policy outcome: ALLOW
הסבר על סיווגים של GeoIP
Media CDN מסתמך על מקורות נתונים פנימיים של Google לסיווג כתובות IP כדי להסיק מיקום (אזור, מדינה, מחוז או עיר) מכתובת IP. אם אתם מבצעים העברה מספק אחד לכמה ספקים, או מפצלים את התנועה בין כמה ספקים, יכול להיות שמספר קטן של כתובות IP ישויכו לפעמים למיקומים שונים.
- Cloud Armor משתמש בקודי אזורים לפי תקן ISO 3166-1 alpha 2 כדי לשייך לקוח למיקום גיאוגרפי.
- לדוגמה,
USלארצות הברית אוAUלאוסטרליה. - במקרים מסוימים, אזור מקביל למדינה, אבל זה לא תמיד המצב. לדוגמה, הקוד
USכולל את כל המדינות בארצות הברית, מחוז אחד ושישה אזורים מרוחקים. - מידע נוסף זמין במאמר unicode_region_subtag בתקן הטכני של Unicode.
- אם אי אפשר להסיק את המיקום של הלקוח, הערך של
origin.region_codeמוגדר כ-ZZ.
אפשר להוסיף נתונים גיאוגרפיים לכותרות של תגובות לנקודת קצה של Media CDN (עם routing.routeRules[].headerActions[].responseHeadersToAdd[]) או לשקף את הנתונים הגיאוגרפיים שסופקו ל-Cloud Function כדי לאמת את ההבדלים בין מקורות נתוני geoIP במהלך השילוב והבדיקה הראשוניים.
בנוסף, יומני הבקשות של Media CDN כוללים את clientRegionנתונים ספציפיים ללקוח אחרים שאפשר לאמת מול מקורות הנתונים הקיימים.
המאמרים הבאים
- כאן מוסבר איך משתמשים בבקשות חתומות כדי לאשר תוכן על בסיס משתמש.
- כדאי לעיין בהפניה לכללים של Cloud Armor כדי להבין איך אפשר להגדיר כללים של התאמה לפי כתובת IP ומיקום גיאוגרפי, ואיך אפשר לשלב ביניהם.
- במסמכי התיעוד בנושא רישום ביומן מוסבר איך לשלוח שאילתות ליומני בקשות ולבדוק אילו בקשות נחסמו.