使用 kubernetes 部署分布式蜜罐系统的实践
Dec 20, 2020
搭建集群
安装
按照 kubernetes 官方文档中安装 kubeadm 的部分进行安装
- 禁用 swap 分区
1
swapoff -a
- 把 iptables 工具切换到“旧版”模式,按照文档的说明,在较新的 Linux 发行版本中,iptables 工具使用 nftables 后端,其与 kubeadm 不兼容。
1
2
3
4update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
update-alternatives --set arptables /usr/sbin/arptables-legacy
update-alternatives --set ebtables /usr/sbin/ebtables-legacy - 安装 docker :
1
apt install docker.io
- 安装 kubeadm、kubelet 和 kubectl(国外)
1
2
3
4
5
6
7
8sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl - 安装 kubeadm、kubelet 和 kubectl(国内)
1
2
3
4
5
6
7
8
9
10
11
12
13
14sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
// 下载镜像(worker节点)
kubeadm config images list
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.1 k8s.gcr.io/kube-proxy:v1.20.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker pull quay.io/coreos/flannel:v0.13.1-rc1
Master 节点
Master 节点我选用了一台已有的 vps 机器中配置最高的,4核8G内存。
- 初始化 Master 节点
1
2
3
4kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-cert-extra-sans ${MASTER_PUBIP} \
--apiserver-advertise-address ${MASTER_PUBIP} \
--node-name master01 - -pod-network-cidr:指定 pod 网络的 IP 地址范围
- -apiserver-advertise-address: API 服务器所公布的其正在监听的 IP 地址。使用 Master 节点的公网 ip 地址,在 linode 上可以运行,在一些云服务商上如果公网 ip 没有绑定到网卡上时会无法启动 ETCD
- -apiserver-cert-extra-sans:用于 API Server 服务证书的可选附加主题备用名称(SAN)
- -node-name:节点的 name
- 运行 kubectl(root 用户)
1
export KUBECONFIG=/etc/kubernetes/admin.conf
- 安装 Pod 网络附加组件
1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Worker 节点
Worker 节点上运行蜜罐容器。配置:1核1G内存。跟官方文档推荐的配置有点差距,但也够用了
- 加入节点
1
2kubeadm join ${MASTER_PUBIP}:6443 --token ${TOKEN} \
--discovery-token-ca-cert-hash sha256:${HASH} - 给工作节点打上标签 type=worker 和位置标签 loc=cn or foreign
1
2kubectl label nodes ${NODE_NAME} type=worker
kubectl label nodes ${NODE_NAME} loc=foreign
配置信息
蜜罐容器需要读取配置文件,我创建了三种配置文件:
- 私有镜像仓库密钥,敏感数据,使用 Secret
- 蜜罐的配置文件,包含数据管道的地址和验证信息,敏感数据,使用 Secret
- cowrie 的配置文件,非敏感数据,使用 ConfigMap
创建用于私有镜像仓库鉴权的 Secret
1 | kubectl create secret docker-registry dockerhubsecret --docker-username=${USERNAME} --docker-password=${PASSWORD} |
创建蜜罐配置文件的 Secret
1 | kubectl create secret generic honeypot-config --from-file=config/config.toml |
创建 cowrie 配置文件的 ConfigMap
1 | kubectl create configmap cowrie-config --from-file=etc/ |
创建 ServiceAccount
向 ServiceAccount 中添加镜像拉取密钥可以不必为每个 pod 都单独进行镜像拉取密钥的添加操作
1 | apiVersion: v1 |
创建 Deployment
因为 GFW 的存在,在国内和国外部署的蜜罐需要使用不同的数据管道,也就需要使用不同的 ConfigMap。在国内和国外我们创建了两个 Deployment。每个 pod 包含两个容器,分别是我们的蜜罐和 cowrie。
- 升级策略:
spec.strategy
使用了 Recreate,即在升级时一次性删除所有旧版本的pod后再创建新pod - 节点选择器:
spec.template.spec.nodeSelector
选择之前设置的 type 标签选择 worker 节点。根据不同的地址位置选择 loc 标签 - 非亲缘性:
spec.template.spec.affinity
定义 podAntiAffinity 强制 pod 调度到不同的节点上。 - 赋值 ServiceAccount:
spec.template.spec.serviceAccountName
- 使用宿主节点的网络空间:
spec.template.spec.hostNetwork
- 使用特权模式运行pod:
spec.template.spec.containers.securityContext
- 挂载配置文件:
spec.template.spec.containers.volumeMounts
- 存活指针:
spec.template.spec.containers.livenessProbe
完整的配置文件放在了最后。
END
- 在部署工作节点时,如果节点的公网 IP 没有绑定到网卡上,需要在 Master 上设置 iptables 规则,将内网 IP 转向外网 IP。参考
- 当前的集群配置比较初级,后续还有很大的改进空间。
- 《Kubernetes in Action》真的很不错。
honeypot-deployment-cn.yaml
1 | apiVersion: apps/v1 |