作者:万宏明,KubeSphere member,负责 KubeSphere 安全和多租户团队

随着 K8s 在生产和测试环境中用的越来越多,对安全性的关注也会越来越多,所以本文主要是给大家分享以下内容:

  • 了解 K8s 环境面临的安全风险
  • 了解 K8s 提供的安全机制
  • 改善 K8s 安全状况的最佳实践

1. K8s 安全风险

这张图是 CNCF 金融用户小组总结的 K8s 信任边界图,它把在 K8s 环境中的信任边界划分成三大块儿。

  • 容器镜像相关部分,主要涉及到的安全攻击点就是镜像仓库和镜像本身。红色曲线可以被视为独立边界的系统。
  • K8s 控制平面相关部分,如果说一个攻击者攻击你的 K8s 集群的话,首先会攻击 K8s 的控制平面,中间涉及到的组件就是 K8s 的 apiserver、scheduler 和 controller-manager,所以说这些组件之间调用链的安全也需要去注意。
  • 节点上运行时的安全,其中包括 kubelet、kube-proxy 和容器运行时环境也容易被攻击,要避免运行环境被渗透。

我们根据不同的攻击类型划分,首先最容易规避的就是来自外部的攻击。通常情况下,来自外部的攻击会有 2 种类型:

  • 一种是系统层面的漏洞,需要及时更新,及时跟进 K8s 社区和安全领域相关的最新消息,可以很好的规避。

  • 第二个是应用本身带来的渗透或者是提权的风险,业务部署在 K8s 之上,应用的漏洞可能造成容器越权或者容器逃逸之类的风险。

借助恶意容器进行攻击也比较常见,在使用容器的过程种主要会面临以下风险:

  1. 使用了不受信任的镜像仓库或者是使用了被篡改的容器镜像会导致恶意代码被执行。
  2. 容器执行恶意代码存在提权或者逃逸的风险。
  3. 即使容器运行时足够安全,无法提权或逃逸,内部暴露的服务也容易成为被攻击的点,造成数据被恶意访问。

K8s 集群的规模变大,运维人员与终端用户也会变多,安全凭证的泄露,会对整个集群的安全造成威胁。

即使集群保护的非常好,在安全凭证没有泄漏的情况下,来自内部成员的恶意攻击也难以规避,即使是在测试环境也需要一定程度的租户隔离,避免来自内部的攻击、对数据的恶意访问。

2. 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 中的数据,在容器运行时进行解密。

3. K8s 安全最佳实践

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 发布!

k8s 安全策略最佳实践的更多相关文章

  1. K8s 生产最佳实践-限制 NameSpace 资源用量

    前言 想象一下这个场景:多个系统运行在同一套 K8s 集群上,有重要系统,也有不太重要的系统.但是某一天,某个不重要的系统突然占用了该 K8s 集群的所有资源,导致该集群上的其他系统的正常运行受到影响 ...

  2. k8s编排最佳实践

    编排文件技巧 使用资源时指定最新稳定版的API version 编排文件应该纳入版本控制,这样可以在必要的时候快速回滚,同样也有利于资源恢复和重建 使用YAML格式而不是JSON格式,尽管两种格式的文 ...

  3. ELK:收集k8s容器日志最佳实践

    简介 关于日志收集这个主题,这已经是第三篇了,为什么一再研究这个课题,因为这个课题实在太重要,而当今优秀的开源解决方案还不是很明朗: 就docker微服务化而言,研发有需求标准输出,也有需求文件输出, ...

  4. 生产环境容器落地最佳实践 --JFrog 内部K8s落地旅程

    引言 Kubernetes已经成为市场上事实上领先的编配工具,不仅对技术公司如此,对所有公司都是如此,因为它允许您快速且可预测地部署应用程序.动态地伸缩应用程序.无缝地推出新特性,同时有效地利用硬件资 ...

  5. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

    写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 ​ 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  6. 一款不错的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳实践构建

    Golang API Starter Kit 该项目的主要目的是使用最佳实践.DDD.CQRS.ES.gRPC 提供样板项目设置. 为开发和生产环境提供 kubernetes 配置.允许与反映生产的 ...

  7. Kubernetes Deployment 最佳实践

    零.示例 首先给出一个 Deployment+HPA+ PodDisruptionBudget 的完整 demo,后面再详细介绍其中的每一个部分: apiVersion: apps/v1 kind: ...

  8. Kubernetes 微服务最佳实践

    本文由个人笔记 ryan4yin/knowledge 整理而来 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」. 其中大部 ...

  9. 在 Kubernetes 容器集群,微服务项目最佳实践

    转载自:https://mp.weixin.qq.com/s/WYu3gDwKKf06f_FYbO9YRg 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes ...

  10. memcache的最佳实践方案

    1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 1 ...

随机推荐

  1. Daph:新一代流批一体数据集成与数据处理工具

    Daph源码位于gitee,地址是https://gitee.com/dasea96/daph 概述 Daph的中文名称是大副,大副是职位仅低于船长的船舶驾驶员,甲板部(驾驶部)负责人,船长的主要助手 ...

  2. 一篇文章讲清楚Java中的反射

    介绍 每个类都有一个 Class 对象,包含了与类有关的信息.当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象. 类加载相当于 Class 对象的加载.类在第 ...

  3. Kubernetes-8:Deployment、DaemonSet、Job、CronJob等各控制器介绍及演示

    前文中也都已经提及过k8s都有哪些常用的控制器,本文对这些控制器进行细剖及演示一下 RS与RC与Deployment关联 RC主要作用就是用来确保容器应用副本数保持用户的期望值数目,即如果有pod异常 ...

  4. 【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云

    在上一篇中,我们使用docker commit 命令,创建了一个带有vim的Ubuntu镜像.那么怎么将这个镜像分享出去呢?本文就来讲解如何将本地的docker镜像发布到阿里云上. 本文主要内容: 1 ...

  5. 【YashanDB数据库】YAS-02024 lock wait timeout, wait time 0 milliseconds

    [标题]错误码处理 [问题分类]锁等待超时 [关键字]YAS-02024 [问题描述]执行语句时候,因锁等待超时执行语句失败 [问题原因分析]数据库默认锁等待时间为0秒,如果执行语句存在锁等待过长会执 ...

  6. [项目] 在openharmony上跑CV

    板子资料 瑞星微 rk3568, CPU: RK3568四核64位Cortex-A55 处理器,采用全新ARM v8.2-A架构 Cortex A55 基于64位Armv8.2-A指令集设计,支持64 ...

  7. 5.5文件上传-WAF绕过

    一.WAF绕过(明确有文件上传) 1.上传参数中,可修改参数 Content-Dispositin:一般可改 name:表单参数,不可更改 filename:文件名,可更改 Content-Type: ...

  8. Mininet安装记录

    安装环境: Ubuntu虚拟机版本:14.04 Mininet版本:2.3.1b1 1.更改软件镜像源 在设置中进行如下操作: 选择国内的镜像站点,如阿里云. 点击关闭后,在弹出的窗口中点击重新载入, ...

  9. C++ 学习路线图

    基础阶段 学习重点: 基本语法:掌握 C++ 的变量.数据类型(如整型.浮点型.字符型等).运算符.控制流语句(条件判断if-else.循环for.while.do-while等).这是编写 C++ ...

  10. [OI] pb_ds

    using namespace __gnu_pbds; Luogu Post#39 1.堆 1.1 基本信息 头文件 #include <ext/pb_ds/priority_queue.hpp ...