实战案例,如何用 Falco 揪出 Kubernetes 集群里的“内鬼”文件访问?
前言:你的 Kubernetes 集群安全吗?别让文件访问成漏洞!
什么是 Falco?你的容器安全“千里眼”
案例背景:揪出试图访问敏感配置的“内鬼”
准备工作:安装和配置 Falco
编写 Falco 规则:锁定敏感文件访问
部署 Falco 规则:让安全策略生效
测试 Falco 规则:模拟恶意文件访问
优化 Falco 规则:更精准的告警
扩展 Falco 规则:监控更多敏感文件
总结:让 Falco 成为你的安全卫士
额外思考:Falco 的更多可能性
前言:你的 Kubernetes 集群安全吗?别让文件访问成漏洞!
各位安全运维工程师,你是否也曾夜不能寐,担心 Kubernetes 集群里潜藏着未知的风险?容器安全,不仅仅是镜像扫描和网络隔离,文件系统访问也是一个不容忽视的环节。想想看,如果某个容器悄悄地读取了敏感配置文件,或者篡改了关键的系统文件,那会造成怎样的灾难?
今天,我就来分享一个实战案例,教你如何利用 Falco,这个强大的运行时安全工具,来检测 Kubernetes 集群中的恶意文件访问行为。我们将一起构建一个规则,揪出那些试图访问敏感文件的“内鬼”,防患于未然。
什么是 Falco?你的容器安全“千里眼”
在深入案例之前,我们先简单了解一下 Falco。Falco 是一个开源的运行时安全工具,由 Sysdig 公司开发,现在已经捐献给 CNCF(云原生计算基金会)。它可以监控容器、Kubernetes 和 Linux 主机的运行时行为,并根据预定义的规则检测异常活动。简单来说,Falco 就像一个“千里眼”,时刻盯着你的容器,一旦发现任何可疑的动作,立即发出警报。
Falco 的强大之处在于它基于系统调用进行监控。系统调用是用户空间程序与 Linux 内核交互的唯一方式。这意味着 Falco 可以捕获到几乎所有容器的行为,包括文件访问、网络连接、进程执行等等。
案例背景:揪出试图访问敏感配置的“内鬼”
我们的目标是检测 Kubernetes 集群中,容器尝试读取或修改敏感配置文件的行为。这些敏感配置文件可能包含数据库密码、API 密钥等重要信息,一旦泄露,后果不堪设想。
为了模拟这种情况,我们假设集群中有一个恶意容器,它试图读取 Kubernetes Service Account 的 token 文件。Service Account 是 Kubernetes 用来授权 Pod 访问集群资源的机制。每个 Pod 默认都会挂载一个 Service Account 的 token 文件,路径通常是 /var/run/secrets/kubernetes.io/serviceaccount/token
。
如果攻击者能够获取到这个 token 文件,就可以冒充该 Service Account,从而获得相应的权限,对集群进行恶意操作。
准备工作:安装和配置 Falco
首先,你需要在你的 Kubernetes 集群中安装 Falco。Falco 提供了多种安装方式,包括 Helm、DaemonSet 等。这里我们以 Helm 为例,介绍如何安装 Falco。
- 添加 Falco Helm 仓库:
helm repo add falcosecurity https://falcosecurity.github.io/charts helm repo update
- 安装 Falco:
helm install falco falcosecurity/falco
这个命令会将 Falco 安装到你的 Kubernetes 集群中。你可以通过 kubectl get pods
命令来查看 Falco 的 Pod 是否正常运行。
- 验证 Falco 安装:
Falco 安装完成后,你可以运行一个简单的测试来验证它是否正常工作。
kubectl run --image=ubuntu:latest --restart=Never test-falco --command -- bash -c 'sleep 30 && touch /tmp/falco_test'
这个命令会创建一个名为 test-falco
的 Pod,并在 /tmp
目录下创建一个名为 falco_test
的文件。如果 Falco 正常工作,你应该可以在 Falco 的日志中看到相应的告警信息。
编写 Falco 规则:锁定敏感文件访问
接下来,我们需要编写一个 Falco 规则,用于检测对敏感文件的访问行为。Falco 规则使用 YAML 格式定义,包含以下几个关键部分:
- rule: 规则的名称,用于唯一标识该规则。
- desc: 规则的描述,用于解释该规则的作用。
- condition: 规则的条件,用于定义触发该规则的事件。
- output: 规则的输出,用于定义告警信息的格式。
- priority: 规则的优先级,用于控制告警信息的显示顺序。
下面是一个检测对 Service Account token 文件访问的 Falco 规则示例:
- rule: Detect Sensitive File Access desc: Detect attempts to read or modify sensitive files, such as Kubernetes Service Account token. condition: > evt.type = "syscall" and evt.dir = "<" and fd.name in (/var/run/secrets/kubernetes.io/serviceaccount/token) and not container.id = host output: > Sensitive file access detected (user=%user.name command=%proc.cmdline file=%fd.name container_id=%container.id container_name=%container.name image=%container.image) priority: WARNING
这个规则的含义是:
- evt.type = "syscall": 只监控系统调用事件。
- evt.dir = "<": 只监控文件读取事件("<" 表示读取,">" 表示写入)。
- fd.name in (/var/run/secrets/kubernetes.io/serviceaccount/token): 只监控对
/var/run/secrets/kubernetes.io/serviceaccount/token
文件的访问。 - not container.id = host: 排除宿主机上的进程,只监控容器内的进程。
如果以上条件都满足,Falco 就会发出一个 WARNING 级别的告警,告警信息包含用户名、进程命令、文件名、容器 ID、容器名称和镜像名称等信息。
部署 Falco 规则:让安全策略生效
将上述规则保存为一个 YAML 文件,例如 sensitive_file_access.yaml
。然后,你需要将这个规则文件部署到 Falco 中。Falco 提供了多种方式来加载规则文件,包括:
- 挂载到 Falco 的 Pod 中: 你可以将规则文件挂载到 Falco 的 Pod 中,Falco 会自动加载这些规则。
- 使用 ConfigMap: 你可以将规则文件保存到 ConfigMap 中,然后让 Falco 从 ConfigMap 中加载规则。
这里我们以 ConfigMap 为例,介绍如何部署 Falco 规则。
- 创建 ConfigMap:
kubectl create configmap falco-rules --from-file=rules=sensitive_file_access.yaml
这个命令会创建一个名为 falco-rules
的 ConfigMap,并将 sensitive_file_access.yaml
文件的内容保存到 ConfigMap 的 rules
字段中。
- 修改 Falco 的 Deployment:
你需要修改 Falco 的 Deployment,让它从 ConfigMap 中加载规则。找到 Falco 的 Deployment 文件,通常位于 /etc/falco/falco.yaml
。在 spec.template.spec.volumes
字段中添加一个 volume:
volumes: - name: falco-rules configMap: name: falco-rules
然后在 spec.template.spec.containers[0].volumeMounts
字段中添加一个 volumeMount:
volumeMounts: - name: falco-rules mountPath: /etc/falco/rules.d readOnly: true
这个配置会将 falco-rules
ConfigMap 挂载到 Falco 的 /etc/falco/rules.d
目录下。Falco 会自动加载该目录下所有的 YAML 文件作为规则。
- 重启 Falco 的 Pod:
修改完 Deployment 文件后,你需要重启 Falco 的 Pod,让配置生效。
kubectl rollout restart deployment falco
测试 Falco 规则:模拟恶意文件访问
现在,我们来测试一下我们编写的 Falco 规则是否能够正常工作。我们可以创建一个 Pod,并在 Pod 中尝试读取 Service Account token 文件。
kubectl run --image=ubuntu:latest --restart=Never test-file-access --command -- bash -c 'sleep 30 && cat /var/run/secrets/kubernetes.io/serviceaccount/token'
这个命令会创建一个名为 test-file-access
的 Pod,并在 Pod 中执行 cat /var/run/secrets/kubernetes.io/serviceaccount/token
命令,尝试读取 Service Account token 文件。
如果 Falco 规则正常工作,你应该可以在 Falco 的日志中看到相应的告警信息。你可以通过 kubectl logs -l app=falco
命令来查看 Falco 的日志。
优化 Falco 规则:更精准的告警
上面的规则虽然能够检测到对 Service Account token 文件的访问,但是它可能会产生一些误报。例如,一些正常的系统进程也可能会读取这个文件。为了减少误报,我们可以对规则进行优化,添加更多的过滤条件。
例如,我们可以添加一个条件,只监控那些没有以 kube
开头的进程:
- rule: Detect Sensitive File Access desc: Detect attempts to read or modify sensitive files, such as Kubernetes Service Account token. condition: > evt.type = "syscall" and evt.dir = "<" and fd.name in (/var/run/secrets/kubernetes.io/serviceaccount/token) and not container.id = host and not proc.name startswith "kube" output: > Sensitive file access detected (user=%user.name command=%proc.cmdline file=%fd.name container_id=%container.id container_name=%container.name image=%container.image) priority: WARNING
这个规则会排除那些以 kube
开头的进程,例如 kubelet
、kube-proxy
等。这样可以减少一些误报。
扩展 Falco 规则:监控更多敏感文件
除了 Service Account token 文件,还有很多其他的敏感文件也需要监控。例如:
- /etc/shadow: 包含用户的密码哈希值。
- /etc/passwd: 包含用户的基本信息。
- /etc/kubernetes/pki: 包含 Kubernetes 集群的证书。
你可以修改 Falco 规则,添加更多的文件路径,从而监控更多的敏感文件。
- rule: Detect Sensitive File Access desc: Detect attempts to read or modify sensitive files, such as Kubernetes Service Account token, /etc/shadow, /etc/passwd. condition: > evt.type = "syscall" and evt.dir = "<" and fd.name in (/var/run/secrets/kubernetes.io/serviceaccount/token, /etc/shadow, /etc/passwd, /etc/kubernetes/pki) and not container.id = host and not proc.name startswith "kube" output: > Sensitive file access detected (user=%user.name command=%proc.cmdline file=%fd.name container_id=%container.id container_name=%container.name image=%container.image) priority: WARNING
总结:让 Falco 成为你的安全卫士
通过这个实战案例,我们学习了如何使用 Falco 来检测 Kubernetes 集群中的恶意文件访问行为。Falco 是一个非常强大的工具,可以帮助我们提高容器安全性。但是,Falco 只是一个工具,我们需要根据自己的实际情况,编写合适的规则,才能发挥它的最大作用。
希望这篇文章能够帮助你更好地理解和使用 Falco。记住,安全是一个持续的过程,我们需要不断地学习和实践,才能保护我们的 Kubernetes 集群免受攻击。
额外思考:Falco 的更多可能性
除了文件访问监控,Falco 还可以用于检测很多其他的安全事件,例如:
- 特权容器: 检测运行在特权模式下的容器。
- 主机共享网络: 检测共享主机网络的容器。
- 不安全的 Capabilities: 检测添加了不安全 Capabilities 的容器。
- Shell 访问: 检测容器内的 Shell 访问。
你可以根据自己的需求,编写相应的 Falco 规则,从而提高容器安全性。
最后,我想说的是,容器安全是一个复杂的话题,我们需要不断地学习和实践,才能保护我们的容器免受攻击。希望这篇文章能够帮助你入门容器安全,并激发你对容器安全的兴趣。