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

השגיאה מגיעה לפני השער

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

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

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

השוו את המיכלים, לא את התווים

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

Where the value stopsWhat you seeWhat you checkWho owns the fix
GUI field or managed profileA validation message before any connection opensThe selected authentication mode and whether the field holds the secret or the usernameThe device owner or the profile author
Keychain or secret agentA prompt that keeps reappearing, or an agent errorWhether the agent is unlocked and holds an entry for this profileThe user who owns the keychain
Two-line credential fileA prompt for a password that was already suppliedLine count, line order and whether a trailing newline is presentWhoever generated the file
Shell argument or environmentWorks interactively but fails in automationWhether the shell expanded, trimmed or logged the valueWhoever wrote the automation

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

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

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

בנו את קובץ פרטי ההתחברות בלי נזק מהמעטפת

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

read -r VPN_USER
read -rs VPN_PASS
printf '%s\n%s\n' "$VPN_USER" "$VPN_PASS" > /etc/openvpn/client/creds
chmod 600 /etc/openvpn/client/creds
openvpn --config /etc/openvpn/client/office.conf --auth-user-pass /etc/openvpn/client/creds

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

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

קראו את השלב מהשגיאה הראשונה

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

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

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

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