לבחון שינויי חומת אש בלי לנעול את עצמך בחוץ
דרגו את נתיבי השחזור לפני שהכלל נכנס, ואז אמתו בזרימה שהמדיניות החדשה חייבת להעריך, ולא בהפעלה ששרדה.
הכלל נכנס, המסוף שכבר יש לכם ממשיך לענות, וההתחברות הבאה נדחית. הפער הזה הוא כל הקושי שבבחינת שינוי חומת אש דרך החיבור שאתם משנים. מעקב החיבורים מחליט פעם אחת ואז מפסיק להסתכל, ולכן זרימה מבוססת היא הבדיקה היחידה שאינה יכולה לראות את המדיניות החדשה. בהמשך מושוות שלוש דרכי החזרה, ואז נקבע הסדר שבו יש לשנות ולבדוק את הכללים.
למה ההפעלה ששרדה היא הראיה החלשה ביותר
חומת אש עם מצב מעריכה את החבילה הראשונה של זרימה ושומרת על אותו פסק כל עוד הרשומה חיה. כללים שנוספים אחר כך חלים על זרימות שמתחילות מאוחר יותר, ולכן החלון שאתם מקלידים בו נשאר שמיש בעוד כל האחרים נדחים. מה שאתם לומדים ממנו מתאר את המדיניות שהייתה בתוקף לפני דקות. אפילו לכידה שנלקחה על אותה זרימה מציגה החלטה שהמכונה כבר קיבלה.
התייחסו להפעלה העובדת כאל פתח מילוט ולא כאל מדידה. כל בדיקה ששווה להריץ חייבת לפתוח זרימה חדשה ממקור שהכלל החדש יעריך, והבדיקה הראשונה צריכה להיות זו שכישלונה יכאיב ביותר. כשההפעלה הזו היא הדרך היחידה שלכם פנימה, השינוי אינו מוכן להיעשות.
שלוש דרכי חזרה, מסודרות לפי מה שכל אחת תלויה בו
דרגו את האפשרויות לפי מידת התלות שלהן במכשיר הנבחן, כי לדירוג הזה תגיעו כשהכלל יתגלה כשגוי. קונסולה שלעולם אינה עוברת דרך חומת האש היא בלתי תלויה, שחזור מתורגל כמעט כך, וההפעלה שכבר פתוחה אינה.
| Way back in | What it survives | Where it fails |
|---|---|---|
| out-of-band or hypervisor console | a policy that blocks new logins | needs separate access you have already tried |
| rollback rehearsed on that platform | a rule that breaks remote access | fails when nobody ever ran it |
| the session that is already open | the change itself | cannot show whether new flows work |
לפני השינוי, התחברו דרך הקונסולה והוכיחו שהיא עובדת, כי נתיב מחוץ לפס שמעולם לא השתמשתם בו הוא תרשים ולא גיבוי. שחזור זוכה למקומו רק לאחר תרגול באותה פלטפורמה, עם אותה מערכת כללים, לפי הנוהל המאושר ולא באלתור על מכונה חיה. כתבו את השלבים ובקשו מאדם אחר להקריא אותם לכם. אם הרצף זקוק לזיכרון שלכם כדי להסתיים, זו אינה תוכנית.
שינוי אחד, ואז חיבור שחייב להיות מוערך
שמרו את מערכת הכללים הפעילה ואת הקובץ שבבעלותה, ואז בצעו עריכה צרה אחת. שינוי אחד לכל בדיקה שומר על תוצאה ניתנת לייחוס; שניים בבת אחת משאירים אתכם עם מכונה עובדת ובלי מושג איזו עריכה עשתה את העבודה. במקום שבו הפלטפורמה יכולה לנתח תצורה בלי לטעון אותה, עשו זאת קודם, כדי ששגיאת הקלדה תיכשל כששום דבר אינו עומד על כף המאזניים.
nft list ruleset > /root/ruleset.before
nft -c -f /etc/nftables.conf
אחר כך התחילו הפעלה חדשה ממקור שהכלל ששונה יתאים לו, בעוד הקונסולה עדיין מחוברת. חזרו על זה פעם אחת אם זה מצליח, כי הניסיון הראשון עלול לנחות על רשומה שהטבלה כבר החזיקה. אם זה נכשל, עדיין יש לכם דרך פנימה והחלטה לבטל, וזו התוצאה הרעה הזולה ביותר הזמינה.
מונה, מצב והקובץ עונים על שאלות שונות
כל אחת משלוש התצפיות יכולה להיראות משכנעת בפני עצמה ולהטעות אתכם לגבי השתיים האחרות. מונים מראים אם הזרימה שיצרתם עכשיו הגיעה לכלל שערכתם. טבלת המצב מראה אילו זרימות המכונה מאמינה שכבר מבוססות, וכך כלל שבור עדיין יכול להיראות בריא. הקובץ השמור מראה מה המכשיר יעשה אחרי הטעינה הבאה, וזה אולי לא מה שמערכת הכללים הרצה עושה עכשיו.
ss -tn state established
קראו מונים כדלתא ולא כסכום, כי המספר היחיד שחשוב הוא זה שזרימת הבדיקה שלכם הזיזה. כלל שהמונה שלו לעולם אינו עולה אינו מתאים, כמה שהוא נראה נכון על הנייר. אשרו גם את מקרה הדחייה: מדיניות שמעולם לא דחתה דבר לא הוכיחה מעולם שהיא דוחה את מה שרציתם לחסום. עברו על ממשק אחד בכל משפחה שהפריסה באמת נושאת, כי כלל v4 אינו אומר דבר על זרימת v6.
שחזרו ממערכת הכללים השמורה, ואז התאימו את הקובץ
כשהשינוי נכשל, טענו את מערכת הכללים השמורה במקום להוסיף כללים מתירים עד שההתחברויות יחזרו לעבוד. כל היתר נוסף משתיק את התסמין ומשאיר חור ששורד את האירוע ואת הזיכרון שלו. שחזרו, התחברו מחדש, ואז שמרו את ההשוואה הכושלת לצד התיעוד של מה שניסיתם.
לאחר שינוי מוצלח, עשו כך שהקובץ בדיסק יתאר את מערכת הכללים שרצה, ואשרו שטעינה מחדש משחזרת אותה. מערכת כללים חיה שסטתה מקובץ התצורה של עצמה היא מלכודת שהונחה לאתחול הבא.