interhost

הבלוג
הכל על שרתים, תקשורת ולינוקס

ארכיון פוסטים מהחודש "אוקטובר, 2009"

הרשאות

יום שני, 26 באוקטובר, 2009

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

ההרשאות מתחקות לשלוש רמות: קריאה, כתיבה והרצה. ניתן לתת לקובץ הרשאת קריאה אך לא כתיבה לתוחו או הרצתו. לדוגמא אם רוצים לתת הרשאת קריאה לקובץ טקסט אך לא רוצים שאותו משתמש יערוך אותו.
משמעות הרשאת הרצה היא אפשרות להריץ קובץ בינארי או סקריפט מסויים (.sh או .perl וכו) אך גם אפשרות כניסה לתיקיה, ז"א שאם אין הרשאת הרצה לתיקיה מסויימת אזי אי אפשר להיכנס לתוכה ובכך למנוע ממשתמשים לא רצויים לשותת לכם בתיקיות.

איך הדבר נראה? כדי להציג את רשימת הקבצים בלינוקס משתמשים בפקודת ls (זו פקודה דומה לפקודת dir ב-dos למי שמכיר), אם מריצים את הפקודה ls ללא כל פרמטר מקבלים את הפלט באופן הבא:

Config_File.class.php  Smarty-2.6.21  Smarty.class.php  Smarty_Compiler.class.php  debug.tpl  internals  plugins

כך שרואים רק את שמות הקבצים והתיקיות בשורה אחת. אני לא רואה ככה את ההרשאות ואת גודל הקבצים, עדיף עלי להוסיף פרמט -l שיציג לי את רשימת הקבצים בעמודה שתכלול מספר נתונים נוספים כגון הרשאות וגדלים,
אם כן אכתוב ls -l והפלט יוצג כך:

-rw-r–r– 1 admin admin 12916 Jun 17 14:13 Config_File.class.php
drwxr-xr-x 6 admin admin  4096 Jun 17 14:13 Smarty-2.6.21
-rw-r–r– 1 admin admin 63475 Jun 17 14:13 Smarty.class.php
-rw-r–r– 1 admin admin 93406 Jun 17 14:13 Smarty_Compiler.class.php
-rw-r–r– 1 admin admin  3562 Jun 17 14:13 debug.tpl
drwxr-xr-x 2 admin admin  4096 Jun 17 14:13 internals
drwxr-xr-x 2 admin admin  4096 Jun 17 14:13 plugins

אתם רואים, עכשיו רואים מספר עמודות שנעבור עליהם ביחד. העמודה הראשונה היא עמודת ההרשאות: (נקח דוגמא)

-rw-r–r–

כל מקף מייצג אפס ז"א "אין הרשאה", המקום הראשון מייצג סוג של קובץ, בדרך כלל הוא נשאר מקף כאשר מדובר בקובץ ומשתמה ל-d כאשר מדובר בתיקיה.

לאחר מכן ההרשאות הולכות בסדר הבא: rwx, השלישיה הראשונה מסמלת הרשאות עבור משתמש שהקובץ בבעלותו, זאת אומרת (במקרה של הקובץ הראשון) לבעל הקובץ יש הרשאת קריאה (r) והרשאת כתיבה (w) אך אין לו הרשאת הרצה (למעשה אין צורך בהרשאת הרצה לקובץ php כיוון ששרת הווב קורא את הקובץ מריץ את תוכנו בעצמו, ישנה אפשרות לגרום לקובץ php להיות קובץ מורץ משורת פקודה אך זה לא המקום לדון בזה כרגע).
השלישיה השניה --r אומרת שלקבוצה שלאיה משוייך הקובץ יש הרשאת קריאה בלבד ואין () הרשאות כתיבה והרצה.
השלישיה האחרונה מתייחסת "לכל השאר" (other), שאר המשתמשים אשר לא נכללים בקבוצה (וש לא מדובר גם בבעל הקובץ) – r– , גם לכל השאר יש הרשאת קריאה בלבד.

העמודה השניה מציינת את מספר ה-הארד לינקים לקובץ. בלינוקס אפשר לצור "קובץ קישור מוקשח" (hard link) אשר מפנה לאותו מידע שהקובץ הראשני מפנה אליו, אפשר להיתכל על זה כסוג של קיצור דרך לקובץ אבל רק כדי לנסות להבין את זה. זה ממש שונה מקיצור דרך ולא נדבר על זה כאן עכשיו.

העמודה השלישית אומרת לנו מי הבעלים של הקובת או מי המשתמש שיש לו הרשאות לקובץ זה; איזה הרשאות? אותן ההרשאות שניתנו לו בשלישיה הראשונה בעמודה הראשונה.
העמודה הרביעית מדבר על שם הקבוצה שיש לה הרשאות לקובץ.

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

chown maddog.maddog Config_File.class.php

הפקןדה מעבירה בעלות של הקובץ Config_File.class.php למשתמש maddog, לאחר מכן יש נקודה . ללא רווח ואז אפשר להגדיר גם את שם הקבוצה שבמקרה הזה היא maddog גם כן.

כדי  לשנות הרשאות של קובץ נשתמש בפקודה chmod בצורה באה:

chmod u+rw Config_File.class.php

chmod g+rw Config_File.class.php

chmod o+r Config_File.class.php

chmod a-x Config_File.class.php

האות הראשונה מסלמת קיצור של קבוצת משתמשים: u- user, g- group, o- other, a- all
לאחר מכן מייד ללא רווח כותבים את ההרשאות שרוצים לתת לאותה קבוצה: +rw (קריאה וכתיבה), -x (ביטול הרשאות הרצה).
אם נקיש את כל הקפודות נקבל את ההרשאות הבאות:

-rw-rw–r–  1 maddog maddog  13K Jun 17 14:13 Config_File.class.php

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

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

טיפים כלליים שימושיים בלינוקס למנהל מתחיל

יום שלישי, 20 באוקטובר, 2009

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

לכן חשבתי לרכז כמה טיפים בסיסיים בתפעול לינוקס בפוסט זה, כמו שרובכם שמתם לב הנני חובב לינוקס דביאן מושבע (אם דביאן הייתה אשה הייתי מתחתן איתה) לכן רוב הפקודות אמורות לעבוד בכל ההפצות אך במקומות שקיים שוני אציין זאת באיקון:

debian logo

(סמל של הפקצת לינוקס דביאן, אגב אחת ההפצות הוותיקות אחרי סלאקוור)

אובכן,

  1. טיפ ראשון – כמה דיסק פנוי נשאר בשרת? הפקדוה הינה פקודה זהה בכל מערכות הליקוס וגם BSD ונרשמת כך:
    df -h
    

    הפלט שלה לדוגמא:

    Filesystem             Size   Used  Avail Use% Mounted on
    /dev/sda7              941M   424M   467M  48% /
    tmpfs                  1.1G      0   1.1G   0% /lib/init/rw
    tmpfs                  1.1G      0   1.1G   0% /dev/shm
    /dev/sda10              57G    47G   7.7G  86% /home
    /dev/sda9              748M    13M   696M   2% /tmp
    /dev/sda6              5.0G   3.5G   1.3G  74% /usr
    /dev/sda8              6.0G   4.0G   1.7G  71% /var
  2. הערך שסימנתי באדום מציין את כמות המקום הפנוי בגיגות שנשאר במחיצת /home והחלק העליון שמסומן בטורקיז אומר שנותרו 467מגה פנויים במחיצת root (המחיצה הראשית בשרת).

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

    אם שמתם לב השתמשתי בפרמטר h-, מטרתו להציג את הנפחים בצורה "נוחה לקריאת אדם" (קיצור H הוא של Human הלוא הוא בן-אנוש באנגלית) ובמילים אחרות בגיגות ולא בבייטים.

  3. טיפ שני – חיפוש קבצים בשרת ניתן לבצע במספר דרכים במערכות לינוקס, אחת הדרכים השכיחות והלקות היא שימוש ב-locate, אופן פעולה של הכלי הינה בכך שתחילה מבצעים "אינדוקס" כללי של המערכת בעזרת פקודת updatedb, הכלי סורק את כל הקבצים בשרת ויוצר אינדקס לחיפוש מהיר עתידי שנעשה בעזרת locate, כך שבכל פעם שתרצו לחפש קובץ כלשהו לא יהיה צורך בסריקה איטית של כל הדיסק אלא סריקה בקובץ אינקדס. פעולת החיפוש הופכת למהירה ונעימה.
    אני נוהג מדי שבוע  לעדכן את ההאינדקס של locate, ניתן לעשות זאת באופן אוטומטי ע"י הוספת מטלה יומית ל-cron. מערכת דביאן מגיעה עם ההגדרה היומית בcron באופן אוטומטי, ניתן למצוא אותה בנתיב הבא:
    debian logo

    /etc/cron.daily/mlocate

    לפעמים אני רוצה לחפש בסיפריה שעודכנה ברגעים האחרונים (או אחרי העדכון היומי של updatedb) ואיני רוצה להריץ updatedb ולחקות עד לאינדוקס של כלל המערכת כיוון שמדובר תיקיית עבודה ידועה אך פקודה הליסט (ls) לא עוזרת כיוון שהקובץ המיוחל עלול להופיע תחת אחת מתתי התיקיות ואיני רוצה כמובן לבזבז זמן ולהיכנס תיקיה תיקיה ולחפש אחריו, אובכן כאן ניתן להשתמש בפקודת find שאיטית לחיפושים גדולים אך מהירה לחיפושים בתיקיות מוגדרות, אופן השימוש הוא פשוט מאוד:

    find /etc/ | grep pass
    

    /etc/pam.d/passwd
    /etc/pam.d/common-password
    /etc/proftpd/ftpd.passwd_old
    /etc/passwd
    /etc/passwd-
    /etc/security/opasswd
    /etc/exim4/passwd.client

השתמשתי בפקודת find על תיקיית /etc אשר מציגה את כל הקבצים בצורה רקורסיבית (גם בתתי תיקיות) לאחר מכן העברתי את הפלט של find בעזרת "פייפ" (pipe) שהוא המקל האנכי | לפקודת grep שהיא מחזירה את
השורות שיש בהן את המילה 'pass'. בצורה זו החיפוש נעשה באופן מהיר יחסית כיוון ש-find לא צריכה להתאמץ אלא רק להדפיס את כל הקבצים וgrep הוא כלי מהיר ונהדר שעוד נדון בו בהזדמנות.

3. מיון והצגת ערכים ייחודיים בלבד מצאתי לנכון לגעת בטכניקה הזו כיוון שהרבה פעמים אני מוצא את עצמי משתמש באוסף הכלים שעמודים לראשותי בלינוקס כדי למיין פלט של קובץ או של פקודה ולפעמים גם להצגיד רק
ערכים יחודיים (unique). מקרה שימושי ונפוץ מאוד הוא כאשר יש עומס חריג בתעבורה על השרת אשר יכול לנבוא עקב תכנות לקוי של אחד האתרים, התקפה זדונית או פריצה לשרת. במקרה כזה הייתי רוצה לדעת כמה
חיבורים יש לשרת מבחוץ ומאיזה כתובות ויתרה מכך, כמה מכל כתובת. הפקודה המלאה לכך היא:

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

הפלט שלה לדוגמא:

1 212.199.127.82
1 220.181.13.x
1 24.72.103.x
1 66.249.65.x
1 67.218.116.x
1 67.218.116.x
1 69.43.149.x
1 81.218.234.x
1 81.218.234.x
1 84.95.245.x
1 Address
1 servers)
2 127.0.0.1
2 38.98.19.x
2 62.219.140.x
2 66.249.71.x
3 212.235.12.x
3 63.111.24.x
9 212.68.132.x
24 95.86.74.x
29 79.176.188.x
31 61.177.194.x
157 87.70.110.x

כפי שאתם רואים פלט מויין מערך החיבורים הקטן ביותר (חיבור אחד) עד לערך החיבורים הגדול ביותר. ניתן לראות שיש כרגע 157 חיבורים לשרת מכתובת 87.80.110. (מחקתי את האוקטטה האחרונה בכל הכתובות כדי
לשמור על הפרטיות של הגולשים).  אם רוצים לקבל פלט של חיבורים פעילים בלבד (אלו שנמצאים במצב ESTABLISHED) צריך להוסיף שדרוג קטן לשרשור הפקודות כך שהפקודה הסופית נראית כך:

netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

במקרה שרוצים לאתר התקפת SYN (syn attack) נשתמש בפקודה הראשונה כיוון שבהתקפה כזאת החיבורים לא נשארים פעילים אלה מתחלפים כל פעם בחדשים ובכך מעמיסים על הרשת והשרת בעצם.

השתמשנו כאן בפקודת לינוקס ידועה (גם bsd אבל עם פרמטים שונים) בשם netstat אשר מציגה את החיבורים לשרת ואת הפורטים והסוקטים שהשרת מאזין בהם. כמו כן השתמשנו בפקודה מיוחדת שנקראית uniq זו
פקודה שמציגה רק את הערכים הייחודיים בפלט. חשוב בטרם שמוש ב-uniq תמיד למיין תחילה את הפלט בעזרת הפקודה sort , ללא sort פקודת uniq לא תעבוד טוב (אם בכלל).

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

יום שלישי, 20 באוקטובר, 2009

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

מקווה שתהנו!

דמיטרי