2016-05-25 81 views
0

我們啓動的一個新項目需要MultiTenancy。在存儲層面,這可以通過多種方式完成。 (單獨的數據庫/不同的模式/共享模式)多租戶數據架構 - 共享模式 - 安全

爲了保持運營成本下降,我們認爲,「共享模式 - 共享表」是繼續的最佳途徑。因此,所有租戶將在同一個數據庫/模式模式上共享相同的表。

但是一個約束是提供良好的租戶隔離和安全性。爲此,我們可以使用加密。如果我們能夠爲每個租戶提供自己的密鑰對,那麼我們提供了良好的安全性和良好的隔離性。每個租戶只能讀取他自己的數據,而且我們也不必在每個表中添加鑑別器字段。

我們如何才能在技術上實現這一點?如果你查詢你的表格,我們會得到很多我們無法解密的數據(來自其他租戶的數據)。同樣在連接等,它會有更高的負載,因爲其他記錄在數據庫中。

我已經看過一些在MSDN上的文章和觀看一些介紹,但他們保持相當高的水平和抽象的。對此有何想法? 就像上面描述的那樣可能嗎?我以爲你可以在Amazon RDS上做些什麼?有沒有可能提供一些例子 - 例如在github上?

回答

0

根據您分享的內容以及兩行之間的一些閱讀內容,我對此方法非常謹慎。就共享模式本身而言,這是一個非常合理的多租戶設計;我看到的問題是建議使用加密。

雖然PostgreSQL在不支持加密,它通過pgcrypto模塊中的功能來完成。 RDS作爲PostgreSQL的託管服務,也增加了輕鬆配置加密卷的能力,但對於數據庫用戶/開發人員來說,它看起來幾乎相同。

文檔建議使用pgcrypto,如果您只需要對不需要過濾或加入的小數據子集進行加密 - 但不清楚您要加密多少數據。如果只有少數幾列,並且不需要過濾它們,這可能會起作用。否則,重新考慮 - 廣泛使用pgcrypto函數將使幾乎所有標準數據庫操作都無法實現效率低下。 where子句需要解密列,然後需要掃描/解密整個表;將不會使用索引。你的表現會很快慢慢爬行。

你沒有提供的一個主要考慮的是你如何提供訪問 - 例如,一個Web應用程序,在這裏你完全單一的,值得信賴的帳戶調節訪問?或允許客戶直接連接到數據庫?在前一種情況下,您的代碼無論如何都會管理所有訪問,並且始終需要訪問所有密鑰;爲什麼會產生開銷?在後一種情況下,您可能會將數據庫呈現給客戶,因爲所有標準查詢工具都很難使用。

更廣泛地說,在我的經驗,一個模式,每個租戶的方法可以提供隔離,效率和開發成本之間的良好平衡。通過明智地使用PostgreSQL中的角色,您可以對直接訪問實施合理的訪問控制(您可以對行執行相同的操作,儘管在我看來,需要更多開銷才能正確管理)。

看看一些常用的應用框架,以瞭解更多的:Rails的提供公寓寶石(https://github.com/influitive/apartment); Django有django-tenant庫(http://django-tenants.readthedocs.io/en/latest/); Hibernate有一個可插拔的租戶框架(例如,https://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch16.html

希望這會有所幫助。