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

שני סודות, שני בעלים שונים

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

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

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

שלוש שאלות שקובעות את ההפרדה

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

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

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

מה לקוח באמת צריך

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

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

בטל משתמש אחד בלי לגעת בשער

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

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

הפקודות שלמטה בודקות תעודת לקוח ואז מבטלות אותה דרך רשות בסגנון OpenSSL, וזה הזרימה ש-easy-rsa עוטף:

openssl x509 -in client.crt -noout -subject -serial
openssl ca -config openssl.cnf -revoke client.crt
openssl ca -config openssl.cnf -gencrl -out crl.pem

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

שמור גיבויים נפרדים כמו הסודות

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

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

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