После apt upgrade какие службы нужно перезапустить, чтобы обновлённые библиотеки вступили в силу: needrestart и почему «обновили, но уязвимость осталась»

Вопрос из обсуждения. На одном дистрибутиве после каждого обновления автоматически выводился список процессов, использующих устаревшие библиотеки. Как получить то же на обычном Debian или Ubuntu?

Ответ (подтверждено). Пакет needrestart. Он ставит хук в apt и после установки пакетов проверяет запущенные процессы: какие из них держат в памяти старые версии обновлённых библиотек, нужно ли перезагружаться из-за нового ядра или микрокода. На серверах Ubuntu он обычно установлен по умолчанию и задаёт вопросы в конце apt upgrade; на Debian ставится отдельно (apt install needrestart). Ручной запуск: sudo needrestart (интерактивно) или needrestart -r l (только список).

Почему это важно. Обновление пакета заменяет файл библиотеки на диске, но работающий процесс продолжает использовать старую копию из памяти. Обновление безопасности OpenSSL «установлено», а веб-сервер, почтовый сервер и SSH продолжают работать со старой уязвимой версией до перезапуска. needrestart называет эти службы; ядро требует перезагрузки (или live-patching, где он есть).

Как настроить на сервере. /etc/needrestart/needrestart.conf или файл в conf.d/:

$nrconf{restart} = 'a';   # автоматически перезапускать службы (для серверов без интерактива)
# $nrconf{restart} = 'l'; # только показать список (по умолчанию в неинтерактивном режиме)
$nrconf{override_rc}{qr(^postgresql)} = 0;   # исключить базу из автоперезапуска

Для критичных служб (базы, брокеры очередей, терминальные сессии пользователей) оставить ручной перезапуск в окно обслуживания и исключить их из автоматики; остальное (nginx, ssh, cron, rsyslog) можно перезапускать сразу. Перезапуск ssh не рвёт текущие сессии.

Без needrestart. Процессы с удалёнными (заменёнными) библиотеками в памяти: sudo lsof +c0 -d DEL | awk 'NR==1 || /lib/' | sort -u -k1,1; необходимость перезагрузки: [ -f /var/run/reboot-required ] && cat /var/run/reboot-required.pkgs. Утилита checkrestart из debian-goodies делает похожее.

Куда это встроить. В скрипт или задание обновлений: apt-get -y upgrade && needrestart -r a -b (пакетный режим), с оповещением, если needrestart сообщает о необходимости перезагрузки; окно перезагрузок раз в неделю или в месяц по результату. Так «обновления установлены» начинает означать «обновления действуют».

Утилита описана в документации Ubuntu.