本篇要解決的問題

現在大部分工程師都藉由 AI 來進行開發(應該吧?),但 AI 愈會寫,資安就愈重要。

只是,每天都有新的漏洞公告,如果需要靠人力來做以下的事:

  1. 不同網站找資料。
  2. 確認跟自己使用的技術有沒有關係。
  3. 把英文公告整理成能採取行動的資訊。

這三步做完,差不多一個早上就過去了。

所以,這篇筆記文的專案,就是把這些工作串成每天自動執行的流程:

  1. 蒐集公開資安公告。
  2. 篩選關注的技術。
  3. 產生正體中文日報。
  4. 透過網站查閱。

我們可以把它想成一份依照技術清單製作的每日剪報。

官方公告提供事實,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 啟動時會自動完成三件事:

  1. 依 config.json 產生 workflow。
  2. 把金鑰存成 n8n Credential。
  3. 讓 Gemini 節點選用這個 Credential。

啟動後,在同一台電腦開啟:

  • n8n:http://localhost:5678
  • 儀表板:http://localhost:3030

資安戰情室的操作介面

日報存放在專案的 reports/,macOS、Windows 的 Docker Desktop 需允許分享專案資料夾。

.env 是本機的明文檔案,已排除在版本控制之外,不要上傳或分享。

2. 手動產生第一份日報

  1. 開啟 n8n,完成首次帳號設定。
  2. 打開「資安戰情室」,按 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。

  1. 在 Telegram 向 @BotFather 傳送 /newbot,建立 Bot 並取得 Bot Token,填入 .env 的 TELEGRAM_BOT_TOKEN。
  2. 私人通知:先對自己的 Bot 傳送 /start。
  3. 群組通知:把 Bot 加入群組,在群組傳送 /start@你的Bot帳號(Bot 在群組預設只收得到 / 開頭的指令)。
  4. 用瀏覽器開啟 https://api.telegram.org/bot<Bot Token>/getUpdates,在回應中找到 message.chat.id,這就是 Chat ID。群組的 Chat ID 是負數,例如 -1001234567890。
  5. 修改 config.json:
    • telegramEnabled:改為 true。
    • telegramChatId:填入 Chat ID,保留雙引號,例如 "123456789"。
    • dashboardUrl:通知中的儀表板連結。
  6. 執行 docker compose up -d --force-recreate n8n,Telegram 節點會自動選用 Credential。

getUpdates 的網址含有 Token,不要公開網址、瀏覽紀錄或截圖。

通知在日報寫完後才發送,若只有通知節點失敗,日報可能已經完成。

5.(選用)讓其他裝置連線

儀表板預設只開放本機。要讓其他裝置存取:

  1. 在 .env 取消 DASHBOARD_BIND 那行的註解,改成這台電腦在區域網路的 IP(預設 127.0.0.1 只允許本機),例如:
DASHBOARD_BIND=192.168.1.10 
  1. 執行 docker compose up -d。
  2. 確認防火牆允許預期的裝置連入。
  3. 有使用 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。

  1. 準備報告資料夾。 在本專案根目錄執行:
node scripts/prepare-reports.js 

這會在 reports/ 建好今年到三年後的年月資料夾,n8n 之後會把日報寫進去。

  1. 讓 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 
  1. 產生 workflow 檔案。 回到本專案根目錄執行:
node build.js 

會依 config.json 產生 workflow/security-intel-gemini.json。

要用 Telegram 通知的話,先改好 config.json 的 Telegram 設定再執行。

  1. 匯入 workflow。 在 n8n 新增一個 workflow,選 Import from File,選剛才產生的檔案。

  2. 填入金鑰。

    • 點開「Gemini 資安分析」節點,新增 Header Auth Credential:Name 填 x-goog-api-key,Value 填自己的 Gemini API Key。
    • 有用 Telegram 的話,點開「發送 Telegram 通知」節點,新增 Telegram API Credential,Access Token 填 Bot Token。
  3. 手動執行一次。 按 Execute workflow,確認 reports/ 出現日報後,再按 Publish 啟用排程。

  4. 啟動儀表板。 進到本專案的 dashboard/ 資料夾執行:

docker compose up -d --build 

補充:

  • 之後改了 config.json,要重新執行 node build.js 並重新匯入。匯入後到 Gemini、Telegram 節點重新選用已建立的 Credential,不用重建。舊的 workflow 記得停用,避免同一天跑兩次。
  • 金鑰存在自己的 n8n 裡,更換金鑰要到 n8n 的 Credentials 頁面修改,改 .env 沒有用。
  • Linux 主機要確認 n8n 容器(UID 1000)能寫入 reports/。不要直接把資料夾改成所有人可寫。

怎麼使用?

  1. 確認日期與最後成功產報時間。 頁面能開啟,不代表今天已成功產報。
  2. 先看「今天要做的事」。 需要確認版本、查核已知利用情形或處理惡意套件的項目都在這裡。
  3. 點回官方來源。 確認自己使用的版本與受影響條件,再決定是否更新。
  4. 查看「例行更新」與「知悉即可」。 可用 CVE、CWE、產品名稱與篩選條件縮小範圍。
  5. 查閱歷史或下載日報。 提供 Markdown、JSON 閱讀與下載。

補充:

  • AI 產生的內容會標示「AI 說明,未經人工確認」。
  • P0 到 P3 是查核優先順序,不等於實際受影響程度。
  • n8n 寫入新日報後,在網站按「重新整理」即可,不需要重建容器。只有儀表板程式更新才需要重新建置。
  • 網站只顯示最後成功產報時間,執行失敗的原因要到 n8n 執行紀錄查看。
  • 定期備份 reports/。

使用限制

  • NVD 只取設定關鍵字、最近 30 小時內首次公布,且有有效 CWE 的紀錄。
  • 每個關鍵字有取得與保留上限。描述沒提到產品名稱、較晚才補上 CWE 或超出上限的紀錄,可能漏收。
  • GitHub Advisory 只查 config.json 列出的 npm 套件,不會讀取專案的相依清單,也不涵蓋間接相依。
  • AI 分析有筆數上限,日報可能包含未經 AI 分析的紀錄。
  • 「日報沒有列出」不代表沒有漏洞;版本確認、影響評估與修補仍由人員處理。
  • 部署前請確認送往外部來源與 Gemini 的內容符合自己的資料使用規範。