本文目录导读:

API 网关作为系统的统一入口,在防止越权访问方面扮演着“安全守门员”的角色,越权访问通常分为水平越权(用户A访问用户B的资源)和垂直越权(普通用户执行管理员操作)。
API 网关可以通过以下几种核心机制来有效防止越权访问:
统一的身份认证与鉴权
这是最基础的防线,网关强制每个请求必须携带有效的身份凭证(如 JWT Token、Session ID、OAuth 2.0 Token)。
- Token 校验: 网关在转发请求前,先验证 Token 的签名、有效期和发行方,无效或过期的 Token 直接拒绝,不会到达后端服务。
- OAuth 2.0 / JWT: 网关可以解析 Token 中的用户 ID、角色和权限范围,网关读取 JWT 中的
scope(权限范围)字段,判断请求是否具有访问特定 API 的权限(垂直越权)。
细粒度的权限校验
在确认身份后,网关需要校验“这个人是否有权做这件事”,这里会用到两种模式:
- 基于角色的访问控制(RBAC,Role-Based Access Control):
- 网关配置好 API 路由与所需角色的映射关系。
/api/admin/*路由只允许Role=admin的请求通过,普通用户的 Token 不包含 admin 角色,请求会被拦截。
- 基于属性的访问控制(ABAC,Attribute-Based Access Control):
- 防止水平越权的关键。 网关解析请求路径中的资源 ID(
/api/order/10086)和 Token 中的用户 ID。 - 策略: 网关可以配置规则:如果请求路径中的
order.ownerId不等于 Token 中的user.id,则拒绝。 - 注意: 复杂的业务逻辑(如“我是管理员,可以看所有订单”)通常不适合在网关硬编码,需要结合后端服务处理。
- 防止水平越权的关键。 网关解析请求路径中的资源 ID(
请求级的安全策略
网关可以对请求本身进行限制,防止通过改变参数实现越权:
- 参数校验: 网关可以校验请求 Path 或 Query(查询参数)中的 ID 格式,只允许数字 ID,不允许 SQL 注入或特殊字符路径遍历(如 )。
- 请求方法与路径限制:
- 对
POST /api/user/create强制要求管理员权限。 - 对
DELETE /api/resource/{id}强制验证当前用户是否是资源所有者。 - 阻止直接访问内部接口(如
GET /api/_internal/system_config)。
- 对
会话与令牌绑定
防止 Token 被窃取后模拟请求(即重放攻击或伪造身份):
- CSRF 防护: 对于 Cookie-Based 的认证,网关校验 CSRF Token。
- 令牌绑定: 将 Token 绑定到具体的客户端设备、IP 或 User-Agent,如果网关发现 Token 的来源 IP 与创建时的 IP 不一致,可以强制要求重新认证或直接拦截。
- 短期令牌: Access Token 的有效期通常很短(如 15 分钟),即使被窃取,攻击者利用窗口期也很短。
网络层隔离
这是防止越权的“硬隔离”:
- 内网隔离: 后端服务只监听内网或特定端口,不接受外网直接请求,所有外部请求必须经过 API 网关。
- 服务间服务账号(Service Account): 即使攻击者攻破了某个后端服务想直接调用另一个内部服务,也需要通过网关请求,并进行服务间的 mTLS(双向TLS)认证。
常见反模式与攻击案例
- 风险:仅仅转发 Token,不做解析。
- 错误做法:网关只验证 Token 是否有效,不做任何权限判断,直接将 Token+请求+路径一起转发给后端。
- 漏洞:恶意用户将 Token 中的用户 ID 从
123改成456,后端如果直接信任网关转发来的请求,就会发生水平越权。
- 风险:网关配置漏洞(如 IDOR,不安全的直接对象引用)。
- 错误做法:网关在日志或转发时泄露了内部 ID 映射关系。
- 漏洞:用户通过
/api/user/1获取自己的信息,但尝试改为/api/user/2,如果网关不校验“1”或“2”是否属于当前用户,则会产生越权。
综合防御架构示例
一个比较完善的 API 网关安全层通常是这样分层的:
- 第一层(网络层): 防火墙 + WAF(Web应用防火墙,拦截扫描、SQL注入)。
- 第二层(网关层):
- 认证: 验证 JWT 签名、颁发者、过期时间。
- 鉴权(垂直): 匹配角色(
rolevs 路由表权限)。 - 鉴权(水平): 校验资源 ID 的所有权(通常通过网关插件配合后端策略点(PDP) 或预置规则)。
- 限流熔断: 防止暴力猜解用户 ID(水平越权尝试)。
- 第三层(业务层): 后端服务仍保留最终的业务权限校验作为兜底,网关只做阻隔大部分攻击的第一道防线。
网关能做什么,不能做什么?
- 能: 做粗颗粒度、通用的安全检查(鉴权、参数校验、防重放、限流),阻断 90% 以上的水平/垂直越权尝试。
- 不能: 完全替代后端服务的业务级权限判断,特别是涉及复杂业务逻辑(如“我是同事可以看,但只能看非机密的”)、动态规则(如临时权限)等场景,仍需要在后端代码中做二次校验。
建议: 将 API 网关作为第一道防线,防住大多数自动化攻击和明显越权,但后端服务仍需保留自己的上下文权限检查作为安全兜底,实现“深度防御”。