1

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

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

我的首选方法:

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

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

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

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

3 回答 3

2

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

于 2018-08-23T17:39:33.370 回答
0

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

于 2012-04-23T13:48:33.197 回答
0
  1. 改用 PostgreSQL,因为它支持真实的模式,不像 MySQL

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

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

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

于 2012-04-01T18:54:59.273 回答