云原生安全系列(一) | Kubernetes云原生靶场搭建

2022-11-11 17:18:06 浏览数 (1)

随着云计算技术的发展,企业积极拥抱上云,广泛使用Kubernetes和容器等云原生技术,研发模式和基础设施也都随之发生了较大的变化,从传统物理机、虚拟机逐步转向容器。

在云原生架构的演变过程中也带来了一些新的风险和挑战,如容器逃逸、容器/K8S配置安全、容器镜像安全、Serverless安全、DevOps安全等。而云原生场景下的攻击路径也与传统的系统架构的攻击路径有所不同,比如从容器到容器,从容器到宿主机,从容器到其他node节点,从node节点到master节点等,更多的围绕云原生技术的特性,如下图所示。

云原生安全系列文章将记录笔者云原生安全学习心得,本期为第一期。俗话说“工欲善其事必先利其器”,要研究云原生安全,首先需要搭建一个云原生的安全靶场,本文将介绍如何搭建一个K8S云原生靶场,后续的攻防研究均在本靶场开展。

0x01 Kubernetes集群架构简介

Kubernetes集群包含master节点和node节点,应用部署在node节点上,且可以通过配置选择应用部署在某些特定的节点上。Kubernetes集群的架构如下所示:

Master节点

Master节点是集群的控制节点,由API Server、Scheduler、Controller Manager和ETCD四个组件构成。

  • API Server:各组件互相通讯的中转站,接受外部请求,并将信息写到ETCD中。
  • Controller Manager:执行集群级功能,例如复制组件,跟踪Node节点,处理节点故障等等。
  • Scheduler:负责应用调度的组件,根据各种条件(如可用的资源、节点的亲和性等)将容器调度到Node上运行。
  • ETCD:一个分布式数据存储组件,负责存储集群的配置信息。

Node节点

Node节点是集群的计算节点,即运行容器化应用的节点。

  • kubelet:kubelet主要负责同Container Runtime打交道,并与API Server交互,管理节点上的容器。
  • kube-proxy:应用组件间的访问代理,解决节点上应用的访问问题。
  • Container Runtime:容器运行时,如Docker,最主要的功能是下载镜像和运行容器。

0x02 Kubernetes靶场搭建准备

在靶场开始搭建之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64;
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘20GB或更多;
  • 集群中所有机器之间网络互通;
  • 可以访问外网,需要拉取镜像;
  • 禁止swap分区;

本靶场通过3台CentOS7虚拟机进行K8S集群搭建,其中一台为master节点,两台为node节点:

代码语言:javascript复制
master节点 IP:192.168.136.153
node1节点 IP:192.168.136.152
node2节点 IP:192.168.136.154

1、关闭防火墙:

代码语言:javascript复制
systemctl stop firewalld
systemctl disable firewalld

2、关闭selinux:

代码语言:javascript复制
sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

3、关闭swap:

代码语言:javascript复制
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab  #永久关闭

4、 修改主机名称

代码语言:javascript复制
hostnamectl set-hostname 名字

5、添加主机名与IP对应关系(记得设置主机名):

代码语言:javascript复制
cat /etc/hosts
192.168.136.153 master
192.168.136.152 node1
192.168.136.154 node2

6、将桥接的IPv4流量传递到iptables的链

代码语言:javascript复制
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
代码语言:javascript复制
 sysctl --system

master节点、node节点完成上述配置后,在三个节点中安装K8S集群所需要的Docker/kubeadm/kubelet。

7、安装docker

代码语言:javascript复制
yum install -y wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker

8、安装kubeadm,kubelet和kubectl

代码语言:javascript复制
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
代码语言:javascript复制
yum install -y kubelet-1.15.0 kubeadm-1.1
systemctl enable kubelet

0x03 部署Kubernetes Master

在Master节点(192.168.136.153)执行:

代码语言:javascript复制
kubeadm init 
--apiserver-advertise-address=192.168.136.153 
--image-repository registry.aliyuncs.com/google_containers 
--kubernetes-version v1.15.0 
--service-cidr=10.1.0.0/16 
--pod-network-cidr=10.244.0.0/16

master节点成功完成初始化:

根据提示,执行以下命令:

代码语言:javascript复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装Pod网络插件(CNI):

代码语言:javascript复制
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

0x04 加入Kubernetes Node

在加入集群前,需要在两个node节点上(192.168.136.152、192.168.136.154)安装flannel:

代码语言:javascript复制
docker pull lizhenliang/flannel:v0.11.0-amd64

在两个node节点上执行向集群添加新节点的命令(即Master 节点在初始化中通过kubeadm init输出的kubeadm join命令)

代码语言:javascript复制
kubeadm join 192.168.136.153:6443 --token wfjbsf.8iavnzi0dq1f8anf 
    --discovery-token-ca-cert-hash sha256:959ea080ad3e6b7cdcc7fa33e1d52a6ed0fc551e156386307d5732c0a1e8ee59

node节点成功加入集群(这里需要注意3台节点的时间要同步):

在master节点上执行下述命令,可以看到2个node节点已经成功加入,处于ready状态:

至此, Kubernetes云原生靶场已经成功完成搭建,后续将在靶场上开展云原生架构攻击面、攻击路径、横向移动手段和安全防护研究、实践。

参考资料:

https://blog.csdn.net/heian_99/article/details/103888459

https://segmentfault.com/a/1190000037682150

https://security.tencent.com/index.php/blog/msg/183

https://payloads.online/archivers/2021-07-20/1/

0 人点赞