Kubernetes部署的最佳安全实践

编者按:本文是由 Aqua Security 的Amir Jerbi 和Michael Cherny 所写,基于他们从本地和云端上收集到的实际数据,描述了Kubernetes 部署的最佳安全实践。html

Kubernetes提供了许多能够极大地提升应用程序安全性的选项。配置它们要求你熟悉 Kubernetes 以及其部署的安全要求。前端

咱们在这里强调的最佳实践与容器生命周期相匹配:构建、分发和运行,并专门为Kubernetes量身打造。咱们在运行在Google云平台的kubernetes上使用了这些安全实践。git

如下是咱们部署安全的Kubernetes应用的建议:github

◆ 确保镜像没有漏洞

运行有漏洞的容器使你的环境会遭受损害的风险。许多攻击能够简单地经过将软件升级为没有漏洞的版原本避免。后端

实现Continuous Security Vulnerability Scanning (持续安全漏洞扫描)——容器可能包括含有已知漏洞(CVE)的过期包。新的漏洞天天都会发布,因此这不是一个“一次性”的工做,对镜像持续进行安全评估是相当重要的。安全

按期对环境进行安全更新,一旦发现运行中容器的漏洞,你应该及时更新镜像并从新部署容器。尽可能避免直接更新(例如, ‘apt-update’ )到正在运行的容器,由于这样打破了镜像与容器的对应关系。服务器

使用Kubernetes滚动升级功能升级容器很是简单,该功能容许经过升级镜像到最新版原本逐步更新正在运行的容器。微信

◆ 确保在你的环境中只使用受权镜像

若是没法保证只运行符合组织策略的镜像,那么组织会面临运行脆弱甚至恶意容器的危险。从未知的来源下载和运行镜像是危险的,它至关于在生产服务器上运行未知服务商的软件,因此千万别这样作!网络

使用私有镜像存储你的合法镜像,这样能大量减小可能进入到你的环境的镜像数量。将成安全评估(如漏洞扫描)加入持续集成(CI)中,使其成为构建流程的一部分。frontend

持续集成应确保只使用审查经过的代码来构建镜像。当镜像构建成功后,要对它进行安全漏洞扫描,而后只有当没有发现问题时,镜像才能被推送私有镜像仓库。在安全评估中失败的镜像不该该被推送到镜像仓库中。

Kubernetes镜像受权插件的工做已经完成(预计随kubernetes 1.4发布)。该插件容许阻止未受权镜像的分发。具体请查看此PR (https://github.com/kubernetes...)。

◆ 限制对Kubernetes 节点的直接访问

应该限制SSH登录Kubernetes节点,减小对主机资源未受权的访问。应该要求用户使用“ kubectl exec ”命令,此命令可以在不访问主机的状况下直接访问容器环境。

你可使用kubernetes受权插件来进一步控制用户对资源的访问。它容许设置对指定命名空间、容器和操做的细粒度访问控制规则。

◆ 建立资源间的管理界限

限制用户权限的范围能够减小错误或恶意活动的影响。Kubernetes 命名空间容许将资源划分为逻辑命名组。在一个命名空间中建立的资源对其余命名空间是隐藏的。

默认状况下,用户在Kubernetes 集群中建立的每一个资源运行在名称为“default”的默认空间内。你也能够建立额外的命名空间并附加资源和用户给它们。你可使用Kubernetes 受权插件来建立策略,以便将不一样用户的访问请求隔离到不一样的命名空间中。

例如:如下策略将容许 ‘alice’ 从命名空间 ‘fronto’ 读取pods。

◆ 定义资源配额

运行没有资源限制的容器会将你的系统置于DoS或被其余租户干扰的风险中。为了防止和最小化这些风险,你应该定义资源配额。

默认状况下,Kubernetes 集群中的全部资源没有对CPU 和内存的使用限制。你能够建立资源配额策略,并附加到Kubernetes命名空间中来限制Pod对CPU和内存的使用。

下面的例子将限制命名空间中Pod 的数量为4个,CPU使用在1和2之间,内存使用在1GB 和 2GB 之间。

compute-resources.yaml:

分配资源配额到命名空间:

◆ 实现网络分段

在相同的Kubernetes集群上运行不一样的应用程序会致使恶意程序攻击其余应用程序的风险。因此网络分割对确保容器只与那些被容许的容器进行通讯很重要。

Kubernetes 部署的挑战之一是建立Pod,服务和容器之间的网络分段。缘由在于容器网络标识符(IP地址)动态的“天性”,以及容器能够在同一节点或节点间进行通讯的事实。

谷歌云平台的用户受益于自动防火墙规则,可以防止跨集群通讯。相似的实现可使用网络防火墙或SDN解决方案部署。这方面的工做由Kubernetes 网络特别兴趣小组(Special Interest Group)完成,这将大大提升 pod到pod 的通讯策略。

新的网络策略API应该解决 Pod之间建立防火墙规则的需求,限制容器化能够进行的网络访问。

下面展现了只容许前端(frontend)Pod访问后端(backend)Pod的网络策略:

点击这里(http://blog.kubernetes.io/201...)阅读更多网络策略的内容。

◆ 将安全环境应用到你的Pods和容器中

当设计你的容器和 pods时,确保为你的pods,容器和存储卷配置安全环境。安全环境是定义在yaml文件中的一项属性。它控制分配给 pod/容器/存储卷的安全参数。一些重要的参数是:

如下是一个具备安全环境参数的pod 定义示例:

◆ 记录全部的事情

Kubernetes提供基于集群的日志,容许将容器活动日志记录到一个日志中心。当集群被建立时,每一个容器的标准输出和标准错误均可以经过运行在每一个节点上的Fluentd 服务记录到Stackdriver或Elasticsearch中,而后使用Kibana进行查看。

◆ 总结

Kubernetes 对建立安所有署提供多种选择,没有适合全部状况的万能解决方案,因此熟悉这些安全选项、了解它们如何提升应用程序安全性是很重要的。

咱们推荐这篇文章中提到的安全实践,将Kubernetes的灵活配置能力加入到持续集成中,自动将安全性无缝融合到整个流程中。

时速云每两周将于微信群进行技术分享,感兴趣的小伙伴能够添加微信号(tenxcloud6)时速云小助手,而后咱们会拉您进群

本文由时速云翻译,如若转载,需注明转载自“时速云

原文连接: http://blog.kubernetes.io/201...