跳至內容

安全性

像款待賓客一樣的安全性。

身分提供者的好壞,取決於租戶之間的隔牆有多牢固,以及它處理機密有多謹慎。以下是 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、登出

僅限公開位址

Usher Identity 的各個層級。租戶網域與平台的網域是不同的可註冊網域,因此租戶的頁面與 Console 永遠不會是同站。

隔離

沒有共用任何重要的東西。

每個專案環境都有自己的 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 的驗證標籤,遭竄改的值會無法開啟,而不是被解密成其他內容。
  1. 主金鑰

    存放在資料庫之外,並有版本控管

  2. 資料金鑰,每個環境一把

    由主金鑰包裹

  3. 機密

    以 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 的安全性問題,我們很想知道,也會與你一起修正。

security@usheridentity.com
  • 你發現了什麼、在哪裡,以及如何重現。
  • 就你的理解,別人可以利用它做什麼。
  • 我們要如何聯絡你,以及你是否希望列名致謝。

請只針對你自己擁有的環境進行測試,不要存取他人的資料,並在公開之前給我們合理的時間修正問題。若要檢舉假冒 Usher Identity 登入頁面的網頁,請參閱檢舉濫用。