前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Kind演示如何将Falco指标输出到Prometheus和Grafana

使用Kind演示如何将Falco指标输出到Prometheus和Grafana

作者头像
CNCF
发布2020-03-24 17:16:47
1.3K0
发布2020-03-24 17:16:47
举报
文章被收录于专栏:CNCF

作者: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只需要访问内核模块创建的一些设备:

代码语言:javascript
复制
$ 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材料:

代码语言:javascript
复制
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输出:

代码语言:javascript
复制
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安装命令:

代码语言:javascript
复制
$ 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:

代码语言:javascript
复制
helm install prom stable/prometheus

然后我们必须等待Prometheus的安装和运行:

代码语言:javascript
复制
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,只需运行:

代码语言:javascript
复制
helm install grafana stable/grafana

然后,要得到你的'admin'用户密码,运行:

代码语言:javascript
复制
kubectl get secret --namespace default grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

当Grafana启动并运行时,让端口转发Grafana服务:

代码语言:javascript
复制
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仪表板:

代码语言:javascript
复制
https://grafana.com/grafana/dashboards/11914

你也可以使用提供的dashboard.json。

https://github.com/falcosecurity/falco-exporter/blob/master/grafana/dashboard.json

现在我们可以生成事件来查看系统的运行情况了!

生成事件

有很多方法可以演示违反了Falco规则,如果你已经加载了默认的Falco规则集,这里有一些有趣的事情可以尝试。

一个简单的单行示例是创建一个警告,即在一个众所周知的可执行目录中touch一个文件。此外,你还可以对其他可能存在漏洞的目录中的文件进行cat或touch操作。

常见的单行示例

代码语言:javascript
复制
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

代码语言:javascript
复制
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读取该文件。

代码语言:javascript
复制
source shell.sh

然后,你可以输入以下内容来演示Kubernetes中的特权升级。

代码语言:javascript
复制
[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/

作为一个简单的示例,你可以运行以下命令来生成事件:

代码语言:javascript
复制
docker run -it --rm falcosecurity/falco-event-generator event_generator点击【阅读原文】阅读英文原文。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档