השהיית לקוח OpenVPN אחד: מדוע הביטול הוא המנוף הלא נכון
הריגת הפעלה הפיכה; ביטול התעודה אינו. החליטו איזה מנוף המקרה דורש, ובנו מחדש את ה-CRL רק כשזה מתאים.
השהיית הגישה של לקוח אחד והסרה שלו לתמיד נראות כמו אותה משימה עד שמנסים לבטל אחת מהן. ביטול תעודה כותב רשומה שהשרת מתייחס אליה כסופית, וביטול שלה פירושו עריכת מסד הנתונים של המנפיק ביד. נטישת המנהרה הפעילה היא פקודת ניהול שלא משנה דבר באמון. בחרו את המנוף בשאלה אם המפתח עדיין ראוי לאמון, ולא בשאלה כמה דחוף הבקשה מרגישה.
האמונה: מבוטל ומושהה הם אותו דבר
קבלן מושהה לשבוע והרפלקס הוא לבטל, כי ביטול נשמע כמו כיבוי משהו. זה נראה מסודר, זה לוקח עשר שניות, וזה משאיר עריכת מסד נתונים כדרך היחידה חזרה. הרפלקס מובן והוא קרוב יותר לשריפת דרכון מאשר לסגירת דלת. התקן מושהה ומפתח שנחשף דורשים טיפול שונה, ורק אחד מהם זול לביטול.
ההבדל הוא בהסמכה ולא באדם. מפתח שעדיין בידיים הנכונות יכול להיות מושהה ולהתחדש בלי שום אובדן אמון. מפתח שאולי הועתק לא צריך להיות משוחזר לעולם, משום ששיקום טוען שהעותק אינו קיים.
רשמו את התשובה לפני שנוגעים באחת משתי המערכות. אם אינכם יכולים לומר אם המפתח נחשף, התשובה השמרנית היא החלפה.
הפילו את ההפעלה הפעילה עם ממשק הניהול
OpenVPN מציע ממשק ניהול שיכול לרשום הפעלות ולהרוג אחת מהן לפי השם המשותף. הפעילו אותו על localhost, הרחיקו אותו מהממשק הציבורי, ושלחו את פקודת ההרג כשההפעלה חייבת להיעלם עכשיו. הפקודה סוגרת רק את המנהרה ההיא, וכל לקוח אחר ממשיך לעבוד.
זו תגובה לבעיה פעילה, לא מדיניות השהיה. אותו פרופיל יכול להתחבר מחדש בתוך דקה, כי שום דבר בהסמכה שלו לא השתנה. השתמשו בה כשההפעלה חייבת ללכת וההחלטה המתמשכת עדיין מתקבלת.
ודאו שההפעלה הייתה מחוברת לפני שאתם הורגים אותה, כדי שלא תרדפו אחרי לקוח שמעולם לא התחבר. פקודת המצב שלמטה מדפיסה מה מחובר כרגע.
printf 'status 2\nquit\n' | nc 127.0.0.1 7506
printf 'kill kiosk-14\nquit\n' | nc 127.0.0.1 7506אם ההרג מדווח שאין לקוח כזה, השם המשותף בתעודה אינו המחרוזת שהקלדתם. קראו את פלט המצב ולא את שם קובץ הפרופיל.
מה ה-CRL באמת שולט בו
השרת אינו מתייעץ עם דגל ביטול השמור בתעודה. הוא קורא את רשימת ביטול התעודות הנקראת ב-crl-verify בכל חיבור חדש, ודוחה תעודה שהמספר הסידורי שלה מופיע ברשימה ההיא. מכאן נובעות שתי השלכות, ושתיהן חשובות תפעולית. הקובץ חייב להיות קריא לחשבון שהשרת מוריד אליו הרשאות, ולקוח שכבר מחובר ממשיך לפעול עד שיתחבר מחדש.
ההשלכה השנייה מפתיעה אנשים בזמן אירועים. ביטול תעודה אינו סוגר את המנהרה שמשתמשת בה כרגע. צמדו לביטול הרג ניהולי אם ההפעלה חייבת להסתיים מיד, והתייחסו לשתי הפעולות כשלבים נפרדים במדריך.
בדקו את הרשימה כדי לראות מה השרת באמת יאכוף, במקום לסמוך על חותמת הזמן של הקובץ האחרון שהעתקתם. מספר המספרים הסידוריים הוא החלק החשוב.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | sed -n '1,14p'
ls -l /etc/openvpn/server/crl.pemרשימה בלי רשומות ורשימה עם הרשומות הנכונות נראות זהות ברישום תיקייה, ולכן שווה להדפיס את מספר המספרים הסידוריים. שורת ההרשאות חשובה באותה מידה, משום שקובץ שהדמון אינו יכול לקרוא מייצר כשל שנראה כמו לקוח נדחה.
שחזור רשומה, בזהירות
שחזור תעודה פירושו היפוך רשומה במסד ההנפקה ופרסום רשימה חדשה. easy-rsa 3 מחזיק את המסד הזה כ-index.txt תחת תיקיית PKI, בעוד פריסות ישנות יותר השתמשו בסידור אחר. שורה מתחילה באות סטטוס ובתאריך תפוגה. שורה מבוטלת מוסיפה חותמת זמן לביטול לפני שהיא ממשיכה עם המספר הסידורי, שם קובץ התעודה והשם המזהה. החזרת שורה למקומה פירושה מחיקת חותמת הזמן ההיא והיפוך האות, תוך השארת כל השאר בשקט.
גבו את הקובץ קודם, ועשו את העריכה כסקריפט ולא בהקלדה בעורך טקסט. שגיאת הקלדה שמשנה כמה שדות נושאת שורה שוברת הנפקה לכל תעודה שתיווסף אחר כך. זו הסיבה לאוטומט את השינוי ולהעתיק את הקובץ לפני שנוגעים בו.
ביטול שני של אותו שם נכשל לעתים קרובות גם כן, משום שהריצה הראשונה העבירה את התעודה ההיא ואת המפתח שלה אל מחוץ לתיקיות שהכלי מצפה למצוא בהן. אז הכלי אינו מוצא את מה שהתבקש לבטל, והודעת השגיאה לא תמיד מבהירה למה.
cp /etc/easy-rsa/pki/index.txt /root/index.txt.$(date +%F-%H%M)
grep -c '^R' /etc/easy-rsa/pki/index.txt
easyrsa gen-crlפרסמו את הרשימה החדשה, תקנו את הבעלות שלה, וגרמו לשרת לקרוא אותה. טעינה מחדש מספיקה ברוב ההתקנות, אבל האישור חייב לבוא מחיבור טרי, מפני שההפעלה הקיימת לא בדקה שום דבר מחדש.
בדקו איזה מנוף המקרה ראוי לו
שאלו את השאלה האחת שמכריעה את כל המדריך: האם המפתח הפרטי עדיין נמצא רק במקום שבו הוא אמור להיות. אם כן, הריגת ההפעלה בתוספת השהיה מתועדת מכסה את המקרה ולא משאירה רשומה קבועה. אם לא, התשובה הבטוחה היחידה היא מפתח חדש כשהתעודה הישנה נשארת מבוטלת.
לאחר מכן אמתו את התוצאה בניסיון חיבור ולא בהבדל תצורה. ההבדל אומר לכם מה התכוונתם, והחיבור אומר לכם מה השרת אוכף.
openssl crl -in /etc/openvpn/server/crl.pem -noout -text | grep -c 'Serial Number'
printf 'status 2\nquit\n' | nc 127.0.0.1 7506כאשר לקוח משוחזר מתחבר ומופיע בפלט המצב, עריכת הרשומה עבדה. כאשר לקוח מבוטל נדחה והיומן נוקב בשם ה-CRL, הביטול עבד. כל מה שביניהם הוא בעיית הרשאות או טעינה מחדש, וראוי לתקן אותה לפני שהבקשה הבאה מגיעה.