目录
安全必须是任何DevOps流程的一等公民。Kubernetes越来越受欢迎,他的安全性也越来越被组织重视。
Kubernetes中的安全性是一种实践,而不仅仅是一项功能。安全是一个多维问题,必须从不同的角度来解决。
Kubernetes的安全性可以定义为以下四个方面:
- Infrastructure(基础设施)
- Kubernetes自身
- Containers(容器)
- Applications(应用)
Kubernetes安全的4个方面
基础设施的安全性
基础设施的安全性通常是最基本的任务,也是最重要的任务。但是,在开发过程中经常会忽略它。组织在构建应用程序时,请务必牢记基础架构的安全性,因为它会影响应用程序的架构方式。
基础设施安全涉及多个方面:
1.网络
Kubernetes部署的主要是微服务,同时微服务内部和不同微服务之间都需要通信。因此,组织需要考虑网络设计的各个方面,以确保网络的安全。
- 流量隔离: Kubernetes控制平面流量必须与数据平面流量隔离。这不仅出于安全原因,而且还避免数据流量影响Kubernetes控制平面流量。
- 隔离存储流量:类似地,需要将存储流量与常规数据流量隔离开来,以使基础架构中的存储服务不会消耗或中断应用程序网络,反之亦然。
- 网络细分: Kubernetes对用户隐藏了基础架构,开发人员在设计网络时应牢记这一事实。底层网络基础架构,应该必须同时支持基于第2层VLAN的分段和基于第3层VXLAN的分段,以隔离不彤租户或应用程序之间的流量。
- 服务质量:在共享的网络基础架构中, noisy neighbors 是一个大问题。因此,能够保证指定Pod或租户的服务水平,同时确保一个Pod的流量不会影响其他Pod,这样的网络基础架构很重要。诸如SR-IOV之类的网络虚拟化技术,可以帮助在共享基础架构上提供虚拟化隔离。
- 网络策略,防火墙和ACL: 我们将在下文更详细地讨论这些,包括应用程序级别的网络访问控制。
2.存储
对于任何组织来说,存储都是安全性里的关键部分。黑客通常会攻击应用程序存储库中保存的机密数据,例如信用卡信息或个人身份信息。使用Kubernetes的开发人员,应该从以下几个方面确保存储的安全性。
- 自加密驱动器( Self Encrypting Drives ): 存储安全的一种保障是自加密驱动器。使用这些自加密驱动器,加密就转移到磁盘本身上,数据在写入磁盘时就能得到加密。这样可以确保即使有人物理访问磁盘驱动器,他们也将无法访问数据。
- 存储卷加密:Kubernetes CSI管理存储卷的生命周期,这样可以将用户与基础存储架构隔离开。同时,存储卷加密可以保护各个存储卷,以防止不安全的访问。
- 服务质量:在共享的存储基础架构中,大量I/O应用程序可能会影响其他应用程序的性能。因此,能够保证指定Pod或租户的服务水平,同时确保一个Pod的流量不会影响其他Pod,这样的存储基础架构很重要。同样,SR-IOV有助于在PCI级别提供存储隔离。
3.主机和操作系统
组织应该通过以下方式来保护主机和操作系统的安全:
- 操作系统:站点可靠性工程师( Site Reliability Engineers,SREs)应遵循安全准则来保护主机操作系统。SRE还应该使用防火墙,端口阻止等安全措施。系统常规安全更新和修补程序在可用后,必须立即应用,这样就可以防止黑客和入侵者利用已知漏洞。
- 启用内核安全性: SELinux和AppArmor之类的内核安全性模块,定义了系统上的应用程序,进程和文件的访问控制。
- 审核和日志记录:使用Kubernetes的组织应该要有审核和日志记录,这样不仅可以帮助监视系统,还有助于分析安全漏洞。
- 凭证轮换:用户凭证必须经常更换,并且要遵循严格的安全准则,以免被破解或被盗。
- 锁定节点:在Kubernetes集群中配置节点后,除了补丁和升级外,无需安装或配置任何新内容。因此,所有节点都必须锁定,并且只能由超级管理员访问,以此来增强安全性。
- CIS一致性: 网络安全中心( Center for Internet Security,CIS )提供了一致性测试。组织需要查看你的主机设置,并通过一致性测试以确保安全。
4.主机访问管理
Kubernetes集群最薄弱的是节点本身。由于Kubernetes将用户与基础节点隔离开来,因此节点访问控制非常重要。
- 严格访问:组织应将对节点的root/admin访问权限,限制为几个受信任用户。
- 锁定节点:即使对于非root用户,应将其限制为通过Kubernetes API服务器进行访问。为了避免对节点上的Kubernetes服务造成任何威胁,应锁定所有节点。
- 隔离Kubernetes节点: Kubernetes节点必须位于隔离的网络上,并且绝对不能直接暴露给公共网络。。否则对数据平面的开放访问意味着对控制平面的开放访问。理想情况下,应该将节点配置为仅接受来自主节点指定端口的连接。
- 主节点:主节点访问必须要有网络访问控制列表。
Kubernetes的安全性
在确保基础架构安全的情况下,增强安全的下一步就是Kubernetes自身。
1.etcd
etcd是高可用的键值存储,用作存储Kubernetes集群的所有状态,密钥和信息,这就意味着确保etcd安全非常重要。
- etcd中的节点应该被授予最小的访问权限。
- 应该加密包含etcd数据的驱动器。
- 对etcd的访问必须仅限于主节点。
- etcd的通信应该要有TLS。
2.Kubernetes集群的访问
Kubernetes访问控制可以细分为以下方面。
- 身份验证:用户必须先经过身份验证,然后才能访问Kubernetes API。Kubernetes提供了各种身份验证模块-包括客户端证书,密码,普通令牌,引导令牌和JWT令牌。这就要求组织与LDAP,Active Directory或其他身份验证解决方案集成非常重要。
Kubernetes中基于角色的访问控制
- 授权:验证用户身份(即允许其连接到Kubernetes集群)后,下一步是授权,以确定对所请求资源的访问权限。Kubernetes支持多种授权模块,例如基于属性的访问控制(ABAC),基于角色的访问控制(RBAC)和Webhooks。RBAC是最受欢迎的授权插件之一,因为它允许在多租户环境中对单个Kubernetes资源进行精细控制。
- 准入控制:准入控制,是在用户经过身份验证并被授权访问所请求的资源之后,拦截和控制Kubernetes请求。准入控制的最佳示例是资源配额。
- TLS:还必须通过TLS保护对Kubernetes API服务器的访问。
3.安全策略
Kubernetes提供了一些可自定义的安全策略,但默认情况下未启用。
- Pod安全策略:是一个准入控制插件,确保遵循一定的安全准则时pod才能被调度成功。可以定义的策略包括:限制特权Pod的创建,阻止容器作为root用户运行或限制对某些名称空间,网络或存储卷的使用。
- 网络策略:由容器网络接口(CNI)插件实现,该插件控制pod如何通信。设置pod网络策略非常重要,因为默认情况下pod网络是非隔离的,它们接受来自任何地方的流量。
- 质量保证:Kubernetes为计算资源(CPU和内存)提供服务质量(QoS)保证,以避免资源匮乏的问题,但它不为I/O(存储和网络)提供QoS。Diamanti等超融合平台增加了对I/O 和QoS的服务质量支持。
4.工作负载隔离
在多租户环境中,每个租户必须要有单独的名称空间,以使工作负载和数据彼此隔离。CNI,CSI和身份验证插件需要支持这些隔离。
容器的安全性
容器在开发过程中和运行时都需要加以保护。
1.容器镜像安全
所有正在运行的容器均基于镜像文件,该镜像文件可以从诸如Docker Hub之类的仓库中下载。
- 镜像漏洞扫描:必须使用Aqua,Twistlock,Sysdig和Clair等工具对正在构建的容器镜像进行扫描以查找已知漏洞。这些工具可以解析镜像中的程序包和依赖项,来查找已知的漏洞。
- 镜像签名:组织还应执行严格的准入控制策略,仅允许通过组织签名的镜像。TUF和Notary是用于容器镜像签名的有用工具。
- 限制特权容器:此外,组织应避免在容器镜像中使用root用户,并防止特权升级。
2.容器运行时(Container Runtime)
今天,大多数环境都使用Docker,而新的运行时(如CRI-O)具有内置的安全功能。
3.运行中的容器
Twistlock,Aqua和Sysdig等许多工具,通过监视网络和系统调用,为运行中的容器,提供连续监视和威胁预防。这些工具还具有拦截和阻止非法调用,确保安全的能力。
应用程序的安全性
应用程序的安全性也很重要。
1.应用程序访问
- Kubernetes Ingress 的TLS:将你的应用程序暴露给集群外部,最常见做法是使用入口控制器( ingress controller ),例如Envoy或NGINX。所有对入口控制器的外部访问都必须通过TLS,并且入口控制器( ingress controller )与应用程序容器之间的通信也应使用TLS。
- 加密传输中的所有内容:除少数情况外,默认应加密传输中的所有内容。Istio和Linkerd等许多服务网格提供了mTLS选项,以自动加密Kubernetes集群中的流量。
2.通信
- 网络: Istio,Linkerd和Consul等服务网格提供了7层网络功能,从而可以限制和控制多个租户之间的流量。
- 端口:仅在应用程序/容器上公开必要的端口,这一点很重要。
3.应用强化
CI/CD管道中应内置许多DevOp实践,以确保应用程序安全:
- 定期分析源代码,以避免漏洞和威胁。有许多可用的工具,例如Veracode和Synopsys。
- 定期扫描代码依赖项以查找新漏洞,以确保它们不会威胁到应用程序的安全。
- 持续测试你的应用程序,是否受到常见攻击,例如SQL注入,DDoS攻击等。
综上所述
安全始终是组织的头等大事。
在容器和Kubernetes的新时代,拥有强大的安全非常重要。因此,从一开始就应该将安全性纳入开发周期。
译文链接: https://thenewstack.io/a-security-checklist-for-cloud-native-kubernetes-environments/