在昨天的 Day 27 中,我們成功實現了每週末自動抓取任務數據並透過 Dify 進行生產力復盤的視覺化儀表板。然而,當自動化流程串接了 Gmail、Notion、Telegram、Google Calendar 以及大語言模型 API 時,系統中傳輸的資料往往包含大量的個人隱私、公司機密、客戶聯絡方式與身分驗證金鑰(Credentials)。
如果金鑰不小心洩漏,或是敏感文字未經處置就直接丟給第三方大語言模型,將會引發嚴重的資安危機。今天我們將專注於「自動化管線的資安與權限控管」:介紹如何在 n8n 中安全管理憑證、實現敏感數據脫敏(Masking / Anonymization),以及設定 Notion 與 API 的最小權限原則!
.env 環境變數引用。{{ $env.OPENAI_API_KEY }} 或 {{ $env.NOTION_SECRET }} 動態調用,確保匯出工作流 JSON 時不包含真實金鑰。.env 中有設定 N8N_ENCRYPTION_KEY,確保數據庫中的 Credentials 皆經過強加密儲存。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();
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 伺服器上)。
0912****78 等星號字符。今天我們成功為整套自動化管線築起了嚴密的防禦牆,確保系統在高度自動化的同時依然符合資訊安全與隱私規範。明天「Day 29」我們將進入正式營運階段——「雲端部署與監控維運:利用 Docker、Nginx 反向代理與 Uptime Kuma 實現 n8n 7x24 小時不間斷服務」!
脫敏那段的方向沒錯,不過「保留頭尾、中間打碼」其實還留了不少辨識度:A1*****789 保住了縣市字母、性別碼和末三碼,配上生日或地區就有機會縮小到特定的人。送給 LLM 的文字多半不需要這些片段才能摘要,我會直接換成 [EMAIL]、[PHONE]、[ID] 這種型別 token,把「部分遮蔽仍外洩」這一整類風險整個消掉。另外建議在 mask 後面加一道獨立的驗證:用另一份規則(或同一包規則的 detect 模式)掃過輸出,命中就讓 workflow 直接失敗。脫敏和檢查要分成兩條程式路徑,因為 regex 最危險的失效模式是「輸入格式變了、規則悄悄不再命中」——這時候它回傳的是看起來很乾淨的原文。