AnyConnect בלינוקס: תסריט בטוח של רצף הכניסה
קובץ ה-vpn של Cisco AnyConnect קורא תשובות מ-stdin, וזה מספיק לכניסה ניתנת לחזרה. בנה את הרצף, הגן על הקובץ, אמת ועצור.
לקוח ה-vpn שמגיע עם Cisco AnyConnect מתנהג כמו שיחה: הוא מדפיס בקשה, ממתין לשורה ואז מדפיס את הבאה. הזינו את השיחה הזו מקובץ או מצינור ואותו קובץ בינארי פועל ללא השגחה. הטכניקה היא הפניה אחת ועוד רשימה מסודרת של תשובות, והרשימה, לא ההפניה, היא שקובעת אם התסריט אמין.
שני דברים שוברים את זה בפועל. סדר הבקשות משתנה כשהשער שואל משהו נוסף, וסיסמה שמורה הופכת שגיאת הקלדה אחת לנעילת חשבון. התייחסו לרצף כאל נתונים מגורסנים שאפשר להשוות אחרי כל שינוי בשער. היכשלו בקול רם במקום לנסות שוב, כי לולאה היא בדיוק הדרך שבה סיסמה שהוקלדה בטעות הופכת לחשבון נעול.
רצף אחד, בסדר שבו הלקוח שואל
הריצו את הלקוח פעם אחת באופן אינטראקטיבי ורשמו כל בקשה בסדר שבו היא מופיעה. התמלול הזה הופך לקובץ התשובות. כשאתם מפנים את הקובץ לקובץ הבינארי, השורה הראשונה חייבת להיות פקודת החיבור עצמה, ולכן הרצף מתחיל בשם מארח ולא בשם משתמש.
connect vpn.example.com
0
<username>
<password>
y
exit
ה-0 החשוף בוחר את פרופיל החיבור הראשון כשהשער מציע רשימה; השתמשו באינדקס שהשער שלכם מדפיס. ה-y מקבל באנר כניסה, לכן מחקו את השורה הזו אם אין באנר והוסיפו שורה בכל מקום שבו השער שלכם שואל שאלה נוספת. ה-exit שבסוף הוא מה שמאפשר ללקוח לסיים בצורה נקייה כשהתשובה האחרונה נוצלה.
/opt/cisco/anyconnect/bin/vpn -s < anyconnect.txt
מצב לא אינטראקטיבי אינו אופציונלי כאן. בלי -s הלקוח יכול להשתלט על הטרמינל ולהתעלם מקלט מופנה; איתו התשובות נקראות מהזרם והתהליך חוזר. במקום שבו הקובץ הבינארי זקוק להרשאות מוגברות, עטפו את הקריאה ב-sudo -n כדי שהתסריט ייכשל מיד במקום להיחסם על בקשת סיסמה.
היכן קובץ התשובות דולף
קובץ שמכיל סיסמה הוא אישור גישה, לכן תנו לו את ההרשאות של אחד כזה: מצב 600, בבעלות החשבון שמריץ את העבודה, ואף פעם לא בתוך תיקייה משותפת או מסונכרנת. צרו אותו כשהמצב כבר מוחל במקום לתקן אותו אחר כך, כי קובץ קריא לכולם לרגע בין הכתיבה ל-chmod.
install -m 600 /dev/null ~/.config/anyconnect.txt
chmod 700 ~/.config
החצי השני הוא argv. סיסמה שמועברת כארגומנט גלויה לכל משתמש מקומי שמפרט תהליכים, והיא גם נוחתת בהיסטוריית ה-shell. קראו אותה מתיאור קובץ או ממשתנה סביבה במקום זאת, ועטפו את המטען במרכאות כדי שה-shell לא יוכל להרחיב דבר בתוכו.
printf '%s\n' 'connect vpn.example.com' '0' "$VPN_USER" "$VPN_PASS" 'y' 'exit' \
| sudo -n /opt/cisco/anyconnect/bin/vpn -s
שימו לב למרכאות. בתוך מרכאות כפולות סיסמה שמכילה ! עלולה להיות מורחבת על ידי shell אינטראקטיבי לפני שהלקוח בכלל רואה אותה, והכשל מגיע כשגיאת event-not-found גנרית שנראית כמו בעיית פרוטוקול.
הוכיחו את המנהרה ואז סגרו אותה
מצב מחובר מוכיח רק שהלקוח מאמין שיש לו הפעלה. בחרו מארח שעונה רק מתוך רשת החברה ובדקו אותו פעם אחת לפני כל דבר אחר. כשל שם הוא תקלת ניתוב או מדיניות, והרצה חוזרת של הכניסה לא תשנה אותו.
/opt/cisco/anyconnect/bin/vpn state
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 https://<internal-host>/
/opt/cisco/anyconnect/bin/vpn disconnect
בדקו את פלט המצב לפני הניתוק ואחריו. לקוח שנשאר עם הפעלה מיושנת יכול לסרב לחיבור הבא בזמן שהתסריט עדיין מדווח על הצלחה, ואופן כשל זה בלתי נראה אם מסתכלים רק בקודי יציאה. השוו בין שתי הקריאות במקום לסמוך על השנייה לבדה. כינויים בפרופיל shell מספיקים לשימוש יומיומי, ואילו כל דבר מתוזמן ראוי לאותה סקירת אישורי גישה וזהות כמו כל עבודה אחרת ללא השגחה.
כשהרשימה הקבועה מפסיקה להיות בטוחה
קובץ תשובות מקודד את סדר הבקשות של היום. באנר שהשתנה, שינוי סיסמה כפוי או אתגר גורם שני הופכים אותו ללולאה שעלולה לנעול את החשבון, ולכן התסריט חייב לצאת בתשובה הלא צפויה הראשונה במקום לאתחל מחדש.
תפסו את מה שהלקוח הדפיס, החזירו סטטוס שאינו אפס והשאירו את ההחלטה לקורא. במקום שבו השער דורש גורם שני, התשובה הכנה היא שכניסה ללא השגחה אינה זמינה עבור הפרופיל הזה, ולא שהרצף זקוק לשורה נוספת.
רוטציה שייכת לאותה סקירה. אם אישור הגישה נשמר, החליטו מי יכול לקרוא אותו, מתי הוא משתנה ומה מסיר אותו כשהמארח נבנה מחדש. תסריט שעובד שנה כי אף אחד לא נגע בסיסמה אינו עיצוב, אלא תאונה שמחכה למדיניות רוטציה.
פרופילים שאינם AnyConnect
שני סגנונות אישורי גישה ותיקים יותר של Cisco מתבלבלים עם זה. פרופיל vpnc מבקש IPSec ID, שהוא למעשה שם הקבוצה, אחר כך סוד קבוצה, אחר כך אישורי הגישה שלכם, וכל השלושה מגיעים ממי שמפעיל את השער. Cisco IPsec הישן הוא פרוטוקול אחר מ-AnyConnect, ולכן vpnc לא יכול להגיע לשירות שהוא רק AnyConnect; openconnect --protocol=anyconnect הוא הלקוח הפתוח לעבודה הזו.
קובץ .pcf מתאר את פרופיל הלקוח הוותיק. אפשר להזין מחדש ידנית את המארח, שם הקבוצה וסיסמת הקבוצה שבתוכו בלקוח שמדבר Cisco IPsec, אם כי הקובץ אינו ייבוא אוניברסלי וכל פורט או מצב מנהרה שאינו ברירת מחדל נעלם בדרך כלל בהעברה.
התחילו ממה שהשער באמת מציע, ואז בחרו את הלקוח שמדבר בפרוטוקול הזה. העתקת פרופיל מאתר אחר היא הדרך שבה אנשים מגיעים לדבג אישורי גישה שמעולם לא היו הבעיה.