mysql - MySQL 应用程序中的安全 Multi-Tenancy

标签 mysql security multi-tenant ansi-sql

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

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

我的首选方法:

  • 添加用户表(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 无关的“角色”之类的东西可以与 MySQL 一起使用?
  • 如果主键是“foo”,角色能否指定允许您向表中添加行?
  • 按照行业标准,我的系统“足够安全”吗?

最佳答案

以下是我为使用单个数据库的 MySQL Multi-Tenancy 所做的工作,以确保数据是私有(private)的:

  1. 为每个租户创建一个mysql用户
  2. 为每个表添加一个 tenant_id 列
  3. 使用触发器自动将当前 mysql 用户放入 INSERT 的 tenant_id 列
  4. 为每个表创建一个 View ,只显示 tenant_id = mysql_user 的行( View 中不包括 tenant_id 列)
  5. 限制租户 mysql 用户只能访问这些 View

由于应用程序正在使用租户的 mysql 用户,因此他们不可能意外获取另一个租户的数据。

我能够在一个周末将一个大型单租户 mysql 应用程序转换为 Multi-Tenancy 应用程序,只需很少的改动。我在这里记录了设计:https://opensource.io/it/mysql-multi-tenant/

关于mysql - MySQL 应用程序中的安全 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772128/

相关文章:

MySQL ABS 计算优化技巧

python - Tkinter Mysql 窗口

windows - 是否可以向 Windows 为管理员用户创建的标准用户 token 添加权限?

amazon-dynamodb - DynamoDB Multi-Tenancy - 分区键

java - Hibernate 搜索索引单个租户

mysql - 查询左连接未返回预期结果

php - 保护目录中 1000 多个 html 文件,无需全部编辑

ios - iOS MultipeerConnectivity 框架中的 session 加密

docker - kata 容器可以用作沙箱来运行不受信任的代码吗?

keycloak - 在 keycloak 中为多个领域使用单个唯一客户端