【问题标题】:Secure multi-tenancy in MySQL applicationMySQL 应用程序中的安全多租户
【发布时间】:2011-04-24 17:40:22
【问题描述】:

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

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

我的首选方法:

  • 添加用户表(PK_User_Id、password_hash、姓名等)
  • 添加访问表(FK_User_Id、FK_Process_Id)
  • 在 Session 中存储 Tenant_Id 的 SSL 登录页面
  • 一个流程选择页面,让您可以选择您有权访问的 Process_Id,并将其存储在 Session 中
  • 几乎每个页面都会根据 Session 的 Process_Id 创建其 SQL 查询
  • “跨进程”页面(如创建、选择和比较)将使用 Session 的 User_Id 代替

我的老板认为这不足以满足外部代码审计的要求。他担心任性的开发人员仍然会编写一个查询,将一个客户的数据暴露给另一个客户,或其他东西。

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

  • 这可能吗?
  • 是否存在与 MySQL 一起使用的与 DB 无关的“角色”?
  • 如果主键是“foo”,角色是否可以指定允许您向表中添加行?
  • 按照行业标准,我的系统是否“足够安全”?

【问题讨论】:

    标签: mysql security multi-tenant ansi-sql


    【解决方案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/

    【讨论】:

      【解决方案2】:
      1. 改用 PostgreSQL,因为它支持真实的模式,不像 MySQL

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

        • 为每个租户创建一个 mysql 用户
        • 为每个表添加一个索引列,tenantVARCHAR(16) NOT NULL
        • 为每个表添加一个触发器,将租户设置为 mysql 连接用户名 ON BEFORE INSERT
        • 为设置 WHERE 租户 = mysql 连接用户名的每个表创建一个视图。不要在选择列表中包含租户列
        • 向租户用户授予视图权限,但不授予表权限

      现在用户只能看到自己的租户信息。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-01-16
          • 1970-01-01
          • 1970-01-01
          • 2019-09-07
          • 2018-08-29
          • 2011-05-05
          • 2015-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多