簡體   English   中英

MySQL應用程序中的安全多租戶

[英]Secure multi-tenancy in MySQL application

我有一個JSP / MySQL Web服務 ,用戶可以在其中與“流程”進行交互-他們可以為給定流程上傳數據,配置,查看報告等。 他們還可以創建新流程或運行比較多個流程的報告。

當前,進程ID是在URL(GET參數)中指定的,因此任何用戶都可以與任何進程進行交互。 我被要求為該服務添加安全性和多租戶。 為簡單起見,假設每個租戶都可以完全訪問一組進程,但是多個租戶可以訪問這些進程。

我的首選方法:

  • 添加用戶表(PK_User_Id,password_hash,名稱等)
  • 添加訪問表(FK_User_Id,FK_Process_Id)
  • 在會話中存儲Tenant_Id的SSL登錄頁面
  • 一個進程選擇頁面,可讓您選擇您有權訪問的Process_Id並將其存儲在Session中
  • 幾乎每個頁面都會根據會話的Process_Id創建其SQL查詢
  • 像“創建”,“選擇”和“比較”之類的“跨進程”頁面將改用會話的User_Id

我的老板認為這不足以滿足外部代碼審核的安全。 他擔心一個任性的開發人員仍然會編寫一個查詢,將一個客戶的數據暴露給另一個客戶或其他對象。

他希望我也使用ANSI SQL內置的ROLES(該應用程序必須與DB無關)為每個用戶創建一個db角色。 該角色將詳細說明該角色可以訪問哪些表,共享表中的哪些行,等等。通過這種方式,登錄后,Connection將是“安全的”,並且任何開發人員錯誤都不會引起問題。

  • 這可能嗎?
  • 是否存在與MySQL無關的與DB無關的“角色”?
  • 如果主鍵為“ foo”,角色是否可以指定允許您向表中添加行?
  • 按照行業標准,我的系統是否“足夠安全”?

這是我為具有單個數據庫的MySQL多租戶所做的操作,以確保數據是私有的:

  1. 為每個租戶創建一個mysql用戶
  2. 向每個表添加一個tenant_id列
  3. 使用觸發器自動將當前的mysql用戶放入INSERT的tenant_id列中
  4. 為每個表創建一個視圖,該表僅顯示tenant_id = mysql_user的行(視圖中不包括tenant_id列)
  5. 限制租戶mysql用戶只能訪問這些視圖

由於應用程序正在使用租戶的mysql用戶,因此他們沒有機會意外獲取另一租戶的數據。

我能夠在周末以最小的更改將大型的單租戶mysql應用程序轉換為多租戶。 我在這里記錄了設計: https : //opensource.io/it/mysql-multi-tenant/

我們就多租戶安全性和處理此類問題的要求進行了類似的討論。 簡而言之,我認為在會話中存儲tenantID是一個巨大的安全風險。 用戶可以從一個租戶轉到另一個租戶,並且tenantID將保持不變,也不應通過URL發送tenantID。

  1. 請改用PostgreSQL,因為它支持真實的架構,與MySQL不同

  2. 如果必須使用MySQL,請執行以下操作:

    • 使每個租戶一個mysql用戶
    • 向每個表添加索引列, tenant VARCHAR(16)NOT NULL
    • 在每個表上添加一個觸發器,將租戶設置為mysql連接用戶名ON插入前
    • 為設置WHERE tenant = mysql連接用戶名的每個表創建一個視圖。 不要在選擇列表中包括“租戶”列
    • 向租戶用戶授予視圖權限,但不授予表權限

現在,用戶只能看到他們自己的租戶信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM