【K8s】RBAC和网络策略如何实现访问控制
这是一个值得关注的 Kubernetes 安全问题。简单来说:
RBAC:控制“谁能”在集群内“做什么”,例如:创建 Pod、删除 Service;NetworkPolicy:控制“哪个 Pod”能“访问”另一个 Pod 的“哪个端口”,例如:前端 Pod 只能访问后端 Pod 的 8080 端口。
它们一个管“账号权限”,一个管“网络流量”,共同构成了 Kubernetes 的安全体系。
一起来看看他们具体的工作方式。
1. RBAC:控制“谁能做什么”
RBAC 的工作模式是“绑定授权”,通过四个关键资源实现:
(1)Role / ClusterRole:定义了一组操作规则。ClusterRole 是集群级别的,可以跨命名空间使用。
(2)Subject:操作的发起方,可以是用户、服务账号 (ServiceAccount) 或组。
(3)RoleBinding / ClusterRoleBinding:把“规则”和“用户”绑定在一起。2. NetworkPolicy:控制“哪个 Pod 能访问哪个 Pod”。
现在我们来编辑一个yaml文件,让 my-sa 这个服务账号只能 get 和 list Pod 信息,不能删除。代码如下:

当 my-sa 尝试 kubectl delete pod 时,API Server 会检查 RBAC 规则,发现 pod-reader 规则里没有 delete 权限,就会直接拒绝这次操作。
2. NetworkPolicy:控制“哪个 Pod 能访问哪个 Pod”
NetworkPolicy 的工作模式是“白名单规则”,通过定义三个维度来控制流量:
(1)podSelector:规则作用于哪些 Pod。
(2)policyTypes:控制入站 (Ingress) 还是出站 (Egress) 流量。
(3)规则内容:允许哪类来源的 Pod(通过 namespaceSelector 或 podSelector 指定)访问本 Pod 的哪个端口。
现在我们来编辑一个yaml文件,限制 backend 命名空间中的 Pod 只能被 frontend 命名空间中的 Pod 访问,且只能访问 8080 端口。

当 frontend 命名空间的一个 Pod 访问 backend 命名空间某个 Pod 的 8080 端口时,NetworkPolicy 会放行流量。但如果用 curl http://backend-pod:22 访问 SSH 端口,或者从 database 命名空间发起访问,网络插件就会直接拒绝或丢弃这些数据包。
4. 实际配合场景
通常需要两者配合才能实现完整的安全隔离。例如,我们现在要求:只允许 监控服务 的 ServiceAccount 访问 metrics Pod。
那么,RBAC 的工作是:防止用户用 kubectl exec 登入 Pod。只有 监控服务 的 ServiceAccount 才有权限访问 metrics 这个 API 资源。
NetworkPolicy 负责在底层阻断网络。即使有人盗用了 监控服务 的账号,试图从另一个 Pod 发起网络请求,NetworkPolicy 也会在 TCP/IP 层面拦截该网络包。
5.总结
RBAC防护的是 API Server,是对“操作”本身的许可。可以理解为用户登录系统后的操作权限。
NetworkPolicy防护的是 Pod 网络,是对“流量”的隔离。可以理解为不同服务器之间的防火墙规则。
它们处理的是不同层面的安全问题,没有重叠,也不能相互替代。
更多推荐

所有评论(0)