摘要:SaaS 服务的核心安全与效率挑战
对于像 QiWe 这样的开放平台而言,服务众多独立的企业客户(即多租户)是核心商业模式。多租户架构要求系统在保证 资源效率 (共享计算资源)的同时,严格实现 数据隔离 和 访问控制。本篇将详细阐述我们在企业微信自动化平台中实现多租户隔离与安全的技术实践。
1. 隔离级别的选择与实施
多租户隔离通常分为三个级别:物理隔离、硬件隔离和软件隔离。考虑到成本与效率,我们选择了 进程级隔离 和 数据库共享-逻辑隔离 的混合模式。
1.1 资源隔离:进程级沙箱
RPA 引擎是 CPU 密集型和 IO 密集型组件,是隔离的关键:
-
容器化隔离 (K8s): 每个租户的 RPA 自动化任务运行在独立的 Kubernetes Pod 或 Docker 容器 中。K8s 负责利用 Linux 内核特性(Cgroups 和 Namespaces)实现严格的资源配额(CPU、内存)和网络隔离,确保一个租户的资源消耗不会影响到其他租户。
-
网络策略 (Network Policy): 通过 K8s 的网络策略,严格限制租户 Pod 之间、以及租户 Pod 对核心平台内部服务的直接访问,仅允许通过 API Gateway 进行通信。
1.2 数据隔离:逻辑划分与行级安全 (RLS)
为了提高数据库资源的利用率,我们采用 共享数据库、逻辑隔离 的方案:
-
租户 ID 强制关联: 在所有核心业务表(如任务记录、日志、客户数据)中,强制加入一个不可为空的
tenant_id字段 。所有数据的写入和读取操作,都必须基于当前请求的tenant_id进行过滤。 -
行级安全(RLS)机制: 在数据库层面(如 PostgreSQL/MySQL),启用 行级安全策略 。即使应用程序层出现 Bug 导致
tenant_id丢失,数据库也能通过 RLS 策略阻止跨租户的数据访问,提供最后一道防线。 -
密钥隔离: 租户的敏感数据(如 API 密钥、回调地址)使用租户特定的 加密密钥 进行加密存储,确保即使数据库被攻破,攻击者也无法通过单一密钥解密所有租户的数据。
2. 访问控制与身份验证
多租户环境下的身份验证需要同时验证用户身份和租户身份。
-
JWT 令牌扩展: 我们采用 JWT (JSON Web Tokens) 进行身份验证,但扩展了 Token Payload,强制包含
tenant_id信息。 -
API Gateway 校验: 所有的 API 请求在到达后端服务之前,都必须在 API Gateway 层完成 双重验证:
-
验证 Token 的有效性(签名、过期时间)。
-
从 Token 中提取
tenant_id,并将其注入到请求的 Header 中,供后续后端服务使用。
-
3. 运维与监控的多租户化
多租户运维的挑战在于区分和聚合不同租户的性能数据。
-
日志 Tagging: 所有微服务和 RPA 引擎产生的日志必须强制打上
tenant_id标签。 -
集中化监控与查询: 利用 ELK 或 Prometheus/Grafana 堆栈进行集中日志和指标收集。运营团队可以根据
tenant_id快速过滤和查询特定租户的资源使用情况、性能瓶颈和故障信息,避免"噪音"干扰。
结论:安全、高效的企业级交付
多租户架构是 QiWe 开放平台实现企业级交付的基石。通过在 容器层实现进程级隔离 、在 数据层实现行级逻辑隔离 ,以及在 应用层实现严格的访问控制,我们能够在大规模、共享资源的云环境中,为每一个企业客户提供一个既安全又高效的独立服务体验。