חומת אש :: IP Tables

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

תוכנת IP Tables Firewall עובדת כמו אחרות בתחום, בצורה של כללים (הכללים נקראים ב-IP Tables בשם Chains) . כאשר כל תעבורה נבדקת מול כל כלל וכלל, ובמידה והכל תקין, התעבורה ממשיכה בדרכה, אחרת – היא נחסמת.

הערה : המדריך הזה מיועד עבור אבטחה IPv4 (ברירת המחדל של Digital Ocean היא כתובות IP כאלו), אם עשית הגדרות עבור IPv6 עליך להגדיר Firewall גם  עבור IPv6 . (יש מדריך כאן ).

איך חומת אש עובדת ? ואיך IP Tables עובדת ?

כל מידע שעובר באינטרנט, עובר בחבילות קטנות של מידע שנקראות Packets = "אריזות".
כל Packet בודד מחולק ל-2 קבעי מידע :
קטע שנקרא Header (כותרת)  – שאומר "מי אני? מאיפה באתי ? ולהיכן אני הולכת ?"
קטע שנקרא Body (=גוף החבילה) – שמכיל את המידע שמועבר בפועל.
בכל גלישה שלנו אנחנו שולחים ומקבלים Packets כל הזמן. אך כמובן, כמו בכל דבר, ישנם אנשים המנסים לנצל את התעבורה לרעה, ולשלוח Packets שעשויים להזיק ל-VPS.
בשביל זה בדיוק מיועדת חומת האש (Firewall), ובמקרה שלנו IP Tables – מסתכלת ובוחנת את ה-Header של כל Packet ולפי הכללים שקבענו, מחליטה האם לתת ל-Packet לעבור הלאה, או לחסום אותו (או להעביר למקום אחר).
כמו שכתבתי לפני כן, הכללים נקראים Chains = שרשראות.
– כללים על מידע נכנס – INPUT
– כללים על מידע יוצא – OUtput
– כללים על מידע שמועבר הלאה – Forward

פעולות בסיסיות ב IP Tables

במדריך הזה נעבור על כמה פקודות בסיסיות של IP Tables, כדאי לדעת, שיש עוד המון פקודות, והגדרות אפשריות, ומתי שהוא מומלץ לעבור עליהן.

[important]שים לב : צריך הרשאות ניהול בשביל הפקודה, לכן השתמש ב- sudo לפני כל פקודת IP Tables[/important]
נתחיל בכך שנרצה לראות מהן הכללים שכבר קיימים.

 sudo iptables -L

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

sudo iptables -L --line-numbers

אם עברת על המדריך של fail2ban, אתה בוודאי תראה פה את הכללים של fail2ban.
אחרת אתה תראה כמה כללים ריקים.

אם תרצה (לא חובה) למחוק את כלל הכללים ולהתחיל "דף נקי" השתמש בפרמטר F

sudo iptables -f

נקודה נוספת לפני שמתחילים – יש חשיבות לסדר הכללים ב-IP Tables, כלומר הכלל שמוגדר ראשון, משפיע לפני הכלל הבא אחריו, וכן הלאה..
שימו לב כמובן שאתם לא חוסמים את עצמכם מגישת SSH לשרת, כי אחרת, לא תוכלו להיכנס אליו.
נתחיל עם פקודה "שמצלמת" את המצב הקיים, ומרשה את כל החיבורים הקיימים ברגע זה לשרת.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

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

A- מוסיף כלל

המילה INPUT אומרת שמדובר בכלל של תעבורה נכנסת

הביטוי m conntract –ctstate ESTABLISHED, RELATED- אומר שהכלל שאנחנו מוסיפים יהיה רלוונטי רק לחיבורים הנוכחיים.

j ACCEPT- הפרמטר j הוא זה שקובע מה הפעולה שצריך לעשות עם ה-Packet, ובמקרה זה הגדרנו לו לקבל את התעבורה הנכנסת.

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

נניח שאנחנו רוצים לחסום את כל התעבורה הנכנסת חוץ מאשר תעבורת אינטרנט (פורט 80) ואת התעבורה שלנו (פורט עבור SSH) , לצורך כך מה שנעשה הוא כך:

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

    sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
    sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

    הסבר על מבנה הפקודה :

    p- מציין פרוטוקול, ובכלל הזה המילה העוקבת הייתה tcp.
    dport– מציינת פורט ספציפי

  2. נגדיר כלל שחוסם את כל התעבורה הנכנסת.
     sudo iptables -A INPUT -j DROP

    שים לב, זה חוסם גם sftp !

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

אם נניח תנסו להתחבר עכשיו עם FTP – החיבור יכשל, כי חסמנו הכל חוץ מאשר 80

עכשיו, אם עקבתם אחרי המדריכים הקודמים, אז בוודאי הגדרתם פורט שונה מהרגיל עבור תקשורת SSH, וכידוע, SFTP עובד בעצם על SSH
ולכן אם נרצה לאפשר את SFTP מאותו פורט (שהוא לא SSH "רגיל", ולכן לא דרך fail2ban) , אז צריך לפתוח את הפורט ההוא.
אבל… כרגע הוספנו כלל שחוסם את כל התעבורה, אז אם נוסיף אחריו כלל שמאפשר משהו, זה לא ישנה כלום, כי הכלל הקודם יתפוס.

זוהי הזדמנות ללמוד איך מוחקים כללים.

sudo iptables -D INPUT 5

D- פירושו למחוק

Input- מדבר על כללי התעבורה הנכנסת

והמספר 5 הוא מספר הכלל (תזכורת – אפשר לראות מספרי כללים עם sudo -L –line-numbers )

ועכשיו נוסיף כלל לגבי פורט מסוים, נניח 1234

sudo iptables -A INPUT -p tcp --dport 1234 -j ACCEPT

ואחריו נוסיף שוב את הכלל שחוסם כל תעבורה אחרת

sudo iptables -A INPUT -j DROP

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

למשל:

 sudo iptables -I INPUT 4 ……

יכניס את הכלל שתכתבו בסוף בתוך כלל INPUT מספר 4.

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

sudo apt-get install iptables-persistent

במהלך ההתקנה, נישאל האם לשמור את הכללים הקיימים עבור IPv4 ועבור IPv6, התשובה היא כן כמובן
לסיום נפעיל את התוכנה הזו:

sudo service iptables-persistent start

ואם תרצו – תעשו ריסט לשרת, ותראו שלאחר מכן, שהכל עולה תקין.

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

sudo sh -c "iptables-save > /etc/iptables/rules.v4"

ותעשו sudo reboot לשרת, זה אמור לשמור אותו.

הערה לסיום : הכללים נשמרים ב-2 קבצים בתיקיה etc/iptables/ , וה-syntax שלהם ממש כמו שכתבנו עד כה, פשוט בלי המילה iptables , לכן, מי שרוצה מוזמן לערוך אותם (גם זו דרך).

בהצלחה!

איך לבדוק האם סגרנו את כל הפורטים שרצינו בשרת הוירטואלי שלנו (Ubuntu) ?

אחרי שהתקנו חומת אש, נרצה בודאי לבדוק אותה ולראות שהיא תקינה.

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

לצורך כך נתקין תוכנה שנקראת nmap , תוכנה זו סורקת את הפורטים בכתובת ה-IP/הדומיין שאליו שלחנו אותה.

את התוכנה נתקין על מחשב או שרת אחר, מהשרת שלנו

sudo apt-get update
$ sudo apt-get install nmap

ולאחר ההתקנה נפעיל זאת כך :

sudo nmap -v  YourDomainOrIp.com

ונקבל דיווח שמציג אילו פורטים פתוחים.

אם נגלה שם פורטים פתוחים שאינם מוכרים לנו – יש לחסום אותם כמובן.

בהצלחה!

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *