Nginx

在 Debian 9 (stretch) 上升級 nginx 1.10.3 以避免 CVE-2017-7529 漏洞

  • May 5, 2021

截至目前,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

引用自:https://serverfault.com/questions/874920