作者:万宏明,KubeSphere member,负责 KubeSphere 安全和多租户团队
随着 K8s 在生产和测试环境中用的越来越多,对安全性的关注也会越来越多,所以本文主要是给大家分享以下内容:

这张图是 CNCF 金融用户小组总结的 K8s 信任边界图,它把在 K8s 环境中的信任边界划分成三大块儿。
我们根据不同的攻击类型划分,首先最容易规避的就是来自外部的攻击。通常情况下,来自外部的攻击会有 2 种类型:
一种是系统层面的漏洞,需要及时更新,及时跟进 K8s 社区和安全领域相关的最新消息,可以很好的规避。
第二个是应用本身带来的渗透或者是提权的风险,业务部署在 K8s 之上,应用的漏洞可能造成容器越权或者容器逃逸之类的风险。
借助恶意容器进行攻击也比较常见,在使用容器的过程种主要会面临以下风险:
K8s 集群的规模变大,运维人员与终端用户也会变多,安全凭证的泄露,会对整个集群的安全造成威胁。
即使集群保护的非常好,在安全凭证没有泄漏的情况下,来自内部成员的恶意攻击也难以规避,即使是在测试环境也需要一定程度的租户隔离,避免来自内部的攻击、对数据的恶意访问。
在 K8s 社区,安全问题的关注度是非常高的,在 K8s 的设计中,各组件都有安全相关的特性。在 API 认证层面,控制平面中各个组件之间,需要开启 mTLS 进行组件之间的互认证。
K8s 也支持丰富的认证、访问控制的机制,通常我们会借助 RBAC 对用户的权限进行限制。
K8s 还提供了针对容器能力的限制机制,我们可以通过 Security Context 去限制容器运行时的用户、用户组,对容器特权进行限制。
K8s 中 Pod Security Policy 可以为集群应用安全策略,但是这个特性会在 1.25 之后被后面提到的 pod security admission webhook 替代。这是 K8s 提供的安全策略机制,非常建议大家去深入了解。
我们还可以用到 Resource Quota 结合 request、limit 限制容器的资源用量,尽可能的利用 linux 提供的安全特性,针对网络、cpu、内存等资源进行用量的限制。Limit Range 可以帮助我们为 Pod 设置默认的资源限制。
除此之外,还可以针对 K8s 集群网络进行划分,通过 network policy 来支持网络隔离策略,设置黑名单或者白名单,为 namespace 去分配一独立的 IP 池。
我们可以借助 K8s 节点调度策略、污点管理,node selector 等机制去限制容器能够调度的节点,实现一定程度的物理隔离。
K8s 还有一些和安全相关的内容,一个是审计日志,需要在 kube-apiserver 中进行开启。然后是 Pod Security Admission Webhook,这将是一个新的特性,帮助我们为集群应用安全策略。最后就是和数据安全相关,我们可以借助 KMS 来加密 etcd 中的数据,在容器运行时进行解密。
K8s 安全最佳实践,大部分都是来自于社区用户和我们实际生产中环境中的经验总结。

上图是 K8s 社区的对云原生安全的安全总结,在云原生中主要分四个比较重要的层级:代码安全、容器安全,K8s 集群安全和云平台、数据中心的安全。
针对这四个层面的安全问题,有不同的解决策略。
代码安全往往可以通过以下方式进行应对,比如说应用之间的通讯,尽量使用 TLS 或 mTLS,保证数据的加密传输。即使集群中大部分都是可信的环境,TLS 带来的性能损耗我认为也是在可以承受的范围之内。
针对代码安全的增强,通常需要我们在在 CI 或 CD 过程中对代码进行扫描,对容器镜像进行扫描,对应用安全进行扫描,即使很多工具会存在误报的情况,但在大规模的项目中这些步骤是必不可少的。
容器安全方面,我们建议尽可能的使用可信的基础镜像,除此之外,尽可能去删掉不必要的二进制,避免基础镜像中操作系统漏洞带来的影响。
在容器运行的过程中尽可能的使用非 root 用户,除非是有特定的数据读写要求,可能会有一些问题。
集群安全 K8s 集群安全层面的建议,首先我们需要整理集群中所有关键组件的通讯矩阵,要知道哪些组件会用到哪些端口,比如说 K8s 控制平面常用的 10250,6443 端口等。对系统组件所用到的端口进行合理的管控,通过防火墙来提供最基础的保障。
数据安全 在 K8s 集群中我们可以实现或接入已有的 KMS 服务,对 etcd 中的数据进行加密,在 etcd 数据泄漏的情况下也可以保证集群中 secret 数据的安全。
网络安全 在 K8s 中我们可以借助 Network Policy 实现网络隔离,常用的网络插件 calico 和 Cilium 都可以很好的支持。不要开放不必要的端口,不仅是不对外开放端口甚至对于容器内部暴露的端口也要尽可能的去屏蔽。
针对所部署的应用安全 尽可能的为每一个部署到 K8s 的容器配置 Security Context,限制容器内的运行用户和容器特权,禁止其直接读取或读写整个宿主机的网络和文件。再就是 K8s 针对安全策略的的增强,我们可以利用一些安全策略管理工具如 Gatekeeper,为整个集群运用一些安全策略以抵抗风险。
可观测性部分 不论是限制节点调度,还是配置网络隔离策略等,这些都是以很被动的方式主动进行防御。在复杂的分布式容器化环境中数据的可见性降低,借助可观测性工具,我们就可以及时的发现集群中异常,比如异常流量、异常的日志、异常的 API 访问等,这些对整个系统安全来说显得尤为重要。借助可观测性工具,无论是监控数据还是异常日志,都可以帮助我们在第一时间去发现问题,我们可以设置合理的告警策略进行防御。
安全策略管理 K8s 集群安全策略,除了在使用过程中规范对使用者的要求,比如限制不可信的镜像仓库、特权容器、hostPath 挂载,也可以借助 Gatekeeper 这类安全策略管理工具进行主动的拦截。
KubeSphere 中的安全增强
KubeSphere 是一个构建在 K8s 之上的容器管理平台,我们针对 K8s 安全问题提供了以下增强:
1、借助可观测性组件增强异常的感知能力。借助日志、监控数据结合告警策略来提高异常感知的能力,增加数据的能见度。
2、支 Network Policy 实现网络隔离,支持 IP 池的管理。
3、支持接入 Kata Containers 等更安全的运行时。
4、KubeSphere 社区中开源的 KubeEye,是一个可以实现集群自动巡检的小工具,可以帮助我们扫描集群中存在的安全风险、不合理的配置等。
5、KubeSphere 提供了 Gatekeeper 的集成,并计划提供可视化的管理界面,实现安全策略的管理。
6、在 DevOps 流水线中我们可以集成代码、镜像等安全扫描工具。
本文由博客一文多发平台 OpenWrite 发布!
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的
默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同