Apache ShenYu 安全模型
本文档定义了 Apache ShenYu 的安全模型和信任边界,适用于:
- 运维人员:了解所需的部署控制措施和安全假设。
- 安全研究人员:判断某个报告的行为是否在 ShenYu 的预期信任边界内。
- ASF 安全团队:根据本模型对收到的漏洞报告进行分诊。
违反本模型的行为报告属于有效范围。假设了本模型明确排除的边界的行为报告则不在范围内。
1. 部署边界
Admin 服务(shenyu-admin)设计用于在受信任的内部网络中运行。
Admin 端口(默认:9095)不得暴露到公共互联网。Admin 服务默认绑定到 0.0.0.0,是为了方便容器化和内部网络部署;这并不意味着它对外部暴露是安 全的。
运维人员负责:
- 将 Admin 服务放置于防火墙或私有 VPC 之后。
- 使用网络级访问控制(安全组、入站规则、VPN)限制对 Admin 端口的访问。
- 在生产环境中,可选择将 Admin 服务器绑定到特定的内部地址。
将 Admin 端口暴露到公共互联网是部署配置错误,而非 ShenYu 的漏洞。
2. 认证边界
所有已认证的 Admin 用户都是完全受信任的。账号管理是安全边界。
Admin 服务使用 Apache Shiro 进行认证。一旦用户通过认证(通过用户名/密码、LDAP 或其他配置的机制),他们就被视为 ShenYu 部署的受信任操作者。
安全边界在于:
- 账号创建和凭证管理 — 只有授权人员才能创建 Admin 账号。
- 凭证存储 — ShenYu 存储的密码和密钥(例如在数据库中)必须受到保护。
已认证的 Admin 用户(包括任何拥有有效登录凭据的用户)执行的操作不属于安全漏洞。如果攻击者能够认证,则部署已经被攻破。
3. RBAC 模型
@RequiresPermissions 控制的是 UI 功能的可见性,而非已认证 Admin 用户之间的安全隔离。
ShenYu 使用 Apache Shiro 注解(@RequiresPermissions)实现了基于角色的访问控制(RBAC)系统。该系统的设计目标是:
- 简化 Admin 界面,仅向每个用户展示与其角色相关的功能。
- 通过限制哪些用户可以修改特定资源(插件、规则、选择器等),防止意外误配置。
ShenYu 中的 RBAC 不是硬安全边界。它不能防护:
- 恶意的已认证用户故意提升权限。
- 用户通过 Admin UI 以外的方式发现或调用未被分配的 API 端点。
- 同一部署的 Admin 用户之间的跨租户隔离。
所有已认证的 Admin 用户共享同一信任域。 如果需要操作者之间的严格隔离,请部署独立的 ShenYu Admin 实例。
4. WebSocket 同步通道
/websocket 端点是有意不进行认证的,必须通过网络级访问控制来保护。
Admin 服务在 /websocket 暴露一个 WebSocket 端点,供 Gateway(bootstrap)实例接收实时配置更新。该端点被明确排除在 Shiro 认证之外(参见 application.yml 中的 shenyu.shiro.white-list)。
由于 Gateway 必须连接到此端点以同步插件、选择器和规则数据,WebSocket 通道在应用层没有认证机制。此通道的安全性完全取决于:
- 网络隔离:
/websocket端点只能被受信任内部网络中的 Gateway 实例访问。 - 防火墙规则:阻止外部访问 Admin 端口,同时也就保护了 WebSocket 端点。
任何能够访问 /websocket 端点的人都可以接收 Gateway 的完整配置状态,包括插件规则、上游服务地址和认证密钥。这是有意为之:在受信任网络内,Gateway 是这些数据的合法消费者。
5. 控制面与数据面
Admin(控制面)和 Gateway(数据面)属于不同的信任域。
| 组件 | 角色 | 信任级别 |
|---|---|---|
| shenyu-admin | 控制面 — 管理配置、插件、规则、元数据 | 仅限受信任的内部网络 |
| shenyu-bootstrap | 数据面 — 处理实时流量路由、限流、认证 | 对流量暴露(面向互联网或 DMZ) |
关键含义:
- Gateway 不会隐式信任 Admin 来做运行时的流量决策。Gateway 会针对入站请求执行自己的认证、限流和路由规则。
- Admin 被攻破不会直接危及流经 Gateway 的流量,但会允许攻击者修改 Gateway 的配置(添加/删除插件、修改路由规则等)。
- Gateway 被攻破不会授予对 Admin 或其数据库的访问权限。
- WebSocket 同步通道(
/websocket)是这两个信任域之间的桥梁,必须按照第 4 节所述进行保护。
6. 数据库安全
数据库是受信任的基础设施。数据库被攻破是一个独立的安全事件,不在 ShenYu 的软件威胁模型范围内。
ShenYu 将配置、用户凭证、插件数据和元数据存储在数据库中(开发环境使用 H2,生产环境使用 MySQL/PostgreSQL)。
ShenYu 假设:
- 数据库部署在安全环境中,具有独立于 ShenYu 的访问控制。
- ShenYu 使用的数据库凭证受到保护且不对外暴露。
- 数据库网络端口不暴露给不受信任的网络。
如果攻击者获得对数据库的直接访问权限(例如通过其他应用程序的 SQL 注入、凭证泄露或网络配置错误),他们可以读取或修改所有 ShenYu 状态。这是基础设施层面的安全事件,而非 ShenYu 应用程序逻辑中的漏洞。
7. 范围总结
在范围内(请报告至 security@apache.org):
- 未经认证的远程代码执行。
- 允许无需有效凭证即可访问的认证绕过。
- Gateway(bootstrap)请求处理漏洞,可通过构造的 HTTP 流量利用。
- 允许绕过 Gateway 强制执行的认证或限流的插件级漏洞。
- 通过未经认证的 Gateway 请求路径可到达的注入攻击(SQL、命令、模板)。
不在范围内(部署或基础设施问题):
- 已认证的 Admin 用户执行的操作。
- 已认证的 Admin 用户对功能的误用(例如,Admin 用户修改了通过 RBAC 他们"不应该"访问的规则)。
- Admin 端口或 WebSocket 端点暴露给不受信任的网络。
- 拥有数据库凭证的攻击者直接访问数据库。
- 与 ShenYu 一起使用的第三方基础设施(LDAP 服务器、数据库、Kubernetes 集群)中的漏洞。