השקה של הצמדת מפתח ציבורי באמצעות דיווח של HPKP

אמילי סטארק

שימוש ב-SSL באתר שלכם הוא דרך חשובה לשמירה על האבטחה והפרטיות של המשתמשים שלכם. אבל הפעלת SSL היא לא סוף הסיפור: יש פעולות רבות שאפשר לבצע כדי לשפר עוד יותר את האבטחה שהאתר מספק, החל מהגדרת המאפיין Secure בקובצי ה-cookie, הפעלת HTTP Strict Transport Security ושימוש במדיניות אבטחת תוכן כדי לנעול את ההרשאות של האתר. אבל לפעמים קשה לפרוס את התכונות העוצמתיות האלה. כדי לעזור לכם להשיק גרסה מחמירה יותר של SSL, גרסת Chrome 46 כוללת תכונה שנקראת 'דיווח HPKP'.

מה המשמעות של כל ראשי התיבות האלה?

האבטחה באינטרנט כיום מסתמכת על אישורי SSL: חתימות קריפטוגרפיות שמוכיחות שהאתר הוא מי שהוא אומר. כשהדפדפן שולח בקשה לכתובת URL כמו https://developers.google.com, השרת מספק אישור SSL. אם האישור תקף, הדפדפן מאפשר את המשך הבקשה ומציג את כתובת האתר עם מנעול ירוק בסרגל הכתובות.

אבל מהו אישור תקף? אישור נחשב כתקף צריך להיות חתום על ידי רשות אישורים (CA), או אישור אחר שנחתם על ידי CA (שנקרא גם CA ביניים). הדפדפנים ומערכות ההפעלה כוללים רשימה של כמה מאות רשויות אישורים מהימנים להנפקת אישורים. עם זאת, הבעיה היא שכברירת מחדל, כל אחת מרשויות האישורים האלה יכולה להנפיק אישורים לכל אתר. אם אחד מהם יימצא בסיכון או יפעל בצורה לא תקינה, הדבר עלול לגרום נזק לאינטרנט כולו.

צריך להזין 'הצמדת מפתח ציבורי של HTTP', או HPKP. התקן הזה מאפשר לאתרים לשלוח כותרת HTTP שמנחה את הדפדפן לזכור (או "להצמיד") חלקים משרשרת אישורי ה-SSL שלו. לאחר מכן הדפדפן ידחה חיבורים נוספים שלא תואמים לסיכות שהוא קיבל בעבר. דוגמה לכותרת HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

הכותרת הזו מציינת שני גיבובים של אישור כסיכות. אחד מהם הוא גיבוב של אישור בשרשרת האישורים של האתר, והשני הוא קוד אימות לגיבוי או גיבוב של אישור שהאתר יכול להשתמש בו אם יהיה צורך לסובב את האישור שלו. הכותרת כוללת גם ערך max-age. לאחר מספר השניות, הדפדפן ישכח את הסיכה.

לקבלת מידע נוסף על HPKP באופן כללי, מומלץ לקרוא את המפרט או את הפוסט המעולה בבלוג של מפתח אחר ל-Chrome, כריס פאלמר.

האם כדאי לי להפעיל את HPKP עכשיו?

לא בהכרח. כשפורסים HPKP, די קל לטעות ולעשות משהו בטעות לאתר. אם תצמידו את האתר לקבוצה אחת של אישורים ואז תצטרכו לפרוס אישור חדש, משתמשים שראו את הסיכה לא יוכלו לגשת לאתר עד שתוקף הסיכה יפוג (על סמך הערך max-age שמופיע בכותרת).

בגלל שקשה להבין את התשובה הנכונה, בשלב זה נעשה שימוש ב-HPKP בעיקר בקומץ אתרים בולטים ורגישים. אם תחליטו להפעיל את HPKP, כדאי להתחיל בערך קצר מאוד של גיל מקסימלי ולהגדיל אותו בהדרגה אם אין בעיות.

מהו דיווח 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 ולבדוק אם הוא גורם לבעיות למשתמשים בלי לקחת את הסיכון של ביצוע DoSing באתר.

שימו לב שכותרת 'דוח בלבד' חלה רק על הבקשה שבה היא מתקבלת. הדפדפן לא זוכר סיכות לדוחות בלבד כמו שהן כן זוכרות סיכות אמיתיות. כך אפשר לבדוק את ההגדרות בלי לדאוג משמירה במטמון של ערכים שגויים בדפדפנים של המשתמשים, וניתן להשיק אותן באופן מצטבר (לדוגמה, רק במשאב אחד) כדי למנוע הצפת השרת באמצעות דוחות.

כשמשיקים את הכותרת Public-Key-Pins האמיתית כדי להתחיל לאכוף את הסיכות, אפשר לכלול גם ערך report-uri בכותרת הזו, כדי להמשיך לקבל דוחות במקרה של בעיות.

מה נכלל בדוח הפרה של HPKP?

דוח הפרה של HPKP הוא הודעת JSON שנשלחת בבקשת HTTP POST ל-report-uri שהגדרת. רשימת השדות מופיעה בspec, אבל כאן אדגיש שניים: 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 שמטפל עבורכם בדיווחים על הפרות.