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

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

מה הלקוח והשער מחליפים, לפי הסדר

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

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

הסדר הזה מסביר למה openconnect --authenticate קיים. הריצו אותו והוא מבצע את שלב האינטרנט, מדפיס בלוק קטן של משתני מעטפת כמו COOKIE, HOST, CONNECT_URL ו־FINGERPRINT, ואז יוצא לפני שנבנית מנהרה. סקריפט עטיפה יכול אחר כך להתחיל את החיבור האמיתי עם הערכים האלה, וזה בדיוק הפיצול שנדרש בפריסה בלי ממשק או בשני מכולות.

הקוקי הוא נושא סשן, לא מפתח

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

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

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

העברת הקוקי בלי להשאיר עותקים

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

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

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

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

אימות ותפוגה בשלב השני

השלב השני עדיין חייב לאמת את השרת. ה־FINGERPRINT ש־--authenticate מדפיס הוא נעיצת תעודה בצורה pin-sha256:, והעברתו לקריאת המנהרה עם --servercert משאירה את הבדיקה מעוגנת בשער שאליו אומתם. כיבוי בדיקת התעודות כדי לפשט סקריפט מסיר את ההוכחה היחידה שהקוקי נמסר למארח המיועד.

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

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

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