在MySQL应用程序中保护多租户

时间:2011-04-24 17:40:23

标签: mysql security multi-tenant ansi-sql

我有一个JSP / MySQL网络服务,用户可以与“流程”进行交互 - 他们可以为给定流程上传数据,配置,查看报告等。他们还可以创建新流程或运行比较多个流程的报告。

目前,在URL(GET参数)中指定了进程ID,因此任何用户都可以与任何进程进行交互。 我被要求为此服务添加安全性和多租户。为简单起见,假设每个租户都可以完全访问一组流程,但多个租户可以访问流程。

我的首选方法:

  • 添加用户表(PK_User_Id,password_hash,name等)
  • 添加访问表(FK_User_Id,FK_Process_Id)
  • 在会话
  • 中存储Tenant_Id的SSL登录页面
  • 一个流程选择页面,可让您选择您有权访问的Process_Id,并将其存储在会话中
  • 几乎每个页面都会根据Session的Process_Id
  • 创建SQL查询
  • “创建”,“选择”和“比较”等“跨进程”页面将取决于会话的User_Id而不是

我的老板认为这不足以“满足”外部代码审核。他担心任性的开发人员仍然可以编写一个查询,将一个客户的数据暴露给另一个客户或其他什么。

他希望我也使用ANSI SQL内置的ROLES(应用程序必须保持数据库不可知)为每个用户创建一个db角色。该角色将详细说明角色可以访问哪些表,共享表中的哪些行等。这样,在登录时,Connection将是“安全的”,并且没有开发人员错误可能导致问题。

  • 这可能吗?
  • 是否存在与MySQL无关的“角色”这样的东西?
  • 如果主键为'foo',角色是否可以指定允许向表中添加行?
  • 按行业标准,我的系统“足够安全”吗?

3 个答案:

答案 0 :(得分:1)

这是我为具有单个数据库的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/

答案 1 :(得分:0)

  1. 使用PostgreSQL,因为它支持真实的模式,不像MySQL

  2. 如果您必须使用MySQL,请执行以下操作:

    • 为每个租户创建一个mysql用户
    • 为每个表添加一个索引列,tenant VARCHAR(16)NOT NULL
    • 为每个表添加一个触发器,该表将租户设置为ON BEFORE INSERT
    • 的mysql连接用户名
    • 为每个设置WHERE tenant = mysql连接用户名的表创建一个视图。请勿在选择列表中包含租户列
    • 授予租户用户对视图的权限,但不授予表
    • 的权限
  3. 现在用户只能看到自己的租户信息。

答案 2 :(得分:0)

我们在so question上就多租户安全和处理请求进行了类似的讨论。但总之,我认为将tenantID存储在会话中是一个巨大的安全风险。用户可以从一个租户转到另一个租户,tenantID将保持不变,tenantID也不应该通过url发送。