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

מה באמת נושא קובץ .ovpn

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

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

השוו לפי תפקיד, לא לפי שורה

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

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

  • remote, proto ופורט, כולל כל בלוק חיבור.
  • ca וcert: מנפיק, נושא ותאריך תפוגה.
  • אם יש בכלל מפתח פרטי, לעולם לא מה הוא מכיל.
  • tls-auth או tls-crypt נוכחות וכיוון מפתח.
  • הנחיות אימות, כולל כל הפניה לקובץ אישורים.
  • מסלולים, אפשרויות DNS וווי סקריפט שרצים בעת החיבור.

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

למה diff פשוט הוא הכלי הלא נכון

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

openssl x509 -in ca.crt -noout -subject -issuer -enddate
openssl x509 -in client.crt -noout -subject -issuer -enddate
grep -E '^(remote|proto|port|tls-auth|tls-crypt|route|dhcp-option)' profile.ovpn

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

בנו עותק מצונזר לכרטיס

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

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

השאירו את ההשוואה קשורה לכשל

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

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

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