WEBKT

实战案例,如何用 Falco 揪出 Kubernetes 集群里的“内鬼”文件访问?

36 0 0 0

前言:你的 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。

  1. 添加 Falco Helm 仓库:
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
  1. 安装 Falco:
helm install falco falcosecurity/falco

这个命令会将 Falco 安装到你的 Kubernetes 集群中。你可以通过 kubectl get pods 命令来查看 Falco 的 Pod 是否正常运行。

  1. 验证 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 规则。

  1. 创建 ConfigMap:
kubectl create configmap falco-rules --from-file=rules=sensitive_file_access.yaml

这个命令会创建一个名为 falco-rules 的 ConfigMap,并将 sensitive_file_access.yaml 文件的内容保存到 ConfigMap 的 rules 字段中。

  1. 修改 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 文件作为规则。

  1. 重启 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 开头的进程,例如 kubeletkube-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 规则,从而提高容器安全性。

最后,我想说的是,容器安全是一个复杂的话题,我们需要不断地学习和实践,才能保护我们的容器免受攻击。希望这篇文章能够帮助你入门容器安全,并激发你对容器安全的兴趣。

安全老司机 FalcoKubernetes安全容器安全

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/9888