本篇要解決的問題
現在大部分工程師都藉由 AI 來進行開發(應該吧?),但 AI 愈會寫,資安就愈重要。
只是,每天都有新的漏洞公告,如果需要靠人力來做以下的事:
- 不同網站找資料。
- 確認跟自己使用的技術有沒有關係。
- 把英文公告整理成能採取行動的資訊。
這三步做完,差不多一個早上就過去了。
所以,這篇筆記文的專案,就是把這些工作串成每天自動執行的流程:
- 蒐集公開資安公告。
- 篩選關注的技術。
- 產生正體中文日報。
- 透過網站查閱。
我們可以把它想成一份依照技術清單製作的每日剪報。
官方公告提供事實,AI 協助閱讀,人工負責確認實際使用版本與後續處理。
本專案的 GitHub 原始碼:https://github.com/letswritetw/letswrite-vuln-digest
這個專案做什麼
| 元件 | 負責的工作 |
|---|---|
| n8n | 按排程取得資料、執行篩選與檢查、儲存日報 |
| Gemini | 整理公告、產生中文說明與部分分析內容 |
| Vue 儀表板 | 顯示摘要、情報卡片、搜尋篩選與歷史日報 |
資料來源:
- NVD:漏洞紀錄(CVE)。
- CISA KEV:已知被利用的漏洞清單。
- GitHub Advisory:套件漏洞與惡意版本資訊。
網站只讀取已產生的日報檔案,查閱時不會再呼叫 Gemini,也不需要資料庫。
為什麼選用 Gemini?
因為透過 Google AI Studio 申請的 Gemini API,在一定額度(Free Tier)內可以免費使用,而資安情報是每天都要做的事,如果公司沒有提供資源……能免費就免費吧。
怎麼安裝?
需要準備:
- Docker 與 Docker Compose(macOS、Windows 可用 Docker Desktop)。
- 自己的 Gemini API Key(可在 Google AI Studio 建立),且帳號能使用 workflow 指定的模型。
1. 填入金鑰並啟動
下載 本專案的原始碼,在專案根目錄(有 config.json、docker-compose.yml)開啟終端機,複製金鑰設定檔:
cp .env.example .env Windows 的「命令提示字元」沒有 cp,改用 copy .env.example .env。PowerShell 可以直接用 cp。
打開 .env,在 GEMINI_API_KEY= 後面填入自己的 Gemini API Key,接著啟動:
docker compose up -d --build n8n 啟動時會自動完成三件事:
- 依
config.json產生 workflow。 - 把金鑰存成 n8n Credential。
- 讓 Gemini 節點選用這個 Credential。
啟動後,在同一台電腦開啟:
- n8n:
http://localhost:5678 - 儀表板:
http://localhost:3030
日報存放在專案的 reports/,macOS、Windows 的 Docker Desktop 需允許分享專案資料夾。
.env 是本機的明文檔案,已排除在版本控制之外,不要上傳或分享。
2. 手動產生第一份日報
- 開啟 n8n,完成首次帳號設定。
- 打開「資安戰情室」,按 Execute workflow 手動執行一次。
成功後會產生:
reports/ ├── latest.json └── YYYY/MM/ ├── security-daily-YYYY-MM-DD.json └── security-daily-YYYY-MM-DD.md 當次若沒有符合條件的資料,流程會跳過 Gemini,產生零筆日報。
確認無誤後,按 Publish 啟用排程,之後每天台灣時間 07:00(時區 Asia/Taipei)自動產生報告,執行時電腦與 Docker 必須開著。
3.(選用)調整關注清單
編輯 config.json:
-
keywords:要追蹤的技術關鍵字。 -
npmPackages:要追蹤的公開 npm 套件。
只填公開產品與套件名稱,不要放內部專案名稱或其他機敏資訊。
改完後執行:
docker compose up -d --force-recreate n8n 之後只要改了 config.json 或 .env,都執行這行指令。
n8n 會重新匯入 workflow,已啟用的排程會維持啟用。
設定有誤時 n8n 會啟動失敗,可用 docker compose logs n8n 查看原因。
workflow 以 config.json 為準。
在 n8n 畫面直接改的節點,下次重新匯入時會被覆蓋。
4.(選用)設定 Telegram 通知
不需要通知可跳過,保持 telegramEnabled: false。
- 在 Telegram 向
@BotFather傳送/newbot,建立 Bot 並取得 Bot Token,填入.env的TELEGRAM_BOT_TOKEN。 - 私人通知:先對自己的 Bot 傳送
/start。 - 群組通知:把 Bot 加入群組,在群組傳送
/start@你的Bot帳號(Bot 在群組預設只收得到/開頭的指令)。 - 用瀏覽器開啟
https://api.telegram.org/bot<Bot Token>/getUpdates,在回應中找到message.chat.id,這就是 Chat ID。群組的 Chat ID 是負數,例如-1001234567890。 - 修改
config.json:-
telegramEnabled:改為true。 -
telegramChatId:填入 Chat ID,保留雙引號,例如"123456789"。 -
dashboardUrl:通知中的儀表板連結。
-
- 執行
docker compose up -d --force-recreate n8n,Telegram 節點會自動選用 Credential。
getUpdates 的網址含有 Token,不要公開網址、瀏覽紀錄或截圖。
通知在日報寫完後才發送,若只有通知節點失敗,日報可能已經完成。
5.(選用)讓其他裝置連線
儀表板預設只開放本機。要讓其他裝置存取:
- 在
.env取消DASHBOARD_BIND那行的註解,改成這台電腦在區域網路的 IP(預設127.0.0.1只允許本機),例如:
DASHBOARD_BIND=192.168.1.10 - 執行
docker compose up -d。 - 確認防火牆允許預期的裝置連入。
- 有使用 Telegram 通知時,把
config.json的dashboardUrl改成其他裝置可到達的網址(不能用localhost),再執行docker compose up -d --force-recreate n8n。
已經有自己的 n8n?
如果 n8n 已經用別的 Docker Compose 跑起來了,就不要在本專案執行 docker compose up -d,否則會多開一個 n8n,兩個搶同一個 5678 連接埠。
另外,前面說的「自動把金鑰存成 Credential」,只會發生在本專案自己啟動的 n8n。
自己的 n8n 不會讀本專案的 .env,金鑰要自己到 n8n 畫面填。
以下步驟需要電腦有安裝 Node.js。
- 準備報告資料夾。 在本專案根目錄執行:
node scripts/prepare-reports.js 這會在 reports/ 建好今年到三年後的年月資料夾,n8n 之後會把日報寫進去。
- 讓 n8n 看得到報告資料夾。 打開自己 n8n 的 compose 檔,參考本專案的
n8n-compose-snippet.yml加入設定:
services: n8n: environment: - GENERIC_TIMEZONE=Asia/Taipei - TZ=Asia/Taipei - "N8N_RESTRICT_FILE_ACCESS_TO=/files/reports;/home/node/.n8n-files" volumes: - "/path/to/letswrite-vuln-digest/reports:/files/reports" -
n8n換成自己的服務名稱。 -
/path/to/letswrite-vuln-digest/reports換成本專案reports/的完整路徑。 - 原本已經有
N8N_RESTRICT_FILE_ACCESS_TO的話,用分號;把/files/reports加在後面。 - 原本的帳密、ports、image、
n8n_data等設定都保留,只加上面這幾行。
改完後,在自己 n8n 的 compose 資料夾執行(n8n 一樣換成自己的服務名稱):
docker compose up -d --force-recreate n8n - 產生 workflow 檔案。 回到本專案根目錄執行:
node build.js 會依 config.json 產生 workflow/security-intel-gemini.json。
要用 Telegram 通知的話,先改好 config.json 的 Telegram 設定再執行。
匯入 workflow。 在 n8n 新增一個 workflow,選 Import from File,選剛才產生的檔案。
-
填入金鑰。
- 點開「Gemini 資安分析」節點,新增 Header Auth Credential:Name 填
x-goog-api-key,Value 填自己的 Gemini API Key。 - 有用 Telegram 的話,點開「發送 Telegram 通知」節點,新增 Telegram API Credential,Access Token 填 Bot Token。
- 點開「Gemini 資安分析」節點,新增 Header Auth Credential:Name 填
手動執行一次。 按 Execute workflow,確認
reports/出現日報後,再按 Publish 啟用排程。啟動儀表板。 進到本專案的
dashboard/資料夾執行:
docker compose up -d --build 補充:
- 之後改了
config.json,要重新執行node build.js並重新匯入。匯入後到 Gemini、Telegram 節點重新選用已建立的 Credential,不用重建。舊的 workflow 記得停用,避免同一天跑兩次。 - 金鑰存在自己的 n8n 裡,更換金鑰要到 n8n 的 Credentials 頁面修改,改
.env沒有用。 - Linux 主機要確認 n8n 容器(UID 1000)能寫入
reports/。不要直接把資料夾改成所有人可寫。
怎麼使用?
- 確認日期與最後成功產報時間。 頁面能開啟,不代表今天已成功產報。
- 先看「今天要做的事」。 需要確認版本、查核已知利用情形或處理惡意套件的項目都在這裡。
- 點回官方來源。 確認自己使用的版本與受影響條件,再決定是否更新。
- 查看「例行更新」與「知悉即可」。 可用 CVE、CWE、產品名稱與篩選條件縮小範圍。
- 查閱歷史或下載日報。 提供 Markdown、JSON 閱讀與下載。
補充:
- AI 產生的內容會標示「AI 說明,未經人工確認」。
- P0 到 P3 是查核優先順序,不等於實際受影響程度。
- n8n 寫入新日報後,在網站按「重新整理」即可,不需要重建容器。只有儀表板程式更新才需要重新建置。
- 網站只顯示最後成功產報時間,執行失敗的原因要到 n8n 執行紀錄查看。
- 定期備份
reports/。
使用限制
- NVD 只取設定關鍵字、最近 30 小時內首次公布,且有有效 CWE 的紀錄。
- 每個關鍵字有取得與保留上限。描述沒提到產品名稱、較晚才補上 CWE 或超出上限的紀錄,可能漏收。
- GitHub Advisory 只查
config.json列出的 npm 套件,不會讀取專案的相依清單,也不涵蓋間接相依。 - AI 分析有筆數上限,日報可能包含未經 AI 分析的紀錄。
- 「日報沒有列出」不代表沒有漏洞;版本確認、影響評估與修補仍由人員處理。
- 部署前請確認送往外部來源與 Gemini 的內容符合自己的資料使用規範。



