הקצאת לקוח OpenVPN בשלבים שנעצרים בעת שגיאה
חמישה שלבים מונעים מסקריפט הקצאה להשאיר התקנה חלקית: אמת את הקלט, הכן את הסט, החלף באופן אטומי, הפעל בעלים אחד, תכנן הוצאה משימוש.
סקריפטי הקצאה שמדווחים על שגיאה וממשיכים גרועים מסקריפטים שלעולם אינם רצים. הגדרת הלקוח נוגעת במפתחות מוגנים, בזהות בשער ובשירות שאולי כבר משרת תעבורה. כל אחד מאלה זקוק לתנאי עצירה, והסקריפט צריך לדעת לאיזה שלב הגיע כשעצר.
התייחס לכל העניין כאל טרנזקציה אחת עם חמש נקודות ביקורת, וגרום לכל נקודת ביקורת לסרב להמשיך בכוחות עצמה.
תקן את הקלט לפני נגיעה במערכת הקבצים
התחל בחוזה מפורש: זהות אחת, מקור פרופיל אחד, בעל שירות אחד מיועד. אמת שהפרופיל קיים, שהתעודה והמפתח שאליהם הוא מפנה קריאים, ושספריית היעד שייכת לחבילה הצפויה. נתיב שנפתר אינו הוכחה שהחומר שמאחוריו שלם.
דחה משתנים ריקים מוקדם. $DEVICE שלא הוגדר ומתרחב לכלום הופך את install -m 400 $KEY /etc/openvpn/client/ להעתק המכוון לספרייה, והכשל מגיע מאוחר יותר כשירות שאינו יכול לקרוא את המפתח שלו.
הרכב את סט הפרופילים בספריית הכנה
בנה תחילה את הסט המלא במקום פרטי: פרופיל, CA, תעודת לקוח, מפתח וכל עזר שהפרופיל קורא לו. העתק עם install -m 400 -o root -g root כדי שההרשאות ייקבעו ביצירה ולא אחריה. לאחר מכן בדוק את ההפניות בתוך הפרופיל, מפני ששורה יחסית של ca או key נפתרת מול ספריית העבודה של היחידה ברגע שהשירות עולה. אין לכתוב דבר לספרייה החיה עד שכל הסט מאומת.
רשום טביעת אצבע שאינה סודית של מה שהריצה הזו הפיקה, למשל sha256sum office.conf השמור לצד סמן גרסה. הערך הבודד הזה הוא שמאפשר לריצה חוזרת להבחין בין עדכון לבין אי-פעולה.
החלף באופן אטומי ושמור את הסט הקודם
העבר את הסט המוכן למקומו בפעולה אחת היכן שמערכת הקבצים מאפשרת, ושמור את הסט הקודם שנבדק תחת שם עם חותמת זמן. העתק חלקי שמשאיר פרופיל חדש לצד מפתח ישן יוצר שירות שמאמת זהות שגויה ואינו מתעד דבר שימושי על הסיבה. אם ההחלפה אינה יכולה להיות אטומית, סדר את ההעברות כך שהפרופיל ינחת אחרון.
כשהיעד כבר קיים, החלט במפורש אם הריצה הזו היא עדכון, ריצה חוזרת זהה או התנגשות עם הפרופיל של התקן אחר. דריסה שקטה של פרופיל השייך לזהות אחרת היא הדרך שבה שתי מכונות מגיעות לחלוק תעודה אחת. דחה את הריצה ונקוב בשם הבעלים המתנגש.
הפעל בעלים אחד והוכח זאת
בחר נתיב הפעלה אחד, או מופע systemd או NetworkManager, והשתמש בו בעקביות. הפעלת תהליך openvpn לא מנוהל לצד יחידה מופעלת נותנת שתי מנהרות, עדכוני DNS מתחרים ואין תשובה ברורה למי מהן מכוונת פקודת עצירה. לאחר ההפעלה בדוק את systemctl is-active openvpn-client@office, אחר כך את הנתיב לתחילית המרוחקת, ואחר כך את resolvectl status עבור הפותר שהתקינה המנהרה. סיים בהגעה למשאב אחד שלמענו קיימת המנהרה.
תהליך פועל וסמל מגש ירוק הם עובדות תהליך, לא הוכחה שהזהות ומדיניות התעבורה שרדו את המסירה.
ריצה חוזרת והוצאה משימוש הן זרימות עבודה נפרדות
ריצה שנייה צריכה להתכנס לאותם קבצים שנבדקו ולאותו בעלים, ולא ליצור חשבון שני או דמון שני. הוצאה משימוש היא נוהל בפני עצמו: עצור את הבעלים המדויק, ארכב או מחק את הפרופיל המקומי לפי המדיניות, ובטל את הזהות בשער. מחיקת קובץ מפתח מקומי אינה מבטלת עותק שכבר עזב את המכונה.
שמור נתיב התאוששות שאינו תלוי במנהרה, כגון גישה למסוף או נתיב ניהול שני. שינוי הקצאה שנועל אותך מחוץ למכונה הוא שינוי כשל גם כשכל שלב דיווח על הצלחה.
הסקריפט שראוי לשמור הוא טרנזקציה סביב בעלות וראיות. רשימה קצרה של פקודות העתקה מורשות אינה אותו דבר.