Skip to content

Security: tschoolsu/852

Security

SECURITY.md

T-Files 資安政策

本文件描述目前 src/ 正式網站程式的安全設計與待完成工作。正式網站為 https://file.tschoolsu.org/,目前使用 Nginx、Node.js、PostgreSQL 與主機上的私有檔案目錄。本文以 OWASP 建議作為檢查參考,不代表已通過資安認證。

帳號登入

  • 帳號使用獨立密碼登入,不使用學校或 Google 密碼。僅接受網域恰好為 tschool.tp.edu.tw 的學校信箱。
  • 註冊時由 Brevo SMTP 寄送驗證及設定密碼連結;使用者可自行設定顯示名稱。密碼長度為 8 至 128 個字元,以隨機鹽值及 PBKDF2-SHA-256 雜湊保存,不保存明文密碼。
  • 忘記密碼時寄送一次性連結。連結有效 30 分鐘,資料庫只保存權杖雜湊;完成密碼設定後會撤銷該帳號既有工作階段。
  • 登入與寄信請求設有依 IP、信箱計算的頻率限制。註冊模式可設為立即啟用或等待管理員審核;只有啟用中的帳號能登入。
  • 管理員資格同時檢查帳號角色與設定中的管理員信箱。重設成員註冊資格會撤銷其工作階段與密碼憑證,但保留原帳號 ID、檔案及擁有者關係。

工作階段與請求保護

  • 成功登入會產生新的隨機工作階段權杖;資料庫只保存以 SESSION_SECRET 計算的 HMAC 值。工作階段有效期為 7 天。
  • 工作階段 Cookie 設為 HttpOnly、Secure、SameSite=Lax。登出會刪除伺服器端工作階段;密碼重設及管理員重設註冊資格也會撤銷舊工作階段。
  • 已登入的資料變更要求會核對 CSRF 權杖;帳號與管理員的相關 POST 要求也會核對來源網址。未登入者不能透過分享網址讀取項目。
  • 登入與批次操作的 JSON 本文有大小限制。正式 Nginx 只接受 Cloudflare 來源的連線,並覆寫傳給應用程式的用戶端 IP 標頭;來源主機已安裝 HTTPS 憑證。2026-09-17 的來源站存取紀錄顯示 Cloudflare 仍使用 HTTP 連到來源;網域管理員須對 file.tschoolsu.org 設定 Full (strict),才能讓這一段連線加密並驗證憑證。

檔案與存取權

  • 所有已登入的學校成員可在清單及搜尋中看到項目的基本資料,包括名稱、類型、擁有者、時間、說明及檔案大小。看見基本資料不等於可開啟內容。
  • 擁有者固定有完整權限。指定成員可設為「可檢視」或「可編輯」;「所有已登入成員」提供檢視權限。資料夾權限可由子項目繼承。可編輯者可修改、移動、刪除及管理共享設定;可檢視者可開啟或下載。
  • 固定分享網址只用於前往項目,不自行授予權限。開啟、下載、進入資料夾和變更資料時,伺服器會重新檢查登入狀態與存取權;無權限者不能取得檔案內容或連結網址。
  • 管理員在伺服器端取得其他成員項目的編輯權限,不會被加入公開的共享成員名單。管理員開啟他人項目時會留下稽核紀錄。
  • 新上傳的單一檔案上限為 100 MB,格式不限。實際檔案以隨機儲存鍵保存在非網站公開目錄;下載由權限檢查後的處理器提供,使用附件下載及 nosniff。版本還原也會檢查目的地權限及資料夾循環。
  • 正式 Node 主機設定 FILE_SCAN_MODE=clamd,使用 ClamAV 掃描新上傳及替換的檔案;掃描偵測或服務不可用時不會發佈該檔案。這不能保證辨識所有惡意內容,下載檔案仍應視為可能有風險。其他部署環境必須自行安裝掃描服務並啟用相同設定;既有檔案需另外執行掃描。

資料與紀錄

  • PostgreSQL 保存帳號、密碼雜湊、工作階段雜湊、權限、項目中繼資料、版本紀錄及稽核紀錄;檔案內容保存在主機私有檔案目錄。資料庫操作使用參數化查詢。
  • 稽核紀錄涵蓋密碼登入成功或失敗、頻率限制、寄信結果、建立與下載項目、編輯與共享權限變更、移動、刪除、版本還原及管理員操作。紀錄可能包含帳號信箱、IP、項目 ID 與操作時間,應限制管理員與主機維護者的存取。
  • 正式主機每天臺北時間 03:20 短暫暫停 T-Files,再備份 PostgreSQL 與私有檔案目錄至只有服務帳號可讀的目錄,完成後恢復服務,備份保留 14 天;已對一份備份執行獨立資料庫還原測試。管理員頁面顯示備份檔時間,不能取代定期還原演練。目前備份仍在同一主機,主機或磁碟整體故障時可能同時遺失,應增加異地主機或物件儲存備份。
  • 不應將 .env、SMTP 憑證、資料庫連線字串、工作階段權杖、驗證連結、資料庫備份或上傳檔案提交至 Git。稽核紀錄目前沒有完整的保留期限及自動清理政策。

上線前工作與持續檢查

網站已對外提供服務。以下項目應在下一次正式版本驗收時優先處理,並持續複查:

  1. 請 Cloudflare 網域管理員只針對 file.tschoolsu.org 設定 Full (strict),避免變更其他子網域的加密模式;之後驗證 Cloudflare 實際使用來源站的 443 連接埠與憑證。
  2. 將 PostgreSQL、檔案、版本及稽核的備份另存到受保護的異地儲存,設定容量告警並定期重新演練還原。
  3. 定期檢查 ClamAV 病毒碼更新、掃描服務和既有檔案;如更換主機,先完成掃描服務設定再開放上傳。
  4. 確認 Brevo 寄件者、SMTP TLS、驗證信與忘記密碼信的送達;定期輪替 SESSION_SECRET、SMTP key 及資料庫憑證,並撤銷曾外洩的憑證。
  5. 設定稽核紀錄保留期限與異常告警;定期檢查管理員名單、管理員額外驗證方式及最小權限。
  6. 定期檢查相依套件漏洞,針對檔案上傳、權限繼承、批次操作、版本還原、CSRF、登入限流與工作階段進行測試。

漏洞回報

請不要在公開 Issue、討論區或聊天訊息貼出密碼、憑證、個資、實際檔案內容或可直接利用的細節。若儲存庫已啟用 GitHub 私密漏洞回報,請使用 私密回報頁;若頁面不可用,先透過學生會數位部既有的私人聯絡管道聯絡維護者。若不知道聯絡方式,可開一則不含漏洞細節的 Issue,請維護者提供私密提交方式。

回報時請提供受影響功能、重現步驟、預期與實際結果、影響範圍,以及必要的去識別化證據。請勿為了驗證問題而存取、下載或修改他人的資料。維護者收到回報後應先限制影響、保存必要紀錄,修補並驗證問題;若涉及憑證或資料外洩,應撤銷受影響的工作階段與憑證,評估通知受影響成員。

參考:OWASP 身分驗證、工作階段管理、檔案上傳與 GitHub 私密漏洞回報說明。

There aren't any published security advisories