Kubernetes部署的最佳安全实践

内存溢出
• 阅读 4149

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

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

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

以下是我们部署安全的Kubernetes应用的建议:

◆ 确保镜像没有漏洞

运行有漏洞的容器使你的环境会遭受损害的风险。许多攻击可以简单地通过将软件升级为没有漏洞的版本来避免。

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

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

使用Kubernetes滚动升级功能升级容器非常简单,该功能允许通过升级镜像到最新版本来逐步更新正在运行的容器。

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

如果无法保证只运行符合组织策略的镜像,那么组织会面临运行脆弱甚至恶意容器的危险。从未知的来源下载和运行镜像是危险的,它相当于在生产服务器上运行未知服务商的软件,所以千万别这样做!

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

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

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

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

应该限制SSH登陆Kubernetes节点,减少对主机资源未授权的访问。应该要求用户使用“ kubectl exec ”命令,此命令能够在不访问主机的情况下直接访问容器环境。

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

◆ 创建资源间的管理界限

限制用户权限的范围可以减少错误或恶意活动的影响。Kubernetes 命名空间允许将资源划分为逻辑命名组。在一个命名空间中创建的资源对其他命名空间是隐藏的。

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

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

Kubernetes部署的最佳安全实践

◆ 定义资源配额

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

默认情况下,Kubernetes 集群中的所有资源没有对CPU 和内存的使用限制。你可以创建资源配额策略,并附加到Kubernetes命名空间中来限制Pod对CPU和内存的使用。

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

compute-resources.yaml:

Kubernetes部署的最佳安全实践

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

Kubernetes部署的最佳安全实践

◆ 实现网络分段

在相同的Kubernetes集群上运行不同的应用程序会导致恶意程序攻击其他应用程序的风险。所以网络分割对确保容器只与那些被允许的容器进行通信很重要。

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

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

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

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

Kubernetes部署的最佳安全实践

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

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

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

Kubernetes部署的最佳安全实践

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

Kubernetes部署的最佳安全实践

◆ 记录所有的事情

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

◆ 总结

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

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

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

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

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

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
Minikube之Win10单机部署
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作。如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes底层使用的组件,Kubernetes是Docker的上层封装,通过它可以很方便的进行Docker集群的管理。今天我们使用minikube在单机上进行Kubern
Stella981 Stella981
3年前
Kubernetes 部署 Nebula 图数据库集群
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。<br/Kubernetes在设计结构上定义了一系列的构建模块,其目的是为了提供一个可以部署、维护和扩展应用程序的机制,组成Kubernetes
Stella981 Stella981
3年前
Kubernetes的四种用户部署场景,你知吗?
Kubernetes可以作为容器编排引擎、PaaS或者作为云原生应用的核心基础架构被用户部署到生产环境。这些用例并不是相互排斥的。DevOps可以委托基于Kubernetes的PaaS层完成整个应用生命周期的管理(ALM),也可以独立部署Kubernetes管理CI/CD工具部署的应用。对于新应用程序可以使用Kubernetes管理微服务架构的云原始应用,支
Stella981 Stella981
3年前
OpenKruise:阿里巴巴 双11 全链路应用的云原生部署基座
简介:Kruise是Cruise的谐音,'K'forKubernetes,寓意Kubernetes上应用的航行和自动巡行,它满载着阿里巴巴多年在大规模应用部署、发布与管理最佳实践,以及阿里云Kubernetes服务数千客户的需求沉淀。来源|阿里巴巴云原生公众号(https://www.oschina.net/acti
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
可莉 可莉
3年前
15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布
本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署JenkinsXPlatform并结合demo实践演示GitOps的操作流程。注意:本文中使用的jx工具、cloudenvironments等做过改造用以适配阿里云Kubernetes容器服务,并未在自建Kubernetes集群中做过验证。先决条件:首先,
Stella981 Stella981
3年前
Kubernetes入门篇
前言随着越来越多的公司使用Kubernetes作为它们运行应用的最佳平台,Kubernetes帮助企业标准化了无论是云端部署还是内部部署的应用交付方式;作为研发人员我们还是很有必要去了解其使用方式,了解其内部机制,接下来的一段时间准备通过阅读<KubernetesinAction来更多的了解Kubernetes。Docker安装
3A网络 3A网络
2年前
三艾云 Kubernetes 集群最佳实践
三艾云Kubernetes集群最佳实践三艾云Kubernetes集群最佳实践容器是CloudNative的基石,它们之间的关系不言而喻。了解容器对于学习CloudNative也是十分重要的。近期,三艾云Cloud