Nginx CVE、CSP 缺失、PHP-FPM 504、MySQL ESM 更新處理流程
下班後接到通知
資安掃描出現兩個主要警示:
Detected CVEs for Nginx 1.14.0 with CVSS above 7.0
No Content-Security-Policy configuration detected on applicable website
這是運作的學校網站,目前還有重要任務。1. 不影響 XOOPS 前後台運作
2. 不直接升級整個 Ubuntu 版本
3. 先套用 Ubuntu Pro / ESM 安全修補
4. 補上網站安全標頭
5. 更新 PHP / MySQL 時保留完整備份
處理前先確認系統版本
lsb_release -a
nginx -v
apt-cache policy nginx不過目前使用的這個版本已經結束標準支援,所以建議啟用 Ubuntu Pro / ESM。啟用 Ubuntu Pro / ESM
若系統沒有
pro指令,先安裝工具:sudo apt update
sudo apt install ubuntu-advantage-tools確認:
pro version
pro status補充:Ubuntu Pro 個人版說明
Ubuntu Pro 是 Canonical 提供的延伸安全維護服務,
可讓 Ubuntu LTS 在標準支援結束後繼續取得 ESM 安全更新。
Ubuntu Pro 並不是把系統升級到新版 Ubuntu,
而是針對原系統套件提供官方 backport 安全修補。
目前 Ubuntu Pro 對個人用途提供免費方案,最多可用於 5 台機器。
使用時需登入 Ubuntu / Canonical 帳號取得 token,
並在主機上執行 pro attach 綁定。
Token 不應公開,。
對於暫時無法立即升級的舊站,例如 Ubuntu 18.04 + XOOPS、PHP 7.2、MySQL 5.7,Ubuntu Pro / ESM
可以作為過渡期的安全修補方案。
如果尚未綁定 Ubuntu Pro:
sudo pro attach 你的_TOKEN
啟用 ESM:
sudo pro enable esm-infra
sudo pro enable esm-apps
sudo apt update查看可更新套件:
sudo apt list --upgradable注意:
正式網站不要直接執行:
sudo apt upgrade -y建議分批更新。
更新前先備份
1. 備份 Nginx、PHP、MySQL 設定
sudo cp -r /etc/nginx /etc/nginx.bak.$(date +%Y%m%d-%H%M)
sudo cp -r /etc/php /etc/php.bak.$(date +%Y%m%d-%H%M)
sudo cp -r /etc/mysql /etc/mysql.bak.$(date +%Y%m%d-%H%M)
2. 備份網站目錄
請將 /var/www/html 改成自己的網站目錄:
sudo tar -czvf /root/webroot-backup-$(date +%Y%m%d-%H%M).tar.gz /var/www/html
3. 找出 XOOPS 資料庫設定
新版 XOOPS 的資料庫設定不一定在 mainfile.php,可能會放在:
xoops_data/data/secure.php
可用:
sudo grep -n "secure.php" /var/www/html/mainfile.php
sudo find /var/www -path "*xoops_data/data/secure.php" -print
查看資料庫名稱與帳號時,不要公開密碼:
sudo grep -n "XOOPS_DB_HOST\|XOOPS_DB_USER\|XOOPS_DB_NAME" /var/www/xoops_data/data/secure.php
請勿截圖或公開:
XOOPS_DB_PASS
4. 備份資料庫
假設資料庫名稱為:
你的資料庫名稱
備份:
mysqldump -u root -p --single-transaction --routines --triggers 你的資料庫名稱 | gzip > /root/db-backup-$(date +%Y%m%d-%H%M).sql.gz
檢查備份檔:
ls -lh /root/*.sql.gz
gzip -t /root/*.sql.gz
gzip -t 沒有錯誤訊息,代表備份檔正常。
分批更新套件
第一批:Nginx
sudo apt install --only-upgrade nginx nginx-common nginx-core
確認:
apt-cache policy nginx nginx-core nginx-common
如果看到:
Installed: 1.14.0-0ubuntu1.11+esm1
代表已套用 Ubuntu Pro / ESM 安全修補。
注意:
nginx -v 仍可能顯示:
nginx/1.14.0
這是 Ubuntu backport 的正常現象,不能只看 nginx -v。
隱藏 Nginx 版本資訊
編輯:
sudo nano /etc/nginx/nginx.conf
在 http { ... } 裡確認:
server_tokens off;
不要是:
# server_tokens off;
測試並重新載入:
sudo nginx -t
sudo systemctl reload nginx
確認:
curl -I https://你的網站網域
理想結果:
Server: nginx
不要再出現:
Server: nginx/1.14.0 (Ubuntu)
補上 Content-Security-Policy 與安全標頭
找到網站設定檔:
sudo grep -R "server_name 你的網站網域" /etc/nginx/sites-available /etc/nginx/sites-enabled
編輯對應設定檔,例如:
sudo nano /etc/nginx/sites-available/default
在對應的 server { ... } 裡加入:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' data: https:; connect-src 'self' https:; frame-ancestors 'self';" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
套用:
sudo nginx -t
sudo systemctl reload nginx
確認:
curl -I https://你的網站網域
應看到:
Content-Security-Policy: default-src 'self'; ...
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()
若 XOOPS 是舊系統,CSP 一開始不要設太嚴格,否則後台編輯器、模組、圖片上傳可能會壞。
更新 PHP 7.2
更新 PHP 7.2 ESM 安全修補:
sudo apt install --only-upgrade \
php7.2-cli php7.2-common php7.2-curl php7.2-fpm \
php7.2-gd php7.2-json php7.2-mbstring php7.2-mysql \
php7.2-opcache php7.2-readline php7.2-soap \
php7.2-xml php7.2-zip
重啟:
sudo systemctl restart php7.2-fpm
sudo systemctl reload nginx
確認:
systemctl status php7.2-fpm --no-pager
apt-cache policy php7.2-fpm
若 XOOPS 後台出現 504 Gateway Time-out
如果 PHP 更新後,XOOPS 後台進入 admin.php 出現:
504 Gateway Time-out
查看 log:
sudo tail -n 80 /var/log/nginx/error.log
sudo tail -n 80 /var/log/php7.2-fpm.log
若看到:
server reached pm.max_children setting (5), consider raising it
代表 PHP-FPM 處理程序太少。
編輯:
sudo nano /etc/php/7.2/fpm/pool.d/www.conf
將:
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
調整為保守版:
pm = dynamic
pm.max_children = 15
pm.start_servers = 4
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 500
request_terminate_timeout = 180s
檢查與重啟:
sudo php-fpm7.2 -t
sudo systemctl restart php7.2-fpm
sudo systemctl reload nginx
進入 XOOPS 後台後,建議執行:
清除快取
包含 XOOPS cache / templates_c / smarty compile 類型的快取。
清完後,後台通常會明顯變快。
更新 MySQL 5.7
確認資料庫備份已存在:
ls -lh /root/*.sql.gz
gzip -t /root/*.sql.gz
更新:
sudo apt install --only-upgrade \
mysql-client-5.7 \
mysql-client-core-5.7 \
mysql-server \
mysql-server-5.7 \
mysql-server-core-5.7
確認版本:
mysql --version
apt-cache policy mysql-server-5.7
systemctl status mysql --no-pager
成功後應看到:
Distrib 5.7.44
Installed: 5.7.44-0ubuntu0.18.04.1+esm1
active (running)
測試 XOOPS:
前台首頁
登入
後台管理
模組管理
文章 / 最新消息
圖片上傳
表單或常用模組
最後驗證弱掃問題是否改善
1. 驗證 Nginx CVE 修補與版本隱藏
apt-cache policy nginx nginx-core nginx-common
curl -I https://你的網站網域
合格條件:
Installed: 1.14.0-0ubuntu1.11+esm1
Server: nginx
2. 驗證 CSP
curl -I https://你的網站網域
合格條件:
Content-Security-Policy: default-src 'self'; ...
沒有留言:
張貼留言