现在越来越多企业把服务往容器上搬,尤其是做数据备份这块,用 Kubernetes 或 Docker 搞自动化调度太常见了。但机器一多、节点一杂,安全隐患也就跟着来了。谁也不想辛辛苦苦做的备份系统,结果成了黑客的跳板。
为什么容器环境更需要入侵检测?
传统服务器可能几个月才更新一次,容器却不一样,动不动就拉起、销毁、重建。这种“短命”特性让很多老派安全工具跟不上节奏。比如某个镜像自带后门,刚启动就被用来横向扫描内网,等你发现时它已经消失了。
还有些攻击手法特别针对容器设计,比如利用挂载宿主机 /proc 或 /sys 目录提权,或者通过共享卷读取其他容器的数据。这些在传统虚拟机里少见的操作,在容器里一个配置失误就能实现。
怎么部署一套实用的入侵检测?
直接上方案。我们团队在实际项目中常用 Falco,它是开源的,专为容器和 Kubernetes 设计,能实时监控系统调用和容器行为。
先装 Helm,然后加仓库:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
接着部署 Falco 到集群:
helm install falco falcosecurity/falco \
--set daemonset.enabled=true \
--set ebpf.enabled=true \
--set config.httpOutput.enabled=true \
--set config.httpOutput.url=http://alert-manager.your-namespace.svc.cluster.local:9080
这里启用了 eBPF 模式,性能更好,不需要再编译内核模块。同时把告警推到内部的 alert-manager 服务,方便统一处理。
自定义规则防误报
Falco 默认规则很严格,刚上线可能会疯狂报警。比如你的备份脚本正常执行 tar 和 scp,也可能被当成可疑操作。
这时候就得写自己的规则。比如你想放过特定命名空间下的容器执行 curl 的行为,可以加一条 rule:
- rule: Ignore Curl in Backup Containers
desc: "Allow curl calls from backup jobs"
condition: >
container.image contains \"backup-tools\" and
proc.name = 'curl' and
k8s.ns.name = 'backup-job'
output: >
Curl used in backup container (user=%user.name %container.info image=%container.image)
priority: NOTICE
tags: [network, cis]
改完配置 reload 一下 DaemonSet 就生效了,不用重启整个组件。
结合日志系统做长期追踪
光有实时告警还不够。我们把所有 Falco 输出的事件打到 Elasticsearch,加上 Kibana 做可视化。这样回头看某次数据异常之前有没有可疑进程启动,查起来特别快。
举个例子,上周发现一个定时备份任务失败,查日志发现那会儿有个容器突然执行了 dd 命令往磁盘写随机数据。要不是有记录,根本想不到是有人通过 CI 流水线注入了恶意 stage。
这类问题在静态服务器上容易发现,但在自动伸缩的容器环境里,不留痕迹地跑个恶意进程太容易了。所以入侵检测不能只靠外围防火墙,得深入到每个 pod 内部去看行为模式。
别忘了保护检测系统本身
最怕的就是“灯下黑”。我们曾遇到过攻击者删掉 Falco 的 DaemonSet,让整个集群失去监控。后来加上了 Kubernetes 的 PodSecurityPolicy 和 RBAC 限制,非管理员不能动系统命名空间里的资源。
另外,把检测组件的日志单独传送到远端存储,哪怕本地被清空也不影响审计。毕竟数据备份系统的安全性,最终还是要落在“可追溯”三个字上。