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

נעבור על סידור שבו טלאי אבטחה מגיעים מעצמם וגרסת PHP אינה משתנה בן לילה.

התקנה

sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -plow unattended-upgrades

הדו-שיח יוצר את /etc/apt/apt.conf.d/20auto-upgrades. בדקו מה יצא ממנו:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

האחדות פירושן «מדי יום». וכל זה מונע על ידי טיימר של systemd ולא על ידי cron הקלאסי:

systemctl list-timers | grep apt

העיקר: אבטחה בלבד

הקובץ המרכזי הוא /etc/apt/apt.conf.d/50unattended-upgrades. יש בו רשימת Allowed-Origins (ב-Debian — Origins-Pattern), וכברירת מחדל מופעל שם רק מאגר האבטחה. השאירו את זה כך.

הפיתוי להסיר את סימן ההערה מהשורה -updates — «שהכול יתעדכן» — חזק. אל תעשו זאת: מאגר העדכונים מביא גרסאות חדשות, לא רק תיקונים, ובדיוק משם מגיעות ההפתעות הליליות. אבטחה ורעננות הן משימות שונות, ואת השנייה עדיף לעשות ידנית בזמן שאתם ליד המקלדת.

אם חבילה כלשהי אסור שתתעדכן אוטומטית, יש לכך רשימה שחורה:

Unattended-Upgrade::Package-Blacklist {
    "mariadb-server";
    "php8.3-fpm";
};

השתמשו בה במודע: כל שורה כאן אומרת «את זה אני מעדכן בעצמי» — וזו הבטחה שתצטרכו לקיים.

הפעלות מחדש

השורה המכרעת:

Unattended-Upgrade::Automatic-Reboot "false";

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

כשמתעדכנים הליבה, libc או openssl, המערכת יוצרת את הקובץ /var/run/reboot-required. עד שההפעלה מחדש לא מתרחשת, הגרסה המתוקנת מונחת בדיסק והישנה רצה בזיכרון — כלומר הפרצה לא הלכה לשום מקום, אף שהחבילה נחשבת מעודכנת. בדקו במפורש:

ls -l /var/run/reboot-required
cat /var/run/reboot-required.pkgs

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

ספריות הן מקרה נפרד. openssl מתעדכן בעוד nginx ו-PHP-FPM ממשיכים לרוץ עם הגרסה הישנה בזיכרון, ושום דגל הפעלה מחדש אינו מופיע. מי זקוק להפעלה מחדש מראה needrestart:

sudo apt install needrestart
sudo needrestart -b

רק העבירו אותו למצב «דווח, אל תשאל» — אחרת הוא יתחיל לשאול שאלות באמצע התקנה לא אינטראקטיבית ויתקע אותה. לשם כך הניחו קובץ ב-/etc/needrestart/conf.d/ עם השורה $nrconf{restart} = 'l';.

בדקו שזה בכלל עובד

הרצת ניסיון בלי התקנה:

sudo unattended-upgrade --dry-run --debug

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

sudo tail -50 /var/log/unattended-upgrades/unattended-upgrades.log

כמה עדכונים ממתינים כרגע:

apt list --upgradable 2>/dev/null | grep -i security

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

מקום ב-/boot

קלאסיקה: ליבות ישנות אינן נמחקות, המחיצה /boot מתמלאת, התקנת ליבה חדשה נכשלת, והעדכונים נעצרים לגמרי. פעם בכמה חודשים שווה להציץ:

df -h /boot
sudo apt autoremove --purge

או הפעילו ניקוי אוטומטי באותו 50unattended-upgrades: Remove-Unused-Kernel-Packages "true" ו-Remove-Unused-Dependencies "true".

מה נשאר לאדם

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