בדף הזה יש טיפים לשימוש בכלי שורת הפקודה 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 באמצעות סקריפט לטעינה בזמן ההפעלה:
אם הסקריפט לטעינה בזמן ההפעלה כבר נמצא בשימוש, יוצרים עותק גיבוי שלו. הגישה לגיבוי תלויה באופן שבו מוגדר סקריפט לטעינה בזמן ההפעלה.
startup-script
אם תוכן הסקריפט מוגדר ישירות בערך המטא-נתונים, אפשר להעתיק את תוכן הסקריפט אל הקטגוריה של Cloud Storage, אל קובץ מקומי או אל כל אחסון פרטי זמני אחר.
startup-script-url
אם התוכן של הסקריפט כבר נמצא באחסון המרוחק ומשתמשים בכתובת ה-URL שלו, אפשר פשוט להסיר באופן זמני את מפתח המטא-נתונים
startup-script-urlכדי להשבית את סקריפט לטעינה בזמן ההפעלה הנוכחי.מעדכנים את הסקריפט לטעינה בזמן ההפעלה באמצעות רצף הפקודות הבא:
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לקריאה בלבד, ומאפשרת רק לבעלים ולקבוצת הבעלים לקרוא את הקובץ.
-
מפסיקים את ה-VM אם הוא פועל. מפעילים מחדש את ה-VM כדי להפעיל את הסקריפט לטעינה בזמן ההפעלה.
מתחברים ל-VM ועורכים את הקובץ
sudoersהפגום כדי לשחזר אותו.sudo visudo /etc/sudoers.backup.TIMESTAMPשומרים את השינויים ומחליפים את קובץ
/etc/sudoersהנוכחי בקובץ שערכתם.sudo mv /etc/sudoers.backup.TIMESTAMP /etc/sudoersמוודאים שהבעיה המקורית בשימוש בפקודה
sudoובהרשאות גבוהות נפתרה.מסירים את הסקריפט הזמני לטעינה בזמן ההפעלה ומחזירים את הסקריפט המקורי אם נעשה בו שימוש.
המאמר הבא
- איך משחזרים מכונה וירטואלית שלא ניתן לגשת אליה או שהיא פגומה
- איך מוסיפים דיסק קיים למכונה וירטואלית אחרת