בדף הזה מופיעה סקירה כללית של קובצי Cookie חתומים והוראות לשימוש בהם עם Cloud CDN. קובצי Cookie חתומים מאפשרים גישה למשאבים מוגבלת בזמן לקבוצה של קבצים, בין אם למשתמשים יש חשבונות Google ובין אם לא.
קובצי Cookie חתומים הם חלופה לכתובות URL חתומות. קובצי Cookie חתומים מגנים על הגישה כשלא ניתן לחתום בנפרד על עשרות או מאות כתובות URL לכל משתמש באפליקציה.
קובצי Cookie חתומים מאפשרים לכם:
- מאשרים למשתמש גישה ומספקים לו טוקן מוגבל בזמן לגישה לתוכן המוגן (במקום לחתום על כל כתובת URL).
- הגדרת היקף הגישה של המשתמש לתחילית ספציפית של כתובת URL, כמו
https://media.example.com/videos/, והענקת גישה למשתמש המורשה לתוכן מוגן רק בתוך תחילית כתובת ה-URL הזו. - כדאי להשאיר את כתובות ה-URL ואת מניפסטים המדיה ללא שינוי, כדי לפשט את תהליך יצירת החבילות ולשפר את האפשרות לשמירה במטמון.
אם אתם רוצים להגביל את הגישה לכתובות URL ספציפיות, כדאי להשתמש בכתובות URL חתומות.
לפני שמתחילים
לפני שמשתמשים בקובצי Cookie חתומים, צריך לבצע את הפעולות הבאות:
מוודאים ש-Cloud CDN מופעל. הוראות מפורטות זמינות במאמר שימוש ב-Cloud CDN. אפשר להגדיר קובצי Cookie חתומים בקצה העורפי לפני שמפעילים את Cloud CDN, אבל ההגדרה לא משפיעה עד שמפעילים את Cloud CDN.
אם צריך, מעדכנים לגרסה האחרונה של Google Cloud CLI:
gcloud components update
סקירה כללית זמינה במאמר כתובות URL חתומות וקובצי Cookie חתומים.
הגדרת מפתחות של בקשות חתומות
כדי ליצור מפתחות לכתובות URL חתומות או לקובצי Cookie חתומים, צריך לבצע כמה שלבים שמתוארים בקטעים הבאים.
שיקולי אבטחה
Cloud CDN לא מאמת בקשות בנסיבות הבאות:
- הבקשה לא חתומה.
- שירות לקצה העורפי או קטגוריית קצה עורפי של הבקשה לא מוגדרים עם Cloud CDN.
בקשות חתומות חייבות לעבור אימות במקור תמיד לפני הצגת התגובה. הסיבה לכך היא שאפשר להשתמש במקורות כדי להציג תערובת של תוכן חתום ולא חתום, ולקוח יכול לגשת למקור ישירות.
- Cloud CDN לא חוסם בקשות ללא פרמטר שאילתה
Signatureאו קובץ Cookie של HTTPCloud-CDN-Cookie. הוא דוחה בקשות עם פרמטרים לא תקינים (או עם פורמט שגוי). - כשהאפליקציה מזהה חתימה לא חוקית, צריך לוודא שהיא מגיבה עם קוד תגובה
HTTP 403 (Unauthorized). אי אפשר לשמור במטמון את קודי התגובהHTTP 403. - התשובות לבקשות חתומות ולבקשות לא חתומות נשמרות במטמון בנפרד, כך שתשובה מוצלחת לבקשה חתומה ותקינה אף פעם לא משמשת להצגת בקשה לא חתומה.
- אם האפליקציה שולחת קוד תגובה שניתן לשמירה במטמון לבקשה לא חוקית, יכול להיות שבקשות עתידיות חוקיות יידחו בטעות.
במערכות עורפיות של Cloud Storage, חשוב להסיר את הגישה הציבורית כדי ש-Cloud Storage יוכל לדחות בקשות שחסר בהן חתימה תקפה.
בטבלה הבאה מפורט סיכום של ההתנהגות.
| לבקשה יש חתימה | מציאה במטמון (cache hit) | התנהגות |
|---|---|---|
| לא | לא | העברה למקור העורפי. |
| לא | כן | הצגה מהמטמון. |
| כן | לא | אימות החתימה. אם התוקף מאומת, המערכת מעבירה את הבקשה למקור העורפי. |
| כן | כן | אימות החתימה. אם התוכן תקין, הוא יוגש מהמטמון. |
יצירת מפתחות של בקשות חתומות
כדי להפעיל תמיכה בכתובות URL חתומות ובעוגיות חתומות של Cloud CDN, צריך ליצור מפתח אחד או יותר בשירות קצה עורפי, בקטגוריית קצה עורפי או בשניהם, שמופעל בהם Cloud CDN.
לכל שירות לקצה העורפי או קטגוריית קצה עורפי, אפשר ליצור ולמחוק מפתחות בהתאם לצרכי האבטחה. אפשר להגדיר עד שלושה מפתחות לכל קצה עורפי בכל פעם. מומלץ להחליף את המפתחות מדי פעם על ידי מחיקת המפתח הכי ישן, הוספת מפתח חדש ושימוש במפתח החדש כשחותמים על כתובות URL או קובצי Cookie.
אפשר להשתמש באותו שם מפתח בכמה שירותי קצה עורפיים ובכמה דליים של קצה עורפי, כי כל קבוצת מפתחות היא עצמאית. שמות של מפתחות יכולים להכיל עד 63 תווים. כדי לתת שם למפתחות, אפשר להשתמש בתווים A-Z, a-z, 0-9, _ (קו תחתון) ו- (מקף).
כשיוצרים מפתחות, חשוב לשמור עליהם מאובטחים כי כל מי שיש לו אחד מהמפתחות יכול ליצור כתובות URL חתומות או קובצי Cookie חתומים ש-Cloud CDN מקבל עד שהמפתח נמחק מ-Cloud CDN. המפתחות מאוחסנים במחשב שבו יוצרים את כתובות ה-URL החתומות או קובצי ה-Cookie החתומים. בנוסף, Cloud CDN מאחסן את המפתחות כדי לאמת חתימות של בקשות.
כדי לשמור על סודיות המפתחות, ערכי המפתחות לא נכללים בתשובות לבקשות API. אם איבדתם מפתח, אתם צריכים ליצור מפתח חדש.
כדי ליצור מפתח בקשה חתום, פועלים לפי השלבים הבאים.
המסוף
- נכנסים לדף Cloud CDN במסוף Google Cloud .
- לוחצים על שם המקור שרוצים להוסיף לו את המפתח.
- בדף פרטי המקור, לוחצים על הכפתור עריכה.
- בקטע Origin basics (הגדרות בסיסיות של מקור), לוחצים על Next (הבא) כדי לפתוח את הקטע Host and path rules (כללים לגבי מארח ונתיב).
- בקטע Host and path rules (כללים לגבי מארח ונתיב), לוחצים על Next (הבא) כדי לפתוח את הקטע Cache performance (ביצועים של מטמון).
- בקטע תוכן מוגבל, בוחרים באפשרות Restrict access using signed URLs and signed cookies.
לוחצים על הוספת מפתח חתימה.
- מציינים שם ייחודי למפתח החתימה החדש.
בקטע שיטת יצירת מפתח, בוחרים באפשרות יצירה אוטומטית. אפשר גם ללחוץ על Let me enter (אני רוצה להזין) ואז לציין ערך של מפתח חתימה.
באפשרות הראשונה, מעתיקים את הערך של מפתח החתימה שנוצר באופן אוטומטי לקובץ פרטי, שבו אפשר להשתמש כדי ליצור כתובות URL חתומות.
לוחצים על סיום.
בקטע Cache entry maximum age (הגיל המקסימלי של רשומה במטמון), מזינים ערך ואז בוחרים יחידת זמן.
לוחצים על סיום.
gcloud
כלי שורת הפקודה gcloud קורא מפתחות מקובץ מקומי שאתם מציינים. צריך ליצור את קובץ המפתח על ידי יצירת 128 ביטים אקראיים חזקים, קידוד שלהם בפורמט Base64, ואז החלפת התו + ב-- והחלפת התו / ב-_. מידע נוסף זמין ב-RFC 4648.
חשוב מאוד שהמפתח יהיה אקראי לחלוטין. במערכת כמו UNIX, אפשר ליצור מפתח אקראי חזק ולאחסן אותו בקובץ המפתח באמצעות הפקודה הבאה:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
כדי להוסיף את המפתח לשירות לקצה העורפי:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
כדי להוסיף את המפתח לקטגוריית קצה עורפי:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
הגדרת הרשאות ב-Cloud Storage
אם אתם משתמשים ב-Cloud Storage והגבלתם את האפשרות לקרוא את האובייקטים, עליכם להוסיף את חשבון השירות של Cloud CDN לרשימות ה-ACL של Cloud Storage כדי לתת ל-Cloud CDN הרשאה לקרוא את האובייקטים.
אין צורך ליצור את חשבון השירות. חשבון השירות נוצר באופן אוטומטי בפעם הראשונה שמוסיפים מפתח למאגר מידע של backend בפרויקט.
לפני שמריצים את הפקודה הבאה, צריך להוסיף לפחות מפתח אחד לקטגוריית קצה עורפי בפרויקט. אחרת, הפקודה תיכשל עם שגיאה כי חשבון השירות למילוי המטמון של Cloud CDN לא נוצר עד שמוסיפים מפתח אחד או יותר לפרויקט.
.gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
מחליפים את PROJECT_NUMBER במספר הפרויקט ואת BUCKET בקטגוריית האחסון.
חשבון השירות של Cloud CDN service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com לא מופיע ברשימת חשבונות השירות בפרויקט. הסיבה לכך היא שחשבון השירות של Cloud CDN הוא בבעלות Cloud CDN, ולא בבעלות הפרויקט שלכם.
מידע נוסף על מספרי פרויקטים זמין במאמר איתור מזהה הפרויקט ומספר הפרויקט במסמכי העזרה של מסוף Google Cloud .
התאמה אישית של זמן השהייה המקסימלי במטמון
מערכת Cloud CDN שומרת במטמון תגובות לבקשות חתומות, ללא קשר לכותרת Cache-Control של השרת העורפי. הזמן המקסימלי שבו אפשר לשמור תשובות במטמון בלי לבצע אימות מחדש מוגדר באמצעות הדגל signed-url-cache-max-age, שמוגדר כברירת מחדל לשעה אחת. אפשר לשנות את ההגדרה כמו שמוצג כאן.
כדי להגדיר את זמן השהייה המקסימלי במטמון לשירות לקצה העורפי או לקטגוריית קצה עורפי, מריצים אחת מהפקודות הבאות:
gcloud compute backend-services update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
gcloud compute backend-buckets update BACKEND_NAME \ --signed-url-cache-max-age MAX_AGE
רשימה של שמות מפתחות של בקשות חתומות
כדי להציג את המפתחות בשירות לקצה העורפי או בקטגוריית קצה עורפי, מריצים אחת מהפקודות הבאות:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
מחיקת מפתחות של בקשות חתומות
כדי שכתובות URL שנחתמו על ידי מפתח מסוים לא יכובדו יותר, מריצים אחת מהפקודות הבאות כדי למחוק את המפתח משירות הקצה העורפי או מקטגוריית הקצה העורפי:
gcloud compute backend-services \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
gcloud compute backend-buckets \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
יצירת מדיניות
מדיניות של קובצי Cookie חתומים היא סדרה של key-value זוגות (מופרדים באמצעות התו :
), בדומה לפרמטרים של שאילתה שמשמשים בכתובת URL חתומה.
דוגמאות מופיעות במאמר בנושא הנפקת קובצי Cookie למשתמשים.
המדיניות מייצגת את הפרמטרים שבהם הבקשה תקפה. המדיניות נחתמת באמצעות קוד אימות הודעות (HMAC) מבוסס-גיבוב (hash), ש-Cloud CDN מאמת בכל בקשה.
הגדרת הפורמט והשדות של המדיניות
יש ארבעה שדות חובה שצריך להגדיר בסדר הבא:
URLPrefixExpiresKeyNameSignature
בזוגות key-value במדיניות חתומה בנושא קובצי Cookie יש משמעות לשימוש באותיות רישיות.
URLPrefix
URLPrefix מציין קידומת של כתובת URL בקידוד Base64 בטוח לשימוש בכתובות URL, שכוללת את כל הנתיבים שהחתימה צריכה להיות תקפה לגביהם.
URLPrefix מקודד סכימה (http:// או https://), שם דומיין מלא (FQDN) ונתיב אופציונלי. הוספת / בסוף הנתיב היא אופציונלית אבל מומלצת. הקידומת לא צריכה לכלול פרמטרים של שאילתה או מקטעים כמו ? או #.
לדוגמה, https://media.example.com/videos מתאים לבקשות לשני המיקומים הבאים:
https://media.example.com/videos?video_id=138183&user_id=138138https://media.example.com/videos/137138595?quality=low
הנתיב של הקידומת משמש כמחרוזת משנה של טקסט, ולא כנתיב של ספרייה.
לדוגמה, הקידומת https://example.com/data מעניקה גישה לשני המיקומים הבאים:
/data/file1/database
כדי להימנע מהטעות הזו, מומלץ לסיים את כל הקידומות ב-/, אלא אם אתם בוחרים בכוונה לסיים את הקידומת בשם קובץ חלקי כמו https://media.example.com/videos/123 כדי להעניק גישה ל:
/videos/123_chunk1/videos/123_chunk2/videos/123_chunkN
אם כתובת ה-URL המבוקשת לא תואמת ל-URLPrefix, Cloud CDN דוחה את הבקשה ומחזיר ללקוח את השגיאה HTTP 403.
בתוקף עד
Expires חייב להיות חותמת זמן של יוניקס (מספר השניות מאז 1 בינואר 1970).
KeyName
KeyName הוא שם המפתח של מפתח שנוצר מול קטגוריית קצה עורפי או שירות לקצה העורפי. שמות המקשים הם תלויי-רישיות.
חתימה
Signature היא חתימת HMAC-SHA-1 בקידוד base64 בטוח לכתובות URL של השדות שמרכיבים את מדיניות קובצי ה-Cookie. האימות הזה מתבצע בכל בקשה. בקשות עם חתימה לא תקינה נדחות עם השגיאה HTTP 403.
יצירה של קובצי Cookie חתומים באופן פרוגרמטי
בדוגמאות הקוד הבאות אפשר לראות איך ליצור קובצי Cookie חתומים באופן פרוגרמטי.
Go
Java
Python
אימות של קובצי Cookie חתומים
תהליך האימות של קובץ Cookie חתום זהה בעצם לתהליך של יצירת קובץ Cookie חתום. לדוגמה, נניח שרוצים לאמת את כותרת קובץ ה-Cookie החתומה הבאה:
Cookie: Cloud-CDN-Cookie=URLPrefix=URL_PREFIX:Expires=EXPIRATION:KeyName=KEY_NAME:Signature=SIGNATURE; Domain=media.example.com; Path=/; Expires=Tue, 20 Aug 2019 02:26:49 GMT; HttpOnly
אתם יכולים להשתמש במפתח הסודי שנקרא KEY_NAME כדי ליצור באופן עצמאי את החתימה, ואז לוודא שהיא תואמת ל-SIGNATURE.
הנפקת קובצי Cookie למשתמשים
האפליקציה שלך צריכה ליצור ולהנפיק לכל משתמש (לקוח) קובץ Cookie יחיד של HTTP שמכיל מדיניות חתומה בצורה נכונה:
יוצרים חותם HMAC-SHA-1 בקוד האפליקציה.
חותמים על המדיניות באמצעות המפתח שנבחר, ורושמים את שם המפתח שהוספתם ל-backend, כמו
mySigningKey.יוצרים מדיניות בנושא קובצי Cookie בפורמט הבא, וחשוב לזכור שהשם והערך הם תלויי-רישיות:
Name: Cloud-CDN-Cookie Value: URLPrefix=$BASE64URLECNODEDURLORPREFIX:Expires=$TIMESTAMP:KeyName=$KEYNAME:Signature=$BASE64URLENCODEDHMAC
כותרת
Set-Cookieלדוגמה:Set-Cookie: Cloud-CDN-Cookie=URLPrefix=aHR0cHM6Ly9tZWRpYS5leGFtcGxlLmNvbS92aWRlb3Mv:Expires=1566268009:KeyName=mySigningKey:Signature=0W2xlMlQykL2TG59UZnnHzkxoaw=; Domain=media.example.com; Path=/; Expires=Tue, 20 Aug 2019 02:26:49 GMT; HttpOnly
המאפיינים
Domainו-Pathבקובץ ה-Cookie קובעים אם הלקוח שולח את קובץ ה-Cookie ל-Cloud CDN.
המלצות ודרישות
צריך להגדיר באופן מפורש את המאפיינים
Domainו-Pathכך שיתאימו לדומיין ולקידומת הנתיב שמהם אתם מתכוונים להציג את התוכן המוגן. יכול להיות שהם יהיו שונים מהדומיין ומהנתיב שבהם קובץ ה-cookie נוצר (example.comלעומתmedia.example.comאו/browseלעומת/videos).מוודאים שיש רק קובץ Cookie אחד עם שם נתון לאותו
DomainוPath.חשוב לוודא שלא מונפקים קובצי Cookie סותרים, כי זה עלול למנוע גישה לתוכן בסשנים אחרים של הדפדפן (חלונות או כרטיסיות).
מגדירים את הדגלים
Secureו-HttpOnlyבמקרים הרלוונטיים. Secureמבטיח שקובץ ה-Cookie יישלח רק דרך חיבורי HTTPS. HttpOnlyמונע את הזמינות של קובץ ה-Cookie ל-JavaScript.מאפייני קובצי ה-Cookie
Expiresו-Max-Ageהם אופציונליים. אם לא מציינים אותם, קובץ ה-Cookie קיים כל עוד סשן הדפדפן (כרטיסייה, חלון) קיים.במקרה של מילוי מטמון או אי מציאה במטמון, קובץ ה-Cookie החתום מועבר למקור שמוגדר בשירות הקצה העורפי. חשוב לוודא שאתם מאמתים את הערך של קובץ ה-Cookie החתום בכל בקשה לפני הצגת התוכן.