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

שלושה פרוטוקולים, שלוש משמעויות

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

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

IPsec ו-OpenVPN משתמשים במילה אחרת

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

האפשרויות tls-auth ו-tls-crypt של OpenVPN מצמידות מפתח סטטי לערוץ הבקרה, בכך שמוסיפות חתימת HMAC או מצפינות את המשא ומתן עצמו. המפתח הזה אינו סיסמת משתמש ואינו מחליף את תעודת הלקוח. ההבחנה חשובה בזמן החידוש, כשהחלפת סיסמה מותירה את מפתח ערוץ הבקרה ללא שינוי.

ה-PSK של WireGuard מוסיף, הוא לא מזהה

לצדדים ב-WireGuard כבר יש מפתחות ציבוריים ופרטיים של Curve25519, ולחיצת היד מאמתת את הזהויות האלה. מפתח משותף מראש אופציונלי מעורבב לתוך מפתח השרשרת ומוסיף חומר סימטרי מעל החלפת המפתחות הציבוריים.

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

בדקו הפצה, רוטציה והסרה

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

טקסט Base64 אינו הצפנה. סוד שנשמר לצד תעודה ציבורית באותה תיקייה הוא עדיין סוד בטקסט גלוי.

openssl rand -base64 32
sudo wg show wg0 preshared-keys
sudo grep -R -n 'psk' /etc/ipsec.d/ 2>/dev/null

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

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

מאמרים קשורים