2026年5月15日 星期五

Ubuntu + XOOPS 網站弱掃改善紀錄

 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'; ...

2026年5月6日 星期三

Ubuntu 24.04 + SmokePing 校園戰情室

剛好在社群軟體上看到了黑暗執行續的這篇文章-24 小時網路品質監控 - SmokePing
https://blog.darkthread.net/blog/smokeping/
又遇到校內同事遇到網路無法連線,但又不知道問題在哪邊,就興起了安裝 SmokePing測試看看的念頭。

 

🚀 一、安裝 SmokePing

更新系統

sudo apt update && sudo apt upgrade -y

安裝 SmokePing

sudo apt install smokeping apache2 fping -y

啟用 Apache CGI

sudo a2enmod cgid
sudo systemctl restart apache2

🚀 二、建立 SmokePing Targets

編輯 Targets

sudo nano /etc/smokeping/config.d/Targets

可公開分享版 Targets

*** Targets ***

probe = FPing

menu = Top
title = 校園教學戰情室
remark = 老師也看得懂的網路狀態系統

# =========================
# DNS
# =========================
+ DNS
menu = DNS
title = DNS服務

++ Google_DNS
menu = Google DNS
title = Google DNS
host = 8.8.8.8

++ Cloudflare_DNS
menu = Cloudflare DNS
title = Cloudflare DNS
host = 1.1.1.1

# =========================
# 校內核心
# =========================
+ LAN
menu = 校內網路
title = 校內設備

++ Gateway
menu = 校內閘道
title = 校內閘道
host = 192.168.1.1

++ NAS01
menu = NAS01
title = NAS01
host = 192.168.1.10

++ School_Cloud
menu = 校內雲端
title = 校內雲端
host = 192.168.1.20

# =========================
# 對外網路
# =========================
+ Internet_Check
menu = 對外連線
title = 對外網路

++ ISP_01
menu = ISP節點1
title = ISP節點1
host = 168.95.1.1

++ ISP_02
menu = ISP節點2
title = ISP節點2
host = 168.95.192.1

++ Google_Endpoint
menu = Google Endpoint
title = Google Endpoint
host = 142.250.204.35

# =========================
# 教學平台
# =========================
+ Teaching
menu = 教學服務
title = 教學平台

++ Google
menu = Google
title = Google 搜尋
host = www.google.com

++ YouTube
menu = YouTube
title = YouTube
host = www.youtube.com

++ Wordwall
menu = Wordwall
title = Wordwall
host = wordwall.net

++ LINE
menu = LINE
title = LINE
host = line.me

# =========================
# 行政平台
# =========================
+ Admin_Service
menu = 行政服務
title = 行政系統服務

++ ODIS
menu = 公文系統
title = 公文系統 ODIS
host = odis.tycg.gov.tw

++ CloudHR
menu = 差勤系統
title = 差勤系統 CloudHR
host = tycg.cloudhr.tw

🚀 三、重新啟動 SmokePing

sudo systemctl restart smokeping

🚀 四、建立 Warroom 網頁資料夾

sudo mkdir -p /var/www/html/warroom

🚀 五、建立 Python 戰情室

建立設定資料夾

sudo mkdir -p /opt/warroom

🚀 六、建立 targets.conf

sudo nano /opt/warroom/targets.conf

可公開分享版 targets.conf

[DNS]
Google DNS|8.8.8.8|ping
Cloudflare DNS|1.1.1.1|ping

[LAN]
校內閘道|192.168.1.1|ping
NAS01|192.168.1.10|ping
校內雲端|192.168.1.20|ping

[Internet_Check]
ISP節點1|168.95.1.1|ping
ISP節點2|168.95.192.1|ping
Google Endpoint|142.250.204.35|ping

[Teaching]
Google 搜尋|https://www.google.com|http
YouTube 影片|https://www.youtube.com|http
Wordwall|https://wordwall.net|http
LINE 連線|https://line.me|http

[Admin]
公文系統 ODIS|https://odis.tycg.gov.tw/|http
差勤系統 CloudHR|tycg.cloudhr.tw|ping

🚀 七、建立 update_warroom.py

sudo nano /opt/warroom/update_warroom.py

貼入完整 Python 程式(上一篇完整版)。


🚀 八、執行輸出

sudo chmod +x /opt/warroom/update_warroom.py
sudo /opt/warroom/update_warroom.py

🚀 九、自動更新

crontab -e

加入:

*/5 * * * * /usr/bin/python3 /opt/warroom/update_warroom.py

🚀 十、HTTPS 憑證

安裝 Certbot

sudo apt install certbot python3-certbot-apache -y

申請 HTTPS

sudo certbot --apache

🚀 十一、XOOPS 嵌入版

SVG 顯示版(推薦)

<img
src="https://你的主機/warroom/status.svg"
style="width:100%;display:block;border-radius:8px;"
alt="校園網路狀態">

<div style="font-size:12px;color:#d9534f;margin-top:4px;">
⚠ 若畫面空白,請先點
<a href="https://你的主機/warroom/status.svg" target="_blank">
【允許安全憑證】
</a>
</div>

🚀 十二、系統輸出

系統會自動輸出:

/var/www/html/warroom/index.html
/var/www/html/warroom/widget.html
/var/www/html/warroom/status.svg
/var/www/html/warroom/status.txt

🎯 AI 判讀邏輯

DNS 區異常

名稱解析異常

校內區異常

校內網路問題

ISP 區異常

教育網/ISP 異常

教學平台異常

外部教學平台問題

行政平台異常

行政系統平台異常

















 

 

Ubuntu + XOOPS 網站弱掃改善紀錄