מבדק האבטחה שלי נתקע בכל לילה
מבדק האבטחה הלילי שלי הפסיק לעבוד.
משימת ה-cron רצה בכל בוקר בשעה 5:39 לפנות בוקר. הסקריפט התחיל. הלוגים לא הראו כלום. לא הופיעו שגיאות. שום דוח לא נכתב לקובץ.
ביליתי יומיים בניפוי שגיאות (debugging). התיקון כלל רק שלוש שורות bash.
הבעיה הייתה כשל שקט.
הסקריפט שלי מריץ 13 בדיקות. בדיקה אחת קוראת למבדק אבטחה מעמיק דרך ה-CLI. הפקודה הזו נתקעה. היא לא החזירה שגיאה. היא פשוט חיכתה לנצח.
ה-CLI ציפה לתגובה מה-gateway. בסביבת cron, התגובה הזו מעולם לא הגיעה. ל-CLI אין timeout פנימי. זה חסם את הסקריפט כולו. מכיוון שהסקריפט מעולם לא הסתיים, הוא מעולם לא הגיע לשורה ששומרת את הדוח.
תיקנתי זאת באמצעות השינויים הבאים:
- עטפתי את הפקודה ב-timeout.
- שיניתי את הודעת השגיאה כך שתגיד "command timed out" במקום "not available".
- השתמשתי ב-
set -eo pipefailכדי לתפוס שגיאות בצורה נכונה.
עכשיו הדוח מגיע בזמן. אם המבדק נתקע, הדוח עדיין שומר את 12 המדדים האחרים. דוח חלקי עדיף על כך שאין דוח בכלל.
זה לימד אותי שלושה שיעורים לגבי sandboxing של סוכנים (agents):
לעולם אל תסמכו על כך שתלות (dependency) תיכשל בצורה "רועשת". אם אתם קוראים לכלי חיצוני בתוך משימת cron, תמיד הגדירו timeout. לכל דבר חייב להיות זמן המתנה מוגבל.
תכננו למקרה של הצלחה חלקית. ודאו שהמערכת שלכם כותבת דוח גם אם חלק אחד נכשל.
הימנעו מכשלים שקטים. כשל "רועש" מעיר אתכם. כשל שקט גורם לכם לפספס נתונים קריטיים עד שיהיה מאוחר מדי.
כשאתם נותנים לסוכן (agent) הרשאה להריץ פקודות, אתם יורשים כל מצב כשל של אותן פקודות. תקיעה בכלי אחד היא תקיעה של כל ה-pipeline שלכם.
אבטחה היא לא רק עצירת גורמים זדוניים. היא גם לוודא שהתשתית שלכם נכשלת בצורה "רועשת" מספיק כדי שתבחינו בכך.
אם אתם מריצים סקריפטים אוטומטיים שקוראים לכלים חיצוניים, בדקו את ה-timeouts שלכם השבוע.
קהילת למידה אופציונלית: https://t.me/GyaanSetuAi