k8s是什么?
Kubernetes 是一个可移植的,可扩展的开源容器编排平台,用于管理容器化的事情负载和做事,方便了声明式配置和自动化。它拥有一个弘大且快速增长的生态系统。Kubernetes 的做事,支持和工具广泛可用。
为什么现在盛行利用容器?早期: 在物理做事器上面支配运用程序存在资源分配问题,由于其不能在物理做事器中的运用程序定义资源边界,导致运用程序资源利用不敷而无法扩展.
后来: 为理解决该问题,引入了虚拟化技能, 虚拟化技能是指许可你在单个物理做事器的 CPU 上运行多个虚拟机,可以让多个运用程序在虚拟机之间进行隔离,具有一定的安全型, 每一个虚拟机便是一台完全的打算机, 在虚拟化硬件之上运行所有组件.
现在: 多数在物理做事器上面支配运用程序都是采kubectl用容器的办法,容器类似于虚拟机,他们都具有自己的文件系统、CPU、内存、进程空间等, 且由于它们与根本架构分离,因此可以跨云和 OS 发行版本进行移植。基于此点被企业大范围利用.
为什么须要利用k8s容器?若涌现这样一个环境: 在生产环境中如果一个容器发生故障,则我们须要手动去启动其余一个容器,这样的操作是对我们的管理员来说是不太方便的, 若一个容器涌现故障,另一个容器可以自动启动容器接管故障的容器,这样是最好的.
k8s就可以实现该效果,Kubernetes 供应了一个可弹性运行分布式系统的框架。 Kubernetes 会知足你的扩展哀求、故障转移、支配模式等。
k8s功能: 做事创造和负载均衡, 存储编排, 自动支配和回滚, 自动完成装箱打算, 自我修复, 密钥与配置管理
名词阐明secret
Secret有三种类型:
Service Account:用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的/run/secrets/kubernetes.io/serviceaccount目录中;Opaque:base64编码格式的Secret,用来存储密码、密钥等;kubernetes.io/dockerconfigjson:用来存储私有docker registry的认证信息。k8s的组成k8s是由组件,API,工具等组成.
包含所有相互关联组件的 Kubernetes 集群图如下:
组件
掌握平面组件kube-apiserver: 为k8s的api做事器,公开了所有Kubernetes API, 其他所有组件都必须通过它供应的API来操作资源数据.担保集群状态访问的安全隔离集群状态访问的办法和后端存储实现的办法:API Server是状态访问的办法,不会由于后端存储技能etcd的改变而改变。etcd: 为k8s的键值数据库,保存了k8s所有集群数据的后台数据库。kube-scheduler: 网络和剖析当前Kubernetes集群中所有Node节点的资源(内存、CPU)负载情形,然后依此分发新建的Pod到Kubernetes集群中可用的节点。 kube-controller-manager: 在主节点上运行 掌握器 的组件。cloud-controller-manager: 云掌握器管理器是指嵌入特定云的掌握逻辑的 掌握平面组件Node 组件kubelet: 一个在集群中每个节点(node)上运行的代理。 它担保容器(containers)都 运行在 Pod 中。kube-proxy: kube-proxy是集群中每个节点上运行的网络代理,掩护节点上的网络规则。这些网络规则许可从集群内部或外部的网络会话与 Pod 进行网络通信。容器运行时: 卖力运行容器的软件。插件(Addons)DNS: 集群 DNS 是一个 DNS 做事器,和环境中的其他 DNS 做事器一起事情,它为 Kubernetes 做事供应 DNS 记录。Web 界面(仪表盘): Dashboard 是Kubernetes 集群的通用的、基于 Web 的用户界面。容器资源监控: 容器资源监控 将关于容器的一些常见的韶光序列度量值保存到一个集中的数据库中,并供应用于浏览这些数据的界面。集群层面日志: 集群层面日志 机制卖力将容器的日志数据 保存到一个集中的日志存储中,该存储能够供应搜索和浏览接口。APIKubernetes 掌握面 的核心是 API 做事器。 API 做事器卖力供应 HTTP API,以供用户、集群中的不同部分和集群外部组件相互通信。
工具Kubernetes工具是Kubernetes系统中的持久实体。Kubernetes利用这些实体来表示集群的状态.
详细来说,他们可以描述:
容器化运用正在运行(以及在哪些节点上)这些运用可用的资源关于这些运用如何运行的策略,如重新策略,升级和容错Kubernetes 架构Kubernetes 架构由节点,掌握面到节点通信, 掌握器, 云掌握器管理器组成.
master 流程图Kubecfg将特定的要求,比如创建Pod,发送给Kubernetes Client。Kubernetes Client将要求发送给API server。API Server根据要求的类型,比如创建Pod时storage类型是pods,然后依此选择何种REST Storage API对要求作出处理。REST Storage API对的要求作相应的处理。将处理的结果存入高可用键值存储系统Etcd中。在API Server相应Kubecfg的要求后,Scheduler会根据Kubernetes Client获取集群中运行Pod及Minion/Node信息。依据从Kubernetes Client获取的信息,Scheduler将未分发的Pod分发到可用的Minion/Node节点上。节点节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pods 所需的做事, 这些 Pods 由 掌握面 卖力管理.
节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。
节点状态
可以利用 kubectl 来查看节点状态和其他细节信息:
kubectl describe node <节点名称>
一个节点包含以下信息:
地址HostName:由节点的内核设置。可以通过 kubelet 的 —hostname-override 参数覆盖。ExternalIP:常日是节点的可外部路由(从集群外可访问)的 IP 地址。InternalIP:常日是节点的仅可在集群内部路由的 IP 地址。状况(conditions 字段描述了所有 Running 节点的状态)Ready 如节点是康健的并已经准备好吸收 Pod 则为 True;False 表示节点不康健而且不能吸收 Pod;Unknown 表示节点掌握器在最近 node-monitor-grace-period 期间(默认 40 秒)没有收到节点的DiskPressure为True则表示节点的空闲空间不敷以用于添加新 Pod, 否则为 FalseMemoryPressure为True则表示节点存在内存压力,即节点内存可用量低,否则为 FalsePIDPressure为True则表示节点存在进程压力,即节点上进程过多;否则为 FalseNetworkUnavailable为True则表示节点网络配置禁绝确;否则为 False容量与可分配描述节点上的可用资源:CPU、内存和可以调度到节点上的 Pod 的个数上限。信息关于节点的一样平常性信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、 Docker 版本(如果利用了)和操作系统名称。这些信息由 kubelet 从节点上搜集而来。掌握面到节点通信节点到掌握面apiserver在安全的 HTTPS 端口(443)上监听远程连接要求以客户端证书的形式将客户端凭据供应给 kubelet掌握面到节点API 做事器到 kubelet连接用于获取 Pod 日志挂接(通过 kubectl)到运行中的 Pod供应 kubelet 的端口转发功能。(注: 在连接状态下, 默认apiserver 不检讨 kubelet 的做事证书。随意马虎受到中间人攻击,不屈安.)apiserver 到节点、Pod 和做事SSH 隧道(目前已经废弃)产生缘故原由: 若无做事证书, 又哀求避免在非受信网络或公共网络上进行连接,则可以在apiserver 和 kubelet 之间利用ssh隧道.Kubernetes 支持利用 SSH 隧道来保护从掌握面到节点的通信路径。Konnectivity 做事为ssh隧道的替代品, Konnectivity 做事供应 TCP 层的代理,以便支持从掌握面到集群的通信。掌握器在 Kubernetes 中,掌握器通过监控集群 的公共状态,并致力于将当前状态转变为期望的状态。
举个例子: 当前室内温度为20度, 我们通过调节遥控器,使其温度上升至24度, 这20度到24度的变革即为让其从当前状态靠近期望状态。
掌握器模式分为直接掌握和通过API做事器来掌握.
云掌握器管理器云掌握器管理器是指嵌入特定云的掌握逻辑的 掌握平面组件。 云掌握器管理器许可您链接聚合到云供应商的运用编程接口中, 并分离出相互浸染的组件与您的集群交互的组件。
云掌握器管理器中的掌握器包括:
节点掌握器节点掌握器卖力在云根本举动步伐中创建了新做事器时为之 创建 节点(Node)工具。 节点掌握器从云供应商获取当前租户中主机的信息。实行功能:针对掌握器通过云平台驱动的 API 所创造的每个做事器初始化一个 Node 工具利用特定云平台的信息为 Node 工具添加表明和标签获取节点的网络地址和主机名检讨节点的康健状况。路由掌握器Route 掌握器卖力适当地配置云平台中的路由,以便 Kubernetes 集群中不同节点上的 容器之间可以相互通信。做事掌握器做事(Service)与受控的负载均衡器、 IP 地址、网络包过滤、目标康健检讨等云根本举动步伐组件集成。 做事掌握器与云驱动的 API 交互,以配置负载均衡器和其他根本举动步伐组件。Kubernetes 安全性云原平生安云原平生安4个C: 云(Cloud)、集群(Cluster)、容器(Container)和代码(Code)
云原平生安模型的每一层都是基于下一个最外层,代码层受益于强大的根本安全层(云、集群、容器)。我们无法通过在代码层办理安全问题来为根本层中糟糕的安全标准供应保护。
根本举动步伐安全
Kubetnetes 根本架构关注领域
建议
通过网络访问 API 做事(掌握平面)
所有对 Kubernetes 掌握平面的访问不许可在 Internet 上公开,同时应由网络访问掌握列表掌握,该列表包含管理集群所需的 IP 地址集。
通过网络访问 Node(节点)
节点应配置为 仅能 从掌握平面上通过指定端口来接管(通过网络访问掌握列表)连接,以及接管 NodePort 和 LoadBalancer 类型的 Kubernetes 做事连接。如果可能的话,这些节点不应完备暴露在公共互联网上。
Kubernetes 访问云供应商的 API
每个云供应商都须要向 Kubernetes 掌握平面和节点付与不同的权限集。为集群供应云供应商访问权限时,最好遵照对须要管理的资源的最小特权原则。Kops 文档供应有关 IAM 策略和角色的信息。
访问 etcd
对 etcd(Kubernetes 的数据存储)的访问应仅限于掌握平面。根据配置情形,你该当考试测验通过 TLS 来利用 etcd。更多信息可以在 etcd 文档中找到。
etcd 加密
在所有可能的情形下,最好对所有驱动器进行静态数据加密,但是由于 etcd 拥有全体集群的状态(包括机密信息),因此其磁盘更该当进行静态数据加密。
集群组件安全
运行的运用程序的安全性关注领域访问掌握授权(访问 Kubernetes API)认证办法运用程序 Secret 管理 (并在 etcd 中对其进行静态数据加密)Pod 安全策略做事质量(和集群资源管理)网络策略Kubernetes Ingress 的 TLS 支持容器安全
容器安全性关注领域容器搭建配置(配置不当,危险挂载, 特权用户)容器做事自身毛病Linux内核漏洞镜像署名和实行代码安全
代码安全关注领域仅通过 TLS 访问(流量加密)限定通信端口范围第三方依赖性安全静态代码剖析动态探测攻击(黑盒)Kubernetes架构常见问题Kubernetes ATTACK 矩阵信息泄露云账号AK透露
API凭据(即阿里云AccessKey)是用户访问内部资源最主要的身份凭据。用户调用API时的通信加密和身份认证会利用API凭据.
API凭据是云上用户调用云做事API、访问云上资源的唯一身份凭据。
API凭据相称于登录密码,用于程序办法调用云做事API.
k8s configfile透露
kubeconfig文件所在的位置: $HOME/.kube/config
Kubeconfig文件包含有关Kubernetes集群的详细信息,包括它们的位置和凭据。
云厂商会给用户供应该文件,以便于用户可以通过kubectl对集群进行管理. 如果攻击者能够访问到此文件(如办公网员工机器入侵、透露到Github的代码等),就可以直接通过API Server接管K8s集群,带来风险隐患。
Master节点SSH登录透露
常见的容器集群管理办法是通过登录Master节点或运维跳板机,然后再通过kubectl命令工具来掌握k8s。
云做事器供应了通过ssh上岸的形势进行上岸master节点.
若Master节点SSH连接地址泄露,攻击者可对ssh上岸进行爆破,从而上岸上ssh,掌握集群.
容器组件未鉴权做事Kubernetes架构下常见的开放做事指纹如下:
kube-apiserver: 6443, 8080kubectl proxy: 8080, 8081kubelet: 10250, 10255, 4149dashboard: 30000docker api: 2375etcd: 2379, 2380kube-controller-manager: 10252kube-proxy: 10256, 31442kube-scheduler: 10251weave: 6781, 6782, 6783kubeflow-dashboard: 8080注:前六个重点关注: 一旦被掌握可以直接获取相应容器、相应节点、集群权限的做事
理解各个组件被攻击时所造成的影响
组件分工图:
如果用户想在集群里面新建一个容器凑集单元, 流程如下:
用户与 kubectl进行交互,提出需求(例: kubectl create -f pod.yaml)kubectl 会读取 ~/.kube/config 配置,并与 apiserver 进行交互,协议:http/httpsapiserver 会协同 ETCD, kube-controller-manager, scheduler 等组件准备下发新建容器的配置给到节点,协议:http/httpsapiserver 与 kubelet 进行交互,奉告其容器创建的需求,协议:http/https;kubelet 与Docker等容器引擎进行交互,创建容器,协议:http/unix socket.容器已然在集群节点上创建成功攻击apiserverapiserver先容:在Kubernetes中,对付未鉴权对apiserver, 能访问到 apiserver 一样平常情形下就能获取了集群的权限.
在攻击者眼中Kubernetes APIServer
容器编排K8S总控组件pods, services, secrets, serviceaccounts, bindings, componentstatuses, configmaps,endpoints, events, limitranges, namespaces, nodes, persistentvolumeclaims,persistentvolumes, podtemplates, replicationcontrollers, resourcequotas …可控以上所有k8s资源可获取险些所有容器的交互式shell利用一定技巧可获取所有容器母机的交互式shell默认情形下apiserver都有鉴权:
未鉴权配置如下:
对付这类的未鉴权的设置来说,访问到 apiserver 一样平常情形下就获取了集群的权限:
如何通过apiserver来进行渗透,可参考:https://Kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
攻击kubelet每一个Node节点都有一个kubelet(每个节点上运行的代理)做事,kubelet监听了10250,10248,10255等端口。
10250端口,是kubelet与apiserver进行通信对紧张端口, 通过该端口,kubelet可以知道当前该当处理的任务.该端口在最新版Kubernetes是有鉴权的, 但在开启了接管匿名要求的情形下,不带鉴权信息的要求也可以利用10250供应的能力, 在Kubernetes早期,很多挖矿木马基于该端口进行传播.
在/var/bin/kubulet/config/yaml配置文件中,若进行如下配置,则可能存在未授权访问漏洞.
若10250端口存在未授权访问漏洞,我们可以直接访问/pods进行查看
根据在pods中获取的信息,我们可以在容器中实行命令
curl -Gks https://host:10250/exec/{namespace}/{podname}/{containername} \-d 'input=1' -d 'output=1' -d 'tty=1' \-d 'command=whoami'
上述命令得到websocket地址,连接websocket得到命令结果:
利用wscat工具连接websocket
wscat -c “https://X.X.X.X:10250/{websocket}” --no-check
即可得到我们实行命令的结果.
获取token
/var/run/secrets/kubernetes.io/serviceaccount
然后即可访问kube-api server,获取集群权限
curl -ks -H "Authorization: Bearer <TOKEN>" \ ttps://master:6443/api/v1/namespaces/{namespace}/secrets
攻击kubelet总体步骤如下:
访问pods获取信息获取namespace、podsname、containername实行exec获取token/var/run/secrets/kubernetes.io/serviceaccount利用Token访问API Server进行对pods操作。攻击dashboarddashboard上岸链接如下: http://xxx.xxx.xxx.xxx:xxxx/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
dashboard界面如下:
dashboard是Kubernetes官方推出的掌握Kubernetes的图形化界面.在Kubernetes配置不当导致dashboard未授权访问漏洞的情形下,通过dashboard我们可以掌握全体集群。
默认情形下, dashboard是须要进行鉴权操作的,当用户开启了enable-skip-login时可以在登录界面点击Skip跳过登录进入dashboard.
通过skip上岸的dashboard默认是没有操作集群的权限,由于Kubernetes利用RBAC(Role-based access control)机制进行身份认证和权限管理,不同的serviceaccount拥有不同的集群权限。
但有些开拓者为了方便或者在测试环境中会为Kubernetes-dashboard绑定cluster-admin这个ClusterRole(cluster-admin拥有管理集群的最高权限).
为Kubernetes-dashboard绑定cluster-admin 设置如下:
新建dashboard-admin.yaml内容apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kubernetes-dashboard roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects : kind: ServiceAccount name: kubernetes-dashboard namespace: kubernetes-dashboard实行kubectl create -f dashboard-admin.yaml后通过skip上岸dashboard便有了管理集群的权限.
创建Pod掌握node节点,该pod紧张是将宿主机根目录挂载到容器tmp目录下。
新建一个Pod如下:
通过该容器的tmp目录管理node节点的文件
攻击etcd
Kubernetes默认利用了etcd v3来存储数据, 若能naetcd对内暴露2379端口,本地127.0.0.1可免认证访问. 其他地址要带—endpoint参数和cert进行认证。
未授权访问流程:
检讨是否正常链接etcdctl endpoint health读取service account token etcdctl get / --prefix --keys-only | grep /secrets/kube-system/clusterrole通过token认证访问API-Server端口6443,接管集群:kubectl --insecure-skip-tls-verify -s https://127.0.0.1:6443/ --token="[ey...]" -n kube-system get pods攻击docker remote api(Docker daemon公网暴露)2375是docker远程操控的默认端口,通过这个端口可以直接对远程的docker 守护进程进行操作。Docker 守护进程默认监听2375端口且未鉴权.
当机器以docker daemon -H=0.0.0.0:2375办法启动daemon时,可以在外部机器对该机器的docker daemon进行直接操作:
之后依次实行systemctl daemon-reload、systemctl restart docker
外部主机利用-H 即可操作暴露2375端口的主机.
因此当你有访问到目标Docker API 的网络能力或主机能力的时候,你就拥有了掌握当前做事器的能力。我们可以利用Docker API在远程主机上创建一个特权容器,并且挂载主机根目录到容器.
检测目标是否存在docker api未授权访问漏洞的办法也很大略,访问http://[host]:[port]/info路径是否含有ContainersRunning、DockerRootDir等关键字。
攻击kubectl proxy
二次开拓所产生的问题
管理Kubernetes无论是利用 kubectl 或 Kubernetes dashboard 的UI功能,实在都是间接在和 APIServer 做交互.
如果有需求对k8s进行二次开拓的话,大部分的开拓功能要求了 APIServer 的 Rest API 从而使功能实现的。
例如:
给用户销毁自己POD的能力DELETE https://apiserver:8443/api/v1/namespaces/default/pods/sleep-75c6fd99c-g5kss类似于这样去调用apiserver, 攻击者若修正namespace、pod和容器名, 那么即可造成越权.
推举工具Kube-Hunter扫描漏洞
kube-hunter是一款用于探求Kubernetes集群中的安全漏洞扫描器
下载地址: https://github.com/aquasecurity/kube-hunter
CDK(强推)CDK是一款为容器环境定制的渗透测试工具,在已攻陷的容器内部供应零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用办法,插件化管理。
下载地址: https://github.com/cdk-team/CDK/wiki/CDK-Home-CN
参考链接
https://developer.aliyun.com/article/765449?groupCode=aliyunsecurityhttps://xz.aliyun.com/t/4276#toc-2https://www.secrss.com/articles/29544https://kubernetes.io/zh/docs/concepts/workloads/pods/#what-is-a-podhttps://www.huweihuang.com/kubernetes-notes/concepts/architecture/kubernetes-architecture.htmlhttps://www.kubernetes.org.cn/service-accounthttps://www.aquasec.com/cloud-native-academy/cloud-native-applications/cloud-native-infrastructure/https://www.cdxy.me/?p=827