מחשבון chmod
ממיר הרשאות קבצים של יוניקס בין אוקטלי (755), סימבולי (rwxr-xr-x) ורשת תיבות סימון, כולל setuid, setgid וביט sticky.
| מחלקה | קריאה | כתיבה | הרצה |
|---|---|---|---|
| בעלים | |||
| קבוצה | |||
| אחרים |
chmod 644 filechmod u=rw,g=r,o=r file-rw-r--r--מה הכלי הזה עושה
לכל קובץ במערכת יוניקס יש אוסף הרשאות שקובע מי רשאי לקרוא אותו, לשנות אותו או להריץ אותו. הפקודה chmod מגדירה אותן, והיא מקבלת את ההרשאות בשני איותים שונים למדי — מספר אוקטלי בן שלוש ספרות ומחרוזת של אותיות — שמתארים בדיוק את אותו הדבר. הכלי הזה מחזיק את שני האיותים, ובנוסף רשת של תיבות סימון, מסונכרנים זה עם זה, כך שאפשר להתחיל מהצורה שיש לכם ולהעתיק את זו שאתם צריכים.
הכל רץ בדפדפן שלכם וזו אריתמטיקה טהורה: אין שרת, ושום דבר שאתם מקלידים לא נשלח לשום מקום. זהו מחשבון ומקור עיון, לא דרך לשנות הרשאות במכונה אמיתית — לשם כך מעתיקים את פקודת ה-chmod שהוא מייצר ומריצים אותה בעצמכם.
שלוש קבוצות, שלוש הרשאות
ההרשאות מאורגנות כשלוש קבוצות של שלוש. שלוש הקבוצות הן הבעלים של הקובץ, הקבוצה שמחזיקה בו, וכל השאר — «אחרים». בתוך כל קבוצה יש שלוש הרשאות: קריאה, כתיבה והרצה.
- קריאה (r) — לצפות בתוכן הקובץ, או להציג את רשימת הפריטים בתיקייה.
- כתיבה (w) — לשנות את הקובץ, או להוסיף ולהסיר פריטים בתיקייה.
- הרצה (x) — להריץ את הקובץ כתוכנית, או להיכנס לתיקייה ולהגיע לקבצים שבתוכה.
להרצה יש משמעות שונה בתיקייה ובקובץ, וזה מפיל אנשים: תיקייה שאתם יכולים לקרוא אבל לא להריץ מאפשרת לראות את שמות הדברים שבתוכה, אך לא לפתוח אף אחד מהם.
איך המספר האוקטלי עובד
שלוש ההרשאות של כל קבוצה נדחסות לספרה אוקטלית אחת על ידי חיבור ערכים קבועים: קריאה היא 4, כתיבה היא 2, הרצה היא 1. קריאה-כתיבה-הרצה היא 4+2+1 = 7; קריאה-הרצה היא 4+1 = 5; קריאה-כתיבה היא 4+2 = 6. שלוש קבוצות נותנות שלוש ספרות.
755 7 = 4+2+1 # בעלים: קריאה + כתיבה + הרצה 5 = 4+0+1 # קבוצה: קריאה + הרצה 5 = 4+0+1 # אחרים: קריאה + הרצה
כך ש-755 הוא «הבעלים יכול הכל, כל השאר יכולים לקרוא ולהריץ אבל לא לשנות», וזה המצב הרגיל לתוכנית או לתיקייה. 644 — קריאה-כתיבה לבעלים, קריאה בלבד לכל השאר — הוא המצב הרגיל לקובץ רגיל. ברגע שהתבנית מוכרת, המצבים הנפוצים נקראים במבט אחד.
המחרוזת הסימבולית
האיות השני הוא זה ש-ls -l מדפיס: תשעה תווים, שלושה לכל קבוצה, כל אחד הוא או האות שלו או מקף. 755 הוא rwxr-xr-x; 644 הוא rw-r--r--. הוא נושא בדיוק את אותו מידע כמו המספר האוקטלי, רק פרוס כך שרואים כל הרשאה במקום לחבר ספרות בראש.
לשורת ls -l יש תו עשירי בהתחלה — d לתיקייה, מקף לקובץ רגיל, l לקישור סימבולי. התו הפותח הזה הוא סוג הקובץ, לא הרשאה, ו-chmod אינו יכול לשנות אותו. אפשר להדביק כאן שדה הרשאות שלם מ-ls -l ותו הסוג פשוט יתעלם.
הביטים המיוחדים: setuid, setgid ו-sticky
מעל תשעת הביטים הרגילים יושבים שלושה מיוחדים, שנכתבים כספרה אוקטלית רביעית אופציונלית בהתחלה — setuid (4), setgid (2) וביט ה-sticky (1). אין להם עמודה משלהם; במקום זאת כל אחד מהם מוטמע במשבצת הרצה במחרוזת הסימבולית, וזה המקור לאותיות הגדולות שאנשים מוצאים מבלבלות.
- setuid על קובץ הרצה גורם לו לרוץ בזהות הבעלים של הקובץ ולא בזהות המשתמש שהפעיל אותו. כך passwd יכול לעדכן קובץ מערכת שאתם לא רשאים לכתוב אליו ישירות — ולכן תוכנית setuid עם באג היא חור אבטחה רציני.
- setgid על קובץ הרצה מריץ אותו עם הקבוצה של הקובץ. על תיקייה הוא עושה משהו שימושי ובטוח יותר: קבצים חדשים שנוצרים בתוכה יורשים את קבוצת התיקייה במקום את קבוצת היוצר.
- ביט ה-sticky על תיקייה אומר שרק הבעלים של קובץ יכול למחוק או לשנות את שמו, גם כשלכולם יש הרשאת כתיבה לתיקייה. זה מה שמשאיר את /tmp משותף ובטוח. על קובץ רגיל הוא לא עושה דבר.
במחרוזת הסימבולית ביט מיוחד דלוק הופך את משבצת ההרצה שלו לאות: s במשבצת הבעלים עבור setuid, s במשבצת הקבוצה עבור setgid, ו-t במשבצת האחרים עבור sticky. גודל האות מספר לכם אם גם ההרצה דלוקה — אות קטנה פירושה כן, אות גדולה פירושה לא.
rwsr-xr-x 4755 # setuid, והבעלים מריץ rwSr-xr-x 4655 # setuid, אך הבעלים אינו מריץ rwxrwxrwt 1777 # sticky, ואחרים מריצים rwxrwxrwT 1776 # sticky, אך אחרים אינם מריצים
אות S או T גדולה היא כמעט תמיד טעות: היא אומרת שביט מיוחד הודלק על קובץ שאינו בר-הרצה, ולכן אין לביט על מה לפעול.
אוקטלי או סימבולי בשורת הפקודה
chmod מקבל את שתי הצורות, והכלי הזה כותב את שתיהן. הצורה האוקטלית מגדירה את כל הביטים בבת אחת: chmod 755 file. צורת ה-= הסימבולית עושה את אותו הדבר באופן מוחלט — chmod u=rwx,g=rx,o=rx file — ומפרטת כל קבוצה, כך שהתוצאה אינה תלויה במה שהיה לקובץ קודם.
יש צורה שלישית, יחסית, שהמחשבון אינו זקוק לה אך תיתקלו בה: chmod +x file מוסיף הרצה לכולם, chmod g-w file מסיר כתיבה מהקבוצה, ו-chmod o= file מנקה הכל עבור אחרים. הצורה הזו משנה ביטים ביחס למצב הנוכחי במקום להגדיר את כולו, וזה נוח בשורת הפקודה אבל אין לו «תוצאה» יחידה להצגה.
מצבים שעדיף לא להגדיר
כלי הרשאות צריך גם לומר מתי מצב הוא רעיון רע. שניים עולים כל הזמן:
- 777 נותן לכל משתמש קריאה, כתיבה והרצה. זהו התיקון האוטומטי כשמשהו «לא עובד», והוא כמעט תמיד מחליף בעיה קטנה בחור אבטחה אמיתי. המצב הנכון כמעט תמיד צר יותר — בדרך כלל 755 או 644.
- כל קובץ שניתן לכתיבה על ידי כולם (הספרה האחרונה כוללת 2) מאפשר לכל חשבון במכונה לשכתב את תוכנו. לכל דבר שמורץ, נטען או נסמך עליו, זו דרך פנימה. תנו הרשאת כתיבה לקבוצה במקום, או השאירו אותה לבעלים בלבד.
הכלי מסמן את אלה כשהם מופיעים. הוא אינו יכול לדעת אם היעד שלכם הוא קובץ או תיקייה, ולכן הוא מנסח אותם כדברים ששווים מבט שני ולא כשגיאות — ביט ה-sticky נכון על תיקייה וחסר טעם על קובץ, ורק אתם יודעים מה מהם יש לכם.
שאלות נפוצות
- מה ההבדל בין 644 ל-755?
- 644 הוא קריאה-כתיבה לבעלים וקריאה בלבד לכל השאר, המצב הרגיל לקובץ רגיל. 755 מוסיף הרצה לשלוש הקבוצות, וזה מה שתוכנית צריכה כדי לרוץ ומה שתיקייה צריכה כדי שאפשר יהיה להיכנס אליה. השתמשו ב-644 למסמכים ולקובצי מקור, וב-755 לסקריפטים ולתיקיות.
- למה המצב שלי הציג S או T גדולה?
- כי ביט מיוחד הודלק על קבוצה שאין לה הרשאת הרצה. s או t קטנה פירושה שגם הביט המיוחד וגם ההרצה דלוקים; הצורה בגודל גדול פירושה שהביט המיוחד דלוק אך ההרצה כבויה, וזה בדרך כלל אומר שהמצב אינו מה שהתכוונתם אליו — למשל 4644 (rwSr--r--) הוא setuid על קובץ שאיש אינו יכול להריץ.
- מה chmod 777 עושה בפועל, ולמה לא מומלץ?
- הוא מעניק קריאה, כתיבה והרצה לבעלים, לקבוצה ולכל השאר — גישה מלאה לכל חשבון במערכת. לא מומלץ כי הוא מסיר כל הגנה בבת אחת; קובץ שכל אחד יכול לכתוב הוא קובץ שכל אחד יכול לחבל בו, ותיקייה שכל אחד יכול לכתוב אליה היא תיקייה שכל אחד יכול לשתול בה קבצים. כמעט כל מקרה שמושיט יד ל-777 נפתר עם 755 או 644 יחד עם הבעלות הנכונה.
- האם הספרה הפותחת חייבת להופיע?
- לא. כשאף אחד מהביטים המיוחדים אינו דלוק, המצב הוא פשוט שלוש ספרות — 755, לא 0755 — וזה מה שהכלי מציג. אפס פותח מתקבל ומשמעותו זהה; 4, 2 או 1 פותחים מדליקים setuid, setgid או ביט ה-sticky בהתאמה.
- אפשר להדביק שורה ישירות מ-ls -l?
- כן. הדביקו את שדה ההרשאות בן עשרת התווים, כמו -rwxr-xr-x או drwxr-xr-x, והכלי יסיר את תו הסוג הפותח ויקרא את השאר. הסוג (קובץ, תיקייה, קישור) אינו הרשאה ו-chmod אינו יכול לשנות אותו, ולכן הוא מתעלם ממנו.
- האם משהו שאני מזין נשלח לשרת?
- לא. כל הכלי הוא אריתמטיקה שרצה בדפדפן שלכם. שום דבר אינו מועלה, נרשם או נשמר, וזו גם הסיבה שהוא עובד גם בלי חיבור רשת כלל.