随着基于容器的技术迅速得到采用,组织日益关注Kubernetes集群的安全性。虽然云和企业发行版提供了可靠的安全功能,但它们需要根据组织的安全要求进行调整。
本文将介绍保护Kubernetes集群需要考虑的三个基本方面:
- 基于角色的访问控制(RBA)
- 开放策略代理(OPA)
- 网络策略
基于角色的访问控制
假设一家组织有三个应用程序团队(蓝队、绿队和红队)。由于这些团队开发不同的产品,应该授予它们访问Kubernetes集群的不同权限。比如说,绿队和红队不应查看、访问或删除蓝队部署的集群。
RBAC是一种控制用户可以访问哪些Kubernetes资源的方法。虽然RBAC在默认情况下启用,但必须加以配置才能使用它。
RBAC有五个关键要素:
- 主题——用户和进程
- 资源——应限制访问的对象
- 动作——可以执行的操作(常常名为动作)集合
- 角色——将API资源与动作连接起来的对象
- 角色绑定——将角色与主题连接起来的对象
不妨回到前面的那家组织,定义只有蓝队才能创建、删除和列出Pod、部署(Deployment)和服务(Service)的策略。
我们先创建一个名为“role-blue”的角色对象,我们在其中定义可以对特定的Kubernetes资源执行的操作。在这个特定情况下,角色允许对资源:Pod、部署和服务执行“创建”、“删除”和“列表”等操作。
接下来,我们创建一个名为“blue-rb”的角色绑定。这个角色绑定属于“blue-ns”,它将上面创建的角色“role-blue”与名为“blue”的蓝队联系起来。
一旦将这些资源运用到集群,“blue”团队的用户就能够执行“role-blue”中定义的操作。
开放策略代理
开放策略代理(OPA)是一种通用策略引擎,可以跨整个堆栈统一策略实施。它的高级声明性语言提供了将策略指定为代码的灵活性。您可以使用OPA在Kubernetes、CI/CD管道或API 网关中实施策略。不妨深入了解如何在Kubernetes中使用和实施它。
Kubernetes实施OPA的机制名为Gatekeeper。它被设计和部署成准入控制器,负责拦截请求、处理请求,并返回允许或拒绝的响应。
如果允许,对象会部署到集群上;否则,请求将被拒绝,并向用户提供反馈。管理员可以定义策略,指示Kubernetes限制容器或命名空间可以消耗的内存或CPU等资源,仅批准基于来自特定注册中心的镜像的容器,限制NodePort服务创建,或执行标准命名。
比如说,这是一个示例模板和约束策略,只有在命名空间中配置ResourceQuota后才允许创建Pod。
网络策略
网络策略与常规防火墙非常相似,不同之处在于它们以应用程序为中心。您为应用程序定义网络策略后,Kubernetes会自动将这些规则运用于关联的容器,这是由于容器会在高度动态的环境中不断创建和终止。网络策略控制进出这些容器的流量。
默认情况下,进出Pod的网络流量不受限制。一个好的开头是设置拒绝所有流量的规则,然后只允许必要的流量。
默认情况下,Kubernetes使用平面网络结构,允许任何Pod与集群中的其他Pod或服务进行通信。在有多个应用程序或多级应用程序的集群中,纵深防御在保护通信层方面起到了关键作用。网络策略使我们能够做到这一点。
这是一个“app1-network-policy”,它在“blue”命名空间中为标签为“role=db”的Pod运用以下规则:
- [Ingress] 允许通过端口6379的来自ipBlock 172.17.0.0/24的连接。
- [Ingress] 如果来自其他Pod的连接被标记为“role=frontend”,并且如果属于端口6379上带有标签“project=myproject”的命名空间,允许这些连接。
- [Egress] Pod可以通过5978端口与IP范围为10.0.0.0/24的其他Pod进行通信。
原文标题:3 key elements to protect a Kubernetes cluster,作者:Avinash Desireddy