שימוש ב-SSL באתר הוא דרך חשובה לשמירה על האבטחה והפרטיות של המשתמשים. אבל הפעלת SSL היא לא סוף הסיפור: יש הרבה פעולות שאפשר לבצע כדי לשפר את האבטחה באתר, החל מהגדרת המאפיין Secure בקובצי ה-cookie, דרך הפעלת HTTP Strict Transport Security ועד לשימוש במדיניות אבטחת תוכן כדי לנעול את ההרשאות באתר. עם זאת, לפעמים יכול להיות מאתגר לפרוס את התכונות החזקות האלה. כדי לעזור לכם להשיק סוג מחמיר יותר של SSL, גרסה 46 של Chrome כוללת תכונה שנקראת דיווח HPKP.
מה המשמעות של כל ראשי התיבות האלה?
האבטחה באינטרנט כיום מבוססת על אישורי SSL: חתימות קריפטוגרפיות שמוכחות שאתר מסוים הוא מה שהוא מציג את עצמו בתור. כשהדפדפן שולח בקשה לכתובת URL כמו https://developers.google.com, השרת מספק אישור SSL. אם האישור תקף, הדפדפן מאפשר להמשיך בטיפול בבקשה ומציג את כתובת ה-URL של האתר עם מנעול ירוק בסרגל הכתובות.
מהו אישור תקף? כדי שאישור ייחשב בתוקף, הוא צריך להיות חתום על ידי רשות אישורים (CA) או על ידי אישור אחר שחתום על ידי רשות אישורים (שנקראת רשות אישורים ביניים). דפדפנים ומערכות הפעלה כוללים רשימה של כמה מאות רשויות אישורים מהימנות שמנפיקות אישורים. עם זאת, הבעיה היא שכל אחת מרשות האישורים האלה יכולה להנפיק אישורים לכל אתר כברירת מחדל. אם אחד מהם ייפרץ או יפעל בצורה לא תקינה, זה עלול לגרום לנזק חמור לאינטרנט כולו.
מזינים את האפשרות HTTP Public Key Pinning (הצמדה של מפתח ציבורי ל-HTTP), או HPKP. התקן הזה מאפשר לאתרים לשלוח כותרת HTTP עם הוראה לדפדפן לזכור (או "לצמיד") חלקים מרשת אישורי ה-SSL שלו. לאחר מכן, הדפדפן יסרב לחיבורים הבאים שלא תואמים לפינים שקיבל בעבר. דוגמה לכותרת HPKP:
Public-Key-Pins:
pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
max-age=259200
הכותרת הזו מציינת שני גיבובים של אישורים כסיכות. אחד מהם הוא גיבוב של אישור בשרשרת האישורים של האתר, והשני הוא מספר PIN לגיבוי או גיבוב של אישור שאפשר להשתמש בו באתר במקרה שיהיה צורך לבצע רוטציה של האישור. הכותרת כוללת גם ערך max-age
. אחרי מספר השניות הזה, הדפדפן ישכח את הסיכה.
מידע נוסף על HPKP באופן כללי זמין במפרט או בפוסט מעולה בבלוג של המפתח של Chrome, כריס פאלמר.
האם כדאי להפעיל את HPKP עכשיו?
לא בהכרח. כשפורסים את HPKP, קל מאוד לעשות שגיאה ולגרום בטעות להתקפת מניעת שירות (DoS) על האתר. אם תוצמדו את האתר לקבוצה אחת של אישורי SSL ואז תצטרכו לפרוס אישור חדש, משתמשים שראו את התג לא יוכלו לגשת לאתר עד שתוקף התג יפוג (בהתאם לערך של max-age
בכותרת).
מכיוון שקשה להשתמש ב-HPKP בצורה נכונה, כרגע רק קומץ של אתרים בעלי חשיבות גבוהה וחשיפה גבוהה לאבטחה משתמשים בו. אם תחליטו להפעיל את HPKP, כדאי להתחיל עם ערך max-age קצר מאוד ולהגדיל אותו בהדרגה אם לא יהיו בעיות.
מהו דיווח HPKP ואיך הוא עוזר?
דיווח על HPKP, שמופיע ב-Chrome 46, הוא תכונה שאפשר להשתמש בה כדי לזהות הגדרות שגויות במהלך ההשקה של HPKP.
קודם כול, אפשר להתחיל לשלוח את הכותרת Public-Key-Pins-Report-Only
במקום את הכותרת Public-Key-Pins:
Public-Key-Pins-Report-Only:
max-age=2592000;
pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
report-uri="https://example.net/pkp-report"
כשהאתר שולח כותרת כזו, Chrome בודק אם החיבור הנוכחי תואם למסמכי הנעילה, ושולח דוח אל report-uri
אם לא. Chrome לעולם לא יחסום בקשות על סמך הסיכות בכותרת 'דיווח בלבד', כך שזו דרך בטוחה לנסות את HPKP ולבדוק אם הוא גורם לבעיות אצל המשתמשים, בלי להסתכן בהתקפת מניעת שירות (DoS) על האתר.
חשוב לזכור שכותרת Report-Only חלה רק על הבקשה שבה היא התקבלה. הדפדפן לא שומר סיכות לדיווח בלבד כמו שהוא שומר סיכות אמיתיות. כך תוכלו לבדוק את ההגדרות בלי לדאוג שהדפדפנים של המשתמשים יאחסנו במטמון ערכים שגויים, ותוכלו להשיק את התכונה בהדרגה (למשל, רק במשאב אחד) כדי למנוע הצפה של הדוחות בשרת.
כשמשיקים את הכותרת Public-Key-Pins
האמיתית כדי להתחיל לאכוף את ההצמדות, אפשר לכלול גם ערך report-uri בכותרת הזו, כדי להמשיך לקבל דוחות אם יהיו בעיות.
מה נכלל בדוח על הפרת HPKP?
דוח של הפרת HPKP הוא הודעת JSON שנשלחת בבקשת POST של HTTP אל report-uri
שהוגדר. רשימת השדות מופיעה במפרט, אבל אבליט כאן שניים מהם: served-certificate-chain
ו-validated-certificate-chain
. השדה served-certificate-chain
הוא האישור בדיוק כפי ש-Chrome קיבל אותו כשהגדיר את חיבור ה-SSL לבקשה. לעומת זאת, הערך של validated-certificate-chain
הוא השרשרת ש-Chrome יצרה מחדש כשניסה לאמת את האישור של השרת, ויכול להיות שהוא שונה מ-served-certificate-chain
. לקוחות שונים מבצעים אימות אישורים בדרכים שונות, וזו יכולה להיות סיבה נפוצה להגדרות שגויות של HPKP. חשוב לסמן את השדה הזה אם אתם מקבלים דוחות לא צפויים.
עוד 'מלכודת' אחרונה
אם אתם פורסים דיווח על HPKP, חשוב לזכור ש-Chrome מבצע אימות של סיכות לכל הבקשות, כולל בקשות לשליחת דוחות. לכן, אם פרסתם את HPKP באתר, מומלץ לשלוח את דוחות ה-HPKP לדומיין אחר שלא הוצמד. אחרת, הפרת הצמדה באתר תגרום ליצירת דוח לגבי אותו דומיין, שייכשל גם הוא בבדיקה של הפרת הצמדה, ולכן לא תקבלו את הדוח.
אם אין לכם דומיין אחר זמין, תוכלו לנסות שירות כמו report-uri.io, שמטפל בדוחות הפרות בשבילכם.