一起检查允许路径与拒绝条件
一句话总结
获取认证信息,与只有满足这些信息才放行,是两件不同的事。本实验对比四个带有真实 Istio sidecar 的支付服务,调查“多加了一个策略,可访问的请求反而增多”这一事故。
为什么需要它
假设有个团队让只有 orders 服务能调用支付 API。安全检查提出还需要用户 JWT。团队保留了原有的工作负载放行策略,又新增了一个放行带有 JWT 主体的请求的策略,并把文件命名为 require-jwt。评审时大家以为,两个策略都读过了,条件就变成了两个。
然而无令牌的 orders 请求仍然一直通过。更令人吃惊的是,带着正常令牌的 stranger 也通过了。文件名并不是执行语义。服务器评估的是策略的组合。在已有放行与新放行只要满足其一就会打开的情况下,新增策略可能只是多开了一扇门。
这不只是把 YAML 里的一个词换掉这么简单。必须确认请求的来源、用户令牌、方法、路径、端口,各自绑定在哪个条件上。只发一个成功请求,是看不出这起事故的。必须把正常用户成功的条件和陌生用户失败的条件,放在同一张表里。
工作原理
实验 VM 的 ica-policy 命名空间中有 orders 和 stranger 两个客户端,分别使用不同的 ServiceAccount。baseline、union、intersection、scoped 是给出相同响应的四个服务器,但可以各自独立地挂上策略。实验不连接外部 IdP,而是使用在 VM 中生成的 RSA 密钥和合成 JWT。请不要带入真实的用户令牌或生产密钥。
| 对比对象 | 要调查的问题 |
|---|---|
| baseline | 只有工作负载放行时,无令牌的 orders 会怎样? |
| union | 单独新增 JWT 放行,stranger 和其他路径也会被打开吗? |
| intersection | 在同一个 source 中放入两种身份,会有什么不同? |
| scoped | 应用“无 JWT 则 DENY”时,如何保留其他端口? |
principals 是通过 mTLS 确认的工作负载身份,requestPrincipals 是已验证 JWT 的请求主体。这两个值不是同一个人的不同名字。它们分别对应服务器之间连接的来源,以及通过该连接传来的用户主张。同一个 source 的各字段可以一起要求,但如果把 from 条目拆成两个,含义就不同了。请想象一下一个条目内的结合与列表中的选择,各是什么样子。
ALLOW 策略之间,看的是是否有任意一条路径匹配。使用 DENY 时,先检查拒绝条件,对于没有被拒绝的请求,再让已有的最小权限放行生效,以此设计。本实验的 scoped 只拒绝无令牌的 8080 请求。不会说它连 8081 也保护了,而是作为一个对比案例保留下来,事实上 orders 无令牌的 8081 请求是被允许的。
端口范围不是附带的装饰。设计使用 HTTP 专用属性的 DENY 时,还必须考虑对其他协议和端口的影响。这里只实测两个 HTTP 端口。不要把实验结果扩大说成验证了整个 TCP 乃至 ambient 网格。
在现场相遇的样子
评审策略变更申请时,先用一句简短的话写下需求。例如“只允许从 orders 发出、带有经过验证的支付用 JWT、到达 POST /v1/charges 的请求”。然后确认被逗号分隔的各个条件是否绑在同一条规则里,以及其他放行策略是否绕过了这些条件。最后发送把这句话中的词逐个替换的请求。如果把来源换成 stranger、把令牌换成没有、把路径换成 /admin/test,结果仍然相同,就可能没有充分实现需求。
只收集 403 也确定不了原因。在本次固定版本的实测中,其他 audience 的令牌也给出 403,但正文是 JWT audience 拒绝,而工作负载身份或路径的授权拒绝则是 RBAC 拒绝。相反,过期、其他签发者、格式错误是 401。必须把响应码、正文、已应用的策略一起记录下来,下一个人才不会把 JWT 验证与授权混淆。
策略保存成功,并不等于数据平面已经生效。本实验的评分还会确认同一批请求是否连续两次一致。如果刚 apply 之后就失败,先用观测命令查看当前响应,待传播收敛之后再重新评分。为了消除失败而放宽条件,不叫恢复。
下一项实验要做什么
先记录六个 Pod 当前的 UID。接着对比 baseline 和故意做错的 union,并正确配置 intersection 和 scoped。intersection 最初的 audience 列表放得很宽,同时允许支付用和其他 API 用,所以要收窄到只剩支付用一个。最后留下端口边界的实测和事故报告。
四个对比对象会一直保留到最后。因此整体评分不会相信之前步骤留下的历史成功标记,而是重新检查当前状态。不过 union 是为复现事故而故意放宽的隔离对象,请不要把这种配置搬到生产环境。VM 终止后,合成密钥和工作文件也会一起被回收。
通过官方文档进一步确认
- AuthorizationPolicy:策略组合、Source 字段结合、DENY 的端口范围。
- RequestAuthentication:issuer、audiences、公钥材料的含义。
- JWT 授权实验:分开验证认证与授权的官方示例。