作者:Leonardo Grasso
Kind是一个使用Docker容器“节点”运行本地Kubernetes集群的工具,可以用于本地开发或CI。它还提供了在Kubernetes集群中安装Falco并在本地使用它的简便方法。我们将使用Kind演示如何将Falco指标输出到Prometheus和Grafana。
创建一个Kind集群
正如文档中所解释的那样,在Kind集群中运行Falco很容易。
https://falco.org/docs/running/#running-falco-in-a-kind-cluster
如果你想要使用内核模块,基本上,你只需要挂载/dev。
注意,并不是必须挂载整个/dev路径。Falco只需要访问内核模块创建的一些设备:
$ ls -l /dev/falco*
cr-------- 1 root root 238, 0 Mar 12 16:04 /dev/falco0
cr-------- 1 root root 238, 1 Mar 12 16:04 /dev/falco1
cr-------- 1 root root 238, 2 Mar 12 16:04 /dev/falco2
cr-------- 1 root root 238, 3 Mar 12 16:04 /dev/falco3
cr-------- 1 root root 238, 4 Mar 12 16:04 /dev/falco4
cr-------- 1 root root 238, 5 Mar 12 16:04 /dev/falco5
cr-------- 1 root root 238, 6 Mar 12 16:04 /dev/falco6
cr-------- 1 root root 238, 7 Mar 12 16:04 /dev/falco7
正如你所看到的,内核模块正在为每个CPU创建一个设备(在我的例子中是8个)。这些路径都是Falco需要的。
证书
为了将指标输出到Prometheus,我们将使用Falco-exporter连接到Falco gRPC的输出。Falco gRPC服务器在设计时只使用相互TLS。因此,你还需要有效的证书文件来正确配置Falco和Falco-exporter。
你可以使用falcoctl快速生成cert材料:
FALCOCTL_NAME=falco-grpc.default.svc.cluster.local FALCOCTL_PATH=/tmp/certs falcoctl install tls
你也可以像这里所解释的那样手动生成它们。
https://falco.org/docs/grpc/#certificates
注意,在这两种情况下,都必须确保设置了正确的CommonName。在本例中,我们使用Helm chart使用的默认主机名。
安装Falco
官方的Falco Helm Chart是部署Falco的直接方法。该chart使用DaemonSet将Falco添加到集群中的所有节点。
确保包含TLS cert材料并启用gRPC输出:
helm install falco stable/falco \
--set-file certs.server.key=/tmp/certs/server.key,certs.server.crt=/tmp/certs/server.crt,certs.ca.crt=/tmp/certs/ca.crt \
--set falco.grpc.enabled=true,falco.grpcOutput.enabled=true
安装falco-exporter
Falco-exporter是Falco输出事件的Prometheus指标输出器。同样,使用提供的Helm chart是部署它的最简单方法。
所以你只需要克隆falco-exporter的repo和运行helm安装命令:
$ git clone https://github.com/falcosecurity/falco-exporter.git
Cloning into 'falco-exporter'...
remote: Enumerating objects: 178, done.
remote: Counting objects: 100% (178/178), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 178 (delta 64), reused 129 (delta 38), pack-reused 0
Receiving objects: 100% (178/178), 693.25 KiB | 1.92 MiB/s, done.
Resolving deltas: 100% (64/64), done.
$ cd falco-exporter
$ helm install falco-exporter \
--set-file certs.ca.crt=/tmp/certs/ca.crt,certs.client.key=/tmp/certs/client.key,certs.client.crt=/tmp/certs/client.crt \
./deploy/helm/falco-exporter
安装Prometheus
当Falco和输出器已经启动和运行,我们可以继续安装Prometheus:
helm install prom stable/prometheus
然后我们必须等待Prometheus的安装和运行:
export POD_NAME=$(kubectl get pods --namespace default -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace default port-forward $POD_NAME 9090
我们可以打开http://localhost:9090/targets并检查falco-exporter是否已被Prometheus发现。
安装Grafana和Falco仪表板
要部署Grafana,只需运行:
helm install grafana stable/grafana
然后,要得到你的'admin'用户密码,运行:
kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
当Grafana启动并运行时,让端口转发Grafana服务:
kubectl port-forward service/grafana 3000:80
要登录到Grafana,打开http://127.0.0.1:3000/login,使用上面的“admin”用户密码。
现在,你可以将Prometheus端点(http://prom-prometheus-server.default.svc.cluster.local)添加到Grafana数据源,最后转到http://127.0.0.1:3000/dashboard/import,并通过复制粘贴以下dashboard URL来导入Falco仪表板:
https://grafana.com/grafana/dashboards/11914
你也可以使用提供的dashboard.json。
https://github.com/falcosecurity/falco-exporter/blob/master/grafana/dashboard.json
现在我们可以生成事件来查看系统的运行情况了!
生成事件
有很多方法可以演示违反了Falco规则,如果你已经加载了默认的Falco规则集,这里有一些有趣的事情可以尝试。
一个简单的单行示例是创建一个警告,即在一个众所周知的可执行目录中touch一个文件。此外,你还可以对其他可能存在漏洞的目录中的文件进行cat或touch操作。
常见的单行示例
touch /usr/local/bin/example-violation
touch /usr/bin/example-violation
cat /etc/shadow
touch /etc/example-violation
你可以在这里找到默认的规则集。
https://github.com/falcosecurity/falco/blob/master/rules/falco_rules.yaml
特权模式
你可以查看Kris Nova在FOSDEM上提供的演示,并找到她在下面定义的函数shell()。
https://www.youtube.com/watch?v=VrtkKgfJ3RI
function shell () {
kubectl run shell --restart=Never -it --image krisnova/hack:latest \
--rm --attach \
--overrides \
'{
"spec":{
"hostPID": true,
"containers":[{
"name":"scary",
"image": "krisnova/hack:latest",
"imagePullPolicy": "Always",
"stdin": true,
"tty": true,
"command":["/bin/bash"],
"nodeSelector":{
"dedicated":"master"
},
"securityContext":{
"privileged":true
}
}]
}
}'
}
你可以将其粘贴到一个新的shell.sh文件中,并在环境使用source读取该文件。
source shell.sh
然后,你可以输入以下内容来演示Kubernetes中的特权升级。
[user@user]$ shell
If you don't see a command prompt, try pressing enter.
root@shell:/# nsenter -t 1 -m -u -i -n bash
root@ip-1-2-3-4:/#
这样做利用了Kubernetes中一个众所周知的安全漏洞,你可以在Prometheus/Grafana中找到Falco警报。
Falco事件生成器
你可以在官方文档中找到有关生成示例事件的更多信息。
https://falco.org/docs/event-sources/sample-events/
作为一个简单的示例,你可以运行以下命令来生成事件:
docker run -it --rm falcosecurity/falco-event-generator event_generator点击【阅读原文】阅读英文原文。