如何用64位ARM在边缘运行Falco和k3s(附代码)

211 阅读4分钟

Falco是一个开源的工具,它可以窥视你的系统内部,检测并报告系统调用和网络活动情况。它最初是由Sysdig建立的,后来捐给了CNCF,在那里它作为一个孵化器项目做得很好,有一个活跃的社区。

我从Sysdig的首席技术官那里了解到,Falco被设计为系统的最后一道防线,在那里,人们通常把重点放在预防措施上。Falco的作用是报告异常情况和意外行为。

当在边缘位置运行k3s时,可能很难获得对服务器的物理访问,而且可能有部分连接可用。

cluster-board

上图:在BitScope Designs公司专门设计的工业装置 "BitScope Cluster Blade "上运行的联网的Raspberry Pi集群。

默认情况下,Falco有三个可能的事件源。

  • 内核和一些系统调用
  • eBPF--比内核访问更快,但并非处处可用
  • 使用PTRACE(2)的用户区--用于AWS Lambda等SaaS产品的潜在用途

这些事件可以被发送到webhook,如OpenFaaS功能,以便在边缘进行补救,或在云中的集中行动中心发出警报和决策。作为一个通用的事件汇,数据可以直接从Kubernetes API中摄取,但智能设备,如门锁,也可以发送数据,如当前温度,或从加速计中获取的意外运动。

Event-detection--and-remediation-with-OpenFaaS

概念架构:从内核、eBPF、k3s API中检测事件,并通过OpenFaaS进行报警和补救。

在本指南中,我将向您展示如何配置Falco,使其在ARM64主机(如Equinix Metal提供的Ampere eMAG®)、AWS Graviton实例或Raspberry Pi 4上与k3s一起在边缘运行。

教程

我们将首先把Ubuntu Linux闪存到SD卡上,然后添加k3s,最后我们将安装Falco并配置k3s来发送事件。

下载操作系统

你将需要一个Raspbery Pi 4。我使用的是4GB内存的设备,但2GB也可以使用。

使用Raspberry Pi 4的链接下载Ubuntu 20.04.01图像。

你可以在这里获得该图像:https://ubuntu.com/download/raspberry-pi

现在使用Etcher.iodd ,将服务器操作系统镜像写入你的Raspberry Pi的SD卡中。

第一次启动

注意:与RaspiOS不同,SSH是默认启用的。

启动机器并使用nmap ,在你的网络上找到它:

nmap -sP 192.168.0.0/24

登录并将密码从ubuntu 改为你喜欢的密码:

ssh ubuntu@192.168.0.101

接下来,把你的SSH密钥复制过来:

ssh-copy-id ubuntu@192.168.0.101

为k3s做准备

编辑/firmware/boot/cmdline.txt 并添加到第一行,不要添加任何断行符。

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

这样就可以启用cgroups,这是设置容器限制的必要条件。这个步骤来自我的Raspbian教程。在你的Raspberry Pi上安装k3s,会不会有集群?

重新启动你的RPi:

sudo reboot

用k3sup安装k3s

在你的工作站上使用我的k3sup工具,通过SSH安装k3s。请不要在RPi上运行这个工具:

curl -sLS https://get.k3sup.dev | sudo sh

现在通过k3sup install 进行安装:

k3sup install --ip 192.168.0.101 --user ubuntu \
  --channel latest

--channel 命令来安装Kubernetes 1.19。

安装Falco和它的依赖项

通过SSH登录到RPi上。

目前,要在64位ARM上运行,需要一个上游项目的分叉,但我希望这些变化很快就能合并回来。一位维护者已经提供了一个.deb文件。

sudo apt-get -y install linux-headers-$(uname -r) dkms

DKMS是构建内核模块的必要条件。这是Falco对你的系统进行检测的方法之一。

你也可以使用build/aarch64 分支从源代码构建。

安装 Falco 的二进制文件,让它构建内核模块:

wget https://fs.fntlnz.wtf/falco/aarch64-builds/falco-0.26.1-48%2Bf82d905-aarch64.deb

sudo dpkg -i ./falco-0.26.1-48+f82d905-aarch64.deb

在falco配置文件中消除一些错误。

编辑/etc/falco/falco.yaml 并替换以下内容:

syscall_event_drops:
  actions:
    - log
    - alert
  rate: .03333
  max_burst: 10

用:

syscall_event_drops:
  actions:
    - ignore
  rate: .03333
  max_burst: 10

这将关闭我在ARM-64版本中看到的一些噪音。

在开机时启用它:

sudo systemctl enable falco \
  && sudo systemctl start falco

你可以在以下网址找到falco的各种预装规则/etc/falco/rules/

ls /etc/falco/rules/

falco.yaml
falco_rules.local.yaml
falco_rules.yaml
k8s_audit_rules.yaml

模拟一个Falco事件

在配置Kubernetes向Falco发送事件之前,我们可以发送一个样本事件来触发一个内置警报。

cat >> sample-event.json <<EOF
{"kind":"Event","apiVersion":"audit.k8s.io/v1beta1","metadata":{"creationTimestamp":"2018-10-25T13:58:49Z"},"level":"Request","timestamp":"2018-10-25T13:58:49Z","auditID":"841d3e6d-90d2-43df-8da4-684738bee3d5","stage":"ResponseComplete","requestURI":"/api/v1/namespaces","verb":"create","user":{"username":"system:anonymous","groups":["system:masters","system:authenticated"]},"sourceIPs":["192.168.99.1"],"objectRef":{"resource":"namespaces","name":"foo","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":201},"requestObject":{"kind":"Namespace","apiVersion":"v1","metadata":{"name":"foo","creationTimestamp":null},"spec":{},"status":{"phase":"Active"}},"requestReceivedTimestamp":"2018-10-25T13:58:49.730588Z","stageTimestamp":"2018-10-25T13:58:49.736141Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":""}}
EOF

通过Falco的REST API调用该事件。

curl http://127.0.0.1:8765/k8s-audit --data-binary @sample-event.json -H "Content-Type: application/json"

从k3s触发一个事件

我们可以添加一个额外的来源,就是来自Kubernetes审计日志的事件。这个功能必须通过k3s的systemd定义来开启。

为审计事件创建一个文件夹:

sudo mkdir -p /var/lib/rancher/audit

下载audit-policy.yaml/var/lib/rancher/audit

wget https://raw.githubusercontent.com/falcosecurity/evolution/master/examples/k8s_audit_config/audit-policy.yaml
sudo cp audit-policy.yaml /var/lib/rancher/audit/

创建一个webhook配置文件:

export IP=192.168.0.23

cat << EOF | sudo tee /var/lib/rancher/audit/webhook-config.yaml
apiVersion: v1
kind: Config
clusters:
- name: falco
  cluster:
    server: http://$IP:8765/k8s-audit
contexts:
- context:
    cluster: falco
    user: ""
  name: default-context
current-context: default-context
preferences: {}
users: []
EOF

编辑/etc/systemd/system/k3s.service ,在结尾处添加这些行:

        '--kube-apiserver-arg=audit-log-path=/var/lib/rancher/audit/audit.log' \
        '--kube-apiserver-arg=audit-policy-file=/var/lib/rancher/audit/audit-policy.yaml' \
        '--kube-apiserver-arg=audit-webhook-config-file=/var/lib/rancher/audit/webhook-config.yaml' \

现在重新加载:

sudo systemctl daemon-reload && \
 sudo systemctl restart k3s

文档中我最喜欢的用例是检测存储在ConfigMaps中的AWS秘钥。当然,我们都知道机密数据属于Vault或Kubernetes Secrets里面,可以在休息时加密。

让我们试试吧?

从你的笔记本上运行这个:

kubectl create configmap aws-creds \
  --from-literal aws_access_key_id=AKES20LNOA

现在检查Falco的日志:

sudo journalctl -u falco --lines 100

Oct 13 16:55:42 ubuntu falco[89818]: 16:55:24.207932928: Warning K8s configmap with private credential (user=system:admin verb=create configmap=aws-creds-1 config={"aws_access_key_id":"AKES20LNOA"})

你可以在Falco文档的 "Kubernetes审计规则 "中找到这个例子。

扩展k3s集群

你可以在k3s集群中添加额外的节点,方法是像我们为第一个节点安装Ubuntu,然后运行k3sup join 命令。

k3sup join --ip $IP -user ubuntu \
  --server-ip 192.168.0.101

k3s还支持高可用性和使用SQL后端或嵌入式etcd的主节点的故障转移。

总结

完全公开:Sysdig是OpenFaaS有限公司的一个客户。

我们现在有了Ubuntu 20.04.01,Kubernetes与k3s和Falco都是为64位ARM构建的,在我们的Raspberry Pi上运行。

现在就看你如何进一步探索Falco,以及如何微调你的Kubernetes规则了。

我还想向我的朋友fntlnz表示感谢,他是Falco的维护者,帮助我在64位ARM上建立了Falco的工作。我们花了好几天时间才达到这个效果。