ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

为什么 NetworkPolicy 不够?kube-rbac-proxy 安全模型深度剖析

为什么 NetworkPolicy 不够?kube-rbac-proxy 安全模型深度剖析 为什么 NetworkPolicy 不够?kube-rbac-proxy 安全模型深度剖析【免费下载链接】kube-rbac-proxyKubernetes RBAC authorizing HTTP proxy for a single upstream.项目地址: https://gitcode.com/gh_mirrors/ku/kube-rbac-proxy很多 Kubernetes 新手在保护应用时第一反应就是加一条 NetworkPolicy以为有了网络隔离就万事大吉。但真相是NetworkPolicy 并不能真正回答谁在访问这个问题它只回答了从哪里访问。本文要深度剖析的kube-rbac-proxy正是为解决这一短板而生的 Kubernetes RBAC 授权 HTTP 代理——它基于 SubjectAccessReview 实现了身份级访问控制是保护 Prometheus 指标端点等场景的经典安全组件。一、先搞懂NetworkPolicy 到底保护了什么NetworkPolicy 是 Kubernetes 提供的网络层隔离机制它的工作方式非常简单粗暴基于IP 地址 端口控制流量只关心数据包从哪里来、到哪里去完全不关心发请求的人是谁、有没有权限换句话说NetworkPolicy 相当于小区门口的门禁——只要你的 IP 在名单里就能进至于进门之后你是谁、想干什么它一概不管。这种无身份的隔离模式正是它最大的局限所在。二、为什么 NetworkPolicy 不够用?3 个关键原因结合 kube-rbac-proxy 官方文档中的说明NetworkPolicy 至少有三大硬伤原因 1NetworkPolicy 并非所有集群都支持NetworkPolicy 依赖 CNI 插件的实现并非所有云厂商、安装工具和发行版都默认支持。这意味着你在文档上画好的隔离规则换一个集群环境可能静默失效——这本身就是巨大的安全隐患。原因 2hostNetwork Pod 直接绕过隔离NetworkPolicy不适用于启用 hostNetwork 的 Pod。例如 Prometheus 监控栈中的 node-exporter 常需要 hostNetwork这类 Pod 一旦被攻破网络策略形同虚设。原因 3网络隔离 ≠ 身份授权这是最核心的一点NetworkPolicy 无法识别是谁在访问。只要 Pod 之间网络互通任何一个被攻破的 Pod 都能直接访问其他应用而 kube-rbac-proxy 这类代理则要求每一个请求都必须通过身份认证和 RBAC 授权否则直接拒绝。三、kube-rbac-proxy 是什么?安全代理的定位kube-rbac-proxy 是一个只面向单个上游服务的小型 HTTP 代理通常以sidecar 容器的形式与应用同 Pod 部署。它的设计初衷是在 Kubernetes 集群内部网络默认全互通的前提下把谁能访问某个服务的控制权从网络层提升到Kubernetes RBAC 权限层。其核心机制是调用 Kubernetes API 的SubjectAccessReviewSAR和TokenReview完成认证与授权具体部署示例可以参考 examples/non-resource-url/deployment.yaml。四、kube-rbac-proxy 安全模型深度剖析:认证→授权→转发kube-rbac-proxy 的安全模型可以概括为一条不可跳过的过滤链主流程在 cmd/kube-rbac-proxy/app/kube-rbac-proxy.go 中串联过滤器实现位于 pkg/filters/auth.go客户端请求 → 认证(AuthN) → 授权(AuthZ) → 反向代理转发 → 上游服务第一步:认证(AuthN)——确认你是谁请求到达后kube-rbac-proxy 先解决身份问题支持三种方式Bearer Token调用TokenReview交给 Kubernetes 验证逻辑见 pkg/authn/delegating.go客户端证书(mTLS)校验客户端证书是否由配置的 CA 签发并提取 CommonName 作为身份OIDC对接 OpenID Connect直接验证 JWT实现用户级认证认证失败直接返回401 Unauthorized请求根本走不到授权环节。第二步:授权(AuthZ)——确认你能做什么身份确认后kube-rbac-proxy 把请求转换成一组授权属性用户、动作、资源、命名空间等再发起SubjectAccessReview交给 Kubernetes RBAC 引擎裁决核心代码在 pkg/authz/auth.go。它支持两种授权配置动态授权通过 SAR 实时查询 Kubernetes RBAC 规则权限变更即时生效静态授权在配置文件中写死允许的用户、动作与资源不依赖集群 RBAC适合离线场景授权不通过直接返回403 Forbidden并附带拒绝原因方便排查。第三步:代理转发——安全通过后才放行只有认证和授权双双通过的请求才会被反向代理转发给上游服务。代理还会把用户身份通过请求头如x-remote-user、x-remote-groups传递给上游供应用层做进一步处理参见 pkg/filters/auth.go 中的WithAuthHeaders。五、NetworkPolicy 与 kube-rbac-proxy 对比:一张表看懂差异对比维度NetworkPolicykube-rbac-proxy控制层级网络层IP/端口身份层用户/RBAC 权限是否识别身份❌ 不识别✅ TokenReview / mTLS / OIDC授权粒度无授权概念细粒度verb resource namespace依赖 CNI 支持✅ 依赖❌ 不依赖抵御内鬼横向移动部分强无权限即拒绝典型场景大范围网络隔离保护指标端点、敏感服务两者其实是互补关系用 NetworkPolicy 做第一道粗粒度防线再用 kube-rbac-proxy 做第二道身份级防线形成纵深防御。六、什么时候该用 kube-rbac-proxy?保护 Prometheus 指标端点这是它的诞生场景防止被攻破的 Pod 窃取 node-exporter、kube-state-metrics 等敏感数据需要用户级授权的内部服务例如让特定运维账号才能访问管理接口Kubernetes API 负载优化与其让每个客户端直连 apiserver 做授权不如由代理统一裁决减轻 API 压力它甚至可以与 Envoy/Istio 组合使用Envoy 负责入口流量kube-rbac-proxy 负责 K8s 原生 RBAC 授权两者并不冲突。七、安全使用的最佳实践优先使用 mTLS 认证官方明确建议客户端证书认证的安全性优于 Token谨慎使用 Token 认证接收方拿到 Token 后可冒充客户端务必只给代理授权用的低权限 Token切勿传递高权限凭证设置 token audiences通过--auth-token-audiences限制 Token 的受众范围降低滥用风险始终启用 TLS--insecure-listen-address已被标记废弃生产环境必须走 HTTPS总结NetworkPolicy 管的是路kube-rbac-proxy 管的是人。前者保证恶意流量难以抵达后者保证即使抵达也无法越权执行任何操作。对追求安全可靠 Kubernetes 集群的你来说把 kube-rbac-proxy 作为 sidecar 部署在敏感服务前是实现最小权限原则的绝佳选择——这也是它成为 Prometheus 生态标配安全组件的原因。动手实践时可以 clone 仓库查看全部示例https://gitcode.com/gh_mirrors/ku/kube-rbac-proxy从 non-resource-url 和 resource-attributes 两个示例开始很快就能上手。【免费下载链接】kube-rbac-proxyKubernetes RBAC authorizing HTTP proxy for a single upstream.项目地址: https://gitcode.com/gh_mirrors/ku/kube-rbac-proxy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表