Назад | Перейти на главную страницу

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

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

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

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

Есть несколько способов получить nginx 1.13.3 и выше. Вы можете скомпилировать его самостоятельно, используя стрейч-спинки репозиторий, или вы можете добавить собственный репозиторий 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просто нажмите Войти или введите 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