השאלה כמעט אף פעם לא צצה משום מקום. השרת נעשה איטי יותר, ספק האחסון שלח הודעה על תעבורה יוצאת, או שבדואר מונחת התראה על כניסה שמעולם לא ביצעתם. אחר כך מגיע החלק הלא נעים: לא ברור לאן להסתכל ובאיזה סדר, והדחף הראשון — למחוק הכול ולהתחיל מחדש — כמעט תמיד מוקדם מדי.
להלן סדר בדיקות שלוקח כעשרים דקות ובמרבית המקרים נותן תשובה ברורה. הוא מתקדם מהזול ליקר: תחילה מה שנראה מיד, אחר כך מה שצריך להשוות מול נקודת ייחוס.
שלב ראשון: מי נכנס
התחילו בכניסות. אם מישהו אחר נכנס, הוא כמעט בוודאות הגיע דרך SSH והשאיר עקבות.
last -20
lastb | head -20
who
last מציג את הכניסות המוצלחות האחרונות, lastb את הכושלות, ו-who את מי שמחובר כרגע. מה שחשוב אינו הכמות אלא הצורה. אלפי ניסיונות כושלים מכתובות שלעולם אינן חוזרות הם רעש הרקע הרגיל של ניחוש סיסמאות; הוא רץ בלי הפסקה מול כל כתובת ציבורית ואינו אומר דבר.
מה שכן צריך להדאיג הוא אחר:
- כניסה מוצלחת מכתובת שאיש מהצוות שלכם אינו נמצא בה;
- כניסה בשם משתמש שמעולם לא יצרתם;
- ניסיונות כושלים מול שם משתמש שקיים באמת במכונה הזאת — כלומר מישהו למד מי המשתמשים שלכם, במקום לעבור על מילון;
- הפעלה פתוחה כרגע שלא אתם פתחתם.
בדקו בנפרד אם הופיעו מפתחות לא מוכרים. הקובץ ~/.ssh/authorized_keys הוא הדרך הנפוצה ביותר להישאר בפנים: את הסיסמה אפשר להחליף כמה שרוצים, המפתח נשאר.
cat ~/.ssh/authorized_keys
sudo cat /root/.ssh/authorized_keys
כל שורה שם היא גישה של מישהו. אם אינכם יכולים לומר של מי, התייחסו אליה כאל זרה.
שלב שני: מה השתנה במערכת
פריצה כמעט תמיד משאירה עקבות בדיסק: קובץ הפעלה שהוחלף, שורה מיותרת בהגדרות, קובץ חדש בתיקיית שרת האתר. לבדוק את זה בעין הוא חסר סיכוי — דרושה נקודת ייחוס.
ב-Debian וב-Ubuntu נקודת הייחוס כבר קיימת: כל חבילה מכירה את סכומי הביקורת של הקבצים שלה.
sudo apt install debsums
sudo debsums -c
הפקודה מציגה קבצים השונים ממה שההפצה התקינה. חלק מהממצאים יהיה לגיטימי — קובצי ההגדרות ב-/etc קיימים בדיוק כדי שיערכו אותם. אבל קובץ הפעלה שהשתנה ב-/usr/bin, ב-/usr/sbin או ב-/bin בשרת שמעולם לא נגעתם בו ידנית הוא עניין אחר לגמרי.
המקור השני הוא קבצים חדשים במקומות שלא אמורים להיות בהם. web shell יושב בדרך כלל בתיקיית ההעלאות ונראה כמו .php תמים:
find /var/www -type f -name '*.php' -mtime -14 -ls
ארבעה עשר יום הם רק נקודת פתיחה; קחו את התקופה שבה אתם יודעים שלא פרסמתם דבר.
שלב שלישי: מה יוצא החוצה
שרת שנפרץ כמעט אף פעם לא נפרץ לשם עצמו. משתמשים בו: לשליחת דואר זבל, לכריית מטבעות, כדי להגיע לרשתות אחרות, לאחסון קבצים של אחרים. כל אלה יוצרים חיבורים יוצאים שלא היו קודם.
ss -tulpn
ss -tp state established
הפקודה הראשונה מציגה מה מאזין, והשנייה מה מחובר כרגע. קראו את עמודת התהליך. מה שמעורר שאלות: תהליך לא מוכר שמאזין על 0.0.0.0; חיבורים יוצאים לפורטים גבוהים של כתובות שלאפליקציה שלכם אין עסק איתן; ומעל הכול תהליך שהופעל מ-/tmp או מ-/dev/shm — שום דבר לגיטימי אינו רץ מהתיקיות האלה.
ובעודכם שם, הביטו גם בעומס. כורה מטבעות מסגיר את עצמו בכך שהוא מעסיק את המעבד באתר שאין לו שום פופולריות.
אם הסימנים קיימים
הדחף הראשון הוא לנקות מהר: למחוק את המפתח הזר, להרוג את התהליך, להסיר את הקובץ. אל תעשו זאת — אתם משמידים בדיוק את מה שעשוי היה להסביר אחר כך איך הם נכנסו. ואם זה יישאר בלתי מוסבר, הם יחזרו, אולי כבר מחר.
סדר ששומר גם על הנתונים וגם על התמונה:
- צלמו תמונת דיסק אצל הספק שלכם אם זה אפשרי. זה הצעד היחיד שאי אפשר לחזור עליו אחר כך.
- נתקו את המכונה מהרשת או סגרו הכול חוץ מכתובת ה-IP שלכם — אבל אל תכבו אותה. כיבוי מאבד את רשימת התהליכים ואת החיבורים הפתוחים, וזו מחצית הראיות.
- העתיקו את היומנים אל מחוץ למכונה:
/var/log/auth.log, יומני שרת האתר, ופלט שלוש הפקודות שלמעלה. - ורק עכשיו בררו איך הם נכנסו.
התקנה נקייה מחדש היא הסיום הנכון אם הגישה הושגה עם הרשאות root. שום כמות של ניקוי אינה מבטיחה שלא נשאר דבר. אבל להתקין מחדש בלי להבין את הסיבה הוא חסר טעם: תחזירו את אותו החור למערכת טרייה.
איך למנוע מהשאלה להגיע פתאום
כל האמור למעלה הוא בדיקה ידנית חד-פעמית, והיא עונה על השאלה «מה קורה כרגע». הצרה היא שהשאלה נשאלת בדרך כלל מאוחר: אחרי שהספק כתב או אחרי שהאתר נפל.
כל אחת מהבדיקות האלה קיימת ככלי נפרד שיכול לעקוב ברציפות: כניסות כושלות — fail2ban, שינויי קבצים — AIDE, שלמות חבילות — debsums, פורטים פתוחים — צילום קבוע של ss. להתקין אותם אחד-אחד אינו קשה; קשה לפתח הרגל להיכנס מדי יום ולקרוא שישה פלטים שונים, ולכן בפועל איש אינו קורא אותם.
וזו בדיוק המשמעות של לוח שמאגד אותם: אותם נתונים, אבל בעמוד אחד ועם היסטוריה, כך ש«אתמול זה לא היה ככה» ייראה בלי מסע מיוחד. למטה נמצאים עמודי ההדגמה שמראים איך זה נראה כשהכול מקובץ.