目前,Debian 9(stretch)安装的 nginx 版本 1.10.3 存在漏洞CVE-2017-7529:
Nginx 0.5.6 至 1.13.2 版本存在 nginx 范围过滤模块中的整数溢出漏洞,可导致由特制请求触发的潜在敏感信息泄露。
我担心用户数据的安全,因此我想升级到不再受此问题影响的最新版本。
答案1
有多种方式获取 nginx 1.13.3 及以上版本。你可以自行编译,使用拉伸后端口存储库,或者您可以添加 nginx 自己的 apt 存储库。在这个答案中,我将引导您完成最后一个,因为它可能是所有三个中最简单的。
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