2011-04-24 82 views
1

我有一個JSP/MySQL Web服務用戶與「進程」交互 - 他們可以爲給定進程上傳數據,配置,查看報告等。他們還可以創建新的流程或運行比較幾個流程的報告。在MySQL應用程序中的安全多租戶

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

我的首選方法:

  • 添加存儲的Tenant_Id用戶表(PK_User_Id,password_hash,姓名等)
  • 增加接入表(FK_User_Id,FK_Process_Id)
  • 的SSL登錄頁面在會議
  • 一個過程選擇頁面,讓你選擇,你可以使用一個PROCESS_ID,並存儲在會話
  • 幾乎每一頁C會不會reate我的老闆認爲這是不安全的「,足以基於會話的PROCESS_ID
  • 「跨進程」頁面,如創建,選擇和比較將致力於關閉Session的USER_ID代替

它的SQL查詢「以滿足外部代碼審計。他擔心一個任性的開發人員仍然可以編寫一個查詢,將一個客戶的數據公開給另一個客戶,或者其他的東西。

他希望我也使用ANSI SQL內置的ROLES(應用程序必須保持DB不可知性)爲每個用戶創建數據庫角色。該角色將詳細說明角色有權訪問哪些表格,共享表格中的哪些表格等。這樣,登錄後,Connection將是「安全」的,並且沒有開發人員的錯誤可能會導致問題。

  • 這可能嗎?
  • 是否存在與MySQL一起使用的DB-agnostic「Roles」這樣的事情?
  • 如果主鍵爲'foo',角色是否可以指定允許您將行添加到表中?
  • 按照行業標準,我的系統「足夠安全」嗎?

回答

0
  1. 使用PostgreSQL代替,因爲它支持實時模式,與MySQL不同

  2. ,如果你要使用MySQL,請執行下列操作:

    • 使每個租戶
    • 一個mysql用戶
    • 將索引列添加到每個表,tenant VARCHAR(16)NOT NULL
    • 將觸發器添加到e ach表將租戶設置爲mysql連接用戶名ON BEFORE INSERT
    • 爲每個設置WHERE tenant = mysql連接用戶名的表創建一個視圖。不包括承租人列在選擇列表中
    • 授予權限的意見租戶用戶,而不是表

而現在用戶只能看到自己的租戶信息。

0

我們對so question上的多租戶安全性和處理請求進行了類似的討論。但總之,我認爲在會話中存儲tenantID是一個巨大的安全風險。用戶可以從一個租戶到另一個租戶,並且tenantID將保持不變,tenantID也不應通過url發送。