在 Debian 9 (stretch) 上升級 nginx 1.10.3 以避免 CVE-2017-7529 漏洞
截至目前,Debian 9 (stretch) 安裝了易受CVE-2017-7529攻擊的 nginx 版本 1.10.3 :
從 0.5.6 到 1.13.2 的 Nginx 版本容易受到 nginx 範圍過濾器模組中的整數溢出漏洞的影響,從而導致由特製請求觸發的潛在敏感資訊洩漏。
我擔心使用者數據的安全,所以我想升級到不再受此問題影響的最新版本。
nginx 1.13.3及以上版本有多種獲取方式。你可以自己編譯,使用stretch-backports倉庫,也可以添加 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