פתרון בעיות בקובצי sudoers

בדף הזה יש טיפים לשימוש בכלי שורת הפקודה sudo, לניהול הפלאגין sudoers ולמניעה או לתיקון של בעיות שמתעוררות.

סיבות לבעיות

במהלך כל הרצה של הפקודה sudo, התהליך הבא מתבצע כדי לאמת את הקבצים sudoers:

  • התחביר נבדק כדי לוודא שהוא נכון.
  • התוכן נותח כדי להחריג חלק מהשגיאות הלוגיות.
  • הבעלות וההרשאות נבדקות.

האימות של קובצי sudoers עלול להיכשל בגלל אחת מהשגיאות הבאות:

שגיאות תחביר

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

הפתרון

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


בדוגמאות הבאות אפשר לראות דוגמאות לתחביר נכון ולא נכון:

תחביר תקין

user   ALL=(ALL) ALL

תחביר שגוי

user   ALL=(ALL), ALL

דוגמה לשגיאת תחביר

$ sudo useradd username
/etc/sudoers:20:17: syntax error
user   ALL=(ALL), ALL
                ^

שגיאות לוגיות

שגיאות מהסוג הזה יכולות להיגרם מאחת מהסיבות הבאות:

  • אי-הבנה של העקרונות של התוסף sudoers.
  • סטיות מהתחביר הנכון.

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

הפתרון

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

‫Google גם ממליצה להשתמש בכלי visudo כדי לערוך את הקבצים sudoers, כי הוא יכול לזהות סוגים מסוימים של שגיאות לוגיות, כמו:

  • כינויים שלא הוגדרו או שלא נעשה בהם שימוש
  • הפניות ציקליות
  • כפילויות של רשומות

אם מזוהות בעיות, מוצגת הודעת אזהרה.


בדוגמאות הבאות מוצגות דוגמאות נכונות ולא נכונות מבחינה לוגית:

נכון מבחינה לוגית

barbara   ALL=(ALL:ALL) /usr/bin/ls

שגיאה לוגית

barbara   ALL=(4LL:ALL) /usr/bin/ls
               ^
barbara   ALL=(ALL;ALL) /usr/bin/ls
                  ^
bar6ara   ALL=(ALL:ALL) /usr/bin/1s
   ^                             ^

הרשאות לא מתאימות

בנוסף לשגיאות שנובעות מהתוכן של קובצי sudoers, הרשאות קובץ מוגזמות או בעלות שגויה עלולים לגרום לכשל בכלי sudo.

הפתרון

תיאור השגיאות האלה מופיע בפלט של פקודת sudo שנכשלה. קוראים את התיאור של הודעת השגיאה ומבצעים את התיקונים הנדרשים.


דוגמה להרשאות ובעלות נכונות על קובץ

$ ls -l /etc/sudoers
-r--r----- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username

בדוגמה הבאה מוצגת השגיאה שמופיעה כשיש הרשאות מיותרות לקבוצת ההרשאות כל המשתמשים:

$ ls -l /etc/sudoers
-r--r---w- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

בדוגמה הבאה מוצגת השגיאה שמופיעה כשמציינים בעלות לא נכונה. בדוגמה הזו, משתמש עם מזהה שאינו 0 (או משתמש שאינו root) הוא הבעלים של הקובץ:

$ ls -l /etc/sudoers
-r--r----- 1 user user 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

מידע נוסף על ההגדרה של קובצי sudoers זמין במאמר Sudoers Manual.

כדי ללמוד איך לנהל את העורך visudo ולהשתמש בו, אפשר לקרוא את המדריך ל-Visudo.

השלכות של בעיות

בעיות בקובצי sudoers גורמות להשפעות שליליות ויכולות להשפיע על הפונקציונליות של המערכת כולה.

  • הפקודה sudo לא פועלת יותר.

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

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

  • יכול להיות שהייתה גישה לא מורשית למערכת.

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

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

שחזור במקרה של בעיות

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

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

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

מידע נוסף על סקריפטים להפעלה ב-Compute Engine

כדי לשחזר את קובצי sudoers באמצעות סקריפט לטעינה בזמן ההפעלה:

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

    startup-script

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

    startup-script-url

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

  2. מעדכנים את הסקריפט לטעינה בזמן ההפעלה באמצעות רצף הפקודות הבא:

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s") && echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers && chown 0:0 /etc/sudoers && chmod 0440 /etc/sudoers
    

    מידע נוסף על הפעולות שהפקודות מבצעות

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s")

    הפקודה הזו יוצרת עותק של הקובץ /etc/sudoers עם שם אחר, ומוחקת את הקובץ המקורי. שם הקובץ החדש כולל חותמת זמן בסוף כדי להבטיח שהוא יהיה ייחודי (לדוגמה, sudoers.backup.1672527600).

    echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

    הפקודה הזו יוצרת את הקובץ /etc/sudoers שנמחק קודם עם כלל יחיד שמאפשר למשתמשים מורשים עם גישה למכונה הווירטואלית להפעיל פקודות בשם כל משתמש במערכת. Google Cloud הכלל הזה תמיד קיים כברירת מחדל בקובץ נוסף /etc/sudoers.d/google_sudoers.

    chown 0:0 /etc/sudoers

    הפקודה הזו מגדירה את הבעלים של הקובץ /etc/sudoers למשתמש עם המזהה 0, ואת קבוצת הבעלים לקבוצה עם המזהה 0.

    chmod 0440 /etc/sudoers

    הפקודה הזו מגדירה את ההרשאות לקובץ /etc/sudoers לקריאה בלבד, ומאפשרת רק לבעלים ולקבוצת הבעלים לקרוא את הקובץ.

  3. מפסיקים את ה-VM אם הוא פועל. מפעילים מחדש את ה-VM כדי להפעיל את הסקריפט לטעינה בזמן ההפעלה.

  4. מתחברים ל-VM ועורכים את הקובץ sudoers הפגום כדי לשחזר אותו.

    sudo visudo /etc/sudoers.backup.TIMESTAMP
  5. שומרים את השינויים ומחליפים את קובץ /etc/sudoers הנוכחי בקובץ שערכתם.

    sudo mv /etc/sudoers.backup.TIMESTAMP /etc/sudoers
  6. מוודאים שהבעיה המקורית בשימוש בפקודה sudo ובהרשאות גבוהות נפתרה.

  7. מסירים את הסקריפט הזמני לטעינה בזמן ההפעלה ומחזירים את הסקריפט המקורי אם נעשה בו שימוש.

המאמר הבא