iT邦幫忙

1

【Day 28】資安與權限控管:n8n API Key 安全防護、敏感數據脫敏(Masking)與 Notion 權限最佳實踐

  • 分享至 

  • xImage
  •  

在昨天的 Day 27 中,我們成功實現了每週末自動抓取任務數據並透過 Dify 進行生產力復盤的視覺化儀表板。然而,當自動化流程串接了 Gmail、Notion、Telegram、Google Calendar 以及大語言模型 API 時,系統中傳輸的資料往往包含大量的個人隱私、公司機密、客戶聯絡方式與身分驗證金鑰(Credentials)。

如果金鑰不小心洩漏,或是敏感文字未經處置就直接丟給第三方大語言模型,將會引發嚴重的資安危機。今天我們將專注於「自動化管線的資安與權限控管」:介紹如何在 n8n 中安全管理憑證、實現敏感數據脫敏(Masking / Anonymization),以及設定 Notion 與 API 的最小權限原則!


為什麼自動化管線必須重視資訊安全?

  1. 防止 API Key 與憑證洩漏:將金鑰硬編碼(Hardcode)在腳本或導出的 Workflow JSON 中,是開源與團隊協作中最常見的資安破口。
  2. 遵守資料合規與隱私保護:客戶姓名、身分證字號、電話號碼、薪資或合約內容等敏感資料,不應未經去識別化就直接傳送給公有雲端 LLM(如 OpenAI / Dify Cloud)。
  3. 最小權限原則(Principle of Least Privilege):防止 API Token 被綁定過高權限(如全域刪除或寫入所有頁面),降低金鑰遭冒用時的損害範圍。

核心實作步驟說明

1. n8n 憑證安全管理與環境變數 (Environment Variables)

  • 嚴禁硬編碼 (No Hardcoding):所有 API Key、Secret Token 與敏感 URL 必須統一存放在 n8n 的 Credentials 儲存庫中,或透過 .env 環境變數引用。
  • 引用環境變數語法:在 n8n 節點中使用 {{ $env.OPENAI_API_KEY }} 或 {{ $env.NOTION_SECRET }} 動態調用,確保匯出工作流 JSON 時不包含真實金鑰。
  • n8n 金鑰加密:確認本地 .env 中有設定 N8N_ENCRYPTION_KEY,確保數據庫中的 Credentials 皆經過強加密儲存。

2. 敏感數據脫敏(Data Masking)JavaScript 模組

  • 在文字送入 Dify / OpenAI 之前,於 n8n 的 Code 節點中加入正規表示式(Regex)進行敏感資訊過濾:
function maskSensitiveData(text) {
  if (!text) return text;
  return text
    // 隱藏 Email: test@example.com -> t***@example.com
    .replace(/([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, (m, p1, p2) => p1[0] + '***@' + p2)
    // 隱藏手機號碼: 0912345678 -> 0912****78
    .replace(/(09\d{2})\d{4}(\d{2})/g, '$1****$2')
    // 隱藏身分證字號: A123456789 -> A1*****789
    .replace(/([A-Z][12]\d{2})\d{4}(\d{3})/g, '$1****$2');
}

// 針對輸入內文進行脫敏處理
for (const item of $input.all()) {
  item.json.clean_text = maskSensitiveData(item.json.body.message);
}
return $input.all();

3. Notion 與外部服務的最小權限設定

  • Notion Internal Integration 權限收攏:

  • 在 Notion 開發者後台,將 Integration 的 Capabilities 設為僅允許存取該「AI 待辦清單表格」頁面,切勿勾選全域讀寫權限。

  • 僅保留 Read content 與 Update content,若不需留言功能則關閉 Insert comments。

  • LINE / Telegram Token 防護:

  • Webhook 傳輸務必強制使用 HTTPS。

  • 啟用 LINE Messaging API 的 IP Whitelist(若 n8n 部署於固定 IP 伺服器上)。

4. 驗證資安防護與 JSON 安全匯出

  • 測試脫敏效果:輸入包含手機號碼與 Email 的測試文字,確認 n8n 輸出給 Dify 的 Payload 已成功替換為 0912****78 等星號字符。
  • 安全匯出 Workflow:導出 n8n 工作流 JSON 時,確認勾選「Remove credentials」,防止金鑰隨著程式碼上傳至 GitHub。

今天我們成功為整套自動化管線築起了嚴密的防禦牆,確保系統在高度自動化的同時依然符合資訊安全與隱私規範。明天「Day 29」我們將進入正式營運階段——「雲端部署與監控維運:利用 Docker、Nginx 反向代理與 Uptime Kuma 實現 n8n 7x24 小時不間斷服務」!


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
helenanova
iT邦新手 5 級 ‧ 2026-10-21 23:25:27

脫敏那段的方向沒錯,不過「保留頭尾、中間打碼」其實還留了不少辨識度:A1*****789 保住了縣市字母、性別碼和末三碼,配上生日或地區就有機會縮小到特定的人。送給 LLM 的文字多半不需要這些片段才能摘要,我會直接換成 [EMAIL]、[PHONE]、[ID] 這種型別 token,把「部分遮蔽仍外洩」這一整類風險整個消掉。另外建議在 mask 後面加一道獨立的驗證:用另一份規則(或同一包規則的 detect 模式)掃過輸出,命中就讓 workflow 直接失敗。脫敏和檢查要分成兩條程式路徑,因為 regex 最危險的失效模式是「輸入格式變了、規則悄悄不再命中」——這時候它回傳的是看起來很乾淨的原文。

我要留言

立即登入留言