使用 Falco 監聽運行時安全

  1. Falco 是什麼

Falco 是由 Sysdig 貢獻給 CNCF 的雲原生運行時安全相關項目。

Falco 實現了一套可擴展的事件規則過濾引擎,通過獲取事件、匹配安全規則、產生告警通知系列操作,能夠發現系統中的安全問題。其中的事件來自系統調用,同時也支持 ebpf 探針,規則是開源的 [1],可以自行定義擴展 [2]。下圖爲其架構圖:

Falco 可以檢測到的典型事件包括:

  1. 生成證書

Falco 的 gRPC 需要雙向的 TLS 認證 [3]。Falco exporter 通過 gRPC 暴露相關事件,自研的系統也可以通過 gRPC 直接集成 Falco。下面的步驟用來生成交互所需的證書,Falco 官方的文檔有些陳舊,有些操作會報錯。

mkdir /root/falco
cd /root/falco
openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
        -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=dev.chenshaowen.com" \
        -key ca.key \
        -out ca.crt
openssl genrsa -out server.key 4096

openssl req -sha512 -new                  \
              -key server.key       \
              -out server.csr       \
              -subj  "/C=SP/ST=Italy/L=Ornavasso/O=Test/OU=Server/CN=localhost"

openssl x509 -req -sha512               \
               -days 3650            \
               -CA ca.crt           \
               -CAkey ca.key        \
               -in server.csr       \
               -out server.crt      \
               -set_serial 01
openssl genrsa -out client.key 4096

openssl req -sha512 -new                  \
              -key client.key       \
              -out client.csr       \
              -subj  "/C=SP/ST=Italy/L=Ornavasso/O=Test/OU=client/CN=localhost"

openssl x509 -req -sha512               \
               -days 3650            \
               -CA ca.crt           \
               -CAkey ca.key        \
               -in client.csr       \
               -out client.crt      \
               -set_serial 01
ls /root/falco

ca.crt  ca.key  client.crt  client.csr  client.key  server.crt  server.csr  server.key
  1. 在 Kubernetes 上安裝 Falco

helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
      --namespace falco --create-namespace \
      --version 3.0.0 \
      --set-file certs.ca.crt=/root/falco/ca.crt,certs.server.key=/root/falco/server.key,certs.server.crt=/root/falco/server.crt \
      --set ebpf.enabled=true \
      --set falco.grpc.enabled=true \
      --set falco.grpc_output.enabled=true \
      --set falcosidekick.enabled=true \
      --set falcosidekick.webui.enabled=true \
      --set falcosidekick.webui.user="admin:admin" \
      --set falco.grpc.unixSocketPath=""
helm install falco-exporter falcosecurity/falco-exporter \
     --namespace falco --create-namespace \
     --version 0.9.1 \
     --set falco.grpcTimeout=3m
     --set-file certs.ca.crt=/root/falco/ca.crt,certs.client.key=/root/falco/client.key,certs.client.crt=/root/falco/client.crt

在運行過程中會請求 ghcr.io 下載默認規則 falco_rules.yaml.tar.gz,在網絡受限環境下,可能會下載失敗。

kubectl -n falco get pod -w

NAME                                      READY   STATUS    RESTARTS   AGE
falco-5bbl6                               2/2     Running   0          152s
falco-exporter-26gfz                      1/1     Running   0          124s
falco-falcosidekick-5c8bf5d7fb-kx778      1/1     Running   0          111s
falco-falcosidekick-ui-5b56bbd7cb-5wdwl   1/1     Running   3          111s
...
helm uninstall falco --namespace falco
helm uninstall falco-exporter --namespace falco
  1. 使用 Grafana 面板查看 Falco 事件數據

通過查看 falco-exporter svc 可以看到其已經將 metrics 暴露給了 Prometheus。

kubectl -n falco get svc falco-exporter  -o yaml

apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/port: "9376"
    prometheus.io/scrape: "true"
  name: falco-exporter
  namespace: falco
spec:
  ports:
  - name: metrics
    port: 9376
    protocol: TCP
    targetPort: 9376
  selector:
    app.kubernetes.io/instance: falco-exporter
    app.kubernetes.io/name: falco-exporter

接下來,只需要添加 Grafana 面板即可。導入 11914,即 https://grafana.com/grafana/dashboards/11914-falco-dashboard/。查看數據如下圖:

但 Metrics 中暴露的信息比較有限,在 Prometheus 中查詢 falco_events{rule="Read sensitive file untrusted"},得到結果 falco_events{app_kubernetes_io_instance="falco-exporter", app_kubernetes_io_managed_by="Helm", app_kubernetes_io_} ,並不會展示執行的用戶、執行的命令等詳情信息,只能看到事件的優先級、觸發的規則等有限的信息。

  1. 使用 falcosidekick-ui 查看事件

falcosidekick 主要是實現了對事件的集中管理,並提供豐富的告警通道能力,能夠將告警發送給 slack、rocketchat、elasticsearch 等 [5]。

而 falco-falcosidekick-ui 提供了對 falco 事件的查看能力。

剛纔在安裝 falco 時,已經添加如下參數,因此 falcosidekick 及 falcosidekick-ui 已經安裝。

      --set falcosidekick.enabled=true \
      --set falcosidekick.webui.enabled=true \
      --set falcosidekick.webui.user="admin:admin"
kubectl -n falco patch svc falco-falcosidekick-ui  --patch \
  '{"spec": { "type": "NodePort", "ports": [ { "nodePort": 32000, "port": 2802, "protocol": "TCP", "targetPort": 2802 } ] } }'

通過主機 IP:32000 端口,即可打開 falcosidekick ui 的頁面。默認賬戶是 admin,默認密碼是 admin。

在主機上,讀取敏感文件 cat /etc/shadow 之後,在 falcosidekick ui 頁面就可以查看到相關的事件,如下圖:

Output 內容,由於是主機上的操作,會缺失集羣相關字段,但文件、命令等信息會豐富不少:

Warning Sensitive file opened for reading by non-trusted program (user=root user_loginuid=1001 program=cat command=cat /etc/shadow pid=54909 file=/etc/shadow parent=bash gparent=sudo ggparent=bash gggparent=sshd container_id=host image=<NA>) k8s.ns=<NA> k8s.pod=<NA> container=host

Dashboard 頁面提供的是全局統計的視圖,可以從整體上對集羣、主機的安全進行評估,視圖如下:

  1. 參考

  1. https://github.com/falcosecurity/rules/blob/main/rules/falco_rules.yaml

  2. https://falco.org/docs/rules/basic-elements/

  3. https://falco.org/docs/grpc/grpc-config/

  4. https://github.com/falcosecurity/charts/tree/master/falco#enabling-grpc

  5. https://github.com/falcosecurity/falcosidekick

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/QfewFkxZn6fBUXRiL_BHqQ