כיצד להשתמש ב-sudo
מתוך הויקי של ג'נטו.
מדריך התקנה זה הוא תרגום של מדריך ה-Sudo הרשמי של ג'נטו.
תוכן המדריך מוגן בזכויות יוצרים של כותבי המדריך המקורי.
התרגום בוצע באישור הרשיון שבו פורסם המסמך המקורי, Creative Commons - Attribution / Share Alike.
על התרגום חלים אותם תנאי רשיון כמו למקור התוכן. המדריך תורגם על ידי oc666.
| שים לב: החבילה app-admin/sudo לא מותקנת כברירת מחדל עם המערכת. על-כן, קרוב לוודאי שעליך להתקין את החבילה בעזרת הפקודה emerge app-admin/sudo. |
תוכן העניינים |
[עריכה] על Sudo
[עריכה] מתן הרשאות
חבילת ה-app-admin/sudo מאפשרת למנהל המערכת שלך לתת גישה למשתמשים נוספים להפעיל יישומים שהם באופן רגיל אינם מורשים אליהם. שלא כמו בשימוש ביישומי setuid bit, כלי ה-sudo נותן יותר יכולת שליטה על מי יכול לבצע פקודות מסוימות ומתי.
עם sudo אתה יכול ליצור רשימה ברורה של מי יכול להפעיל יישום מסוים. אם תגדיר את ה-setuid bit, כל משתמש יוכל להריץ ישום (או כל משתמש של קבוצה מסוימת, תלוי בהרשאות שבשימוש). תוכל (וקרוב לוודאי שאפילו אמור) לדרוש מהמשתמש לספק סיסמא כשהוא יצטרך להריץ ישום ואפילו תוכל לכוונן היטב את ההרשאות בהתבססות על מיקום המשתמש: נכנס למערכת באופן רגיל או דרך SSH ממחשב מרוחק.
[עריכה] יומן פעילות
אחד היתרונות הנוספים של sudo הוא שהכלי יכול לרשום כל ניסיון (מוצלח או לא) של הרצת יישום. זה מאוד שימושי אם תרצה לעקוב אחר מי שעשה את אותה טעות גורלית שגזלה לך 10 שעות תיקון.
[עריכה] הגדרת Sudo
הגדרת sudo מנוהלת ע"י הקובץ etc/dusoers/. קובץ זה אמור לא להיות ערוך ע"י nano /etc/sudoers או vim /etc/sudoers או כל עורך אחר שאתה אוהב. כאשר תרצה לערוך את הקובץ השתמש בvisudo.
כלי זה מוודא ששני מנהלי מערכת לא עורכים קובץ זה בו זמנית, שומר על הרשאות קובץ זה ומבצע בדיקת תחביר כדי לוודא שלא ביצעת שום שגיאה גורלית בקובץ.
[עריכה] על מדריך זה
מדריך זה מתכוון להציג היכרות מהירה עם sudo. חבילת ה-sudo הרבה יותר חזקה מאשר מה שמתואר במדריך זה. ישנן אפשרויות מיוחדות לערוך קבצים כמשתמש נפרד (sudoedit), הרצה מתוך סקריפט (כך שזה יוכל להיות ברקע, מילוי סיסמא באופן סטנדרטי במקום מהמקלדת,...) ועוד.
קרא עוד בדפי ההוראות (manual pages) של sudo ו-sudoers עבור מידע נוסף.
[עריכה] תחביר Sudoers
[עריכה] תחביר בסיסי
החלק הכי קשה ב-sudo הוא תחביר etc/sudoers/. התחביר הבסיסי הוא משהו כמו זה:
| קוד: תחביר etc/sudoers/ בסיסי |
|
user host = commands |
התחביר מורה ל-sudo שהמשתמש, מוצהר ע"י user ונכנס מתוך המערכת (ולא ממחשב מרוחק) יכול לבצע כל פקודה מרשימת הפקודה commands כמשתמש מנהל (root). דוגמא יותר אמיתית יכולה לעשות זאת יותר קלה להבנה: מתן הרשאה למשתמש swift להריץ את הפקודה emerge אם הוא נכנס מתוך המערכת (ולא ממחשב מרוחק בעזרת SSH).
| קוד: דוגמת etc/sudoers/ מציאותית |
|
swift localhost = /usr/bin/emerge |
| אזהרה: אל תתן הרשאה למשתמש להריץ ישום שיכול לתת הרשאה למשתמשים אחרים. לדוגמא, מתן הרשאה להריץ את emerge כמשתמש מנהל, יכול לתת להם הרשאה מלאה למערכת, מכיוון ש-emerge יכול (בצורה מתוחכמת) לשנות את קובץ המערכת. אם אינך בוטח במשתמשי sudo, אל תתן להם הרשאה כלשהי. |
כמו כן, שם המשתמש יכול להתחלף עם שם קבוצה - במקרה זה תצטרך להתחיל את שם הקבוצה עם הסימן %. לדוגמא, אם תרצה לאפשר לכל השותפים בקבוצת wheel להריץ את פקודת ה-emerge:
| קוד: מתן הרשאה לחברי קבוצת wheel להריץ את emerge |
|
%wheel localhost = /usr/bin/emerge |
תוכל להרחיב את השורה כדי להרשות מספר פקודה (במקום ליצור שורה עבור כל פקודה). לדוגמא, כדי לתת הרשאה לאותו משתמש לא רק להריץ את emerge אלא גם ebuild ואת emerge-webrsync כמשתמש מנהל.
| קוד: מספר פקודות |
|
swift localhost = /usr/bin/emerge, /usr/bin/ebuild, /usr/sbin/emerge-webrsync |
תוכל גם לציין פקודה מסוימת ולא את הכלי עצמו. זה מאוד שימושי להגביל את השימוש בכלי מסוים לכדי קבוצה מסוימת של אפשרויות של אותן פקודות. כלי ה-sudo מאפשר שימוש בביטויים רגולרים גם כן.
בואו נבחן זאת:
| קוד: ניסיון לעדכן את המערכת בעזרת sudo |
# sudo emerge -uDN world We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. Password: (Enter the user password, not root!) |
הסיסמא שה-sudo מבקש היא הסיסמא של המשתמש עצמו. זה כדי לוודא שהטרמינל שהינך משתמש לא הושאר ללא השגחה ובכך נתת אפשרות לאחרים לפגוע במערכת שלך.
אתה בטח יודע ש-sudo לא יכול להחליף את המשתנה {path}$: כל פקודה שתריץ אחרי sudo תיוחס מהסביבה שלך. אם תרצה שהמשתמש יריץ מתוך sbin לדוגמא, הוא יצטרך לספק את הנתיב המלא, כמו זה:
| קוד: שימוש בנתיב המלא לכלי |
# sudo /usr/sbin/emerge-webrsync |
| טיפ! תוכל להשתמש בפקודה which כדי למצוא נתיב מלא של כלי. לדוגמא which emerge-webrsync, יתן לכם את הנתיב של הדוגמא למעלה. |
[עריכה] שימוש בכינויים
בסביבות גדולות יותר רישום כל המשתמשים שוב ושוב (או מארחים, או פקודות) יכול להיות משימה מרתיעה. כדי להקל את משימת הניהול של etc/sudoers/ תוכל להגדיר כינויים (aliases). המבנה המגדיר כינויים הוא די פשוט:
| קוד: הגדרת כינויים ב-etc/sudoers/ |
|
Host_Alias hostalias = hostname1, hostname2, ... User_Alias useralias = user1, user2, ... Cmnd_Alias cmndalias = command1, command2, ... |
כינוי אחד שתמיד עובד עבור כל עמדה הוא ALL (כדי לעשות הפרדה טובה בין כינויים לבין לא-כינויים מומלץ להשתמש באותיות רישויות עבור כינויים). כפי שללא ספק ניחשת, כינוי ALL הוא כינוי לכל ההגדרות האפשריות.
שימוש פשוט בכינוי ALL היא לאפשר לכל משתמש לכבות את המחשב אם הוא נכנס למערכת באופן מקומי:
| קוד: מתן הרשאה לכל משתמש לכבות את המערכת |
|
ALL localhost = /sbin/shutdown |
דוגמא אחרת היא לתת הרשאה למשתמש swift להריץ את הפקודה emerge כמשתמש מנהל, בלי להתחשב מאיפה הוא נכנס למערכת:
| קוד: מתן הרשאה למשתמש להריץ ישום בלי להתחשב במיקומו |
|
swift ALL = /usr/bin/emerge |
יותר מעניין הוא להגדיר קבוצה של משתמשים שיכולים להריץ ישומי ניהול (כמו emerge ו-ebuild) במערכת וקבוצה של מנהלים שיכולים לשנות הגדרות של כל משתמש, חוץ ממנהל (root)!!!
| קוד: שימוש בכינויים עבור משתמשים ופקודות |
|
User_Alias SOFTWAREMAINTAINERS = swift, john, danny User_Alias PASSWORDMAINTAINERS = swift, sysop Cmnd_Alias SOFTWARECOMMANDS = /usr/bin/emerge, /usr/bin/ebuild Cmnd_Alias PASSWORDCOMMANDS = /usr/bin/passwd [a-zA-Z0-9_-]*, !/usr/bin/passwd root SOFTWAREMAINTAINERS localhost = SOFTWARECOMMANDS PASSWORDMAINTAINERS localhost = PASSWORDCOMMANDS |
[עריכה] פקודות לא מנהלתיות
דבר נוסף אפשרי הוא להריץ ישום כמשתמש שונה, אך לא מנהל. זה יכול להיות מעניין אם אתה מריץ ישומים כמשתמש שונה (לדוגמא משתמש apache) ותרצה לאפשר למשתמשים מסוימים לבצע צעדים מנהליים כמשתמש מסוים (כמו סיום תהליכי זומבי).
בתוך etc/sudoers/ רשום את המשתמש(ים) בין סוגריים עגולות לפני שם הפקודה:
| קוד: תחביר להפעלה לא מנהלתית |
|
users hosts = (run-as) commands |
לדוגמא, כדי לתת הרשאה למשתמש swift להריץ את כלי ה-kill כמשתמש apache או כמשתמש gorg:
| קוד: דוגמא להפעלה לא מנהלתית |
|
Cmnd_Alias KILL = /bin/kill, /usr/bin/pkill swift ALL = (apache, gorg) KILL |
בהגדרה זו משתמש יוכל להריץ sudo -u כדי לבחור בתור איזה משתמש הוא רוצה להריץ את הישום:
| קוד: הרצת pkill כמשתמש apache |
# sudo -u apache pkill apache |
תוכל להגדיר כינוי בשביל המשתמש כדי להריץ ישום בעזרת נתיב Runas_Alias. יעודו להזדהות ככינוי האחר (Alias_) לנתיב שראינו קודם.
[עריכה] סיסמאות והגדרות ברירת מחדל
לפי ברירת מחדל, sudo מבקש מהמשתמש לזהות את עצמו בעזרת הסיסמא שלו. כאשר הסיסמא נרשמת לראשונה, sudo זוכר אותה ל-5 דקות ומאפשר למשתמש להתמקד במשימותיו ולא להכניס את הסיסמא שוב ושוב.
כמובן, התנהגות זו יכולה להשתנות: תוכל לאתחל את ברירות המחדל (Defaults): נתב ב-etc/sudoers/ כדי לשנות את התנהגות ברירת מחדל של המשתמש.
לדוגמא, כדי לשנות את ברירת המחדל מ-5 דקות ל-0 (לא לזכור סיסמא אף פעם):
| קוד: שינוי ערך הפסק זמן (timeout) |
|
Defaults:swift timestamp_timeout=0 |
הגדרת של הערך 1- יזכור את הסיסמא תמיד (עד אתחול המערכת הבא).
הגדרת אחרת היא לדרוש סיסמא של המשתמש שמריץ את הפקודה בפועל ולא את הסיסמא של המשתמש עצמו. זה מתבצע בעזרת runaspw. בדוגמא הבאה נגדיר גם את מספר החזרות (כמה פעמים מותר למשתמש להקיש את הסיסמא שלו לפני ש-sudo יסגר) ל-2 במקום ברירת המחדל 3:
| קוד: דרישת סיסמת מנהל במקום סיסמת המשתמש |
|
Defaults:john runaspw, passwd_tries=2 |
מאפיין נוסף ומעניין הוא שמירה על הערך של המשתנה DISPLAY וכך תוכל להריץ כלים גרפיים:
| קוד: שמירה על המשתנה DISPLAY לשימוש |
|
Defaults:john env_keep=DISPLAY |
אתה יכול לשנות אלפי הגדרות ברירת מחדל ע"י שימוש בנתיב Defaults. שגר את דף ההוראות sudo וחפש שם על Defaults. אם תרצה בכל מקרה לאפשר למשתמש להריץ סדרה של פקודות ללא הקשת סיסמא כלשהי, תצטרך להתחיל את הפקודות עם :NOPASSWD, כמו זה:
| קוד: לאפשר הרצת emerge כמשתמש מנהל ללא בקשת סיסמא |
|
swift localhost = NOPASSWD: /usr/bin/emerge |
| אזהרה: הגדרה זו מסוכנת ביותר!!! |
[עריכה] שימוש ב-Sudo
[עריכה] רשימת ההרשאות
כדי להציג בפניך אילו יכולות יש לך, הרץ sudo -l:
| קוד: רשימת היכולות |
# sudo -l User swift may run the following commands on this host: (root) /usr/libexec/xfsm-shutdown-helper (root) /usr/bin/emerge (root) /usr/bin/passwd [a-zA-Z0-9_-]* (root) !/usr/bin/passwd root (apache) /usr/bin/pkill (apache) /bin/kill |
אם יש לך פקודה כלשהי בקובץ etc/sudoers/ שלא דורשת הקשת סיסמא, היא לא תדרוש סיסמא כדי לפלוט רשימה זו. אחרת, תתבקש להקיש סיסמא, אם היא איננה בזיכרון.
[עריכה] הארכת פסק הזמן של סיסמא
לפי ברירת מחדל, אם משתמש הקיש את הסיסמא שלו כדי לזהות את עצמו בפני sudo, הכלי יזכור את הסיסמא למשך 5 דקות. אם המשתמש רוצה להאריך פרק זמן זה, הוא יכול להריץ sudo -v כדי לאתחל את חותמת הזמן, כך שהוא יספור מחדש 5 דקות לפני ש-sudo יבקש הקשת סיסמא שוב.
| קוד: הארכת פסק הזמן של סיסמא |
# sudo -v |
כדי להפוך זאת ולסיים את חותמת הזמן השתמש ב-sudo -k.
