לימודי מחשבים בשיטת בטא/מדריך סביבות העבודה של ויקטור

From Wikiversity

מי זה ויקטור?[edit]

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

הסביבות שתייצרו יעזרו למומחים של מחלקת אבטחה לעצור את ויקטור.

סביבת ויקטור ל"זאת בדיוק הנקודה"[edit]

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

אנחנו צריכים סביבת עבודה מתאימה.

מה ויקטור צריך כדי לעבוד[edit]

  • חשבון בלינוקס (מן הסתם).
  • קובץ מאובטח שבו הוא יוכל לשמור את הסיסמאות הסודיות שלו. רק לויקטור מותר לקרוא או לשנות את הקובץ.
  • תיקיה שבה משה ואחרים יכולים לשים ציורים של פיקאצ'ו.
  • תוכנה בשם pikapika בתוך תיקיית הפרוייקט, שויקטור יכול להריץ כדי לתקשר עם הבוס שלו. התוכנה כותבת לו את המילה pikapika כמה פעמים שהוא מבקש ממנה.

חשבון לויקטור[edit]

התחברו ללינוקס בתור root, והריצו את הפקודה הבאה:

adduser victor

תנו לו סיסמה בשביל ויקטור כשהוא מבקש (תמציאו משהו).

אל תיתנו לו שום מידע אחר, זה סתם מיותר.

אם הצליח, תצאו ממשתמש root בעזרת הפקודה:

exit

ותתחברו בתור ויקטור. מעכשיו אתם ויקטור.

קובץ הסיסמאות הסודיות - יצירת הקובץ[edit]

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

מי שלא יודע איך ליצור קובץ, כדאי שיקרא שוב את...

המדריך המהיר של עופר לעבודה בלינוקס

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

קובץ הסיסמאות הסודיות - מידע בסיסי על הרשאות בלינוקס[edit]

איזה הרשאות יכולות להיות על קובץ או על תיקיה?

  • קריאה (r)
  • כתיבה (w)
  • הרצה (x)

ככה נוצרה השלישיה שכל לינוקסאי צריך להכיר:

rwx

מסמנים את ההרשאות בשלושה ביטים, אם הביט דלוק (1) יש הרשאה, אם הוא מכובה (0) אין הרשאה.

לדוגמה:

111

שמשמעותו

rwx

הכל דלוק, מותר לקרוא, לכתוב ולהריץ. ההרשאה הזו ידועה גם בתור הרשאה 7, כי 111 זה המספר הבינארי 7.

עוד דוגמה:

100

שמשמעותו

r--

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

ועוד דוגמה:

101

שמשמעותו

r-x

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


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

rwxr--r--

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

לשם האימון, כתבו את הפקודה:

ls -l

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

אז איזה הרשאות צריך לתת לתוכנה pikapika? צריך שויקטור יוכל להריץ. רק ויקטור. ושאף אחד חוץ ממנו לא יוכל לקרוא, כי אז הם יראו את הקוד ויבינו שנורא קל לכתוב תוכנות כאלו.

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

עם איזה פקודה נותנים הרשאות? עם chmod.

לדוגמה, אם אני רוצה לתת הרשאת 744 על הקובץ file.txt, אני אריץ אותה ככה:

chmod 744 file.txt

יש עוד דרכים לתת הרשאות, חלקן הרבה יותר ברורות. אבל בשביל זה תצטרכו לקרוא את הman. או לקרוא את המדריך על chmod של אבירן עבאדי.

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

התיקיה המשותפת[edit]

עכשיו ניצור תיקיה בשם pikachu (אתם יודעים איך, קראתם את זה במדריך המקוצר).

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

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

יאללה, לשנות הרשאות עם chmod ונמשיך.

כתיבת התוכנית pikapika - הכרת הפקודות[edit]

אפשר לכתוב את התוכנה הזו בהרבה שפות, הכי קל לכתוב אותה בbash, שפת הshell שלנו. זאת שפת סקריפט, יעני כותבים ומיד אפשר להריץ, לא צריך לקמפל.

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

yes

הנה ההסבר:

man yes

מתעצלים? גם זה יסביר:

yes --help

head

הנה ההסבר:

man head

מתעצלים? גם זה יסביר:

head --help

tr

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

לדוגמה, כאן אנחנו מחליפים במילה yoyo את כל הפעמים שמופיעה o בk:

echo "yoyo" | tr o k

ואז יצא לנו ykyk.

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

man tr

מתעצלים? גם זה יסביר:

tr --help

כתיבת התוכנית pikapika - עקרונות אוטומציה[edit]

נכיר כמה עקרונות באוטומציה בלינוקס:

pipes

זאת לא פקודה, זה מושג. pipes ("צינורות") מאפשרים לנו לקחת פלט של תוכנה אחת ולזרוק אותו לתוך תוכנה אחרת. זה נקרא "לשרשר פקודות". לדוגמה:

cat /etc/groups

זורק את קובץ הקבוצות אל המסך.

cat /etc/passwd | head -10

זורק את קובץ הקבוצות אל הפקודה head. והיא לוקחת ממנו את 10 השורות העליונות, וזורקת למסך.

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

commandline arguments

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

pikapika.sh 5

תוציא pikapika חמש פעמים.

אבל איך הסקריפט ידע מה המספר שהכנסנו בארגומנט?
כי סקריפטים יודעים שאם אתם כותבים $1 אתם מתכוונים לארגומנט הראשון שהמשתמש הכניס.

נשרשר את הפקודות כדי ליצור תוכנה שמוציאה pikapika המון פעמים:

  • ניתן לyes להדפיס את המילה pikapika
  • נזרוק את זה לתוך head שתחתוך לנו רק את ה$1 שורות הראשונות. (בשלב הזה אפשר לבדוק באמצעות מספר במקום $1).
  • את מה שיצא נזרוק לtr, ובעזרתה נמחק את כל סופי השורות ('\n').

עובד? יופי.
את הפקודה המשורשרת שיצאה לנו נכתוב לתוך קובץ הסקריפט.

כתיבת התוכנית pikapika - כתיבת הסקריפט[edit]

1. ניכנס לתיקיית pikachu

2. ניצור קובץ בשם pikapika.sh (זו הסיומת המקובלת לקבצי bash shell scripts)

3. נערוך אותו באמצעות עורך טקסט

4. נכתוב בשורה הראשונה של הקובץ:

#!/bin/bash

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

5. בשורה השניה של הקובץ נכתוב את הפקודה המשורשרת שלנו.

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

כתיבת התוכנית pikapika - הרשאות הרצה[edit]

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

להריץ את pikapika בנוחות[edit]

ויקטור הוא עצלן, ונראה לו אידיוטי לכתוב

./pikapika.sh

כל פעם שהוא רוצה להריץ את התוכנה שלו. הוא רוצה לכתוב פשוט

pikapika.sh

ושזה ירוץ.

אז נסדר לו את זה, למרות שזה ממש אבטחת מידע גרועה.

הקושי הוא, בעצם, שכשרוצים להריץ את pikapika לינוקס לא מחפש אותה בתיקיה הנוכחית, אלא רק בתיקיות שבהן בדרך כלל יש תוכנות. איזה תיקיות אלו? נבדוק איפה שלינוקס בודק, במשתנה PATH$:

echo $PATH

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

PATH=.:$PATH

נבדוק מה יצא:

echo $PATH

אם יצא נכון ננסה להריץ את pikapika בעזרת השם שלה בלבד:

pikapika.sh

ניצחון.

וזהו[edit]

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