随着云计算技术的发展,企业积极拥抱上云,广泛使用Kubernetes和容器等云原生技术,研发模式和基础设施也都随之发生了较大的变化,从传统物理机、虚拟机逐步转向容器。
在云原生架构的演变过程中也带来了一些新的风险和挑战,如容器逃逸、容器/K8S配置安全、容器镜像安全、Serverless安全、DevOps安全等。而云原生场景下的攻击路径也与传统的系统架构的攻击路径有所不同,比如从容器到容器,从容器到宿主机,从容器到其他node节点,从node节点到master节点等,更多的围绕云原生技术的特性,如下图所示。
云原生安全系列文章将记录笔者云原生安全学习心得,本期为第一期。俗话说“工欲善其事必先利其器”,要研究云原生安全,首先需要搭建一个云原生的安全靶场,本文将介绍如何搭建一个K8S云原生靶场,后续的攻防研究均在本靶场开展。
Kubernetes集群包含master节点和node节点,应用部署在node节点上,且可以通过配置选择应用部署在某些特定的节点上。Kubernetes集群的架构如下所示:
Scheduler:负责应用调度的组件,根据各种条件(如可用的资源、节点的亲和性等)将容器调度到Node上运行。
ETCD:一个分布式数据存储组件,负责存储集群的配置信息。
在靶场开始搭建之前,部署Kubernetes集群机器需要满足以下几个条件:
一台或多台机器,操作系统 CentOS7.x-86_x64;
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘20GB或更多;
集群中所有机器之间网络互通;
可以访问外网,需要拉取镜像;
禁止swap分区;
本靶场通过3台CentOS7虚拟机进行K8S集群搭建,其中一台为master节点,两台为node节点:
master节点 IP:192.168.136.153
node1节点 IP:192.168.136.152
node2节点 IP:192.168.136.154
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
swapoff -a # 临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
hostnamectl set-hostname 名字
cat /etc/hosts
192.168.136.153 master
192.168.136.152 node1
192.168.136.154 node2
6、将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
master节点、node节点完成上述配置后,在三个节点中安装K8S集群所需要的Docker/kubeadm/kubelet。
7、安装docker
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
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
yum install -y kubelet-1.15.0 kubeadm-1.1
systemctl enable kubelet
在Master节点(192.168.136.153)执行:
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节点成功完成初始化:
根据提示,执行以下命令:
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):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
在加入集群前,需要在两个node节点上(192.168.136.152、192.168.136.154)安装flannel:
docker pull lizhenliang/flannel:v0.11.0-amd64
kubeadm join 192.168.136.153:6443 --token wfjbsf.8iavnzi0dq1f8anf \
--discovery-token-ca-cert-hash sha256:959ea080ad3e6b7cdcc7fa33e1d52a6ed0fc551e156386307d5732c0a1e8ee59
node节点成功加入集群(这里需要注意3台节点的时间要同步):
在master节点上执行下述命令,可以看到2个node节点已经成功加入,处于ready状态:
至此, Kubernetes云原生靶场已经成功完成搭建,后续将在靶场上开展云原生架构攻击面、攻击路径、横向移动手段和安全防护研究、实践。