אבטחה בסיסית שרתי לינוקס

מדריך זה מסביר צעדים בסיסיים על מנת לאבטח את מחשבכם המחובר לרשת

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

■התקפות שיכולות לכוון לשירותים לא מעודכנים (למשל גירסאות ישנות של שרת FTP)
■שרותים שלא מקונפגים כמו שצריך (למשל שרת FTP, שמאפשר העלאת קבצים)
■משתמשים מקומיים, אם השרת הוא שרת משתמשים שמאפשר גישה דרך telnet או ssh למשתמשים רשומים.

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

דרישות קודמות
המדריך דורש ידע מוקדם בניהול בסיסי של המערכת/רשת שלכם, וידע בסיסי ברשתות IP

הערות המחברים
נושא האבטחה הוא נושא רחב יריעה, שכל מדריך צר יהיה מלהכיל אותו.
מדריך זה בא לתת לכם ידע בסיסי במושגי אבטחה ואיך ליישם אותם על המערכת/רשת שלכם, על מנת לעשות אותה יותר בטוחה.
אנחנו מוצאים לנכון להדגיש, שזהו רק מבוא, ובשום אופן אין להסתמך עליו כמדריך שלם לאבטחת המערכת שלכם.
לכל המעוניין, בסוף המדריך יש רשימה של אתרים של חדשות וכלי אבטחה, שמהם ניתן ללמוד עוד ולהרחיב את הידע בנושא.
הערה חשובה:
המדריך נכתב בשימוש מערכת RedHat, ולכן הדוגמאות שבמדריך תהינה מתאימות למערכת RedHat(ומערכות מבוססות RH), את אותה הפונקציונאליות אפשר להשיג בכל מערכת לינוקסית, אבל לאו דווקא עם הפקודות שמוצגות כאן. (לדוגמא, לא בטוח אם ב- Debian יש ntsysv, כלי שמופעי בפרק הראשון).

צעדים ראשונים
כמה עצות לפני ההתקנה
לפני שאתם מתקינים בכלל את המערכת, מומלץ לעשות קצת חושבים, ולתכנן את יעוד השרת ואילו חבילות או קבוצות של חבילות הייתם רוצים להתקין על השרת.
כמה דוגמאות: על שרת שיהיה שרת WEB בלבד, אין צורך להתקין DNS, X, או מנהל חלונות כמו KDE/GNOME. ומהכיוון השני של המטבע, על עמדת עבודה, לא תמיד יש צורך להתקין שרת WEB, או SQL.
בחירת היעוד והחבילות מראש ובזמן ההתקנה גם יקצרו את משך ההתקנה, וגם יעזרו במשך הקשחת השרת/עמדת עבודה במהלך המדריך.
זיכרו, מה שלא צריכים, אין שום סיבה להתקין. כך תמנעו מראש בעיות אבטחה (גרסאות ישנות שלא מעודכנות, זוכרים?) ותקלו על עצמכם בניהול השרת.

עדכון חבילות
עדכוני אבטחה ושידרוגי גירסא מתפרסמים מפעם לפעם לכל הפצה,ולכן ייתכן מאוד שלמרות שרק התקנתם את המערכת החדשה,כבר יהיה צורך בשידרוג חבילות.(אפילו ל- RedHat 8.0, ההפצה האחרונה של RedHat בזמן כתיבת מדריך זה, יש כבר עדכוני אבטחה)
לכל הפצה כיום, יש מערכת לעידכון גירסאות אוטומאטית, כדוגמאת up2date של RedHat או urpmi של מנדרייק.
ישר אחרי ההתקנה, ולפני כל אופטימיזציה או הקשחה אחרת, מומלץ להריץ קודם את עדכון החבילות, שכן קבצי קונפיגורציה עשויים להיות מוחלפים לאחר העדכון, קבצים שיתכן שכבר נגענו בהם.
זכרו: עדכון חבילות הוא כמובן לא צעד ראשוני בלבד, חובה לעשות אותו בכל פעם שההפצה בה אתם משתמשים מוציאה עדכון אבטחה או שידרוג גירסא כלשהו.

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

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

■בעזרת הכלי ntsysv, שמאפשר לסמן אילו שרותים יעלו ואילו לא בזמן עליית המערכת, הכלי הוא גראפי ואין הרבה להסביר עליו. רק תשימו לב, ש- ntsysv לא מכבה את השרותים אם הם עובדים, אלא רק דואג שלא יעלו שוב בעליה הבאה של המערכת. אחרי שהרצנו ntsysv, כדי להפסיק את השרותים שאנחנו רוצים לכבות, ניתן להריץ את הפקודה הבאה בתור root:

# service stop
eg.
# service httpd stop

אם זה לא עובד, ניתן לגשת ישירות לקובץ ההרצה, ולהריץ, שוב בתור root:

# /etc/init.d/httpd stop

כדי לוודא שהשרות באמת נעצר, ניתן להריץ את אחת מהפקודות הבאות:

# service httpd status
# /etc/init.d/httpd status

שוב, httpd זה רק דוגמא, סדרת הפקודות הזו תעבוד על כל שרות אחר שקובץ ההרצה שלו נמצא ב- etc/init.d

■דרך נוספת לדאוג ששרותים לא יעלו בזמן עלית המחשב היא בעזרת (8)chkconfig, כלי טקסטואלי שמנהל את שרותי המערכת. כדי לדאוג ששרות לא יעלה נריץ את הפקודה הבאה, כ- root (בעזרת httpd כדוגמא):

# chkconfig –list httpd
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off

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

# chkconfig –list
keytable 0:off 1:on 2:on 3:on 4:on 5:on 6:off
atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
gpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
kudzu 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
random 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rawdevices 0:off 1:off 2:off 3:on 4:on 5:on 6:off
apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
ipchains 0:off 1:off 2:off 3:off 4:off 5:off 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off
portmap 0:off 1:off 2:off 3:off 4:off 5:off 6:off
xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rhnsd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
nfslock 0:off 1:off 2:off 3:off 4:off 5:off 6:off
nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
yppasswdd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
ypserv 0:off 1:off 2:off 3:off 4:off 5:off 6:off
ypxfrd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off
smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
snortd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
dhcpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
httpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
named 0:off 1:off 2:off 3:on 4:on 5:on 6:off
arpwatch 0:off 1:off 2:off 3:off 4:off 5:off 6:off
mysqld 0:off 1:off 2:off 3:on 4:on 5:on 6:off
snmpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
snmptrapd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
xinetd based services:
chargen-udp: off
chargen: off
daytime-udp: off
daytime: off
echo-udp: off
echo: off
services: off
servers: off
time-udp: off
time: off
proftpd: off
ntalk: off
talk: off
imap: off
imaps: off
ipop2: off
ipop3: on
pop3s: on

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

# chkconfig –levels 123456 httpd offff

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

# chkconfig ipop3 off

ללא ציון רמות הריצה (שכן xinetd הוא שרות בפני עצמו שרץ ברמות ריצה מוגדרות גם כן)
בהתאם לשרת/עמדת עבודה שהתקנתם, ובהתאם לשימוש אתם רוצים לעשות בו, מומלץ לעיין ברשימת השרתים
הבאה, שפעולתם לרוב לא נחוצה, ואפשר לכבות אותו בדרך כלל:

1.שרות ה- NFS – שרות שמאפשר לעשות mount למשאבים מרוחקים ברשת, לא תצטרכו אותו לרוב, אלא בסביבה בה יש מידע שצריך להישמר ברשת.
2.שרות portmap – שרות עזר לאפליקציות כמו NFS ו-NIS, אם אף אחד מאלה לא בשימוש (מה שלא סביר בסביבה ביתית), אז השרות הזה לא יהיה חשוב
3.שרות httpd – זהו שרת ה-web, שמבוסס לרוב (99.9%) על apache. השרות הזה בד”כ די מאובטח, אבל אם העמדה היא עמדת עבודה, ולא שרת web, לא יהיה צורך בו, וכדאי לכבותו (בנוסף, הוא תופס משאבים)
4.שרות named – זהו שרת ה DNS. שוב, אם זה אינו שרת שיעודו הוא DNS, מומלץ לכבות שרות זה, הוא ידוע כשרות בעל בעיות אבטחה, עדיף להשתמש בשרתי ה-DNS של הספק
5.שרות mysqld – שרת ה-SQL. אם אינכם מריצים אפליקציית web שמצריכה גישה למסד נתונים, רצוי לכבות שרות זה, שגם תופס משאבים.
6.שרות snmp – שרות שמאפשר קבלת נתונים על המחשב, משמש בדרך כלל למחשבים שמשמשים כראוטרים או יישומים ללא מגע אדם. שרות זה גם ידוע בבעיות אבטחה שונות, ובד”כ אינו מאובטח “out-of-the-box”. מומלץ לכבות אותו על כל שרת/עמדת עבודה, אלא אם אתם יודעים מה אתם עושים.

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

קיר אש (Firewall)
אז מה זה בעצם קיר אש?
קיר אש הוא למעשה תוכנה שנועדה להגן על מחשב או שרת מפני פריצות והתקפות. קיר האש “מסנן” חבילות מידע המגיעות למחשב, וע”י כך מונע מחבילות שלא אמורות להיכנס, גישה פנימה.
הקרנל של לינוקס תומך במכניזם חדש לבניית קיר אש או באנגלית – Firewall, שנקרא Netfilter. המכניזם הזה נשלט ע”י כלי הנקרא Iptables, שהוא יותר מתקדם מ Ipchains שהיה הכלי הקודם.
Iptables משתמש בטכנולוגיה הנקראת Stateful Firewalling, אשר מהווה קפיצת מדרגה משמעותית מבחינת יכולות של Firewall וגמישות של חוקים, למשל, לבלום/לאתר את רוב התקפות ה DoS (התקפות שלילת שירות) ע”י הגבלת פאקטים מסויימים, מכיוון שהוא שומר בזיכרון כל חיבור שעובר דרכו.
באופן כללי, נהוג לנקוט במדיניות אבטחה כגון : “כל מה שספציפית לא מורשה – אסור”. גישה זו חוסמת תנועת רשת באופן מוחלט בין שתי רשתות, חוץ מהשירותים שאותם הוחלט לספק. זוהי השיטה הבטוחה ביותר, ובה יש מעט מאוד מקום לטעויות קונפיגורציה. מצד שני, מבחינת המשתמשים, זוהי שיטה מאוד מגבילה ולא נוחה, אך היא הבטוחה ביותר.
דוגמאות:
שרת Web
כדי לאפשר כניסה את פורט 80 (http) כל מה שיש לעשות זה לכתוב את השורה הבאה בסקריפט Firewall שלכם:

/sbin/ipables -A INPUT -i ppp0 -p tcp –dport 80 -j ACCEPT

שרת DNS
כדי לאפשר כניסה לשאילתות DNS, יש לפתוח את פורט 53 TCP ו UDP:

/sbin/ipables -A INPUT -i ppp0 -p tcp –dport 53 -j ACCEPT
/sbin/ipables -A INPUT -i ppp0 -p udp –dport 53 -j ACCEPT

שרת דואר
כדי לאפשר כניסה את פורט 25 (smtp) כל מה שיש לעשות זה לכתוב את השורה הבאה בסקריפט Firewall שלכם:

/sbin/ipables -A INPUT -i ppp0 -p tcp –dport 25 -j ACCEPT

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

/sbin/ipables -A INPUT -j DROP

על מנת לבדוק אילו חוקים פועלים ברגע נתון, מריצים את הפקודה:

/sbin/ipables -L

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

[root@www root]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all — anywhere anywhere state NEW
ACCEPT tcp — anywhere anywhere tcp dpt:smtp
ACCEPT tcp — anywhere anywhere tcp dpt:domain
ACCEPT udp — anywhere anywhere udp dpt:domain
ACCEPT tcp — anywhere anywhere tcp dpt:http

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

/sbin/iptables -A INPUT -i ppp0 -p tcp –dport 22 -m limit -j LOG — log-prefix "Blocked an ssh attempt from:"

אמנם שורות אלו הן שמישות, אבל הן רק דוגמא ליכולות המתקדמות של Iptables. מומלץ בחום ליצור סקריפט Firewall משלכם, שיתאים למערכת ולדרישות שלכם, או להשתמש בסקריפט מוכן ולהתאימו (לרוב ע”י שינוי כמה פרמטרים) למערכת שלכם.
נושא ה- Firewall יכול להיות לעיתים מורכב ומתקדם מאוד, לכן בחרנו רק לתת הצצה קטנה לעולם ה- Iptables של לינוקס. בנספח תמצאו קישורים עם עוד מידע על iptables וסקריפטים לשימוש.

גישה מבוססת לקוח (Host based access)
לאחר שעברה חבילה את השער הראשון (ה-FW) שיודע לחסום ע”פי כתובת או דגלים בחבילת המידע, מגיע השכבה השניה, Host based access.
בשביל “הגנה” זו נשתמש בחבילה שנקראת – TCP Wrappers – (או בכינויה הנפוץ יותר : TCP וופלס…), חבילה שמספקת מנגנון אבטחה, ששרותים רבים תומכים בו (xinetd, ssh, sendmail ועוד).
לפני שנמשיך, הסבר קטן על xinetd. זהו מעין “שרות על”, שחוסך את הצורך בהפעלת שרותים מסויימים כ- daemons שרצים ברקע, וכך חוסך משאבים ומהווה שכבת חציצה נוספת. במקום, שרות ה- xinetd מאזין על אותם הפורטים שבהם רצים שרותים אלו, למשל פורט 110 שהוא הפורט של שרות ה pop3. אם כן, xinetd מאזין על פורט 110, וכאשר הוא מזהה נסיון חיבור, הוא מריץ את שרות ה pop3 חד פעמית כדי לענות לפנית הלקוח, וכשמסתיימת הפעולה, השרות נסגר. מאפיין חושב של xinetd הוא שהוא תומך ב- TCP Wrappers האלו.
ומה מקנה לנו מנגנון ה-TCP_Wrappers? הוא מאפשר לנו לסנן גישה לפי שם השרות (sshd, pop3, in.telnetd), לפי כתובת IP, לפי דומיין ועוד. המנגנון גם מאפשר להגיב לנסיון מוצלח או כושל של התחברות.
המדריך מסביר רק את החלק של סינון לפי כתובת/שם המקור ולפי שם השרות.
נשתמש ב- 2 קבצים לצורך הסינון, הקבצים הם

1.etc/hosts.allow
2.etc/host.deny

עכשיו לחלק הטיפה טריקי. שרות/כתובת שמופיע ב- hosts.allow יאושר לו גישה, ואם ב- hosts.deny הגישה תידחה. סדר הבדיקה הוא:

1.האם השרות/כתובת נמצא ב hosts.allow? אם כן אפשר גישה, אם לא עבור לבא
2.האם הוא נמצא ב hosts.deny? אם כן דחה את הגישה, אם לא עבור לבא
3.במקרה שהשרות לא נמצא בשני הקבצים, הגישה תתאפשר.

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

1.כאשר מתייחסים לשרות, יש להתייחס לשם הקובץ של השרות, למשל ssh זה sshd, שרות ה- ftp עשוי להיות proftpd, או wu-ftpd
2.כאשר אתם משנים את הגדרות אלו מרחוק, שימו לב והיזהרו לא לנעול את עצמכם מחוץ למכונה ללא יכולת שינוי ע”י, למשל, חסימת ה ssh רק לכתובות מסוימות (כששלכם לא ברשימה (-: ), אני מדבר מתוך נסיון כואב.
תחביר 2 הקבצים הוא אחיד, ניתן לדוגמא את hosts.allow:

ipop3d: 192.168.0, 10.0.0 100.l0
sshd: .example.com
in.ftpd: ALL

הסבר:

ipop3d: 192.168.0, 10.0.0 100.l0

יאפשר גישה לשרות ה-pop3 בשם ipop3d לכתובות מרשת 192.168.0 ו- 10.0.0

sshd: .example.com

יאפשר גישה ל- sshd לכל מי שחבר בדומיין example.com

in.ftpd: ALL

יאפשר גישה לשרת ftp ששמו in.ftpd לכולם (ALL).
שימו לב: כל עוד אין חסימה ב- hosts.deny, גם מי שאינו חבר בהגבלות הנ”ל יוכל להתחבר לשרותים אלו!
שימו לב 2: רשימת הכתובות האלו היא חלקית, tcp_wrappers תומך בעוד שמות קוד (כמו ALL) ובעוד תחבירים שונים, מומלץ לקרוא את man hosts.allow לרשימה מלאה.
על מנת שהאיפשור גישה שביצענו יהיה יעיל, יש לחסום את הגישה לשרותים אלו ב- hosts.deny (זכרו, קודם נבדק allow, אח”כ deny, ורק אז מותרת הגישה באין מפריע)
דוגמא ל hosts.deny:

ipop3d, sshd, in.fptd: ALL

קונפיגורציה זו משלימה את הקונפיגורציה של hosts.allow ע”י שהיא אפקטיבית מגבילה את הכניסה רק למה שאושר ב hosts.allow. כל מה שלא תאם את רשימת הכתובות ב hosts.allow מועבר לבדיקה מול hosts.deny, ושם ידחה על בטוח.
שיטה זו, שדיברנו עליה כבר בפרק קודם, של חסימת כל התעבורה, ואיפשור רק מה שצריך, היא שיטה יעילה מאוד.
דוגמא פשוטה ליכולות המתקדמות של tcp_wrappers, מתוך hosts.deny

sshd : ALL: spawn (/sbin/iptables -A TCPWRAP -s %h -j DROP)

פקודת התגובה לנסיון לא מאושר זה של התחברות ל-ssh, תוביל להוספת חוק בקיר האש שיחסום את כתובת ה-IP של ה-“פושע”. כתובת ה-IP מוחלפת במשתנה %h.

סיכום ביניים: סריקה עצמית
אחרי שסגרנו את השרותים שלא רצינו, וחסמנו גישה ע”י קיר אש ו tcp_wrappers, הגיע הזמן לבדוק את עבודתנו.
נבדוק זאת בכמה שלבים:

1.סריקת פורטים פתוחים ממקור חיצוני (יבדוק את ה-FW)
2.נסיון התחברות לפורטים פתוחים ממקור חיצוני (יבדוק את tcp_wrappers)

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

# nmap -v

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

# nmap -v 192.168.1.1
Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
No tcp,udp, or ICMP scantype specified, assuming SYN Stealth scan. Use -sP if you really don't want to portscan (and just want to see what hosts are up).
Host (192.168.1.1) appears to be up … good.
Initiating SYN Stealth Scan against (192.168.1.1)
Adding open port 25/tcp
Adding open port 80/tcp
Adding open port 22/tcp
Adding open port 110/tcp
The SYN Stealth Scan took 0 seconds to scan 1601 ports.
Interesting ports on (192.168.1.1):
(The 1592 ports scanned but not shown below are in state: closed)
Port State Service
22/tcp open ssh
25/tcp open smtp
80/tcp open http
110/tcp open pop-3

כמו שניתן לראות, במקרה של מחשב זה פתוחים מספר פורטים. פלט זה אינו בהכרח פלט רצוי, בהתאם לשימוש המערכת/תיכנונכם האישי.
אם מתגלים פורטים פתוחים שלא ידוע מה הם או לא רצוי שיהיו פתוחים, מומלץ לעבור שוב על חלק א' של פרק זה “סגירת שרותים”.
בדיקה שניה שנבצע היא התחברות לשרותים פתוחים, שנחסמו ע”י tcp_wrappers. כלומר יש גישה אליהם, אבל גישה זו אמורה להחסם.
אתן פה דוגמא לפלט של נסיון התחברות לפורט 110(שרות pop3), ומה רואים מצד השרת:

$ telnet foo.org.il 110
Trying 1.2.3.4…
Connected to foo.org.il.
Escape character is '^]'.
Connection closed by foreign host.

ומצד השרת, אם נציץ בלוגים נראה את ההודעה הבאה:

Nov 26 00:11:19 foo xinetd[2750]: libwrap refused connection to pop3 from 4.3.2.1

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

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

■מציאת קבצי SUID/GUID
■קבצים חשודים אחרים
■שימוש ב-RPM לבדיקת שלמות המערכת
נושאים אלו הם רק חלק (קטן וראשוני) מהצעדים שכדאי לנקוט ע”מ לאבטח מערכת בצורה מקומית.
אנחנו מוצאים לנכון לחזור ולהדגיש, שזהו רק מבוא, ובשום אופן אין להסתמך עליו כמדריך שלם לאבטחת המערכת שלכם.

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

אבל, לא כל הקבצים במערכת באמת צריכים להיות SUID, ויתרה מכך, קובץ שאינו קובץ מערכת (כלומר לא הותקן בזמן התקנת המערכת) צריך להיות חשוד. מומלץ לבצע את הבדיקה הזו תקופתית או אפילו בעזרת cron (שרות תיזמון עבודות). המלצה של מדריך זה היא ליצור קובץ master שיכיל את הפלט של כל קבצי ה SUID/SGID, ואח”כ להשוות מולו בריצות נוספות, דוגמאות לכך יובאו בהמשך.
בתור התחלה, נבצע סריקה ראשונית, ונשמור את הפלט לתוך קבצים בשביל השוואה עתידית:

# find / -perm +4000 -ls > ~/suid.master
# find / -perm +2000 -ls > ~/sgid.master

הרצת הפקודות יכולה לקחת דקות ארוכות, שכן היא סורקת את כל מערכת הקבצים (פעמיים)
שתי פקודות אלו יסרקו את מערכת הקבצים כולה בשביל קבצים עם הרשאת SUID (הרשאה 4000) והרשאות SGID (הרשאה 2000), וישמרו את הפלט בקובץ המצויין. כדי לקרוא עוד על הרשאות מומלץ לקרוא את המדריך בלינק הבא http://www.penguin.org.il/faq/downlo…ons/index.html
הערה: ניתן לשלב את 2 הפקודות לפקודה אחת:

# find / -perm +6000 -ls

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

[root@linux root]# rpm -qf /usr/bin/passwd
passwd-0.67-3

פקודה אשר לא תהיה שייכת לאף חבילה (ישר אחרי התקנת המערכת) תהיה חשודה.
כאשר מבצעים את הבדיקה התקופתית, נוכל להשתמש בקבצי ה- master ע”מ להשוות את המצב למצב שבוא אנחנו בטוחים כי המערכת נקייה. דוגמא לבדיקה תקופתית ושימוש בפקודה diff ע”מ להשוות לקבצי המאסטר:

# find / -perm +4000 -ls > ~/suid.today
# diff ~/suid.today ~/sgid.master

# find / -perm +2000 -ls > ~/sgid.today
# diff ~/sgid.today ~/sgid.master

הפקודה diff, כשמה כן היא, מצביע ומראה על שוני בין 2 הקבצים שמפורטים בשורת הפקודה. כך תוכלו לקבל אינדיקציה מהירה ואמינה על שינויים בקבצי suid/sgid במערכת.
מצורף סקריפט קטן שניתן להשתמש בו בעזרת cron כדי לבצע סריקה יומית/שבועית (מה שנראה לכם מתאים למערכת שלכם), אם אינכם יודעים מה הוא שרות ה cron, לא נורא, ניתן להריץ סקריפט זה ידנית פעם ביום/שבוע, עד שתלמדו מה תפקידו של cron ואיך להשתמש בו. הסקריפט:

#!/bin/sh
SUIDTMP=/tmp/suid${$}
SUIDMASTER=/root/suid/suid.master
SGIDTMP=/tmp/sgid${$}
SGIDMASTER=/root/suid/sgid.master

find / -perm +4000 -ls > $SUIDTMP
diff $SUIDTMP $SUIDMASTER | mail -s "New SUID Files Today" root

find / -perm +2000 -ls > $SGIDTMP
diff $SGIDTMP $SGIDMASTER | mail -s "New SGID Files Today" root

rm -f $SUIDTMP $SGIDTMP
קבצים חשודים אחרים
עוד 2 סוגים של קבצים חשודים או בעלי פוטנציאל מסוכן הם קבצים ללא בעלים או קבצים בעלי הרשאת כתיבה לכל משתמש.
קבצים ללא בעלים הם קבצים שה- Owner שלהם אינו קיים במערכת. כדי למצוא אותם, נשתמש בפקודה הבאה:

find / -nouser -o -nogroup -ls

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

# find / -perm -2 ! -type l -ls

מסופק כאן סקריפט קטן שניתן להריץ ידנית או להשתמש ב cron. בשביל סקריפט זה נצטרך ליצור קובץ master שאליו יושוו תוצאות עתידיות, הציצו בפרק כדי ללמוד כיצד לבצע זאת:

#/bin/sh
NOOWNERTMP=/tmp/noowner${$}
NOOWNERMASTER=/root/noowner.master
WWTMP=/tmp/ww${$}
WWMASTER=/root/ww.master

find / -nouser -o -nogroup -ls > $NOOWNERTMP
diff $NOOWNERTMP $NOOWNERMASTER | mail -s "New Owenerless Files Today" root

# find / -perm -2 ! -type l -ls
diff $WWTMP $WWMASTER | mail -s "New WordWritable Files/Directories Today" root
rm -f $NOOWNERTMP $WWTMP
שימוש ב-RPM לבדיקת שלמות המערכת
פרק זה נועד למערכות שמשתמשות ב-RPM כמערכת התקנת חבילות.
אחת מהאופציות של פקודת ה- rpm הוא בדיקת שלמות החבילה ושינויים בקבצים שהותקנו מקובץ RPM. ניתן לנצל תכונה זו על מנת להריץ בדיקות שלמות על המערכת.
קודם דוגמא קטנה. נשתמש ב rpm כדי לוודא את שלמות החבילה passwd-0.67-3:

[root@linux root]# rpm -V passwd-0.67-3
[root@linux root]#

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

[root@linux root]# mv /usr/bin/passwd /usr/bin/passwd-temp
[root@linux root]# rpm -V passwd-0.67-3
missing /usr/bin/passwd
[root@linux root]#

ניתן לראות כי rpm מצא שהקובץ אינו קיים. דוגמא נוספת:

root@linux root]# mv /usr/bin/passwd /usr/bin/passwd-temp
[root@linux root]# touch /usr/bin/passwd
[root@linux root]# rpm -V passwd-0.67-3
SM5….T /usr/bin/passwd
[root@linux root]#

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

[root@linux root]# rpm -Va

פקודה זו תסרוק את כל המערכת, ותדווח על שינויים בחבילות המותקנות.
יש לשים לב אבל, שלא כל שינוי הוא בהכרח בעיה. לדוגמא, אם התקנו את ה- RPM של אפאצ'י (apache), שקובץ הקונפיגורציה שלו הוא בד”כ:

etc/httpd/conf/httpd.conf

וביצענו בוא שינויים על מנת שיתאים למערכת שלנו. סריקה זו תגלה את השינוי:

root@linux root# rpm -V apache
S.5….T c /etc/httpd/conf/httpd.conf
missing /var/www/html/index.html
root@gw root#

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

#!/bin/sh
RPMVTMP=/tmp/rpm-v${$}
RPMVMASTER=/root/rpm-v.master

rpm -Va > $RPMVTMP
diff $RPMVTMP $RPMVMASTER | mail -s "New RPM Changes" root

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

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

LinuxSecurity -http://www.linuxsecurity.com
SecurityFocus -http://www.securityfocus.com
SecuriTeam -http://www.securiteam.com
OpenNA -http://www.openna.com
Bugtraq -http://online.securityfocus.com/archive/1
תוכנות אבטחה שמופיעות במדריך:

nmap -http://www.insecure.org/nmap
xinetd -http://www.xinetd.org
iptables -http://www.iptables.org
iptables hotow's&scripts -http://www.linuxguruz.org/iptables
Iptables Tutorial -http://people.unix-fu.org/andreasson/iptables-tutorial/iptables-tutorial.html

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

tripwire -http://www.tripwire
nessus -http://www.nessus.org
tcpdump -http://www.tcpdump.org
snort -http://www.snort.org
snort&acid -http://www.penguin.org.il/faq/downloads/snort-acid/index.html