До основного вмісту

Аудит версій PHP і nginx на парку серверів: один скрипт

Безпека · 27.10.2026 · 2 хв читання

Коли серверів більше трьох, питання «ми оновилися?» перестає мати однозначну відповідь. Один сервер пропустили, на іншому PHP-FPM не перезапустили, на третьому PHP у контейнері. Нижче — перевірка, яка відповідає на це питання списком.

Головна пастка: номер версії бреше

В Ubuntu, Debian, AlmaLinux виправлення переносять у стару версію, не змінюючи номер. На виправленому сервері php -v покаже 8.3.6 — ту саму цифру, що й на вразливому. Порівнювати номери версій марно: потрібен журнал змін пакета.

Скрипт перевірки

Покладіть список серверів у файл hosts.txt, по одному на рядок, і запустіть:

#!/usr/bin/env bash
set -uo pipefail

while read -r host; do
  [ -z "$host" ] && continue
  printf '%-28s ' "$host"
  ssh -o ConnectTimeout=5 -o BatchMode=yes "$host" '
    php_v=$(php -v 2>/dev/null | head -1 | awk "{print \$2}")
    ngx_v=$(nginx -v 2>&1 | grep -oE "[0-9]+\.[0-9]+\.[0-9]+")
    fixed=ні
    if zgrep -lq "CVE-2026-109618" /usr/share/doc/php*/changelog.Debian.gz 2>/dev/null; then
      fixed=так
    elif rpm -q --changelog php-cli 2>/dev/null | grep -q "CVE-2026-109618"; then
      fixed=так
    fi
    fpm_start=$(ps -eo lstart,cmd 2>/dev/null | grep -m1 "php-fpm: master" | cut -c1-24)
    echo "php=${php_v:-ні} латка=$fixed nginx=${ngx_v:-ні} fpm_з=${fpm_start:-ні}"
  ' 2>/dev/null || echo 'недоступний'
done < hosts.txt

Як читати вивід

ПолеЩо означає
латка=таку журналі пакета знайдено номери вразливостей — виправлення встановлено
латка=ніабо не оновлювалися, або PHP зібрано вручну чи встановлено зі стороннього джерела
fpm_зчас запуску головного процесу PHP-FPM; якщо він раніший за оновлення, старий код ще в пам'яті
nginx1.30.6 і новіша в стабільній гілці — жовтневий набір закрито

Що робити з результатом

  1. Спершу сервери з латка=ні і відкритим назовні портом 80 або 443.
  2. Потім ті, де латка є, але PHP-FPM запущено раніше за оновлення — їм достатньо перезапуску.
  3. Окремо — контейнери: скрипт їх не бачить, перевіряйте через docker exec.

Щоб не повторювалося

Поставте перевірку в cron раз на добу й надсилайте вивід собі. Мовчазний сервер і оновлений сервер виглядають однаково, поки їх не запитати.

Часті запитання

Чому не порівнювати просто номери версій?

Тому що при бекпорті номер не змінюється. Порівняння номерів дасть хибну тривогу на виправлених серверах і хибний спокій там, де PHP зібрано вручну.

Чи потрібен скрипту root?

Ні, читання журналів змін доступне звичайному користувачу.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці