אתם כותבים סקריפט שמריץ scutil --nc start עם שם החיבור, הוא עובד ב-Mac שלכם, והוא נכשל בכל מכונה שהותקנה לאחרונה במשרד. הסקריפט לא שבור. מבקשים ממנו משהו שמעולם לא יכול היה לעשות: הפעלת חיבור קיים אינה אותה פעולה כמו יצירת חיבור חדש.

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

עם מה פקודת ההתחלה באמת מדברת

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

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

שלושה בעלים של תצורת VPN

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

תצורת VPN אישית מקורית נוצרת דרך Network Extension API של Apple, שמכסה את פרוטוקולי IPsec ו-IKEv2 המובנים. זהו ממשק יישום עם שלב שמירה ואישור משתמש, לא פקודת מעטפת שיוצרת בשקט כל סוג מנהרה שספק מספק.

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

להקצאה מקורית יש שמירה ואישור

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

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

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

מה פקודת התחלה ניתנת לחזרה רשאית להניח

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

בחיבורים מקוריים, בקשת סשן נקובה כמו scutil --nc start היא פעולת בקרה. היא אינה מתקינה הגדרות שרת, אינה מייבאת אישורים ואינה מבצעת הרשאה של שמירה ראשונה. התייחסו אליה כאל השלב האחרון בשרשרת, לעולם לא כאל השרשרת כולה.

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

שתי בדיקות קבלה

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

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

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