当多个数据库共用一台服务器时,为了确保数据安全、防止越权访问和资源争用,需要从逻辑隔离和权限控制两个方面进行设计。以下是常见的隔离与权限管理策略:
一、逻辑隔离方式
1. 使用独立的数据库实例(推荐)
- 每个应用或租户使用一个独立的数据库(如 MySQL 中的不同 database/schema)。
- 示例:
CREATE DATABASE app1_db; CREATE DATABASE app2_db; - 优点:逻辑清晰,便于备份、迁移和权限划分。
- 缺点:共享同一实例,仍需注意资源竞争。
2. 使用不同 Schema(适用于 PostgreSQL、Oracle 等)
- 在同一个数据库中创建多个 schema,通过 schema 隔离不同业务的数据。
- 示例(PostgreSQL):
CREATE SCHEMA tenant_a; CREATE SCHEMA tenant_b; - 配合权限控制,限制用户只能访问指定 schema。
3. 表前缀隔离(不推荐用于高安全场景)
- 所有租户共用一套表结构,但用前缀区分(如
tenant1_users,tenant2_users)。 - 适用于多租户 SaaS 应用,但维护复杂,安全性较低。
- 需在应用层严格控制数据访问范围。
4. 虚拟化或容器化部署(高级方案)
- 使用 Docker 或虚拟机为每个数据库运行独立的数据库服务(如多个 MySQL 容器)。
- 实现物理级隔离,资源可控,适合高安全要求场景。
二、权限隔离策略
1. 创建专用数据库用户
- 为每个数据库或 schema 创建独立的数据库用户。
- 示例(MySQL):
CREATE USER 'app1_user'@'localhost' IDENTIFIED BY 'secure_password'; GRANT SELECT, INSERT, UPDATE, DELETE ON app1_db.* TO 'app1_user'@'localhost';
2. 最小权限原则
- 只授予必要的权限(如不给 DROP、GRANT 权限)。
- 避免使用 root 或超级用户连接应用。
3. 网络访问控制
- 限制用户来源 IP:
GRANT ... TO 'user'@'192.168.1.%'; - 结合防火墙规则,限制数据库端口访问。
4. 使用角色(Role-based Access Control)
- 在支持角色的数据库(如 PostgreSQL、SQL Server)中定义角色并分配权限。
- 示例(PostgreSQL):
CREATE ROLE app_reader; GRANT SELECT ON ALL TABLES IN SCHEMA tenant_a TO app_reader; GRANT app_reader TO user_tenant_a;
三、资源隔离(防干扰)
1. 资源配额限制
- 使用数据库自带的资源管理功能(如 MySQL 的
cgroups+ 进程限制,或企业版的 Resource Governor)。 - 或通过操作系统层面限制 CPU、内存使用。
2. 连接数限制
- 限制每个用户的最大连接数:
CREATE USER 'app1_user'@'%' WITH MAX_USER_CONNECTIONS 50;
3. 监控与告警
- 监控各数据库的 CPU、I/O、连接数等指标。
- 设置阈值告警,及时发现异常占用。
四、其他安全建议
| 措施 | 说明 |
|---|---|
| 加密存储 | 对敏感数据加密(TDE 或应用层加密) |
| SSL 连接 | 启用 TLS 加密客户端与数据库通信 |
| 定期审计 | 开启数据库审计日志,记录登录、操作行为 |
| 定期备份 | 按租户/数据库独立备份,避免交叉影响 |
五、典型架构示例(MySQL)
服务器(一台)
├── MySQL 实例
├── 数据库: db_app1
│ └── 用户: user_app1 (仅 db_app1 权限)
├── 数据库: db_app2
│ └── 用户: user_app2 (仅 db_app2 权限)
└── 系统数据库(mysql, information_schema 等)
所有用户均不能跨库访问,且连接来源受限。
总结
| 隔离维度 | 推荐做法 |
|---|---|
| 数据隔离 | 独立数据库或 Schema |
| 权限控制 | 最小权限 + 专用用户 + 角色管理 |
| 资源隔离 | 连接数限制 + 监控 + 容器化 |
| 安全加固 | SSL、审计、加密 |
✅ 最佳实践建议:
对于生产环境,优先采用“独立数据库 + 专用用户 + 最小权限 + 网络隔离”组合,必要时使用容器或虚拟机实现更强隔离。
如有更高安全需求(如X_X、X_X),建议考虑分库分表或独立服务器部署。
云小栈