אבטחת אתרי אינטרנט בצד הקוד ובצד השרת
אבטחת אתר אינטרנט הוא מכלול של הגנה על האתר גם ברמת הקוד וגם ברמת השרת. כדי לוודא שהאתר שלנו מאובטח עד כמה שניתן (כי אין לעולם אבטחה של 100%, אפילו לפנטגון כבר פרצו) וכדי להקשות עד כמה שניתן חדירה של האקרים לא רצויים לאתר שלנו (שעלולים לשבש לנו את המידע, לגנוב אותו ואף למחוק אותו), יש גם לוודא שהקוד מאובטח מפני חולאים כגון SQL injection, XSS, DDoS, ספאם בטפסים וכיו"ב, וגם שהשרת מאובטח מפני תקיפות דומות. רק שילוב חכם של כמה רמות הגנה, הן ברמת הקוד והן ברמת השרת יכולים להביא לרמת אבטחה גבוהה.
במאמר זה, נתרכז בנושא אבטחת שרתים. את נושא ההגנה בקוד נשאיר לפעם אחרת. גם אבטחת שרתי אחסון הוא נושא מורכב, ולא ניתן לדבר עליו במאמר אחד קצר, ולכן בעיקר נעלה את הרעיונות הכלליים של האבטחה ונסיים עם טיפים שקל ליישם ללא הבנה גדולה מדי באבטחת מידע.
מהי אבטחת מידע טובה על השרת
אבטחת מידע טובה היא כזו המקיימת:
- חסימה של ביצוע פעולות שעלולות להוות סיכון, לחשוף מידע רגיש או לאפשר גישה לנתונים שלא נרצה לתת אליהם הרשאה בצורה ישירה. למשל, ביצוע פקודות כמו trace או track למעקב אחר פעילות השרת, הן פעולות שנרצה לחסום.
- הסתרה של מידע שיכול לעזור להאקר לפרוץ לנו לאתר. למשל, חשיפה של גרסת תוכנת ה-Apache המותקנת על השרת, חשיפת גירסת ה-PHP, נתוני שגיאה בקוד שמספקים מידע על קבצים ופרצות אבטחה.
- מניעת הרצה של קוד שעלול להיות מנוצל לרעה. למשל, ביצוע קריאות exec, shell וכיו"ב מתוך קוד PHP יכול להיות שימושי, אבל גם הרסני (ולכן עדיף באופן כללי שלא להשתמש בפקודות מסוג זה בקוד שאנו כותבים ובכלל לחסום קריאות אלו מתוך השרת).
איך מגינים על שרת האחסון
כדי להגן על שרת האחסון, מומלץ קודם כל להשתמש בגרסאות עדכניות של כל תוכנה מותקנת, לרבות גרסאות כלים כמו Apache, PHP וגם גרסאות של תוכנות, כלי עזר ותוספים כגון Wordpress, TinyMCE וכן הלאה. גירסאות עדכניות ברוב המקרים כוללות תיקוני אבטחה וסוגרות פרצות אבטחה שהיו אפשריות בגרסאות ישנות יותר.
לאחר שעדכנו את כל גירסאות הכלים, יש לוודא חלוקת משאבים נכונה על השרת (במיוחד אם זהו שרת שיתופי) על מנת שגישה לאתר אחד לא תיפגע באתר אחר. הפרד ומשול יעזור פה גם באבטחה, שכן ניצול לרעה של משאבי אתר אחד לא יוביל לפגיעה באתר אחר. תוכנה טובה שמאפשרת ניהול משאבי שרתים היא למשל Cloud Linux.
יש לוודא גם שאנו משתמשים כמובן בפיירוול. פיירוול ימנע חדירה של סוסים טרויאנים, malware ושאר מזיקים שירצו לגשת למידע על השרת.
לאחר שעשינו את כל ההתקנות והעדכונים הנזכרים לעיל, יש לבצע את השלב החשוב והמכריע של ההגדרות השונות.
קינפוג והגדרת Apache - אופטימיזציית אבטחה חכמה יותר
נרצה לבצע קונפיגורציה חכמה ל-Apache, על מנת לחסום קוד מסוכן, להסתיר גירסת Apache וכיו"ב. אספנו עבורכם סט הנחיות להגנה טובה יותר על השרת:
- הסתרת נתוני Apache:
בקובץ /etc/apache2/apache2.conf (או בקובץ httpd.conf) יש להוסיף את השורות הבאות:
ServerTokens ProductOnly
ServerSignature Off
- מניעת ביצוע Trace:
בקובץ /etc/apache2/apache2.conf או בקובץ /etc/apache2/conf.d/security/security.conf יש להוסיף שורה:
TraceEnable Off
- הסתרת רשימת הקבצים בעת טעינת האתר:
יש לבטל את המודול autoindex המותקן על Apache. במערכת Ubuntu למשל, יש למחוק לשם כך את הקבצים הבאים:
/etc/apache2/mods-enabled/autoindex.load
/etc/apache2/mods-enabled/autoindex.conf
- מניעת גישה להורדה, העלאה ושינוי קבצים באמצעות מנגנון WebDAV:
מנגנון WebDAV הוא מנגנון שנימצא בשימוש נדיר ביותר ומאפשר הורדה, העלאה ושינוי קבצים. מומלץ לנטרל אותו ע"י ביטול המודולים dav, dav_fs, dav_lock. במערכת Ubuntu למשל, יש למחוק לשם כך את הקבצים הבאים:
/etc/apache2/mods-enabled/dav.load
/etc/apache2/mods-enabled/dav_fs.conf
/etc/apache2/mods-enabled/dav_fs.load
/etc/apache2/mods-enabled/dav_lock.load
- הסתרת גירסת BIND DNS Sever:
בקובץ named.conf בתוך הקטע options, יש להכניס מלל סתמי עבור השדה version. דוגמא:
options {
….
version "BIND DNS Sever Version Protection";
}
לאחר השינוי יש לאתחל את הרישום על ידי ביצוע:
# service bind9 restart
הערות:
- לפני הוספת השורות בקבצים השונים, יש לבדוק קודם האם כבר קיימת הגדרה רלוונטית, ואם כן, אז לתקן אותה במקום להוסיף הגדרה נוספת.
- לאחר שינויי ההגדרות יש לבצע אתחול לשרת.
קינפוג והגדרת PHP - אבטחת מידע בקוד PHP
הקובץ /etc/php5/apache/php.ini מרכז בתוכו הגדרות ברירת מחדל של PHP. ההגדרות ההלו שולטות בין היתר ביכולות של הקוד לבצע פעילויות כגון: חשיפת גירסת PHP, הרצת קוד משרת חיצוני, שליחת מידע לא מאובטח כפרמטרים בקוד, חשיפות שגיאות קוד ובעיות כלפי חוץ לגולשים באתר וכיו"ב.
קביעה לא נכונה של הגדרות ברירת המחדל של PHP הינה כר פורה לפרצות אבטחה שהאקרים יכולים לנצל.
להלן שורה של הגדרות שמומלץ לקבוע כברירת מחדל על מנת להעלות את רמת האבטחה על השרת:
allow_url_fopen = Off
display_errors = Off
display_startup_errors = Off
log_errors = On
error_reporting = E_ALL
expose_php = Off
register_globals = Off
אבטחת שרתים - לסיכום
הרעיונות והטיפים שהזכרנו הם התחלה טובה לאבטחה חזקה יותר של השרת ושל קוד PHP. אנו ממליצים לוודא כי השרת שלכם עבר בדיקת אבטחה, אבל זכרו כי זה אינו מספיק: האבטחה חייבת להמשיך במעגל השני של הקוד, אבל זה כבר לפעם אחרת.