安全性
像款待賓客一樣的安全性。
身分提供者的好壞,取決於租戶之間的隔牆有多牢固,以及它處理機密有多謹慎。以下是 Usher Identity 的打造方式。我們說明的是軟體實際做的事,並未宣稱取得任何認證。
架構
分開的網域,分開的網路。
Usher Identity 自己的頁面和每位客戶的簽發者,位於不同的可註冊網域。資料庫位於無法連上網際網路的網路中,唯一的出口是一個會檢查目的地的代理。
- Caddy 為每台主機終止 TLS,並移除只有 Usher Identity 自己的服務才能設定的標頭。
- 驗證層為每個環境提供回應,並依主機加以區分;不會把為某台主機快取的內容提供給另一台主機。
- 每個服務都以自己的使用者身分連線到 Valkey,而且只能存取自己的鍵。沒有預設使用者。
- 帶有權杖和驗證碼的陳述式,絕不會連同其值寫入資料庫紀錄。
網際網路
使用者、你的 App、你的伺服器
邊緣
Caddy:TLS、HSTS,移除內部標頭
usheridentity.com
網站與 Console
usheridentity.com, console.usheridentity.com
API
api.usheridentity.com
*.usherid.com
驗證層
每個環境的簽發者與 Lobby
資料網路 · 無對外路由
Postgres
每個環境一個 schema
Valkey
每個服務只能存取自己的鍵
唯一的出口
對外連線代理
用於每個客戶提供的 URL
探索、JWKS、登出
僅限公開位址
隔離
沒有共用任何重要的東西。
每個專案環境都有自己的 Postgres schema、自己的簽署金鑰,以及以自己的資料金鑰密封的機密。它的簽發者是租戶網域上的一台主機,Cookie 也僅限該主機,因此瀏覽器絕不會將一個環境的 Cookie 傳送給另一個環境。
usheridentity.com
網站、Usher Identity Console、Usher Identity 帳號
*.usherid.com
每個環境一個簽發者,位於獨立的網域
使用者、工作階段和權杖都存放在專為這個環境建立的 schema 中。查詢只會針對該 schema 執行,絕不會使用帶有租戶欄位的共用資料表。
把 Acme 正式環境中密封的 Google 用戶端機密,複製到 Northwind 正式環境。
靜態加密
信封加密,綁定在原處。
你交給 Usher Identity 的機密,會以 AES-256-GCM 在只屬於一個環境的資料金鑰下密封。資料金鑰本身又由存放在資料庫之外、有版本控管的主金鑰包裹。
- 每個環境專屬的資料金鑰
- 即使一個環境的資料金鑰遭到破解,也不會洩漏其他環境的任何資訊。
- AAD 綁定
- 環境與用途會綁定在每段密文中,因此值無法在資料列或租戶之間搬移。
- 有版本控管的金鑰
- 每個密封的值都會記錄建立時所用的金鑰版本,因此可以輪替金鑰,並重新包裹舊的值。
- 經過驗證
- 有了 GCM 的驗證標籤,遭竄改的值會無法開啟,而不是被解密成其他內容。
主金鑰
存放在資料庫之外,並有版本控管
資料金鑰,每個環境一把
由主金鑰包裹
機密
以 AES-256-GCM 在資料金鑰下密封
u1.<key version>.<iv>.<ciphertext + tag>
aad = u1 | version | environment | purpose
做法
每個細節,都用心處理。
密碼(如果你使用的話)
以 Argon2id 雜湊,採用 OWASP 建議的成本(19 MiB、兩次迭代),並限制同時執行的數量,避免大量登入拖垮服務。新密碼會透過 Have I Been Pwned 的範圍 API 與已知外洩資料比對,該 API 只會看到密碼雜湊值的一小段前綴。預設最小長度為 12 個字元。
不儲存任何可被重送的內容
用戶端機密、權杖、魔術連結權杖和電子郵件驗證碼都以雜湊形式儲存。備用碼經過加密。授權碼有效五分鐘;電子郵件驗證碼可以嘗試三次。
每扇門都有速率限制
登入、註冊、電子郵件驗證碼、魔術連結、密碼重設和雙重認證檢查,各有自己的限制:例如每分鐘十次密碼登入,以及每十分鐘五封電子郵件驗證碼。
嚴格的 Content-Security-Policy
每個 Lobby 頁面都會取得一個全新的 nonce,以及圍繞它建立的政策:只有這個來源中帶有該 nonce 的指令碼才會執行,表單只能送往同一個來源,其他網站也無法將頁面嵌入框架。
值得信任的稽核紀錄
對工作區、專案和環境的變更,都會寫入只能附加的紀錄,每筆項目都與前一筆形成雜湊鏈結,因此任何遭到修改或遺失的項目都會顯露出來。
處理客戶 URL 的對外連線代理
Usher Identity 對客戶提供的位址所發出的每個請求(OIDC 探索、JWKS、後端通道登出),都會經由同一個代理送出。它只解析一次名稱,拒絕私人、回送、連結本機和雲端中繼資料位址,並連線到它檢查過的那個位址,因此 DNS 重新綁定無法把客戶的 URL 變成內部位址。
永不重複發出的代號
正式環境的代號就是其簽發者的第一個標籤。Console 僅限受邀使用,被檢舉用於網路釣魚的 Lobby 會遭到停用;代號一經使用,就永遠不會再發給別人,因為舊的 App 可能仍然信任它的權杖。
說結束就結束的工作階段
Usher Identity 每次請求都會檢查自己的工作階段,而不是信任快取的副本,因此你結束的工作階段會立即失效。存取權杖的有效期很短(預設十分鐘),你的 API 也可以對它們進行內省。
負責任的揭露
發現問題了嗎?請先告訴我們。
如果你認為自己發現了 Usher Identity 的安全性問題,我們很想知道,也會與你一起修正。
- 你發現了什麼、在哪裡,以及如何重現。
- 就你的理解,別人可以利用它做什麼。
- 我們要如何聯絡你,以及你是否希望列名致謝。
請只針對你自己擁有的環境進行測試,不要存取他人的資料,並在公開之前給我們合理的時間修正問題。若要檢舉假冒 Usher Identity 登入頁面的網頁,請參閱檢舉濫用。