האם לוותר על chroot או להעתיק את iproute2 אל הכלא?
כלא לא שלם נכשל אחרי ההפעלה, לא באתחול. בחרו בין הרפיית ההקשחה לבין העתקת הקבצים הבינאריים והספריות אל השורש החדש.
השירות עולה, לקוח מתחבר, ובדרך כלל אף מסלול לא מופיע בצד השרת. או שהדמון מסרב לעלות ומציין פקודה שלא הצליח להריץ. שתי התוצאות הולכות אחרי אותן שלוש שורות, שבדרך כלל מועתקות יחד ממדריך הקשחה: מעבר לחשבון לא מיוחס, ויתור על הקבוצה ושינוי שורש מערכת הקבצים. רק אחת מהשלוש מסתירה קבצים, ורק אחת מהן מסירה את ההרשאה לשנות את טבלת הניתוב. הפרדה ביניהן היא הדרך ללמוד איזו שורה אתם באמת רוצים.
מה הכלא מסיר והדמון עדיין צריך
שינוי השורש קורה אחרי ההפעלה, ולכן הדמון שומר על כל מה שכבר פתח ומאבד כל מה שהיה פותח אחר כך. כל עוזר שהחיבור מריץ אחרי הנקודה הזו חייב להתקיים בתוך השורש החדש, יחד עם הספריות המשותפות שהוא טוען. כלא שנבנה מקובץ הגדרות ותעודה אינו מכיל אף אחד מהשניים.
מעבר לחשבון לא מיוחס הוא הגבלה נפרדת. תהליך שוויתר על root עשוי שלא להצליח לשנות מסלולים או להעלות ממשק גם כשהקובץ הבינארי נמצא ממש שם, ולכן יש לאבחן את שתי התקלות בנפרד.
שלושה תנאים קובעים איזה תיקון אתם צריכים
התנאי הראשון הוא איך הבנייה שלכם מתקינה מסלולים. גרסאות OpenVPN חדשות מגדירות את הממשק ואת טבלת הניתוב בתוך התהליך, ואילו חבילות ישנות יותר והגדרות מותאמות נשענות על כלים חיצוניים או על סקריפטים up ו-down. אם הלוג מציין פקודה, יש כלי חיצוני בעניין והכלא מסתיר אותו. אם הלוג מציג במקום זאת שגיאת הרשאה, החשבון הוא הבעיה.
השני הוא תחזוקה. כלא עם קבצים בינאריים מועתקים צריך להיות מרוענן בכל פעם שהחבילה שמספקת אותם משודרגת, אחרת השדרוג הראשון משאיר מאחוריו מנהרה שבורה. השלישי הוא אם בקרה מסוימת באמת דורשת chroot; אם הדרישה היא למעשה על הפרדת הרשאות, ייתכן שמעבר החשבון לבדו יספיק.
| Signal in the log | Other side of the boundary | Repair direction |
|---|---|---|
| Command not found after startup | Binary and its libraries absent inside the new root | Populate the jail, or drop the chroot line |
| Operation not permitted | Account lost the privilege to edit routes | Keep the account privileged, or pre-create routes elsewhere |
| No such device | Jail lacks the tun device node | Create the node inside, or open it before the root change |
מה כלא עובד חייב להכיל
כלא שמריץ פקודות צריך את הקובץ הבינארי, כל ספרייה שהוא מקושר אליה וכל צומת התקן שהדמון פותח מאוחר. העתיקו את החלקים ובדקו אותם בלי ה-VPN בתמונה:
ldd /usr/sbin/ip
chroot /etc/openvpn/jail /sbin/ip route show
chroot /etc/openvpn/jail /sbin/ip link set tun0 up
הפקודה הראשונה מפרטת את התלויות, והיא זו שאנשים מדלגים עליה. קובץ בינארי מועתק שלא מוצא ספרייה נכשל בהודעה שונה מקובץ בינארי חסר, ושניהם נראים כמו תקלת OpenVPN כשקוראים אותם מצד הלקוח. הרצת הפקודה ביד בתוך הכלא משחזרת את התקלה בלי להפעיל מחדש את השירות.
העתיקו לכלא גם את ההגדרות, את התעודות ואת כל CRL, כי קובץ שהדמון מצפה לקרוא שוב אחרי ההפעלה לא יימצא לאחר שהשורש השתנה. רשמו מה העתקתם, שכן השדרוג הבא של חבילת הרשת מחליף את המקוריים ומשאיר את הכלא על ההעתקה הישנה.
במקום זאת הקטנת את ההקשחה
אם הכלא קיים רק מפני שמדריך אמר כך, הסרת השורה האחת תוך שמירה על הגבלות החשבון היא תוצאה ניתנת להגנה. הדמון שומר על תצוגת מערכת הקבצים שלו ומאבד את הבעיה, והורדת ההרשאות עדיין מסירה root מהתהליך ארוך החיים.
רשמו מה נשאר, ולמה. הגדרה שאיבדה בשקט בקרה בלי הערה היא הדרך שבה הקשחה נסחפת, והביקורת הבאה תשאל למה השורה נעלמה.
פצלו את שלוש השורות לפני שתבחרו
העתיקו את ההגדרות, השביתו את שלוש ההוראות ואשרו שלקוח מתחבר ושהמסלולים הצפויים מופיעים. אחר כך הפעילו מחדש רק את שורות החשבון, ואחר כך את ה-chroot לבדו. השלב שבו המנהרה נשברת מצביע על הגבול, ואתם נמנעים מלבנות מחדש כלא שמעולם לא היה הסיבה.
כשהוא מנתב שוב, הריצו הפעלת לקוח אחת ברמת פירוט גבוהה יותר וקראו את השורה שמציינת את הפקודה או את ההרשאה שנכשלה. השורה הזו שווה יותר מהפסק הזמן שהלקוח מדווח בסופו.