跳至內容

保安

像款待賓客一樣的保安。

身份提供者的好壞,取決於租户之間的隔牆有多牢固,以及它處理機密有多謹慎。以下是 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 登入頁面的網頁,請參閱舉報濫用。