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

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

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

גיבוי

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

גירסה אחרונה של ג'ומלה

בין אם אתם מפתחי אתרים מנוסים ובין אם יש לכם סתם אתר חובבני, הדבר הראשון שיש לדאוג הינה הגירסה האחרונה של ג'ומלה. יש לעקוב אחר האתר joomla.org.il ולעקוב אחרי החדשות ועל שחרורי גרסאות. חלק משחרורי הגרסאות הינן תיקוני אבטחה. בכל פעם שמשוחררת גירסה, תוכל לעדכן גירסה בקלות. מגירסה ג'ומלה 1.6 ניתן לעדכן ישירות מפאנל הניהול. גם שדרוג ישירות ל-1.7 יתבצע ישירות מהניהול.

סיסמאות

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

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

פאנל ניהול האתר

המשתמש של מנהל האתר

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

אל תשתמשו במשתמש המנהל ברירת המחדל

לאחר התקנה רגילה של ג'ומלה, המשתמש שנוצר בברירת מחדל הינו מנהל. בגלל שמנהל ברירת המחדל של ג'ומלה בעל מספר זיהוי (ID) קבוע (62 ב-1.5 ו-42 ב-1.6) עדיף לא להשתמש בו. עדיף להירשם לאתר עם משתמש אחר ולהפוך אותו למנהל. את המשתמש ברירת מחדל עדיף למחוק לאחר מכן.

עדכון: אחד הפיצ'רים שכותב המאמר הכניס לג'ומלה 2.5.6 הינו שמזהה (ID) של המשתמש הראשון של ג'ומלה הינו רנדומלי ולא קבוע.

חסימת פאנל הניהול ממשתמשים לא מורשים

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

גילוי נאות: אחד התוספים הינו של כותב המאמר. הוא חינמי וחופשי ישירות מה-JED.

הרחבות

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

רכיבים מיותרים

ג'ומלה הינה מערכת ניהול תוכן מאוד מתקדמת. בהתקנת ברירת מחדל היא מגיעה עם המון רכיבים. חלקם שימושיים ביותר (תוכן, משתמשים), אבל חלקן אינן בשימוש כלל. דוגמאות לאלו יכולות להיות פרסומות/באנרים, אנשי קשר, מזין חדשות, כיוון מחדש ועוד. רכיבים אלו גם אין להם קישורים ישירים בדפים שיצרת, יש להם גישה באמצעות קישור ישיר לרכיב (נסה index.php?option=com_search באתר שלא הוספת אופציה לחיפוש בתכנים). עדיף לנטרל רכיבים שאינם בשימוש. ניתן לעשות זאת באמצעות ניהול הרחבות->נהל. שים לב שאתה מנטרל (מכונה ביטול פרסום) ולא מסיר (אף פעם לא תדע מה תצטרך את ההרחבה). אל תנטרל הרחבה שאתה לא יודע מה היא עושה.

הרשאות קבצים

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

אחד הדברים הראשונים שיש לדאוג להם הינם הרשאות הקבצים. לכל קובץ ותיקייה בלינוקס יש שלושה דגלים קריאה (r), כתיבה (w) והרצה (x). אני לא אכנס לתוך זה ניתן בקלות באמצעות גוגל למצוא ולקרוא את התיעוד (יש המון). מה שחשוב כאן הוא דגל הכתיבה. דגל הכתיבה מאפשר למשתמש הקצה להוסיף קבצים. בטח אתם שואלים למה המשתמש צריך את זה (ביחוד המתחילים מביניכם) והתשובה היא לרוב היא בשביל להוסיף תמונות לאתר ע"י מנהל האתר בשביל תוכן. לג'ומלה יש מספר תיקיות שצריכות להיות כתיבות בנוסף לתמונות. תיקייה המטמון cache וספריית tmp, המשמשת לאחסון קבצים זמנים (בזמן התקנה למשל). כדי להשאיר את התיקיות הנ"ל כתיבות וכל השאר קריאות בלבד יש קודם לדאוג שהספריות הינן לקריאה בלבד ורק לאחר מכן לדאוג לכתיבה של התיקיות הספציפיות. על הקבצים להיות בהרשאת 644, לכן הריצו את הפקודה הבאה בשרת:

הצג/הסתר קוד bash

הצג מקור
find /home/xxx/domains/xxxxxxx.com/public -type f -exec chmod 644 {} \;

ועל הספריות להיות בהרשאת 755:

הצג/הסתר קוד bash

הצג מקור
find /home/xxx/domains/xxxxxxx.com/public -type d -exec chmod 755 {} \;

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

את הפקודות מריצים בעזרת חיבור ssh לשרת (putty לעזרתכם) או באמצעות CPanel.

שימו לב לתיקייה שעלינו הפעלנו את הפקודה (home/xxxxxx/domains/xxxxxxx.com/public_html/) זו התיקייה שבה מותקנת ג'ומלה בשרת שלכם.

פתיחת תיקיות לכתיבה

כמו שציינו הצורך בכתיבה לתיקיות הינו נדרש במקרים ספציפיים. התיקיות שאני ממליץ בכל אופן לאפשר להן כתיבה הינן tmp, cache ו-images. ניתן לעשות זאת באמצעות הפקודה הבאה:

הצג/הסתר קוד bash

הצג מקור
cd /home/xxxxxx/domains/xxxxxxx.com/public_html && chmod -R o+w images cache tmp

כפי שציינתי ועפ"י הפריצה שבדקתי רוב הפריצות מנצלות את האופציה הזו ומעלות קובץ סקריפט (בד"כ PHP בגלל שג'ומלה מריצה PHP) ואז ההאקר יכול פשוט לגלוש לקובץ שהוא העלה ולהפעיל את הסקריפט.

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

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

הצג/הסתר קוד apache

הצג מקור
# secure directory by disabling script execution
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

בסיס הנתונים MySQL

ההמלצה לגבי MySQL הינה לא לתת לטבלאות את הקידומת (prefix) ברירת מחדל של ג'ומלה (jos_), זאת מכיוון שבד"כ פורצים ינסו להחדיר נתונים לטבלאות והם יניחו שהשארתם את הקידומת. במידה ושיניתם יהיה להם הרבה יותר קשה להחדיר נתונים לבסיס הנתונים שלכם.

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

מתקדמים: PHP

אופציות אלו אפשריות רק אם יש לכם גישה לקובץ הקונפיגורציה של PHP בשרת בשם php.ini. אם אינכם מכירים, עדיף שתשאירו עבודה זו או העבירו זאת למארח שלכם.

חסימת פונקציות שמיועדות לפורענות

PHP היא השפה הכי נפוצה היום לכתיבה אפלקציות אינטרנטיות ושפת התכנות הרביעית בתפוצתה בכלל (אחרי C, C++ וג'אווה). הקלות שניתן לפתח בה הוא חלק גדול ביתרונותיה אבל כמובן אליה וקוץ בה. יש בה מספר פונקציות שיכולות לתת גישה למקומות לא רצויים. ניתן לחסום בקלות פונקציות "מקוללות" באמצעות עדכון השורה בקובץ המתחילה ב-disable_functions:

הצג/הסתר קוד bash

הצג מקור
disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open, eval

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

מתן גישה רק לאפליקציית ג'ומלה

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

הצג/הסתר קוד bash

הצג מקור
open_basedir =/home/xxxxxx/domains/xxxxxxx.com/:/tmp

התיקייה tmp צריכה להיות נגישה (שימו לב שזו אינה התיקייה tmp של ג'ומלה), בגלל שההעלאות הקבצים של PHP מתבצעות קודם כל לשם (אח"כ זה עובר לג'ומלה).

מתקדמים: htaccess

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

ההמלצה שלי היא להוסיף מקטעים של htaccess כאשר אתם יודעים בוודאות מה כל מקטע עושה. מקטע הינו קטע קוד קצר שמטפל שאירוע בודד (מכונה גם case בעגה המקצועית).

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

חסימת גישה ישירה לקבצי הליבה ג'ומלה

כל מערכת ג'ומלה עוברת דרך הקובץ index.php או index2.php כל ניסיון אחר הוא למעשה ניסיון פריצה. שום הרחבה (בד"כ!) לא עושה גישה לשום קובץ אחר באופן ישיר, אלא דרך הפלטפורמה של ג'ומלה שעוברת דרך אותו השער (index.php או index2.php). לכן ניתן לחסום גישה לרוב סוגי קבצים אחרים (במקרה הזה xml, ini' ו-php) בעזרת המקטע הבא:

הצג/הסתר קוד apache

הצג מקור
#### @RS
# Deny access to php, xml and ini files 
# within components and plugins directories
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]
#### @RS

שימו לב לסימון @RS שמסמן תחילת וסוף מקטע.

חסימת ניסיון לפריצת MySQL

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

הצג/הסתר קוד apache

הצג מקור
#### @RS
# Prevent most common SQL-Injections
RewriteCond %{query_string} concat.*\( [NC,OR]
RewriteCond %{query_string} union.*select.*\( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]
#### @RS

חסימת כלי פריצה

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

הצג/הסתר קוד apache

הצג מקור
#### @RS
# Block most common hacking tools
SetEnvIf user-agent "Indy Library" stayout=1
SetEnvIf user-agent "libwww-perl" stayout=1
SetEnvIf user-agent "Wget" stayout=1
deny from env=stayout
#### @RS

מתקדמים: שינוי מיקום configuration.php

החל מג'ומלה 1.6 ניתן לשנות את מיקום ברירת המחדל של קובץ הקונפיגורציה המרכזי של ג'ומלה - configuration.php. השינוי נובע מכמה סיבות. הראשונה שהרבה פורצים יודעים שהוא שוכב שם בברירת מחדל ומנסים קודם כל לתקוף אותו. שנית, אנחנו רוצים שהוא יהיה ניתן לכתיבה על אף שכבר הגדרנו את כל מה שתחת ג'ומלה יהיה לקריאה בלבד (חוץ מתיקיות ספציפיות). הדרך הנכונה היא לשים אותו מחוץ למקום הציבורי (מכונה public_html) שבו ניתן לגשת אליו מהאינטרנט. מיקום כזה יהיה ניתן לגישה רק ע"י ג'ומלה.

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

  1. העתיקו את הקובץ public_html/includes/defines.php אל public_html ואת public_html/administrator/includes/defines.php אל public_html/administrator/.
  2. לאחר מכן עליכם להיכנס לכל אחד מהקבצי defines.php החדשים  ב-public_html וגם ב-public_html/administrator ולהוסיף את 2 השורות הבאות:
    הצג/הסתר קוד php
    הצג מקור
    define('_JDEFINES', 1);
    define('JPATH_BASE', dirname(__FILE__));


    מתחת ל:
    הצג/הסתר קוד php
    הצג מקור
    defined('_JEXEC') or die;
  3. הצעד האחרון הינו לעדכן את המיקומים ברירת מחדל של קובץ הקונפיגורציה. למשל אם נרצה לעדכן את המיקום למעל ה-public_html, נעדכן את השורה:
    הצג/הסתר קוד php
    הצג מקור
    define('JPATH_CONFIGURATION',   JPATH_ROOT);

    ב:
    הצג/הסתר קוד php
    הצג מקור
    define('JPATH_CONFIGURATION',   JPATH_ROOT .DS.'..');

סיכום וקינוח

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

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

קישורים נוספים

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]



תגובות   

0 #1 מגדי 2014-08-11 11:27
עופר כל הכבוד על המאמר החשוב
שמתי לב שהמאמר לא עודכן כבר יותר משנתיים לכן ברשותך כמה הערות

1- אפשר להוסיף לג'ומלה מדיניות אבטחה אחרי ניסיון התחברות כושל לממשק האדמין השלישי שיקבלו חסימה בהקשה שגוייה של שם המשתמש והסיסמה

2- יש להפעיל 2 FACTOR AUTHENTICATION הקיים בג'ומלה 3 או להוסיף אותו בג'ומלה 2.5

3-אם אפשרי (במקרה של אתרים שלא מתעדכנים תכוף)לחסום את הגישה ל SSH וגם ל FTP או לפחות לשנות את הפורטים

4-באתרים שלא נוספים להם משתמשים חדשים, יש לחסום את האפשרות של רישום של משתמשים חדשים

5-

עליך להירשם כדי להוסיף תגובות

עופר כהן

חובב ג'ומלה
אתר המחבר/ת: http://embad.com