安全性
什麼在保護這份記錄
您的工作、客戶地址和金錢,全都在這裡。這個頁面會告訴您,我們打造了什麼來保護這些資料、現在正在運作的是什麼,以及保護的界線在哪裡。
隔離
一個帳戶絕不會看到另一個帳戶
其他一切都建立在這一點之上,所以我們做了兩層防護,並且由電腦替我們把關。
帳戶之間有兩道牆,不只一道
每一筆記錄都會標記擁有它的帳戶。我們的伺服器每次向資料庫發出請求,也都限定在提出請求的那個帳戶範圍內。再往下一層,資料庫本身也維持著同一道牆:每一張存放帳戶記錄的資料表,都有自己的規則。所以光是應用程式出錯,還不足以跨越這道牆。
檢查這道牆的是電腦,不是某個人的記憶
一項自動測試會讀取正式環境的資料庫,找出每一張帶有帳戶標記的資料表,只要有任何一張缺少對應的規則,就會直接點名讓測試失敗。我們是實際清點涵蓋範圍,不是憑假設。例外清單目前是空的。
發布前,我們會用一個帳戶去測試另一個帳戶
每當我們為應用程式新增一個可以呼叫的網址,就會配上一項測試:以某個帳戶的身分登入,嘗試讀取另一個帳戶的資料。同步、定價和已儲存的檔案名稱,各自都有專屬的測試。
完整性
記錄無法被悄悄改寫
當工作出狀況時,歷史記錄就是證據。它的設計就是要讓任何人(包括我們自己)都無法在您不知情的情況下更動它。
歷史記錄只能新增,而且每一行都鎖住前一行
歷史記錄中的每一行,都帶有前一行的指紋。要悄悄改掉或刪掉其中一行,就一定會弄斷這條鏈。資料庫本身會封鎖任何修改或刪除的動作,而如果這項保護機制不存在,我們的伺服器會拒絕啟動。
付款記錄絕不會被修改
要更正錯誤時,我們會新增一行來抵銷舊的那一行,而不會直接更動舊的記錄。當初記錄了什麼、什麼時候記錄的,都會一直保持可讀,這正是付款歷史記錄存在的意義。
簽署連結由我們的伺服器產生
用來簽署文件的連結,只能使用一次、無法被猜出,並且會在固定時間後失效。這個連結是由我們的伺服器產生的,手機上的應用程式本身絕不會自行組出這種連結。
傳輸中,以及儲存時
資料流向哪裡
Cloudflare 位於網際網路和應用程式連線的伺服器之間,套用我們自訂的封鎖規則,也會拖慢短時間內送出過多請求的人。我們自己的伺服器在它後面,同樣的限制會再套用一次。
傳輸過程全程加密
手機與我們之間往來的所有資料,都透過 HTTPS 傳送,會先經過加密,讓中間的任何人都無法讀取。正式環境的網站還會送出一項指示:瀏覽器只要造訪過我們一次,往後就絕不要退回未加密的連線。所有請求都是透過 Cloudflare 抵達我們,而不是直接連到我們自己的伺服器。
檔案固定保存在同一個地區
照片、文件和簽名都放在同一個檔案儲存空間,而這個空間設定在單一固定地區:北美東部。不論帳戶實際在哪裡作業,都是如此。正式環境的伺服器啟動時會檢查這項設定,如果地區設定缺漏或被設為「auto」,伺服器就會拒絕執行。
我們絕不保存您的密碼
我們不會儲存您的密碼,也無法替您找回密碼。我們只保存經 Argon2 處理的版本,無法還原成原始密碼。這個版本足以在登入時核對,卻不能讀出您的密碼。另外,我們也限制短時間內登入、註冊或重設密碼的嘗試次數。
在手機上
手機也是我們保護的一部分
手機可能被留在貨車後車廂、借給學徒,或隔著櫃檯遞出去。我們在這裡打造的保護機制,就是為了應付這些情況,而不是為了辦公室裡的一張桌子。
應用程式本身有一道選用的鎖
已經登入不代表誰撿到手機,誰就能看到整個帳戶的內容。應用程式鎖會在開啟前,先要求輸入手機本身的螢幕鎖或指紋。除非您自己開啟,否則預設是關閉的;而且只有在手機本身已經設好螢幕鎖時,我們才會提供這項功能。
登入金鑰保存在手機自己鎖定的儲存空間裡
應用程式必須在手機上保存幾項私密資料,例如讓您維持登入狀態的憑證。這些資料會存放在 Android 的 keystore,也就是由手機本身硬體保護的鎖定儲存空間,而不是放在一般的應用程式檔案裡。
持續性
備份、事故應變,以及取出您的資料
資料庫的加鎖副本,存放在伺服器之外
我們每小時為正在運行的資料庫做一份完整副本。副本在存放之前會用加密上鎖,這項工作不會留下未上鎖的副本:它先確認上鎖的檔案確實已經鎖上,然後才刪除沒上鎖的那一份。接著它核對副本本身的內容清單,把副本送到一處單獨的儲存空間,應用程式本身沒有登入該儲存空間的憑證,再讀回來確認副本已經送達。資料庫還會在每一次更動發生時把它連續記錄下來,這份記錄同樣被複製到伺服器之外,所以把資料放回去並不只限於最近一份完整副本。照片、PDF 與簽名圖片也複製到同一處單獨的儲存空間。舊副本在兩個地方都按固定的時間表刪除。把話說明白:那處單獨的儲存空間是同一家儲存公司裡的第二個儲存位置,不是第二家公司。
我們把備份放回去,以證明它們真的有用
從來沒有被放回去過的備份是一種指望,不是計畫。所以我們取一份正在運行的資料庫的真實副本,裝進一個備用資料庫,確認記錄確實在裡面,然後才把這個備用庫丟掉;其中也包括打開一份已經存放好的加鎖副本,而不是剛做出來的副本。檔案儲存我們也做了同樣的事:每一個還原出來的檔案都與複製時記下的指紋做過核對。每次演練都寫下來並註明日期。下面是這些演練沒有證明的事,因為這比它們證明了什麼更重要:我們從未在新機器上重建過整個服務,從未把持續的更動記錄向前重放到某個選定的時刻,從未把備份放回正在運行的資料庫,也從未從頭到尾計過一次完整還原的時間。這就是我們不公布任何還原目標的原因。
出狀況時,我們有一份寫好的應變計畫
一旦出狀況,我們會遵循一份事先寫好的計畫,而不是臨時想辦法。步驟是:先評估嚴重程度、阻止狀況擴大、把所有人登出並關閉付款連結與內部人員的存取權限、更換我們的密鑰、保存歷史記錄並確認沒有被竄改,接著評估損害並通知受影響的人。我們承諾會盡快告知您,不會拖延超過必要的時間。我們不公布一個固定的時限,因為我們還沒有證明自己能夠做到。
您隨時都能把自己的資料帶走
您可以直接在應用程式裡下載一份自己帳戶的副本:客戶、工作、帳單、付款、收據、照片,以及您的帳單和報價單 PDF。帳戶也可以在應用程式裡直接刪除。存取權限會立即停止,資料則會在固定天數後被永久刪除。我們會刻意保留誰做了什麼的歷史記錄,因為這份記錄本身就只能新增,無法刪改。
我們沒有宣稱的事
以下清單列出我們沒有的東西,以及我們沒有做出的承諾。如果清單裡有什麼對您很重要,那就是一個真實的答案。請在把工作交給我們之前,先想清楚這一點。
沒有任何認證,也沒有外部稽核。 我們沒有 SOC 2 報告,沒有 ISO 27001 認證,也沒有 PCI 或 HIPAA 核可,這些都是大型採購方常要求的安全認證。公司外部沒有任何人被付費嘗試入侵。任何人告訴您 Zeus 有這些認證,都是錯的。
沒有任何運作時間或復原方面的承諾。 我們不公布應用程式的可用時間比例,不設定復原速度的目標,也不設定可能遺失多少近期工作的目標,因為我們無法為這些數字背書。
沒有絕對安全的承諾。 沒有任何系統是絕對安全的,宣稱做得到的頁面,是廣告,不是事實。
離線時完成的工作,要等到資料送達我們這裡才會被備份。 在沒有訊號時做的變更,只會留在那支手機上,直到應用程式連上伺服器為止。等您恢復訊號後,記得打開應用程式,讓它把資料送出去。
回報安全漏洞
如果您發現了什麼問題,我們寧願直接從您這裡聽到,也不希望是從正在使用這款應用程式的企業那裡得知。我們沒有獎金計畫,也不提供報酬,但會有真人給您明確的回覆。
請遵守以下規則
- 在告訴其他任何人之前,請先給我們時間修復問題。
- 調查過程中,除了您自己的資料以外,請不要開啟、變更或保留任何資料。
- 除非我們事先以書面同意,否則請不要用大量流量灌爆正式環境網站來測試它的承受能力,不要對它使用自動掃描工具,也不要嘗試入侵。
- 請告訴我們您做了什麼、看到了什麼,並提供足夠的細節,讓我們能重現問題。粗略的說明也好過完全沒有說明。
這些規則與我們的可接受使用政策相同。
本頁面的狀態
這個頁面是寫給您讀的。它不是一份合約,裡面的任何一句話,您都無法拿到法庭上要求我們兌現。真正具有這種效力的文件,是我們服務條款和隱私政策,收錄在我們的法律文件包裡。安全性工作永遠不會停止,所以這個頁面上的內容會持續變動。如果這個頁面和那些文件之間出現落差,以那些文件為準。
任何相關問題,請寄到 [email protected],其他一切則都在聯絡頁面上。