OCI 上的多租用戶應用程式部署模型

在現今的雲端優先世界中,企業和獨立軟體供應商 (ISV) 越來越多地將傳統應用程式轉換為軟體即服務 (SaaS) 產品。此轉型的重要組成部分是多租用戶部署模型,可讓多位客戶共用相同的應用程式,同時確保安全性、效能及成本效益。 Oracle Cloud Infrastructure (OCI) 提供一組強大的服務,可讓您使用共用租用戶和混合方法輕鬆提供 SaaS 應用程式。

關於租戶

請務必不要將 OCI 租用戶與 SaaS 應用程式中的租用戶概念混淆。

OCI 租用戶:這是您在註冊 OCI 服務時所收到的帳戶。它代表您的 root 帳戶,並作為安全、隔離的分割區,供您組織及管理 OCI 資源。

租用戶 (在 SaaS 相關資訊環境中):假設 ISV 在 OCI 上建置 SaaS 平台。ISV 將自己的客戶佈建到平台時,每個客戶都會被視為租用戶。這意義上的用戶代表一個客戶組織,而每個用戶可以有多個與其相關聯的使用者。

簡而言之,OCI 租用戶是指 OCI 帳戶本身,而租用戶是指使用由其他實體 (例如 ISV) 在 OCI 上代管之應用程式的組織 (例如 SaaS 客戶)。

架構

此架構代表 OCI 上高層級的多租用戶應用程式部署模型。

下圖說明此參照架構:



多租戶 -app-oci-oracle.zip

此彈性架構分為三個層:

圖層 目的 關鍵動作
初始驗證 (OCI IAM) 驗證全域識別 驗證證明資料後發出 JSON Web 權杖 (JWT)
認證中介軟體 確認每一要求的身分 從 JWT 擷取用戶和使用者相關資訊環境
資料存取層或 ORM 鉤點 強制執行資料隔離 tenant_id 自動篩選所有查詢

每一層描述如下:

起始認證和租用戶相關資訊環境建立

  • 認證服務:使用者通常會使用用戶特定的 URL (例如 mycompany.app.com) 登入,或在登入時選取用戶來登入。
  • 作為身分識別提供者的 OCI 身分識別與存取管理 (OCI IAM): OCI IAM (特別是專用識別網域 ) 會驗證使用者的證明資料。重要的是,它會確認使用者不僅有效,而且也是他們嘗試存取之特定用戶群組 (例如 mycompany-users) 的成員。
  • JWT 發行:成功認證後,OCI IAM 識別網域會發出簽署的 JSON Web 權杖 (JWT)。此權杖包含下列重要宣告:
    • sub :使用者的唯一 ID。
    • 群組:使用者所屬之 IAM 群組的 OCID 陣列。這是識別用戶的關鍵。
    • 您可以使用 OCI IAM 中的自訂屬性來新增自訂宣告 (例如 tenant_idtenant_name)。(選擇性)

認證中介軟體 – "Who" 層

後端必須設計為安全地擷取和傳輸用戶相關資訊環境。此架構支援使用 OCI API 閘道OCI 負載平衡器來執行每個要求認證和用戶相關資訊環境傳輸。

  • OCI API 閘道這是建議的進入點。它可以執行 JWT 驗證本身,從您的應用程式代碼卸載此職責。您可以將它設定為根據 OCI IAM 識別網域的 JWKS 端點驗證簽章。
  • OCI 負載平衡器:可以處理 SSL 終止和路由,但會將 JWT 傳送至認證中介軟體進行驗證。

動作:OCI API 閘道會驗證 JWT 的簽章和到期。若無效,會立即拒絕要求。如果有效,它會將要求轉送至上游服務,通常會在標頭中傳送已驗證的權杖或擷取的宣告 (例如 X-USER-IDX-TENANT-ID)。

如果您使用的是 OCI 負載平衡器而非 OCI API 閘道,則應用程式後端的第一個元件必須是認證中介軟體。

動作:Authorization: Bearer <token> 標頭擷取 JWT、使用 OCI IAM 的公開金鑰驗證其簽章、解碼宣告,以及將 user_idtenant_id (衍生自群組宣告) 插入所有後續層使用的要求相關資訊環境。

資料存取層或物件關聯對應程式 (ORM) 鉤點 - 何謂圖層

此層會自動將用戶 ID 插入每個 SQL 查詢中。

  • 範例:getAllInvoices() 的呼叫會轉換成 SELECT * FROM invoices WHERE tenant_id = :tenant_id
  • 強制:最好由集中式資料存取層、ORM (例如 Hibernate) 掛載或「租用戶感知」連線集區強制實行,以避免人為錯誤。
  • ORM 鉤點:透過攔截與修改應用程式架構層次的資料庫作業,讓真正的隱含用戶隔離機制。

用戶資料隔離策略:

此架構支援兩個選項來隔離和保護租用戶的資料:

選項 1:應用模組層次

ORM 鉤點 / 範圍: Hibernate (Java)、Django ORM (Python) 或 Eloquent (PHP) 等架構可讓您定義全域範圍,以自動將用戶篩選新增至特定模型的所有查詢。

選項 2:資料庫層次

您可以為每個用戶使用鑑別資料欄、每個用戶使用不同的綱要,或是為每個用戶使用不同的資料庫:

  • 鑑別欄 (最常見):

    tenant_id 資料欄會新增至每個租用戶特定的表格或文件。

    應用程式的資料存取層 (DAL) 或 ORM 負責自動將 WHERE tenant_id = ? 子句附加至每個查詢。這可透過下列方式實現:

    • 儲存區域樣式:所有資料庫存取都會流經一個中央類別或一組類別。此儲存區域會根據目前要求相關資訊環境中的 tenant_id,自動將用戶篩選新增至每個 SELECT、INSERT、UPDATE 以及 DELETE 作業。
    • 連線相關資訊環境:對於某些 SQL 資料庫 (例如 Oracle HeatWave MySQL),應用程式可以設定階段作業變數 (例如 SET @tenant_id = 'mycompany123';),然後在檢視或預存程序中使用該變數。不過,應用程式層仍然負責為每個連線設定這個值。
  • 每一租用戶的綱要:

    每個用戶在相同的資料庫執行處理內都有一個專用資料庫綱要。

    根據用戶 ID 的應用程式邏輯必須切換資料庫連線的目前綱要。

    • 每個租用戶的連線集區:為每個租用戶維護個別的連線集區,其中每個連線都已預先設定為使用租用戶的綱要 (例如 USE tenant_mycompany;)。
    • 動態連線切換:使用連線集區,根據目前的 tenant_id 設定取出時的綱要 (例如,使用 SET search_path TO tenant_mycompany; 命令執行 PostgreSQL)。
  • 每一租用戶的資料庫:

    每個租用戶都有自己的實體獨立資料庫執行處理,並為企業提供自己的金鑰加密。

    應用程式需要租用戶資料查詢服務,才能將 tenant_id 對應至正確的資料庫連線字串。

    • 應用程式會保留多個資料庫的連線集區。
    • DAL 會使用要求相關資訊環境的用戶 ID 從集區取得正確的連線,然後在專用用戶資料庫上執行查詢。

    此選項具有優點與缺點:

    • Pros:最大隔離、安全性和效能。用戶甚至可以位於不同的資料庫版本或引擎類型。
    • 假設:最高的營運負荷、成本和複雜性。必須在每個租用戶資料庫上執行資料庫移轉和修正程式。

此架構實作下列元件:

  • Tenancy

    租用戶是一個安全且隔離的分割區,當您在註冊 OCI 時,Oracle 會在 Oracle Cloud 內建立此分割區。您可以在租用戶內的 OCI 上建立、組織及管理您的資源。租用戶與公司或組織同義字。通常,公司會有單一租用戶,並反映其在該租用戶內的組織結構。單一租用戶通常與單一訂閱關聯,而單一訂閱通常只有一個租用戶。

  • OCI Identity and Access Management

    Oracle Cloud Infrastructure Identity and Access Management (IAM) 為 OCI 和 Oracle Cloud Applications 提供使用者存取控制。IAM API 和使用者介面可讓您管理識別網域及其中的資源。每個 OCI IAM 識別網域都代表獨立的識別與存取管理解決方案,或代表不同的使用者群體。

  • 負載平衡器

    Oracle Cloud Infrastructure Load Balancer 提供從單一進入點到多部伺服器的自動化流量分配功能。

  • OCI API 閘道

    Oracle Cloud Infrastructure API Gateway 可讓您發布具有可從網路存取之專用端點的 API,並視需要向公用網際網路公開這些 API。端點支援 API 驗證、要求與回應轉換、CORS、認證與授權,以及要求限制。

  • Oracle Key Management Cloud Service

    OCI 金鑰管理服務 Oracle Cloud Infrastructure (OCI) 金鑰管理服務 (KMS) 是一項雲端服務,可為儲存在 OCI 中的資料集中管理和控制加密金鑰。OCI KMS 是客戶管理的加密,提供 OCI Vault (虛擬保存庫和專用保存庫)、OCI 專用 KMS 和 OCI 外部 KMS 服務。

  • OCI Compute

    您可以使用 Oracle Cloud Infrastructure Compute 在雲端佈建及管理運算主機。您可以啟動資源配置符合 CPU、記憶體、網路頻寬和儲存資源需求的運算執行處理。建立運算執行處理之後,您可以安全地存取、重新啟動、連附及取消連附磁碟區,然後在不再需要運算執行處理時予以終止。

  • OCI 功能

    Oracle Cloud Infrastructure Functions 是一個完全託管、多租用戶、可高度擴展、隨選、函數即服務 (FaaS) 平台。它由 Fn Project 開放原始碼引擎提供技術支援。OCI Functions 可讓您部署程式碼,以及直接呼叫程式碼或觸發程式碼以回應事件。OCI Functions 使用 Oracle Cloud Infrastructure Registry 中代管的 Docker 容器。

  • OCI Kubernetes 引擎

    Oracle Cloud Infrastructure Kubernetes Engine ( OCI Kubernetes EngineOKE) 是完全託管、可擴展且高可用性的服務,可用來將容器化應用程式部署到雲端。您可以指定應用程式所需的運算資源,然後確定在現有租用戶的 OCI 上佈建這些資源。OKE 使用 Kubernetes 將跨主機叢集的容器化應用程式部署、調整規模及管理自動化。

  • Oracle HeatWave MySQL

    Oracle MySQL Database Service 是一項完全受管理的資料庫服務,可讓開發人員使用全球最熱門的開源資料庫,快速開發及部署安全的雲端原生應用程式。Oracle HeatWave MySQL 是適用於 Oracle MySQL Database Service 的全新、整合式、高效能的記憶體內查詢加速器,可提升分析和交易查詢的 MySQL 效能。

  • Oracle NoSQL Database Cloud Service

    Oracle NoSQL Database Cloud Service 可讓開發人員使用文件、固定綱要和索引鍵值資料庫模型輕鬆建置應用程式,透過資料複寫實現高可用性,提供可預測的數毫秒回應時間。此服務針對隨選和佈建的容量模式提供主動式區域複寫、ACID 交易、無伺服器擴展、全方位的安全性,以及低按使用量定價,包括與內部部署 Oracle NoSQL Database 的 100% 相容。

  • OCI Object Storage

    OCI Object Storage 可讓您存取任何內容類型的大量結構化和非結構化資料,包括資料庫備份、分析資料,以及豐富的內容 (例如影像和影片)。您可以直接從應用程式或雲端平台內安全地儲存資料。您可以擴展儲存,而不會發生任何效能或服務可靠性的降低情況。

    針對需要快速、立即及頻繁存取的「熱」儲存使用標準儲存。將封存儲存用於保留一段很長的時間和很少或很少存取的「冷」儲存。

  • Oracle Autonomous Database Serverless

    Oracle Autonomous Database ServerlessOracle Autonomous Database 。您擁有一個完全彈性的資料庫,Oracle 可在資料庫生命週期的各個方面自主運作,從資料庫位置到備份和更新。

  • 通透資料加密

    Transparent Data Encryption (TDE) 會以通透方式加密 Oracle AI Database 中的靜態資料。TDE 已與 Oracle AI Database 完全整合,可以加密整個資料庫備份 (RMAN)、資料汲取匯出、整個應用程式表格空間或特定機密資料欄。加密的資料在資料庫中仍會保持加密,無論是位於表格空間儲存體檔案、暫時表格空間、還原表格空間,或是其他像是重做日誌的檔案中。這可防止未經授權的存取資料庫資料,而不會影響應用程式使用 SQL 存取資料的方式。

建議

使用下列建議作為設計架構的起點。 您的需求可能與此處說明的架構不同。
  • VCN

    建立 VCN 時,請根據計畫要連附至 VCN 中子網路的資源數目,決定所需的 CIDR 區塊數目以及每個區塊的大小。使用標準專用 IP 位址空間內的 CIDR 區塊。

    選取未與您要設定專用連線的任何其他網路 (在 Oracle Cloud Infrastructure 、內部部署資料中心或其他雲端提供者中) 重疊的 CIDR 區塊。

    建立 VCN 之後,您可以變更、新增及移除其 CIDR 區塊。

    設計子網路時,請考量您的流量和安全需求。將特定層或角色內的所有資源連附至相同的子網路,以作為安全界限。

  • 安全清單

    使用安全清單定義適用於整個子網路的傳入和傳出規則。

  • 網路安全群組 (NSG)

    您可以使用 NSG 定義一組適用於特定 VNIC 的傳入和傳出規則。我們建議您使用 NSG 而非安全清單,因為 NSG 可讓您將 VCN 的子網路架構與應用程式的安全需求分開。

  • 雲端保全

    複製並自訂 Oracle 提供的預設處方,以建立自訂偵測器和回應器處方。這些處方可讓您指定哪些類型的安全違規會產生警告,以及允許對它們執行哪些動作。例如,您可能想要偵測將可見性設為公開的 OCI Object Storage 儲存桶。

    在租用戶層級套用 Oracle Cloud Guard ,以涵蓋範圍最廣,並降低維護多個組態的管理負擔。

    您也可以使用「受管理清單」功能,將特定組態套用至偵測器。

  • 安全區域

    對於需要最高安全性的資源,Oracle 建議您使用安全區域。安全區域是與 Oracle 定義的安全原則處方關聯的區間,以最佳做法為基礎。例如,安全區域中的資源不能從公用網際網路存取,而且必須使用客戶管理的金鑰加密。當您在安全區域中建立及更新資源時,OCI 會根據處方中的原則驗證作業,並防止違反任何原則的作業。

注意事項

部署此架構時,請考慮使用這些選項。

  • 效能:
    • 對 API 設定以用戶為基礎的速率限制
    • 在 OKE 中使用每個命名空間的 Kubernetes 資源配額,以限制每個租用戶的 Pod、CPU 和記憶體
    • 運用專屬節點集區處理高需求租用戶
    • 設定資料庫連線的每個租用戶集區大小
  • 安全:
    • OCI IAM 群組可控制使用者可存取的租用戶。這由 JWT 強制執行。
    • 讓 Oracle Cloud Guard 偵測組態錯誤
  • 成本:

    無論您需要表格層次、綱要層次或企業層次客戶的專用資料庫,都能根據您的業務需求進行評估。舉例而言:

    • 第 1 層:標準 (鑑別資料欄):用戶共用相同的表格 / 綱要。
    • 第 2 層:進階 (每一租用戶的綱要):用戶會在同一個資料庫內取得專用綱要。
    • 第 3 層:企業 (每一租用戶的資料庫):用戶會取得專用資料庫執行處理。
  • 修正與應用程式更新

    在單一執行處理的多租用戶 SaaS 架構中,若不打補丁全部租用戶,就無法打補丁該租用戶。您的所有客戶都共用相同的應用程式程式碼庫、程式實際執行和基礎架構。此實境帶來了重大挑戰:如何安全、高效地推出更新,而不會對整個使用者群造成破壞性停機?答案是專為此目的設計的現代化 DevOps 部署策略:使用零停機部署策略,在版本之間進行無縫轉換,而不強制使用者離線。

    • 藍綠色部署:這涉及維護兩個相同的生產環境:一個「藍色」(執行目前的版本) 和一個「綠色」(執行新版本)。在 Green 中部署和測試新版本之後,您可以無縫地將所有流量從 Blue 切換為 Green。如果發生任何錯誤,您可以立即切換回去,倒回非事件。舊的 Blue 環境便會停止使用。
    • 金絲雀偵測部署:此策略藉由執行逐步推出來降低風險。新版本會部署至由小型且受控制的使用者子集 (下稱「掃描器」)。您會密切監控此群組,找出錯誤或效能問題。如果分析指標看起來良好,您將逐步向更多使用者推出更新,直到每個人都在新版本上。

    您通知使用者必要的升級時段 (例如「若未指定升級日期,將會在星期日 mm/dd/yyyy 的 12:00 自動進行升級)。視窗結束後,您可以終止舊版本的階段作業,並將所有流量重新導向至新版本。然後會完全關閉舊的應用程式程式碼。

  • 資料庫考量

    切換應用程式版本時,您無法完全切換資料庫綱要。大多數 SaaS 公司使用下列方法來避免此情況:

    • 回溯相容的資料庫綱要變更
    • 功能旗標 / 切換
    • 用戶描述資料式版本控制

    這可讓新程式碼在開展期間安全地與舊綱要版本作業,不需停機即可移轉及立即倒回。

確認

  • 作者:企業雲端架構師 Gururaj Mohan
  • 貢獻者Joshua Stanley