云原生运行时安全 Falco 入门
Falco(https://falco.org) 是一个开源的运行时安全工具,可以帮助你保护各种环境的安全,最初由 Sysdig 创建,并于2018年成为 CNCF 项目。Falco 的工作方式是查看文件更改、网络活动、进程表和其他数据是否存在可疑行为,然后通过可插拔后端发送警报,通过内核模块或扩展的 BPF 探测器在主机的系统调用级别检查事件。Falco 包含一组丰富的规则,你可以编辑这些规则以标记特定的异常行为,并为正常的计算机操作创建允许列表。
Falco 对容器安全特别有用--尤其是当你使用 Kubernetes 来运行它们的时候。Falco 通过获取 Kubernetes API 审计日志,用于运行时威胁检测和了解应用程序行为。
Falco 通过使用定义意外行为的检测规则来工作,虽然它自带有默认规则,但你可以扩展这些规则来定义自定义规则,以进一步加固你的集群。通过 Falco 我们可以检测下面的场景:
从一个容器中打开一个 shell 会话 Host Path 卷挂载 读取 secret 和敏感文件,比如 /etc/shadow
文件在运行的容器中安装新的软件包 从不属于 CMD 的容器中产生的新进程 打开一个新的端口或意外的网络链接 创建一个特权容器 ......
Falco 可以确保我们知道应用什么时候有潜在的违规行为,以便我们可以提前修复这些安全问题,Falco 对现有的 Kubernetes 原生安全措施(如 RBAC 和 Pod 安全策略)进行了补充,这些措施有助于我们预防一些安全问题。
安装
首先当然需要确保我们有一个可访问的 Kubernetes 集群:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready master 12d v1.19.3
node1 Ready 12d v1.19.3
node2 Ready 9d v1.19.3
然后我们使用 Helm 来快速安装,所以我们先安装 Helm,安装 Helm 很简单,下载你的操作系统对应的最新包,解压并将文件移动到 PATH 路径上即可。
$ wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz
$ tar -xvf helm-v3.4.0-linux-amd64.tar.gz
$ chmod +x linux-amd64/helm
$ mv linux-amd64/helm /usr/local/bin/
$ helm version
version.BuildInfo{Version:"v3.4.0", GitCommit:"7090a89efc8a18f3d8178bf47d2462450349a004", GitTreeState:"clean", GoVersion:"go1.14.10"}
现在我们用官方的 Helm Chart 来安装 Falco,先添加 Helm repo 仓库:
$ helm repo add falcosecurity https://falcosecurity.github.io/charts
"falcosecurity" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "falcosecurity" chart repository
Update Complete. ⎈Happy Helming!⎈
现在我们就可以直接使用 Helm Chart 来安装 Falco 了:
$ helm install falco falcosecurity/falco
NAME: falco
LAST DEPLOYED: Thu Oct 29 20:10:01 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Falco agents are spinning up on each node in your cluster. After a few
seconds, they are going to start monitoring your containers looking for
security issues.
No further action should be required.
Helm 会安装一个 Falco DaemonSet 对象,正常我们可以看到每个节点上会启动一个 Falco Pod。
$ kubectl get pods -l app=falco
NAME READY STATUS RESTARTS AGE
falco-q6mcq 1/1 Running 0 24m
falco-tjmqs 1/1 Running 0 24m
falco-vkrv7 1/1 Running 0 24m
到这里我们就成功安装了 Falco,并在所有节点上运行。
测试
接下来我们进行一个简单的测试,比如创建一个 NGINX 的 Pod,并尝试做一些平时很少执行的操作。
创建 NGINX Pod:
$ kubectl run --generator=run-pod/v1 nginx --image=nginx
上面 Pod 启动后查看运行在哪个节点上:
$ kubectl get pod nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 26s 10.244.2.17 node2
我们可以看到 NGINX Pod 运行在节点 node2 上,对应的 Falco Pod 是 falco-q6mcq
,下面我们打开两个窗口,在左侧窗口中执行以下操作,同时在右侧窗口中使用 kubectl logs -f falco-q6mcq
命令查看 Falco 容器的日志:
在 NGINX 容器中启动一个 shell Cat 一个敏感文件 /etc/shadow 从 shell 中退出
我们可以看到每当我们做操作是潜在的安全漏洞时,右侧窗口就会出现对应的日志信息。我们也可以将这些日志导出到 Grafana 等监控工具中,也可以触发一个 webhook 到钉钉或者企业微信上进行即时通知。
这是因为 Falco 已自带了很多默认监控规则,具体可以查看 Falco pod 中的 /etc/falco/falco_rules.yaml
文件。
总结
Falco 是 Kubernetes 中非常流行的运行时安全工具,非常建议在所有环境中使用它 - 尤其是生产环境,我们还可以修改规则来满足你的要求,关于 Falco 的规则后续再详细介绍。
训练营推荐