למה nc -uz לא יכול להוכיח ששרת OpenVPN מוכן
בדיקת UDP עם netcat מדווחת על הצלחה גם כששום דבר לא מאזין, ולכן היא לא יכולה להוכיח ששרת OpenVPN מוכן. בדקו את התהליך, את היומן, את המאזין ואת לקוח אמיתי.
הרצת nc -uz מול שרת OpenVPN כמעט לא מודדת דבר, ו המדריך של OpenBSD אומר זאת בהסתייגויות שלו: סריקות UDP במצב הזה מדווחות על הצלחה בין אם משהו מאזין ובין אם לא. סטטוס היציאה משקף את השליחה המקומית, לא את המצב המרוחק, ולכן מפקח שסומך עליו מחזיק שרת מת מסומן כבריא כל עוד טבלת התהליכים נראית סבירה. החלפתו מתחילה בהחלטה על איזו שאלה הבדיקה אמורה לענות, כי תהליך, מאזין, אימות ונגישות היישום הם ארבע תצפיות שונות. בדיקה שמציינת אחד מהם מועילה; בדיקה שרומזת על כל הארבעה היא נטל.
מה בדיקת UDP יכולה לראות ומה היא לא יכולה
nc -uz שולח דאטהגרם ויוצא, והסטטוס שהוא מחזיר מתאר את השליחה המקומית. פורט סגור עשוי להשיב ב-ICMP port unreachable, אבל ההתנהגות המתועדת של מצב סריקה זה אינה הופכת זאת לכשל, ופורט מסונן לא מחזיר תשובה כלל. לכן שתיקה והצלחה פירושן אותו דבר עבור הקורא.
זה הופך את הבדיקה לבדיקה של המחסנית המקומית, לא של השרת. היא אינה קובעת שהמארח נגיש, שהפורט קשור, שתהליך OpenVPN פועל או שלקוח יוכל להזדהות. בדיקת חיבור TCP חזקה יותר כי לחיצת היד נותנת תשובה חד-משמעית, אבל רק כשהפריסה באמת מאזינה ב-TCP. העברת הבדיקה ל-TCP באותו מספר בודקת מאזין שאולי אינו קיים, ומול שרת שעובד רק ב-UDP היא תכשיל שירות בריא.
התאמת הבדיקה לתעבורה המוגדרת באה לפני אמון בכל אחת משתי התוצאות. פריסת UDP זקוקה לאות אחר, לא לפרוטוקול אחר.
שלושה קוראים, שלוש שאלות שונות
המוכנות תלויה במי שואל. מנהל שירות שמפעיל מחדש תהליך שקרס צריך לדעת שהמופע עלה וקשר את המאזין שלו. מאזן עומסים צריך לדעת שלקוח שמגיע עכשיו יתקבל. מערכת ניטור צריכה לדעת שהנתיב מרשת אמיתית עדיין נושא הפעלה למשאב מורשה.
אלה אינם אותה בדיקה, ובדיקה אחת לא יכולה לכסות את שלושתם ביושר. בחרו תחילה את הקורא, ואחר כך את הראיה.
בנו את הבדיקה מהמופע הנוכחי
OpenVPN כותב שורת אתחול כשמופע מסיים לאתחל, והשורה הזו היא ראיה שימושית על האתחול המקומי. קראו אותה מהאתחול הנוכחי ולא מסוף קובץ שמצטבר, כי הצלחה מהשבוע שעבר נקראת בדיוק כמו הצלחה מלפני דקה. שרת יכול גם לסיים לאתחל לפני שאף לקוח התחבר אי פעם, ולכן השורה לא אומרת דבר על אימות.
לבדיקת אתחול, שלבו את מצב התהליך עם ראיה עדכנית מהיומן ועם מאזין שמתאים לתעבורה המוגדרת. הבדיקה צריכה להיכשל כשהתהליך פועל אך לא סיים לאתחל, מה שאומר ששאילתת היומן חייבת להיות מוגבלת לאתחול הזה וליחידה הזו.
systemctl is-active openvpn@server
sudo journalctl -u openvpn@server -b --no-pager | grep "Initialization Sequence Completed"
ss -lunp | grep 1194
שלושה פלטים, שלוש טענות: היחידה פעילה, האתחול הזה הפיק את שורת האתחול, ומשהו מחזיק בפורט UDP. אף אחד מהם לא אומר שלקוח יכול להתחבר. החזיקו אותם בנפרד בעמוד הסטטוס כדי שאירוע לא יתכווץ לנקודה ירוקה אחת.
שברו את זה בכוונה והתבוננו בבדיקה
בדיקה היא מהימנה רק לאחר שראיתם אותה נכשלת. עצרו את השרת, הריצו את הבדיקה ואשרו את התוצאה שאתם מצפים לה. אחר כך הפעילו אותו מחדש ואשרו שהבדיקה מתאוששת בלי שום שינוי אחר.
sudo systemctl stop openvpn@server
nc -uz 203.0.113.10 1194; echo "exit=$?"
ss -lunp | grep 1194
sudo systemctl start openvpn@server
ss -lunp | grep 1194
קראו את הבלוק שורה אחר שורה. פקודת netcat מדפיסה exit=0 בעוד ששום דבר אינו קשור, וזו כל הבעיה בשורה אחת. הראשון ss לא מדפיס דבר, ההפעלה מחדש מצליחה, והשני ss מציג שוב את המאזין. אם הבדיקה שלכם עוברת מול השרת העצור, היא מודדת את המחסנית המקומית ושום דבר אחר.
גם הכשל ההפוך חשוב. בדיקה שנכשלת מול שרת בריא גורמת להפעלות מחדש שמעולם לא היו נחוצות, ולולאת הפעלות מחדש היא בעצמה תקלה. בדקו את שני הכיוונים לפני שתחברו את הבדיקה למשהו שיכול לפעול לפיה.
מה שורת הסטטוס צריכה לומר
רשמו איזה גבול כל בדיקה מכסה: תהליך, מאזין, אימות או יישום. בדיקה אחת מכסה לעתים רחוקות יותר מאחד, ועמוד סטטוס שמכווץ אותם ל“up” מסתיר את ההבדל שחשוב בזמן אירוע. לנתיב הרשת השתמשו בלקוח אמיתי עם זהות ייעודית, תנו לו להשלים את לחיצת היד ופעולה מורשית אחת לא מזיקה, ואז נתקו. זה מתרגל את ערוץ הבקרה, את מדיניות האימות ואת המאזין בצעד אחד.
החזיקו את הזהות הזו בנפרד ממשתמשים אמיתיים ותנו לה את ההרשאות המינימליות שהבדיקה צריכה. בדיקת מוכנות עם גישה רחבה היא משטח תקיפה חדש שנוסף מטעמי נוחות. סובבו את האישורים שלה כמו בכל חשבון אחר, כי בדיקה שמפסיקה לאמת נראית בדיוק כמו שרת שהפסיק לקבל לקוחות.
נקבו בשם הגבול בטקסט ההתראה, כדי שהמגיב הראשון ידע אם להסתכל על היחידה, על השקע, על התעודה או על המסלול. בדיקה שלא יכולה לומר מה הוכיחה תהיה מהימנה מהסיבה הלא נכונה, וכך הבדיקה עם netcat שרדה מלכתחילה.