Обновление nginx 1.10.3 в Debian 9 (растяжка), чтобы избежать уязвимости CVE-2017-7529

На данный момент Debian 9 (stretch) устанавливает версию 1.10.3 nginx, которая уязвима для CVE-2017-7529:

Версии Nginx начиная с версии 0.5.6 до 1.13.2 включительно уязвимы для уязвимости целочисленного переполнения в модуле фильтра диапазона nginx, приводящей к утечке потенциально конфиденциальной информации, вызванной специально созданным запросом.

Я беспокоюсь о безопасности данных моих пользователей, поэтому я бы хотел обновить их до последней версии, которая больше не затрагивается этой проблемой.

1 ответ

Решение

Есть несколько способов получить nginx 1.13.3 и выше. Вы можете скомпилировать его самостоятельно, использовать репозиторий stretch-backports или добавить собственный репозиторий nginx. В этом ответе я проведу вас через последний, поскольку это, вероятно, самый простой из всех трех.

На веб-сайте nginx есть отдельная страница о том, как настроить свой репозиторий, но это еще не все, особенно если вы хотите избежать этой конкретной уязвимости прямо сейчас. stable В ветви будет установлена ​​1.12.0, которая все еще уязвима (она была исправлена ​​в 1.12.1+ и 1.13.3+), поэтому вам нужно будет использовать mainline, который установит 1.13.5.

В лучшем случае переключение версии nginx должно быть таким же простым, как выполнение нескольких команд, и вы будете сделаны через 2-3 минуты с минимальным временем простоя. Чтобы иметь возможность вернуться к работе как можно скорее, начнем с подготовки к установке. Во-первых, вам нужно добавить репозиторий в вашу конфигурацию apt, добавить ключ подписи и обновить список пакетов:

$ sudo echo "deb http://nginx.org/packages/mainline/debian/ stretch nginx
deb-src http://nginx.org/packages/mainline/debian/ stretch nginx" > /etc/apt/sources.list.d/nginx.list
$ wget -qO - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
$ sudo apt update

Далее выполните следующую команду:

$ sudo apt remove nginx-common

Это эффективно удалит nginx из системы, но сохранит ваши файлы конфигурации, за исключением файла службы systemd, который легко восстановить.

Далее установите nginx из нового репозитория:

$ sudo apt install nginx

Имейте в виду, что вам будет предложено заменить определенные файлы конфигурации, например так:

Configuration file '/etc/nginx/nginx.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** nginx.conf (Y/I/N/O/D/Z) [default=N] ?

Убедитесь, что вы не входите Y, просто нажмите Enter или введите N каждый раз, когда вам предлагается избежать потери текущей конфигурации.

Если вы случайно перезаписали свой nginx.conf вам нужно - как минимум - изменить последнюю строку в файле с include /etc/nginx/conf.d/*.conf; в include /etc/nginx/sites-enabled/*; восстановить предыдущее поведение включения.

Вы можете проверить недавно установленную версию:

$ nginx -v
nginx version: nginx/1.13.5

Наконец, вы заметите, что пытаясь запустить service nginx start Теперь происходит сбой со следующим сообщением:

Failed to start nginx.service: Unit nginx.service is masked.

Это потому что удаление nginx-common также вытерли /lib/systemd/system/nginx.service который ранее использовался systemd для управления nginx. Чтобы восстановить этот файл, просто создайте его, используя команду ниже:

$ echo "[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
" > /lib/systemd/system/nginx.service

Наконец, беги systemctl unmask nginx с последующим systemctl enable nginxи теперь вы сможете управлять сервисом, как и раньше, со всеми вашими прежними настройками без изменений.

$ service nginx start
Другие вопросы по тегам